2012-04-23 65 views
42

是否可以在編譯過程中使用通配符函數在Makefile中排除源文件?使用Makefile編譯時排除源文件

像有幾個源文件,

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

然後在我的makefile我有,

SRC_FILES = $(wildcard src/*.cpp) 

但我想排除bar.cpp。這可能嗎?

回答

5

可以使用的Makefile SUBST功能:

EXCLUDE=$(subst src/bar.cpp,,${SRC_FILES}) 
9

使用爲它找到:)

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

你的意思是$(shell找到src/...)? – 2012-04-23 07:45:24

+0

是的,忘記了:) – K1773R 2012-04-23 07:50:43

69

如果您使用GNU製作,您可以使用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)) 
+2

新的'Makefile's?因此,在閱讀完這個優秀的答案之後,請查看'='和':='(以上都使用過)之間的區別,並找出爲什麼您通常會盡可能使用':='! – 2014-08-01 14:07:30

+1

當變量的定義需要解析其他變量時,使用':=':[「這些定義可以包含變量引用,它將在定義完成之前展開」](https://www.gnu.org/software/make/ manual/html_node/Setting.html#index-_003a_003d-1) – mems 2014-11-05 21:31:44

+0

作爲@TomaszGandor評論的附錄:參見[變量的兩個風格](https://www.gnu.org/software/make/manual/ html_node/Flavors.html#Flavors)在GNU make文檔中。 – jhin 2015-09-14 10:12:39

0

Unix glob模式src/[!b] *。cpp排除以b開頭的所有src文件。

但是,只有bar.cpp是以b開頭的唯一src文件,或者如果您願意將其重命名爲以獨特字符開頭,那纔會起作用。