2012-04-23 15 views
42

Có thể loại trừ tệp nguồn trong quá trình biên dịch bằng cách sử dụng hàm ký tự đại diện trong một tệp Makefile không?Loại trừ tệp nguồn trong quá trình biên dịch bằng Makefile

Giống như có một vài file nguồn,

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

Sau đó, trong makefile của tôi, tôi có,

SRC_FILES = $(wildcard src/*.cpp) 

Nhưng tôi muốn loại trừ bar.cpp. Điều này có thể không?

Trả lời

5

Bạn có thể sử dụng chức năng Makefile subst:

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

sử dụng tìm cho nó :)

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

ý của bạn là $ (shell find src/...)? –

+0

có, hãy quên rằng :) – K1773R

69

Nếu bạn đang sử dụng GNU Make, bạn có thể sử dụng filter-out:

SRC_FILES := $(wildcard src/*.cpp) 
SRC_FILES := $(filter-out src/bar.cpp, $(SRC_FILES)) 

Hoặc dưới dạng một dòng:

SRC_FILES = $(filter-out src/bar.cpp, $(wildcard src/*.cpp)) 
+2

Mới đối với 'Makefile's? Vì vậy, sau khi đọc câu trả lời tuyệt vời này, hãy tìm kiếm sự khác biệt giữa '=' và ': =' (cả hai được sử dụng ở trên), và tìm hiểu, tại sao bạn thường muốn sử dụng ': =' bất cứ khi nào có thể! –

+1

Sử dụng ': =' khi định nghĩa của biến cần giải quyết các biến khác: ["các định nghĩa này có thể chứa tham chiếu biến sẽ được mở rộng trước khi định nghĩa được tạo"] (https://www.gnu.org/software/make/ manual/html_node/Setting.html # index-_003a_003d-1) – mems

+0

Là phụ lục cho nhận xét của @TomaszGandor: Xem [Hai Hương vị của Biến] (https://www.gnu.org/software/make/manual/ html_node/Flavors.html # Flavours) trong GNU tạo tài liệu. – jhin

0

Mẫu Unix glob src/[! B] *. Cpp không bao gồm tất cả các tệp src bắt đầu bằng b.

Điều đó chỉ có tác dụng, tuy nhiên, nếu bar.cpp là tệp src duy nhất bắt đầu bằng b hoặc nếu bạn sẵn sàng đổi tên nó để bắt đầu bằng ký tự duy nhất.

Các vấn đề liên quan