我的C ++项目的源文件组织在./src
的嵌套子目录中。我的Makefile中有一个模式规则,该规则将所有.cpp
源文件编译为对象:
$(OBJDIR)/%.o: %.cpp makefile
$(CXX) -c $< -o $@
由于我使用的是这种模式,而不是为每个源文件编写一个编译规则,因此我需要告诉make
通过./src
递归查找这些先决条件。现在我有:
VPATH := $./src/:./src/folder1:./src/folder2:./src/folder3
这有效,但是感觉很不雅致,而且当我不可避免地忘记添加新文件夹时,也会引起错误。
希望有人有更好的解决方案!
答案 0 :(得分:1)
gmake本身不具有递归目录遍历的任何功能,因此您必须求助于$(shell ...)
:
VPATH := $(shell find src -type d -print | tr '\012' ':' | sed 's/:$$//')
调整shell脚本以获得正确的语义。您想使用:=
运算符,以便对此进行一次评估。
答案 1 :(得分:1)
您可以通过搜索子目录并用冒号替换空格来像您一样自动构建VPATH
变量:
space :=
space +=
VPATH := $(subst $(space),:,$(shell find src -type d))
这假定您的目录或文件名中没有空格。
使用这种方法,我不清楚如果两个不同子目录中的两个源文件具有相同的名称,该怎么办–但这似乎与您的整体设置有关,而不是与您对{{ 1}}。
有关VPATH
可变技巧,请参阅漂亮的Escaping comma and space in GNU Make博客文章。