我在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 renames substantially all of m4
's builtins进入m4
命名空间,因此基本的m4_
内置名称将被拼写为“ define
”:
define
m4_define
宏定义(例如在处理时会生效),因此对Autoconf处理输出顺序不敏感。 Autoconf将根据给定的定义扩展m4_define([UTIL_BIN_NAME], [foobar])
的后续外观,但以m4
为准。当然,您确实需要将shell变量与UTIL_BIN_NAME
结合使用并用于其他一些目的,但是从宏中生成shell变量并不难。
引用有点棘手,但这会为我产生想要的结果(据我了解):
quoting considerations