运行 autoconf 时将变量替换为 m4 宏

Substitute variable into m4 macro when running autoconf

我的 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 宏注入参数的某些地方,变量引用在 shell 脚本中不提供句法或语义服务。

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

Autoconf renames substantially all of m4's builtins into the m4_ namespace, so the basic define 内置函数将拼写为“m4_define”:

m4_define([UTIL_BIN_NAME], [foobar])

诸如此类的m4宏定义在处理时生效,因此它对Autoconf 的输出顺序处理不敏感。 UTIL_BIN_NAME 的后续出现将由 Autoconf 根据给定的定义扩展,服从 quoting considerations。当然,您确实需要一个 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])