AC_SUBST动态变量名称



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

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

您尝试执行的操作的麻烦在于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 *,但为了简单起见,我将保留它,而不是用更通用的版本替换它:

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

注意:我认为在可移植的配置脚本中应避免使用$()表示法,而应替换为反引号。 但是,我发现反引号很可怕。

相关内容

  • 没有找到相关文章

最新更新