我做一些Makefile的重構,並試圖找出最簡潔的方式來實現一個Makefile執行以下操作:簡明的Makefile
- 有具有列出的所有源文件中的一個變量(既可以是C和C++文件)
- 所有對象文件都在OBJ_DIR
- 如果不存在
這對象目錄中創建生成是我到目前爲止有:
...
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)
我看到這個設計的問題。你如何解釋標題依賴關係?我通常使用'src = $(shell find ./ --name「* .cpp」)來編寫makefile,並使用GCC'-M'開關爲我處理依賴關係。這樣,我爲我的所有項目都有一個簡短的可重用makefile。至於你的實際問題,爲什麼不事先創建'obj'目錄? – 2011-03-16 13:29:04
不完全是答案,但您是否已經查看了'Makefile'的替代方案? 'SConstruct'出現在我的腦海裏(很棒),但還有很多其他工具可以很好地處理這些問題。 – ereOn 2011-03-16 13:35:53
@Alexandre:我也正在研究頭文件依賴關係。你有一個很好的例子來說明如何做到這一點? – waffleman 2011-03-17 13:50:04