在运行自动会议时将变量替换为 m4 宏



>我的 configure.ac 中有这样的东西,其中设置并通过AC_SUBST传递二进制名称,然后将相同的二进制名称硬编码到其他各种 m4 宏中。

UTIL_BIN_NAME=foobar
...
AC_ARG_WITH([utils],
[AS_HELP_STRING([--with-utils],
[build foobar binary (default=yes)])],
[build_utils=$withval],
[build_utils=yes])
...
AC_SUBST(UTIL_BIN_NAME)

有没有办法替换变量,这样二进制名称只在一个地方硬编码,而不是多个地方。 例如:

UTIL_BIN_NAME=foobar
...
AC_ARG_WITH([utils],
[AS_HELP_STRING([--with-utils],
[build $UTIL_BIN_NAME binary (default=yes)])],
[build_utils=$withval],
[build_utils=yes])
...
AC_SUBST(UTIL_BIN_NAME)

不幸的是,上述方法不起作用,所以这只是我希望实现的一个例子。

我尝试了各种搜索以尝试找到正确的方法来执行此操作,但不知何故,我遇到了不足,没有找到任何东西。如何实现这一点?

您可以在Autoconf 宏参数中使用 shell 变量,但这样做并不总是具有您想要的效果。 Autoconf 本身不会扩展它们(通常;这里有一个完全不同的故事(,但您可能会被以下事实所绊倒:生成的configure脚本中的代码顺序并不严格遵循 Autoconf 输入中的宏顺序。 特别是,用于处理参数的代码几乎先于其他所有内容。 此外,在 Autoconf 宏注入其参数的某些位置,变量引用在 shell 脚本中不会在语法或语义上提供服务。

如果您需要一个对输出重新排序不敏感的可调参数,或者可以在 shell 变量无法提供的上下文中,那么您可能正在寻找一个m4宏或宏参数。 Autoconf 输入使用自定义m4配置和大量预定义宏进行处理,但它仍然是m4输入,您可以使用普通m4工具。 宏观定义和扩展是其中最基本的。

Autoconf 将m4的所有内置元素重命名为m4_命名空间,因此基本define内置将被拼写为"m4_define":

m4_define([UTIL_BIN_NAME], [foobar])

诸如此类的m4宏定义在处理时生效,因此它对 Autoconf 对输出顺序的处理不敏感。 Autoconf将根据给定的定义扩展UTIL_BIN_NAME的后续外观,但须考虑引用。 当然,您确实需要一个 shell 变量来与AC_SUBST一起使用并用于其他目的,但从宏生成 shell 变量并不难。

引用有点棘手,但这为我产生了想要的结果(据我所知(:

m4_define([UTIL_BIN_NAME], [foobar])
# Create a shell variable with the same name and (initial) value as the macro:
[UTIL_BIN_NAME]=UTIL_BIN_NAME
# Note: one could use the (a) macro to customize the names of shell variables
# such as 'build_utils', too, if that were desirable.  Details are left as an
# exercise.
AC_ARG_WITH([UTIL_BIN_NAME],
[AS_HELP_STRING([--with-[]UTIL_BIN_NAME],
[build ]UTIL_BIN_NAME[ binary (default=yes)])],
[build_utils=$withval],
[build_utils=yes]
)
# ...
AC_SUBST([UTIL_BIN_NAME])

最新更新