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