带有动态变量名的AC_SUBST

时间:2012-06-01 22:08:11

标签: autoconf m4

我正在尝试创建一个基本上调用AC_CHECK_SIZEOF(type)的m4宏,然后使用AC_SUBST来定义该变量以进行替换。 所以给出了输入:

AX_CHECK_SIZEOF_AND_SUBST(int, 4)

我希望所有@SIZEOF_INT@的出现都被替换为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)
])

1 个答案:

答案 0 :(得分: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])
])

注意:我认为在便携式配置脚本中应该避免$()表示法,并且应该用反引号替换。但是,我觉得反叛是可怕的。