2013-03-01 79 views
4

我有一套我想編譯的.cpp文件。這些.cpp文件位於分層目錄結構中。我希望相應的.o文件都以一個構建文件夾結束。Makefile動態規則w /沒有GNU-make模式

這裏是我如何獲得GNU使枚舉文件...

SRCS = \ 
    $(wildcard $(CODE)/**/*.cpp) \ 
    $(wildcard $(CODE)/AlgebraLibraries/**/*.cpp) \ 
    $(wildcard $(CODE)/Calculator/Environments/**/*.cpp) 

BARE_SRCS = $(notdir $(SRCS)) 
BARE_OBJS = $(BARE_SRCS:.cpp=.o) 
OBJS = $(addprefix $(BUILD)/, $(BARE_OBJS)) 

這樣做之後,我不知道如何創建,將創建從.cpp文件.o文件的規則。直覺上,我想要做的是以下僞代碼。

for i=0, N do # <-- a for-loop! 
    $(OBJS)[i]: $(SRCS)[i] # <-- the rule! 
    $(CPP) -c $(SRCS)[i] -o $(OBJS)[i] # <-- the recipe 
end 

當然,這不是有效的GNU使代碼,但我希望你明白它是什麼在這裏,我想要做的事。以下將無法使用。

%.o: %.cpp 
    $(CPP) -c $< -o [email protected] 

這不起作用,因爲GNU make會匹配%符號,假設.o文件位於.cpp文件的旁邊。

我所知道的所有這些方法的替代方法都是可行的,但是會非常單調乏味,它將所有規則列舉爲明確的規則。這是遲緩的!一定有更好的方法。

我一直在研究GNU make生成規則的能力,但似乎沒有辦法沒有內置邏輯來做。如果我能利用一些流程控制語句來生成我想要制定的規則,那將是非常好的。這是否要求太多的GNU-make?

無論如何,有沒有辦法做到我正在試圖用GNU make做什麼?如果是這樣,怎麼樣?

謝謝你的幫助!

回答

11

這看起來像......多項先進讓詭計工作:

all: $(OBJS) 

define ruletemp 
$(patsubst %.cpp, $(BUILD)/%.o, $(notdir $(1))): $(1) 
    $$(CPP) -c $$< -o [email protected] 
endef 

$(foreach src,$(SRCS),$(eval $(call ruletemp, $(src)))) 
+0

會不會gcc的抱怨,如果它是試圖爲'dir1/dir2/file.c'創建'$(BUILD)/ dir1/dir2/file.o',因爲目錄結構'$(BUILD)/ dir1/dir2'不存在? – Tuxdude 2013-03-02 02:42:57

+1

謝謝,謝謝! (http://www.gnu.org/software/make/manual/make.html#Eval-Function) - 我將閱讀更多關於這個,看看我是否可以使用它。我認爲這就是我正在尋找的...一種抽象make-file語法的方法。順便說一句,即使我不應該嘗試去做我在我的情況下所做的事情,但我確信在其他情況下,我試圖做的事至少是合法的。我也開始考慮果醬,但我不喜歡沒有人支持它的事實。 – user2125275 2013-03-02 05:51:34

+0

這工作,順便說一句。再次感謝!我的makefile看起來相當隱祕,但它至少可以作爲一些可以在make中完成的東西的例子。 – user2125275 2013-03-02 06:51:40