制定配方以防止重建非依赖目标

我有以下项目目录结构:

Prog /include /include/dir1 /include/dir2 /src /src/dir1 /src/dir2 

App1依赖于mod1和mod2,其中App2仅依赖于mod1。

使用下面表示的makefile,模块和应用程序都可以正确构建 – 但是如果我对mod2进行了更改然后执行’make all’,即使App2没有依赖项,它也会被重建。

这是因为OBJ被传递到目标构建配方中的是所有OBJ,而不仅仅是当前目标所需的特定OBJ。

我想知道makefile的哪些更改只能将依赖对象传递给正在构建的当前目标。

makefile:

 CC := g++ LD := g++ TARGETS := app1 app2 MODULES := mod1 mod2 INC_DIR := $(addprefix include/,$(MODULES)) SRC_DIR := $(addprefix src/,$(MODULES)) BUILD_DIR := $(addprefix build/,$(MODULES)) SRC := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.cpp)) OBJ := $(patsubst src/%.cpp,build/%.o,$(SRC)) INCLUDES := -Iinclude $(addprefix -I,$(INC_DIR)) vpath %.cpp $(SRC_DIR) define make-goal $1/%.o: %.cpp $(CC) $(INCLUDES) -c $$< -o $$@ endef .PHONY: all checkdirs clean all: checkdirs $(TARGETS) $(TARGETS) : %: $(OBJ) $(CC) $(INCLUDES) -o build/$@ src/$@.cpp $^ checkdirs: $(BUILD_DIR) $(BUILD_DIR): @mkdir -p $@ 

makefile已从以下答案转发: https : //stackoverflow.com/a/2484343

假冒’全部’目标中列出了三个目标。

每个都应该列出一个单独的规则,而不是将两个目标’app1’和’app2’混为一谈。

注意:任何常见的文件更改/编译都将导致重新创建两个目标。

将’SRC’分解为SRC_APP1 SRC_APP2然后在每个app1和app2目标中使用适当的SRC_APPx宏。

对’OBJ’宏和’INCLUDES’宏使用类似的分隔

不要使用’foreach’规则,因为这要求构建所有目标

还有其他一些细节需要解决,但上述内容应该指向正确的方向。

有一点应该有很大帮助。

将app1和app2的目标文件放在单独的控制器中,并使makefile查看每个appx的相应目录