2012-06-01 77 views
1

我想创建一个基本上调用AC_CHECK_SIZEOF(类型)的m4宏,然后使用AC_SUBST来定义该变量进行替换。 所以给定输入的: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我根据ac-archive.sourceforge.net/doc/contribute.html的建议得到了AX_前缀(请参见最后一段) – 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可能,不太稳定,太;)情况因人而异)

要定义的宏(请注意我的关于命名约定注释),你可以这样做:

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 *,但为了简单起见,我w虐待它保留下来,而不是更一般的版本来替换它:

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]) 
]) 

注:我相信$()符号应在便携的配置脚本来避免,并应与反引号替换。但是,我发现反衬可怕。