2013-07-27 5 views
3

У меня есть проект, в котором есть много make-файлов внутри него. Потому что иногда мне нужно скомпилировать только некоторые части моего проекта, поэтому я решил создать один файл makefile в каждом каталоге. Но когда я хочу запустить основной make-файл, который включает в себя все остальные, чтобы скомпилировать мой проект, он дает мне много ошибок. Это мой проект дерево:Makefile: используйте несколько make-файлов

корень 'Makefile'

-folder1 'foo1.c foo2.c Makefile'

-folder2 'Makefile'

foo3 --folder2-1» .c foo4.c Makefile»

--folder2-2 'foo5.c Makefile'

Каждый Makefile в самом последнем каталоге были включены в это верхний м akefile. Но он не запускает основной файл makefile. Я действительно новичок в GNU make, и я хочу иметь что-то подобное, но я не знаю, как это сделать. Я просто написал некоторые скрипты, но это не сработает. Я просто хочу иметь что-то, что я могу скомпилировать части проектов отдельно или скомпилировать весь проект, используя несколько make-файлов.

+0

вы можете использовать '-C' опцию в TOP' makefile' компилировать каждый каталог –

+0

можете ли вы объяснить, пожалуйста, больше? – MadZarx

+0

Вы упомянули много ошибок, но вы никогда не говорили, что они были или предоставили какую-либо часть вашего файла makefile. Для каждой папки вы хотите использовать '$ (MAKE) -C имя_папки' как @How. Кроме того, вы уверены, что используете правильный формат? Любые цели для создания должны отображаться в первом столбце, тогда как правила для фактического создания этих целей должны быть отступом одним символом табуляции (а не пробелами, ваш редактор может использовать пробелы, даже если вы нажимаете клавишу табуляции). –

ответ

9

любым способом, я покажу вам кое-что и надежда может помочь вам:

all: 
    @$(MAKE) -C subfolder 

или если вы хотите использовать * .mk в качестве суб Makefile, вы можете написать:

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

I показать вам мой пример, мой 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 

и мой TOP 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 

он будет вызывать sub DIR * .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) является немного по-другому, потому что я использую суб Makefile для генерировать 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

Смежные вопросы