我目前正在使用模板进行相当广泛的项目,并在实例化期间遇到内存限制。我已将实例化拆分为许多非常简单的文件,这些文件都是仅包含的三行文件。
我让它们由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脚本生成此文件列表。
如何实现此迭代的任何想法?
答案 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.cpp
到f_3.cpp
的所有文件。
答案 1 :(得分:1)
和你一样,我发现GNU make foreach函数不会像这样工作,因为 在生成Makefile时,源需要存在。因此,我使用GNU Autogen(也here)生成一个makefile片段,该片段随后包含在Makefile.am中。所以它可能与你的shell脚本方法没什么不同。