Makefile:使用多个Makefile
我有一个项目,里面有很多makefile。因为有时候我只需要编译项目的某些部分,所以我决定在每个目录中都有一个makefile。但是当我想要运行包含所有其他文件的主makefile来编译我的项目时,它会给我带来很多错误。 这是我的项目树: 根“makefile” -folder1'foo1.cfoo2.cmakefile' -folder2“生成文件” --folder2-1“foo3.cfoo4.cmakefile” --folder2-2“foo5.c生成文件” 最后一个目录中的每个makefile都包含在它的上层makefile中。但它不运行主makefile。我真的是GNU制造的新手,我想有这样的东西,但我不知道怎么做。我刚写了一些make脚本,但不起作用。Makefile:使用多个Makefile,makefile,Makefile,我有一个项目,里面有很多makefile。因为有时候我只需要编译项目的某些部分,所以我决定在每个目录中都有一个makefile。但是当我想要运行包含所有其他文件的主makefile来编译我的项目时,它会给我带来很多错误。 这是我的项目树: 根“makefile” -folder1'foo1.cfoo2.cmakefile' -folder2“生成文件” --folder2-1“foo3.cfoo4.cmakefile” --folder2-2“foo5.c生成文件” 最后一个目录中的每个make
我只想有一些东西,我可以分别编译项目的各个部分,或者使用多个makefile编译整个项目 无论如何,我给你看些东西,希望能对你有所帮助:
all:
@$(MAKE) -C subfolder
或者,如果要使用*.mk作为子生成文件,可以编写:
all:
@$(MAKE) -C busfolder -f somename.mk
我向您展示我的示例,我的目录如下所示:
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
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
我的顶级makefile如下所示:
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
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。sub-DIR makefile,我只写了一个简单的示例供您参考:
LIB = $(MAKE_DIR)/libs/yourmodulename.a
SRCS = $(wildcard *.c)
OBJS = $(patsubst %.c, %.o, $(SRCS))
$(LIB): $(OBJS)
@mkdir -p ../libs
@$(AR) cr $@ $^
@echo " Archive $(notdir $@)"
$(OBJS): $(SRCS)
@$(CC) $(CFLAGS) -c $^
@echo " CC $(OBJS)"
.PHONY: clean
clean:
@$(RM) -f $(LIB) $(OBJS)
@$(RM) -f *.expand
@echo " Remove Objects: $(OBJS)"
对于生成最终目标文件(如a.out)的makefile,有点不同,因为我使用子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 $@
@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))"
您可以使用TOP
makefile
中的-C
选项来编译每个目录。您可以解释更多吗?您提到了很多错误,但您从未说过它们是什么,也没有提供makefile的任何部分。对于每个文件夹,您都希望使用@How提到的$(MAKE)-C folder\u name
。另外,您确定使用的格式正确吗?要创建的任何目标都应显示在第一列中,而实际创建这些目标的规则应缩进一个制表符(不是空格;即使按了制表键,编辑器也可能使用空格)。谢谢。make-C目录解决了我的问题。我认为如果我包含子makefile并调用目标,它将编译它们。但这是错误的。我用的是-C,现在可以用了。谢谢。:)非常感谢@How Chen