使用Makefile在编译过程中排除源文件

91

在Makefile中使用通配符函数是否可以排除某些源文件不参与编译过程?

比如有多个源文件:

src/foo.cpp
src/bar.cpp
src/...

那么在我的 makefile 中,我有以下内容:

SRC_FILES = $(wildcard src/*.cpp)

但是我想排除 bar.cpp 文件,这是否可能?

5个回答

168

如果您正在使用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))

8
对于Makefile新手来说,阅读完这个优秀的回答后,建议查找一下等号(=)和冒号等于号(:=)之间的区别,并了解为什么通常情况下应尽可能使用:= - Tomasz Gandor
3
当变量的定义需要解决其他变量时,请使用:="这些定义可以包含变量引用,在定义之前将被扩展" - mems
1
作为@TomaszGandor评论的附录:请参阅GNU make文档中的变量的两种类型 - Eike P.

18

使用find来实现它 :)

SRC_FILES := $(shell find src/ ! -name "bar.cpp" -name "*.cpp")

1
你是不是想说 $(shell find src/ ... )? - Dima Chubarov

7
您可以使用Makefile的subst函数:
 EXCLUDE=$(subst src/bar.cpp,,${SRC_FILES})

5

Unix glob模式src/[!b]*.cpp排除了所有以b开头的src文件。

然而,只有当bar.cpp是唯一以b开头的src文件或者你愿意将其重命名为以唯一字符开头时,才能起作用。


当您还需要使用.SECONDEXPANSION通配符和模式替换时,此方法非常有效,例如locales/%/_bundle.ftl: $$(wildcard locales/%/[!_]*.ftl)。谢谢! - zanona
@zanona,不用谢!我很高兴你觉得它有用。 - ma11hew28

0

如果您想将所有内容合并为一个调用:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接