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

时间:2015-05-05 02:53:52

标签: c++ c build makefile dependencies

我有以下项目目录结构:

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

1 个答案:

答案 0 :(得分:1)

虚假中列出了三个目标&#39;所有&#39;目标

每个都应列出单独的规则, 而不是将两个目标集中在一起&#39; app1&#39;和&#39; app2&#39;在一起。

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

打破了SRC&#39;进入SRC_APP1 SRC_APP2然后在每个app1和app2目标中使用适当的SRC_APPx宏。

使用类似的分离“OBJ&#39;宏观和&#39;包括&#39;宏

不要使用&#39; foreach&#39;规则就是要求建立所有目标

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

有一件事应该会有很大帮助。

将app1和app2的目标文件放在不同的控制器中,并在每个appx的相应目录中查找makefile