生成automake中生成的源列表(一个foreach)

时间:2011-09-16 15:59:32

标签: makefile autotools automake

我目前正在使用模板进行相当广泛的项目,并在实例化期间遇到内存限制。我已将实例化拆分为许多非常简单的文件,这些文件都是仅包含的三行文件。

我让它们由Makefile.am中的规则生成。现在我有一个很长的文件列表,应该在我的Makefile中生成,并希望使用类似foreach的表达式重构此列表。更具体的说法:我有一个像

这样的行
libfoo_la_SOURCES = a_0.cpp a_1.cpp ... b_0.cpp b_1.cpp ... c_0.cpp c_1.cpp ...

可以更简洁地表达为

libfoo_la_SOURCES = $(foreach i,a b ...,$(foreach j,0 1 ...,$i_$j.cpp))

然而,第二个结构不仅被automake警告,而且也不起作用:以这种方式给出的文件既不编译也不清理。

我目前的解决方法是通过shell脚本生成此文件列表。

如何实现此迭代的任何想法?

2 个答案:

答案 0 :(得分:4)

我会忘记制作循环:GNU扩展不是标准的,并且不被Automake理解。您可以在此处使用的一个标准(和便携式)make构造是macro expansion with substitution$(var:subst1=subst2)在替换任何后缀$(var)之后会扩展为subst1的值subst2之后的一个词。 Automake了解这一点。

如果subst1为空,与$(var:=subst2)中一样,则会将subst2追加到$(var)中的所有文件。您可以使用它来构建文件列表,如下所示:

f = a b c d e f
g = $(f:=_0) $(f:=_1) $(f:=_2) $(f:=_3)
all_files = $(g:=.cpp)

echo:
        @echo $(all_files)

使用上述make echo投放Makefile会显示从a_0.cppf_3.cpp的所有文件。

答案 1 :(得分:1)

和你一样,我发现GNU make foreach函数不会像这样工作,因为 在生成Makefile时,源需要存在。因此,我使用GNU Autogen(也here)生成一个makefile片段,该片段随后包含在Makefile.am中。所以它可能与你的shell脚本方法没什么不同。