我正在尝试创建一个基本上调用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)
])
答案 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])
])
注意:我认为在便携式配置脚本中应该避免$()
表示法,并且应该用反引号替换。但是,我觉得反叛是可怕的。