gpt4 book ai didi

makefile - 具有虚假依赖关系的真实目标

转载 作者:行者123 更新时间:2023-12-02 20:16:07 25 4
gpt4 key购买 nike

试图找到一种优雅的方法来解决一些复杂的依赖关系。我的 Makefile 中有类似以下内容:

.PHONY: FOO
FOO: foo
foo:
build foo

.PHONY: BAR
BAR: bar
bar: FOO
build bar

这里的想法是我想用虚假目标(FOO BAR)抽象真实文件(foo,bar)。当然,在我真正的 Makefile 中,它更加复杂,这就是抽象很重要的原因。但这里的问题是,通过使虚假目标 FOO 成为 bar 的依赖项,然后 Make 总是尝试重建 bar,即使 foo 和 bar 都是最新的。这显然是因为它总是将 FOO 视为过时的。但这种行为并不完全正确。

看来我只有3个选择: 1)使bar直接依赖于foo。在我的真实 Makefile 中,它更加复杂,并且尝试将真实文件指定为依赖项是非常不可取的。 2)除了所有的假货之外,还使用变量。这使得整个Makefile更加复杂。 3) 从 bar 中删除 foo/Foo 作为依赖项,并添加 FOO 的递归构造作为 bar 中规则的一部分。这是非常糟糕的形式。

是否有一些我不知道的更优雅的解决方案?

谢谢。

最佳答案

正如您所建议的,变量正是您所需要的,并且实际上可以提高可读性。它们允许我们使 bar 文件正确依赖于 foo 文件,而不是用户友好的 .PHONY 目标:

foo.file = horrendously/long/path/to/the/real/foo.file
bar.file = horrendously/long/path/to/the/real/bar.file

.PHONY: FOO
FOO: $(foo.file)
$(foo.file):
touch $@

.PHONY: BAR
BAR: $(bar.file)
$(bar.file): $(foo.file)
touch $@

我们开始吧:

$ make BAR 
touch horrendously/long/path/to/the/real/foo.file
touch horrendously/long/path/to/the/real/bar.file

$ make BAR
make: Nothing to be done for `BAR'.

关于makefile - 具有虚假依赖关系的真实目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18666757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com