【问题标题】:Real targets with PHONY dependencies具有 PHONY 依赖项的真实目标
【发布时间】:2013-09-11 02:01:09
【问题描述】:

试图找到一种优雅的方法来解决一些复杂的依赖关系。我的 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 作为依赖项,并在 bar 中添加 FOO 的递归 make 作为规则的一部分。这是非常糟糕的形式。

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

谢谢。

【问题讨论】:

  • 我不确定我明白你为什么要进行这种抽象。 make 最好的部分之一是它如何很好地处理真实目标和时间戳。
  • 除非你能更清楚地解释为什么你要求目标是假的,否则我看不出我们能提供什么帮助。你想通过把它做成 PHONY 来达到什么目的?如果您不使用 PHONY,什么会中断或无法正常工作? PHONY 的全部意义在于确保与目标关联的配方始终运行,因此这种行为“不是真正正确”的想法是......不是真的正确:-)
  • 文件名很复杂(子目录、长名称等)。在所有规则中直接使用文件名会使事情变得相当不可读。从最终用户的角度来看,由于这种复杂性,在命令行上输入目标变得不切实际。我可以选择用变量完全替换 PHONY 目标——我想——这将简化 Makefile,但“make”命令行仍然存在同样的问题(即用户必须指定的目标很复杂) .

标签: makefile dependencies


【解决方案1】:

正如您所建议的,变量是您所需要的,并且实际上可以提高可读性。它们允许我们使 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'.

【讨论】:

    【解决方案2】:

    GNU make 对这种情况的回答是order-only dependencies。它还允许您提供目标的排序而没有“过时”的关系。从您的问题来看,这似乎就是您要寻找的。​​p>

    所以你上面的 makefile sn-p 看起来像这样:

    .PHONY: FOO
    FOO: foo
    foo:
        build foo
    
    .PHONY: BAR
    BAR: bar
    bar: | FOO
        build bar
    

    这将允许 foo 始终在 bar 之前构建,但不会强制要求更新 foo 时必须构建该 bar。 foo 只会在调用make BAR 并且 foo 的文件不存在时构建。

    【讨论】:

    • 不错。我刚刚愤怒地使用了你的建议,在 FOO 是一个真正的 PHONY 的情况下 - 也就是说,一个目标做了一些重要的事情,但没有生成名为 FOO (或 foo )的文件。不过,我怀疑仅订单依赖项对 Miguel 不起作用,因为如果 foo 已过期,它不会重建 bar 文件。
    猜你喜欢
    • 1970-01-01
    • 2012-02-08
    • 2023-02-07
    • 2012-11-27
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 2016-03-08
    • 1970-01-01
    相关资源
    最近更新 更多