2013-07-27 75 views
3

我有一個項目裏面有很多makefile。因爲有時我只需要編譯我的項目的一些部分,所以我決定在每個目錄中都有一個makefile。但是當我想運行包含所有其他編譯工具的主makefile時,它會給我帶來很多錯誤。 這是我的項目樹:Makefile:使用多個makefiles

根 '的makefile'

-folder1 'foo1.c foo2.c makefile文件'

-folder2 '生成文件'

--folder2-1「foo3 .C foo4.c makefile文件」

--folder2-2 'foo5.c makefile文件'

在最後目錄中的每個生成文件已被列入到它的高m akefile。但它不運行主makefile。我對GNU make真的很陌生,我想要這樣的東西,但我不知道如何。我只寫了一些make腳本,但它不起作用。 我只想有一些東西可以分別編譯項目部分或使用多個makefile編譯整個項目。

+0

,你可以使用'-C'選項TOP'makefile'編譯每個目錄 –

+0

你能解釋更多嗎? – MadZarx

+0

您提到了很多錯誤,但您從未說過它們是什麼或提供了makefile的任何部分。對於每個文件夾,您都希望使用'$(MAKE)-C folder_name'作爲@How提到的。另外,你確定你使用的格式正確嗎?任何目標都應該出現在第一列中,而實際製作這些目標的規則應該由一個製表符縮進(不是空格;即使您點擊Tab鍵,編輯器也可能使用空格)。 –

回答

9

任何方式,我會告訴你的東西,希望可以幫到你:

all: 
    @$(MAKE) -C subfolder 

,或者如果你想使用* .mk爲你的makefile子,你可以寫:

all: 
    @$(MAKE) -C busfolder -f somename.mk 

我告訴你我的例子,我的DIR是這樣的:

TOPDIR-- Makefile 
| 
|-- debug 
| |-- debug.c 
| |-- debug.h 
| |-- debug.mk 
| |-- instrument.c 
| `-- uart_print.c 
|-- driver 
| |-- driver.c 
| |-- driver_ddi.c 
| |-- driver_ddi.h 
| |-- driver.h 
| `-- driver.mk 
|-- include 
| `-- common.h 
|-- Makefile 
|-- mw 
| |-- manager.c 
| `-- mw.mk 
|-- root 
| |-- main.c 
| `-- root.mk 

和我頂層Makefile的樣子:

MAKE_DIR = $(PWD) 

ROOT_DIR := $(MAKE_DIR)/root 
DRV_DIR  := $(MAKE_DIR)/driver 
INCLUDE_DIR := $(MAKE_DIR)/include 
DEBUG_DIR := $(MAKE_DIR)/debug 

INC_SRCH_PATH := 
INC_SRCH_PATH += -I$(ROOT_DIR) 
INC_SRCH_PATH += -I$(DRV_DIR) 
INC_SRCH_PATH += -I$(INCLUDE_DIR) 
INC_SRCH_PATH += -I$(DEBUG_DIR) 

LIB_SRCH_PATH := 
LIB_SRCH_PATH += -L$(MAKE_DIR)/libs 


COLOR_ON = color 
COLOR_OFF = 
CC = $(COLOR_ON)gcc 
#CC = $(COLOR_OFF)gcc 
LD = ld 

LINT = splint 

LIBS := -ldriver -ldebug -lmw -lm -lpthread 

CFLAGS := 
CFLAGS += $(INC_SRCH_PATH) $(LIB_SRCH_PATH) 
CFLAGS += -Wall -O -ggdb -Wstrict-prototypes -Wno-pointer-sign -finstrument-functions -fdump-rtl-expand 
CFLAGS += -DDEBUG -D_REENTRANT 

LDFLAGS := 

export MAKE_DIR CC LD CFLAGS LDFLAGS LIBS LINT INC_SRCH_PATH 

all: 
    @$(MAKE) -C debug -f debug.mk 
    @$(MAKE) -C driver -f driver.mk 
    @$(MAKE) -C mw -f mw.mk 
    @$(MAKE) -C root -f root.mk 

.PHONY: clean 
clean: 
    @$(MAKE) -C debug -f debug.mk clean 
    @$(MAKE) -C driver -f driver.mk clean 
    @$(MAKE) -C mw -f mw.mk clean 
    @$(MAKE) -C root -f root.mk clean 

它將在編譯期間調用子目錄* .mk。子DIR的makefile,我只寫你引用一個簡單的例子:

LIB = $(MAKE_DIR)/libs/yourmodulename.a 
SRCS = $(wildcard *.c) 
OBJS = $(patsubst %.c, %.o, $(SRCS)) 

$(LIB): $(OBJS) 
    @mkdir -p ../libs 
    @$(AR) cr [email protected] $^ 
    @echo " Archive $(notdir [email protected])" 

$(OBJS): $(SRCS) 
    @$(CC) $(CFLAGS) -c $^ 
    @echo " CC  $(OBJS)" 

.PHONY: clean 
clean: 
    @$(RM) -f $(LIB) $(OBJS) 
    @$(RM) -f *.expand 
    @echo " Remove Objects: $(OBJS)" 

的Makefile文件生成最終的目標文件(像a.out的)是有點不同,因爲我用的是子​​生成文件生成LIB文件,我用一個root.mk生成最終的目標:

PROG = ../prog/DEMO 

SRCS = $(wildcard *.c) 
OBJS = $(patsubst %.c, %.o, $(SRCS)) 

$(PROG): $(SRCS) 
    @mkdir -p ../prog 
    @$(CC) $^ $(CFLAGS) -Wl,-Map=$(PROG).map $(LIBS) -o [email protected] 
    @echo " Generate Program $(notdir $(PROG)) from $^" 

.PHONY: clean 
clean: 
    @$(RM) -f $(OBJS) $(PROG) 
    @$(RM) -f *.expand 
    @$(RM) -rf ../prog ../libs 
    @echo " Remove Objects: $(OBJS)" 
    @echo " Remove Libraries: $(notdir $(PROG))" 
+0

非常感謝你,謝謝你 – MadZarx