当有更改时,如何在调用子构建时检查依赖关系?

Posted

技术标签:

【中文标题】当有更改时,如何在调用子构建时检查依赖关系?【英文标题】:How do I check dependencies when invoking a sub-make to build when there are changes? 【发布时间】:2009-02-17 13:51:37 【问题描述】:

如果我有一个调用另一个makefile的makefile,我如何让主makefile正确检查从属makefile的依赖关系是否发生了变化?

例如,如果我有规则

server:
     @cd $(SERVERDIR) && $(MAKE)

这会在我构建可执行“服务器”的子目录中调用 make。但是,如果我更改了组成服务器的文件之一,则父 make 不会看到更改并拒绝重建服务器 - “make: `server' 是最新的。”

我怎样才能让主 makefile 正确检测其中一个依赖文件(例如 $(SERVERDIR)/server.c 之类的文件)发生更改的时间?

【问题讨论】:

【参考方案1】:

您似乎想使用虚假目标

.PHONY: server
server:
     @cd $(SERVERDIR) && $(MAKE)

Phony 目标 here 有详细描述,但简短的描述是您告诉 makefile 永远不会有与此服务器目标对应的文件,因此它不会考虑服务器最高如果目录中有名为 server 的文件,则日期。

【讨论】:

这通常是一个很好的解决方案,但我不想总是重建目标,我希望它表现得像一个普通的非递归目标并且只构建当事情发生变化时。 那是你的子makefile的责任。 兰迪说的。由于您的服务器目标没有依赖关系,因此它不知道“发生了一些变化”。否则,拥有 submakefile 有什么意义?【参考方案2】:

您的目标名称与您的主 Makefile 目录中的文件或目录之一的名称匹配。

假设您需要在名为 server 的子目录中构建所有内容,则此规则:

server:
    $(MAKE) -C server

不起作用,因为目标server 是一个目录,没有源文件,因此不需要构建。

这个:

srv:
    $(MAKE) -C server

只要没有名为srv 的文件或目录就可以工作。

【讨论】:

【参考方案3】:

你没有:

Recursive Make Considered Harmful Implementing non-recursive make

但是是的,如果您别无选择,例如因为您不控制子 makefile,所以您正在寻找 .PHONY 目标。

【讨论】:

以上是关于当有更改时,如何在调用子构建时检查依赖关系?的主要内容,如果未能解决你的问题,请参考以下文章

Web服务器群集——编译安装Apache构建虚拟主机

在生产数据库中减少列大小并修剪数据,处理同一列上的约束/依赖关系

gui中windows的JavaFX依赖关系

如何检查 DLL 依赖关系?

Flux 中的 AJAX:依赖状态更改时刷新存储

在 Android 上构建 Flutter 应用程序时如何修复“依赖失败”