【问题标题】:Substitute variable into m4 macro when running autoconf运行 autoconf 时将变量替换为 m4 宏
【发布时间】:2020-06-16 11:00:39
【问题描述】:

我的 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】:

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

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

    Autoconf renames substantially all of m4's builtins 进入m4_ 命名空间,因此基本的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])
    

    【讨论】:

    • 语法有点“棘手”,但确实有效,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 2013-09-27
    • 1970-01-01
    相关资源
    最近更新 更多