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

问题描述 投票:0回答:1

我在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)

不幸的是,上面的方法不起作用,所以只是我希望实现的示例。

我已经尝试了各种搜索来尝试找到正确的方法来执行此操作,但不知何故,却没有找到任何东西。如何实现呢?

autotools autoconf m4
1个回答
0
投票

可以在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
© www.soinside.com 2019 - 2024. All rights reserved.