Shell变量作为autoconf宏输入

时间:2013-01-08 15:56:10

标签: autotools autoconf

我需要在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]。我也知道DEPS变量的评估不是untile的./configure被调用,而m4_foreach_w需要先前的DEPS值。

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

2 个答案:

答案 0 :(得分:1)

你可以尝试:

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

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

答案 1 :(得分:0)

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

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

<强> elib.def

autogen definitions elib;

elib = { name="app1"; };
elib = { name="app2"; };

然后使用如下模板文件调用autogen

<强> gen.tpl

[+ autogen5 template 
m4=%s.m4
(setenv "SHELL" "/bin/sh") +]#
[+ (dne "# " "# ") +]
# whatever comment for the macro
AC_DEFUN([CHECK_MY_ELIBS],
[
[+
FOR elib "\n" +]AC_ERLANG_CHECK_LIB([[+name+]])[+ENDFOR+]
])

将输出一个宏 elib.m4

...
# whatever comment for the macro
AC_DEFUN([CHECK_MY_ELIBS],
[
AC_ERLANG_CHECK_LIB([app1])
AC_ERLANG_CHECK_LIB([app2])
])

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

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