【问题标题】:Shell variables as autoconf macro inputShell 变量作为 autoconf 宏输入
【发布时间】:2013-01-08 15:56:09
【问题描述】:

我需要在 configure.ac 上检查 Erlang 库,但 erlang 应用程序列表位于单独的文件中,我必须运行一个程序来提取该列表。

通常,我可以这样做:

AC_ERLANG_CHECK_LIB([app1])
AC_ERLANG_CHECK_LIB([app2])

但是,由于实际的应用程序位于单独的文件中(并且我不想在 configure.ac 上重复它们,我正在考虑按照以下方式进行某处:

DEPS=`some command that gets app1, app2`
# DEPS=app1 app2

m4_foreach_w(dep, "$DEPS", [AC_ERLANG_CHECK_LIB([dep])])

我知道“$DEPS”在这里是错误的参数,因为它需要实际值 - 类似于 [app1 app2]。我也知道在调用 ./configure 之前不会对 DEPS 变量进行评估,而 m4_foreach_w 需要先验 DEPS 的值。

知道如何解决这个问题吗?

【问题讨论】:

    标签: autotools autoconf


    【解决方案1】:

    你可以试试:

    m4_foreach_w(dep, m4_esyscmd([some command that generates list]),
           [AC_ERLANG_CHECK_LIB(dep)])
    

    我怀疑这是一个坏主意,但我无法提供有关潜在陷阱的更多详细信息。如果是我,我更愿意对依赖项进行硬编码或使用脚本生成 configure.ac

    【讨论】:

    • 嗯。愿意解释为什么这是一个坏主意吗?
    • @jvliwanag 我唯一关心的是 m4 引用;它往往很容易产生难以跟踪的错误。另一方面,生成 configure.ac 的脚本可能更加脆弱。我只是对m4_esyscmd 保持警惕。也许太过分了。
    【解决方案2】:

    这种方法对你来说可能有点矫枉过正,但我​​只是描述一下。

    当您运行程序以获取列表时,将输出转换为 GNU Autogen .def 文件格式:

    elib.def

    自动生成定义 elib; elib = { name="app1"; }; elib = { name="app2"; };

    然后使用这样的模板文件调用autogen

    gen.tpl

    [+ autogen5 模板 m4=%s.m4 (setenv "SHELL" "/bin/sh") +]# [+ (dne "#" "#") +] # 宏的注释 AC_DEFUN([CHECK_MY_ELIBS], [ [+ FOR elib "\n" +]AC_ERLANG_CHECK_LIB([[+name+]])[+ENDFOR+] ])

    会输出一个宏elib.m4

    ... # 宏的注释 AC_DEFUN([CHECK_MY_ELIBS], [ AC_ERLANG_CHECK_LIB([app1]) AC_ERLANG_CHECK_LIB([app2]) ])

    AC_CONFIG_MACRO_DIR 中安装 elib.m4 后,然后在configure.ac 中调用 CHECK_MY_ELIBS。

    您当然可以通过其他方式(例如 perl、python)生成 elib.m4,但这并不太难。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-07
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 2015-01-02
      • 2021-08-22
      • 2018-11-23
      • 1970-01-01
      相关资源
      最近更新 更多