2013-07-05 17 views
1

我的目錄有很多類似名稱的文件:test1.cpp,test2.cpp,test3.cpp等。我想將所有測試文件編譯爲可執行文件test1,test2,test3等。它們不必鏈接對彼此。在Makefile中,我該如何定義通配符模式?

CC = clang++ 
CXX = clang++ 

INCLUDES = 

CFLAGS = -g -Wall $(INCLUDES) 
CXXFLAGS = -g -Wall $(INCLUDES) 

LDFLAGS = -g 
LDLIBS = 

.PHONY: default 
default: test1 test2 

test1: 

test2: 

而不是指定test1,test2,我想要使用通配符或模式匹配或沿着這些行的東西。我該怎麼做呢?

+2

我建議閱讀[Make manual](http://www.gnu.org/software/make/manual/make.html),然後搜索「wildcard」;) –

+0

呃...一個簡單的答案是不使用makefile,而是在環境中定義變量,然後使用隱式make規則:'make test1',如果目錄中有一個'test1.cpp'文件(並且沒有makefile)會運行編譯器 –

回答

2

大衛羅德里克斯有正確的想法:make有內置的規則,將爲您處理這個。不過,我會建議使用makefile而不是在你的環境中設置變量,所以你可以很容易地執行構建另一個用戶等環境設置不正確。您也可以使用makefile來創建default目標。

這是不夠好:

CC = clang++ 
CXX = clang++ 

INCLUDES = 

CFLAGS = -g -Wall $(INCLUDES) 
CXXFLAGS = -g -Wall $(INCLUDES) 

LDFLAGS = -g 
LDLIBS = 

.PHONY: default 
default: $(basename $(wildcard test*.cpp)) 

這就是你所需要的!

+0

謝謝。我將如何爲此創建一個乾淨的?可執行文件沒有方便的擴展名來標識它們。 – ask

+0

對於你來說,如何擴展我的例子來使用一個乾淨的規則應該是非常簡單的:函數序列'$(basename $(通配符測試* .cpp))'會得到所有可執行文件的名稱,所以你可以刪除它們。 – MadScientist

+0

可執行文件將被命名爲「test1」,「test2」等。我需要類似$(basename $(通配符測試*)<我需要添加一些選項來忽略具有.cpp或.o的文件> )) – ask