如何让makefile在子目录makefile中找到目标
发布时间:2020-12-16 09:46:33 所属栏目:百科 来源:网络整理
导读:如何使顶级Makefile调用子目录Makefile中的所有目标? 我的文件夹结构是这样的 /Makefile/src/Makefile 我编写/ src / Makefile中的所有目标,但现在我想编写另一个/ Makefile来简化我的工作.如何编写这个顶级Makefile? 解决方法 您可以在TOP makefile中使用
如何使顶级Makefile调用子目录Makefile中的所有目标?
我的文件夹结构是这样的 /Makefile /src/Makefile 我编写/ src / Makefile中的所有目标,但现在我想编写另一个/ Makefile来简化我的工作.如何编写这个顶级Makefile? 解决方法
您可以在TOP makefile中使用
all: @$(MAKE) -C src 例如,如果你不在子目录中使用makefile,你可以使用somename.mk all: @$(MAKE) -C src -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 我的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 .PHONY: lint lint: $(MAKE) -C debug -f debug.mk lint 它会在编译期间调用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 $@ $^ @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)" @echo " Remove Libraries: $(notdir $(LIB))" .PHONY: lint lint: $(LINT) $(INC_SRCH_PATH) $(SRCS) 对于makefile,生成目标文件有点不同,因为我使用sub makefile生成LIB文件,并使用root.mk生成目标: PROG = ../prog/DEMO SRCS = $(wildcard *.c) OBJS = $(patsubst %.c,$(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))" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |