2012-06-01 4 views
1

기본적으로 AC_CHECK_SIZEOF (type)를 호출하고 AC_SUBST를 사용하여 대체 할 변수를 정의하는 m4 매크로를 만들려고합니다. 그래서 주어진 입력 :동적 변수 이름을 사용하는 AC_SUBST

:

AX_CHECK_SIZEOF_AND_SUBST(int, 4)

나는이 작동하지 않습니다 분명히 이것은 내가 지금까지 해낸 것입니다 @[email protected]의 모든 차례 나오는 4

로 대체하기를 원하지만

AC_DEFUN([AX_CHECK_SIZEOF_AND_SUBST], [ 
    AC_CHECK_SIZEOF($1, $2) 
    NAME=$(echo -n "SIZEOF_$1" | tr "a-z" "A-Z" | tr '*' 'P' | tr -c 'A-Z0-9' '_') 
    echo "NAME=$NAME" 
    AC_SUBST($NAME, $$NAME) 
]) 
+0

http://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Macro-Names.html의 3 번째 단락을 읽으십시오. "AX_"는 예약 된 네임 스페이스와 충돌하지 않는다고 생각하지만 그 이름을 피하는 것이 좋습니다. –

+0

@WilliamPursell AX_ 접두어 나는 ac-archive.sourceforge.net/doc/contribute.html (마지막 단락을 참조하십시오) – Naddiseo

답변

1

당신이하려는 일에 문제가있어서 AC_CHECK_SIZEOF은 실제로 SIZEOF_INT이라는 변수를 정의하지 않습니다. 2.68에서 원하는 변수의 이름은 ac_cv_sizeof_int이지만 이후 버전에서는 변경 될 수 있으므로 이름을 사용하면 안됩니다. 값은 confdefs.h에 기록, 그래서 그것을 잡기 위해 또 다른 방법입니다 :

AC_PROG_AWK 
AC_CHECK_SIZEOF([int]) 
SIZEOF_INT=$($AWK '/SIZEOF_INT/{print $3}' confdefs.h) 
AC_SUBST([SIZEOF_INT]) 

(읽기 confdefs.h이 문서화되지 않은 행동과 autoconf를의 향후 버전에서 변경 될 수도 있지만보다 가능성이 더 안정적입니다 .. $의 ac_cv_sizeof_int보고 아마, 덜 안정, 너무) YMMV은)

(이름 지정 규칙에 대한 내 의견을 유의하시기 바랍니다) 매크로를 정의하려면, 당신은 할 수 :

AC_DEFUN([wrp_CHECK_SIZEOF_AND_SUBST], [ 
    AC_REQUIRE([AC_PROG_AWK]) 
    AC_CHECK_SIZEOF([$1]) 
    m4_toupper(SIZEOF_$1)=$($AWK ' 
     /SIZEOF_[]m4_toupper($1)/{print $[]3}' confdefs.h) 
    AC_SUBST(m4_toupper(SIZEOF_$1)) 
]) 

버전은 위의 않습니다 int *을 처리하지 못하지만, 간단하게하기 위해 병 보관이 아닌 더 일반적인 버전으로 교체 :

AC_DEFUN([wrp_CHECK_SIZEOF_AND_SUBST], [ 
    AC_REQUIRE([AC_PROG_AWK]) 
    AC_CHECK_SIZEOF([$1]) 
    m4_pushdef([name],SIZEOF_[]m4_toupper(m4_translit($1,[ *],[_p]))) 
    name=$($AWK '/name/{print $[]3}' confdefs.h) 
    AC_SUBST(name) 
    m4_popdef([name]) 
]) 

참고 : 나는 $() 표기 휴대용 구성 스크립트를 피해야한다고 생각하고, 역 따옴표로 교체해야합니다. 그러나, 나는 역겨운 것을 찾는다.