2011-03-16 55 views
5

我做一些Makefile的重構,並試圖找出最簡潔的方式來實現一個Makefile執行以下操作:簡明的Makefile

  1. 有具有列出的所有源文件中的一個變量(既可以是C和C++文件)
  2. 所有對象文件都在OBJ_DIR
  3. 如果不存在

這對象目錄中創建生成是我到目前爲止有:

... 

OBJ_DIR = obj/ 
BIN_DIR = bin/ 
PROGRAM = program 

SRCS = test1.cpp test2.c 

OBJS = $(addprefix $(OBJ_DIR), \ 
     $(patsubst %.cpp, %.o, \ 
     $(patsubst %.c, %.o, $(SRCS)))) 

$(BIN_DIR)$(PROGRAM) : $(OBJS) 
    $(CREATE_OUT_DIR) 
    $(LINK) 

$(OBJ_DIR)%.o : %.c 
    $(CREATE_OBJ_DIR) 
    $(CCOMPILE) 

$(OBJ_DIR)%.o : %.cpp 
    $(CREATE_OBJ_DIR) 
    $(CPPCOMPILE) 

... 

我想消除每個.o編譯對$(CREATE_OBJ_DIR)的調用。有人知道怎麼做嗎?我嘗試添加這一點,但那就不是建立目標文件:

$(OBJS): | $(OBJ_DIR) 

$(OBJ_DIR): 
    $(CREATE_OBJ_DIR) 
+0

我看到這個設計的問題。你如何解釋標題依賴關係?我通常使用'src = $(shell find ./ --name「* .cpp」)來編寫makefile,並使用GCC'-M'開關爲我處理依賴關係。這樣,我爲我的所有項目都有一個簡短的可重用makefile。至於你的實際問題,爲什麼不事先創建'obj'目錄? – 2011-03-16 13:29:04

+0

不完全是答案,但您是否已經查看了'Makefile'的替代方案? 'SConstruct'出現在我的腦海裏(很棒),但還有很多其他工具可以很好地處理這些問題。 – ereOn 2011-03-16 13:35:53

+0

@Alexandre:我也正在研究頭文件依賴關係。你有一個很好的例子來說明如何做到這一點? – waffleman 2011-03-17 13:50:04

回答

3

您似乎已經解決了你的第一個觀點:讓他們都在同一個變量(我不應該覺得你真的需要將它們分成TEMP1和TEMP2喜歡你,只是有不同的生成規則)

對於第二點,你可以告訴編譯器輸出目標文件(G ++它是這樣的:

g++ -c MySourceFile.cpp -o obj/MySourceFile.o 

這種情況的生成規則將如下所示:

obj/%.o: %.cpp 
    g++ -c $*.cpp -o obj/$*.o 

而你的第三點也很容易解決,因爲你可以有一個構建規則(在列出所有對象之前,只需將目錄名稱放入目標的依賴項列表中),構建規則將如下所示

obj: 
    mkdir obj 

編輯:或以下的代碼示例:

$(BIN_DIR)$(PROGRAM) : $(BIN_DIR) $(OBJS) 
$(LINK) 

$(BIN_DIR): 
    $(CREATE_OUT_DIR) 
+0

目錄依賴關係應該僅限於順序依賴關係。 – 2011-03-16 14:31:40

+0

我將目標文件列表生成壓縮成一個命令。謝謝你的提示。 – waffleman 2011-03-17 13:55:42

1

至於你的第三個問題:這個問題有been asked here before。不幸的是,沒有真正的好的答案,你需要從答案中找到最不可思議的答案。就我個人而言,我投票選擇了標記文件解決方案。

0

這是我做的:

$(OBJ_LOC)/%.o: $(SRC_LOC)/%.c 
    @[ -d $(OBJ_LOC) ] || mkdir -p $(OBJ_LOC) 
    g++ ... 

但是,我在看非常INTE這些其他的答案休息。