我的文件夹结构是这样的
/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)/driverINCLUDE_DIR := $(MAKE_DIR)/includeDEBUG_DIR := $(MAKE_DIR)/deBUGINC_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)/libscolor_ON = colorcolor_OFF = CC = $(color_ON)gcc#CC = $(color_OFF)gccLD = ldliNT = splintliBS := -ldriver -ldeBUG -lmw -lm -lpthreadCFLAGS :=CFLAGS += $(INC_SRCH_PATH) $(liB_SRCH_PATH) CFLAGS += -Wall -O -ggdb -Wstrict-prototypes -Wno-pointer-sign -finstrument-functions -fdump-rtl-expandCFLAGS += -DDEBUG -D_REENTRANTLDFLAGS :=export MAKE_DIR CC LD CFLAGS LDFLAGS liBS liNT INC_SRCH_PATHall: @$(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: cleanclean: @$(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: lintlint: $(MAKE) -C deBUG -f deBUG.mk lint
它会在编译期间调用sub DIR * .mk.子DIR makefile,我只是写一个简单的例子供你参考:
liB = $(MAKE_DIR)/libs/yourmodulename.aSRCS = $(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: cleanclean: @$(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/DEMOSRCS = $(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: cleanclean: @$(RM) -f $(OBJs) $(PROG) @$(RM) -f *.expand @$(RM) -rf ../prog ../libs @echo " Remove Objects: $(OBJs)" @echo " Remove librarIEs: $(notdir $(PROG))"总结
以上是内存溢出为你收集整理的如何让makefile在子目录makefile中找到目标全部内容,希望文章能够帮你解决如何让makefile在子目录makefile中找到目标所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)