定义递归makefile调用的目标

时间:2018-12-20 14:11:43

标签: makefile gnu-make

我需要什么:使LAUNCHMAKES目标依赖于某种东西,以便在未更改源文件时不调用子makefile。

SUB MakeFile包含目录中所有.cpp文件的收集,并将它们存储到obj /。然后,没有更改任何src文件,它仍会调用并产生“进入目录-离开目录”。我需要在不需要时摆脱它。 我已经读过--no-print-directory,但事实并非如此。

项目的结构:

Project
|----project
|    |----dir1
|    |    |----src1.cpp
|    |    `----Makefile
|    |----dir2
|    |    |----src2.cpp
|    |    `----Makefile
     `----main.cpp
|----obj
|    |----src1.o
|    |----src2.o
|    `----main.o
|----MakeFile

代码:

release: LAUNCHMAKES obj/main.o
    $(CXX) $(CXXFLAGS) main.o src1.o src2.o -o result

LAUNCHMAKES: (?)
    for i in $(SUBDIRS); do \
    $(MAKE) -C $$i CXXFLAGS=$(CXXFLAGS);  \
    done

obj/main.o: project/main.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

1 个答案:

答案 0 :(得分:1)

不是解决问题的方法,而是一个非递归Makefile的示例,只是向您展示它对您的简单示例项目而言有多简单:

SUBDIRS := dir1 dir2
OBJDIR  := obj
SRCS    := $(shell find . -type f -name '*.cpp')
OBJS    := $(patsubst %.cpp,$(OBJDIR)/%.o,$(notdir $(SRCS)))
VPATH   := $(SUBDIRS)

.PHONY: release clean

release: result

result: $(OBJS)
    $(CXX) $(LDFLAGS) $^ -o $@

$(OBJDIR)/%.o: %.cpp
    $(CXX) $(CXXFLAGS) -c $< -o $@

clean:
    rm -f $(OBJDIR)/*.o result

演示:

$ make
g++  -c dir2/src2.cpp -o obj/src2.o
g++  -c dir1/src1.cpp -o obj/src1.o
g++  -c main.cpp -o obj/main.o
g++  obj/src2.o obj/src1.o obj/main.o -o result