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