当前的 Makefile 有这样的内容:
target1 : lib1.a lib2.a
target2 : lib1.a lib3.a
target3 : lib3.a
lib1.a:
$(MAKE) -C sub_dir all
我想更改此 Makefile,以便目标依赖于任何地方lib1.a
,它总是运行命令“$(MAKE) -C sub_dir all
“,总是。换句话说,在上面的示例中,target1和target2将始终运行”$(MAKE) -C sub_dir all
”。有什么办法可以做到这一点吗?
我知道以下方法不起作用:
target1 : lib2.a
$(MAKE) -C sub_dir all
target2 : lib3.a
$(MAKE) -C sub_dir all
target3 : lib3.a
因为如果 lib2.a 没有更新,则该命令不会运行。我有一个限制,我只能控制 lib1.a,我无法更改 lib2.a 的构建方式。
任何帮助表示赞赏!
UPDATE: 我使用了以下解决方案:
target1 : lib1.a lib2.a
target2 : lib1.a lib3.a
target3 : lib3.a
lib1.a: relay
.PHONY: relay
relay:
$(MAKE) -C sub_dir all
The GNU 帮助 https://www.gnu.org/software/make/manual/html_node/Force-Targets.html说 FORCE 不如 .PHONY 高效,但从你的解释来看,在我看来 FORCE 更好。难道是我理解错了?
我认为一个Force Target http://www.gnu.org/software/make/manual/make.html#Force-Targets就是您在这里寻找的。
lib1.a: FORCE
$(MAKE) -C sub_dir all
FORCE: ;
相比于一个.PHONY
规则(按照@MadScientist的建议here https://stackoverflow.com/questions/26226106/how-can-i-force-to-run-a-command-all-the-time#comment41133336_26226106)这本身不会强制所有依赖于的目标lib1.a
一直在重建。只有在以下情况下才会这样做lib1.a
实际上发生了变化。
不过,更好的解决方案可能会完全摆脱子品牌,并且实际上具有以下依赖信息:lib1.a
可用于此 makefile(直接或通过包含在sub_dir
)因为这避免了整个“强制这个配方,因为我无法告诉你如何判断目标是否需要更新”问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)