我有以下项目目录结构:
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
答案 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