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


69

是否可以使用Makefile中的通配符功能在编译过程中排除源文件?

就像有几个源文件一样,

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

然后在我的makefile文件中,

SRC_FILES = $(wildcard src/*.cpp)

但是我想排除bar.cpp。这可能吗?

Answers:


132

如果您使用的是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))

4
MakefileS陌生?因此,在阅读了这个出色的答案之后,请查找=和之间的区别:=(两者都在上面使用),并找出为什么通常会:=尽可能使用它!
Tomasz Gandor 2014年

2
使用:=时,该变量的定义需要解决的其他变量:“这些定义可以包含变量引用由定义之前,这将扩大”
MEMS

1
作为@TomaszGandor的注释的附录:请参见GNU make文档中的变量的两种风格。
jhin 2015年

14

使用查找:)

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

您是说$(shell find src / ...)吗?
Dmitri Chubarov


4

Unix的水珠图案的src / [!B] *。CPP排除以b开头的SRC文件。

但是,如果bar.cpp是唯一以b开头的src文件,或者您愿意将其重命名为以唯一字符开头,则这仅会起作用。


当您还必须使用.SECONDEXPANSION通配符和模式替换(例如)时locales/%/_bundle.ftl: $$(wildcard locales/%/[!_]*.ftl),此方法非常有用。谢谢!
zanona

@zanona,不客气!很高兴您发现它有用。
ma11hew28 '20
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.