我需要在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值。
知道如何解决这个问题吗?
答案 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),但这并不太难。