1

我正在尝试创建一个 m4 宏,它基本上调用 AC_CHECK_SIZEOF(type) 然后使用 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)
])
4

1 回答 1

1

您尝试做的问题是AC_CHECK_SIZEOF实际上并没有定义一个名为SIZEOF_INT. 在 2.68 中,您想要的变量是 named 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])
])

注意:我认为$()在可移植的配置脚本中应该避免使用这种符号,并且应该用反引号代替。但是,我发现反引号很可怕。

于 2012-06-02T12:38:15.360 回答