2012-06-08 53 views
3

我正在開發一個包含多個靜態庫的項目。我建立它們的方式總是一樣的。我想知道如何對所有庫重用這些規則,並避免爲每個庫複製&粘貼。這裏是一個構建'foo'庫的例子。重用相同的規則來構建不同的目標

# inputs 
# 
FOO_LIB_NAME := libfoo.a 
FOO_SRC_DIR := $(SRC_DIR)/foo 
FOO_SRC_FILES := \ 
     foo_file1.cc        \ 
     subdir/foo_file2.cc      \ 
     subdir/foo_file3.cc      \ 
     ... 
FOO_CFLAGS := 

# rules 
# 
FOO_SRC_FILES := $(addprefix $(FOO_SRC_DIR)/,$(FOO_SRC_FILES)) 
FOO_OBJ_FILES := $(subst .cc,.o,$(FOO_SRC_FILES)) 

$(FOO_LIB_NAME): $(FOO_OBJ_FILES) 
     $(AR) rc [email protected] $^ 

$(FOO_OBJ_FILES): %.o: %.cc 
     $(CXX) $(COMMON_CFLAGS) $(FOO_CFLAGS) $< -o [email protected] 

此外,如果您對代碼的以前摘錄有任何意見,我會很高興知道它。我在編寫Makefiles方面很新穎。

在此先感謝

+0

你嘗試'包括makefile.common' – deebee

+0

嗨deebee,你可以給我使用一個共同的生成文件的例子嗎? – user1192525

+0

可能的重複[避免重複GNU Make規則](http://stackoverflow.com/questions/7149989/avoid-duplicating-gnu-make-rules) –

回答

3

您可以使用模板和使eval功能做到這一點。該GNU Make Manual在​​

下面的例子是從手動的例子:

PROGRAMS = server client 

server_OBJS = server.o server_priv.o server_access.o 
server_LIBS = priv protocol 

client_OBJS = client.o client_api.o client_mem.o 
client_LIBS = protocol 

# Everything after this is generic 

.PHONY: all 
all: $(PROGRAMS) 

define PROGRAM_template = 
$(1): $$($(1)_OBJS) $$($(1)_LIBS:%=-l%) 
ALL_OBJS += $$($(1)_OBJS) 
endef 

$(foreach prog,$(PROGRAMS),$(eval $(call PROGRAM_template,$(prog)))) 

$(PROGRAMS): 
     $(LINK.o) $^ $(LDLIBS) -o [email protected] 

clean: 
     rm -f $(ALL_OBJS) $(PROGRAMS) 
+0

謝謝,我認爲這是我正在尋找的結構:) – user1192525

+0

別客氣。當心雙'$$' – dwikle

相關問題