thi*_*ton 3 automake makefile autotools
我目前正在开发一个使用模板相当广泛的项目,并在实例化过程中遇到内存限制。我已将实例化为许多非常简单的文件,这些文件都是仅包含包含的三行文件。
我让这些由 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 ...
Run Code Online (Sandbox Code Playgroud)
可以更简洁地表示为
libfoo_la_SOURCES = $(foreach i,a b ...,$(foreach j,0 1 ...,$i_$j.cpp))
Run Code Online (Sandbox Code Playgroud)
然而,第二个构造不仅被 automake 警告,而且不起作用:以这种方式给出的文件既没有编译也没有清理。
我当前的解决方法是通过 shell 脚本生成此文件列表。
任何想法如何实现这个迭代?
我会忘记制作循环:GNU 扩展不是标准的,Automake 无法理解。make您可以在此处使用的一种标准(和可移植)结构是带有替换的宏扩展: $(var:subst1=subst2)将单词的$(var)任何后缀替换为后,将扩展为值。Automake 明白这一点。subst1subst2
如果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)
Run Code Online (Sandbox Code Playgroud)
运行make echo上面的Makefile将显示所有文件从a_0.cpp到f_3.cpp.