当有更改时,如何在调用子构建时检查依赖关系?
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
目标。
【讨论】:
以上是关于当有更改时,如何在调用子构建时检查依赖关系?的主要内容,如果未能解决你的问题,请参考以下文章