制作配方以防止重建非依赖目标
Make recipe to prevent rebuilding of non-dependent targets
我的项目目录结构如下:
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
/%.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 已根据以下答案重新调整用途:
伪造的 'all' 目标中列出了三个目标。
每一个都应该有一个单独的规则列出,
而不是将 'app1' 和 'app2' 中的两个目标混为一谈。
注意:任何通用文件 changes/compiles 都会导致重新创建两个目标。
将 'SRC' 分解为 SRC_APP1 SRC_APP2 然后在每个 app1 和 app2 目标中使用适当的 SRC_APPx 宏。
对 'OBJ' 宏和 'INCLUDES' 宏使用类似的分隔
不要使用 'foreach' 规则,因为它要求构建所有目标
还有其他几个细节需要解决,但以上应该为您指明了正确的方向。
有一件事应该很有帮助。
将 app1 和 app2 的目标文件放在不同的目录中,并在每个 appx 的相应目录中查找 makefile
我的项目目录结构如下:
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
/%.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 已根据以下答案重新调整用途:
伪造的 'all' 目标中列出了三个目标。
每一个都应该有一个单独的规则列出, 而不是将 'app1' 和 'app2' 中的两个目标混为一谈。
注意:任何通用文件 changes/compiles 都会导致重新创建两个目标。
将 'SRC' 分解为 SRC_APP1 SRC_APP2 然后在每个 app1 和 app2 目标中使用适当的 SRC_APPx 宏。
对 'OBJ' 宏和 'INCLUDES' 宏使用类似的分隔
不要使用 'foreach' 规则,因为它要求构建所有目标
还有其他几个细节需要解决,但以上应该为您指明了正确的方向。
有一件事应该很有帮助。
将 app1 和 app2 的目标文件放在不同的目录中,并在每个 appx 的相应目录中查找 makefile