【问题标题】:Make recipe to prevent rebuilding of non-dependent targets制作配方以防止重建非依赖目标
【发布时间】: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


【解决方案1】:

虚假的“全部”目标中列出了三个目标。

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

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

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

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

不要使用“foreach”规则,因为它要求构建所有目标

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

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

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

【讨论】:

  • 这是一个玩具示例,列出典型 app1 或 app2 的所有依赖项非常繁琐
  • @SamiKenjat,强烈建议,不要列出依赖项。相反,使用类似 Etan Reisner 链接的东西让“make”为您生成所有依赖项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 2018-06-28
  • 1970-01-01
相关资源
最近更新 更多