【发布时间】:2015-07-14 15:02:36
【问题描述】:
我的项目目录结构如下:
Prog
/include
/include/dir1
/include/dir2
/src
/src/dir1
/src/dir2
App1 依赖于 mod1 和 mod2,而 App2 仅依赖于 mod1。
使用下面表示的 makefile,模块和应用程序都可以正确构建 - 但是,如果我对 mod2 进行更改然后执行“make all”,即使 App2 没有依赖项,也会重新构建。
这样做的原因是因为传递给目标构建配方的 OBJ 是所有 OBJ,而不仅仅是当前目标所需的特定对象。
我想知道可以对 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
【问题讨论】:
-
make 无法知道给定输出使用了哪些输入,除非您(或其他人)告诉它。您可以手动列出它们或使用Auto-Dependency Generation 之类的东西为您生成列表。
-
@EtanReisner 我已经阅读了那篇文章 - 我的问题是如何将该文章中提到的依赖列表注入到目标规则中。
-
您不需要将其注入到任何现有规则中。 make 结合规则定义。上述 makefile 中单独的
app1: foobar行将 添加foobar作为app1的先决条件,但将$(TARGETS)静态模式规则保留为构建app的秘诀。例如,请参阅Multiple Rules for One Target。
标签: c++ c build makefile dependencies