0

我需要在 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 的值。

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

4

2 回答 2

1

你可以试试:

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

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

于 2013-01-08T17:51:09.513 回答
0

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

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

elib.def

自动生成定义 elib;

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

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

根.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])
])

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

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

于 2013-01-08T19:36:44.860 回答