在Makefile中使用通配符函数是否可以排除某些源文件不参与编译过程?
比如有多个源文件:
src/foo.cpp
src/bar.cpp
src/...
那么在我的 makefile 中,我有以下内容:
SRC_FILES = $(wildcard src/*.cpp)
但是我想排除 bar.cpp 文件,这是否可能?
如果您正在使用GNU Make,则可以使用filter-out
函数:
SRC_FILES := $(wildcard src/*.cpp)
SRC_FILES := $(filter-out src/bar.cpp, $(SRC_FILES))
或者作为一行代码:
SRC_FILES = $(filter-out src/bar.cpp, $(wildcard src/*.cpp))
使用find来实现它 :)
SRC_FILES := $(shell find src/ ! -name "bar.cpp" -name "*.cpp")
EXCLUDE=$(subst src/bar.cpp,,${SRC_FILES})
Unix glob模式src/[!b]*.cpp排除了所有以b开头的src文件。
然而,只有当bar.cpp是唯一以b开头的src文件或者你愿意将其重命名为以唯一字符开头时,才能起作用。
.SECONDEXPANSION
通配符和模式替换时,此方法非常有效,例如locales/%/_bundle.ftl: $$(wildcard locales/%/[!_]*.ftl)
。谢谢! - zanona如果您想将所有内容合并为一个调用:
g++ -g $(filter-out excludedFile.cpp, $(wildcard *.cpp)) -o main
,其中正常的调用是g++ -g *.cpp -o main
如果您还想运行它:
g++ -g $(filter-out excludedFile.cpp, $(wildcard *.cpp)) -o main && ./main
Makefile
新手来说,阅读完这个优秀的回答后,建议查找一下等号(=
)和冒号等于号(:=
)之间的区别,并了解为什么通常情况下应尽可能使用:=
! - Tomasz Gandor:=
:"这些定义可以包含变量引用,在定义之前将被扩展"。 - mems