gpt4 book ai didi

makefile - makefile 调用其他 makefile 的最佳实践

转载 作者:行者123 更新时间:2023-12-04 02:32:24 44 4
gpt4 key购买 nike

我有一个 Makefile,它针对特定目标调用另一个 Makefile。假设主 Makefile 包含

some_dir/some_target:
cd some_dir && make some_target

some_dir/Makefile 包含

some_target: file1 file2
do_stuff

这是我的难题:对于主 Makefile 中的目标,依赖项应该是什么?如果我没有放置任何依赖项,那么,根据 GNU make 手册,只有当 some_dir/some_target 不存在时,才会调用 some_dir/Makefile。我可以改为从 some_dir/Makefile 复制依赖项。但是,这会产生稍后更改子目录的 Makefile 中的依赖项并忘记更新主 Makefile 的危险。

有没有办法告诉主 Makefile,“我不知道目标是否过时。去问另一个 Makefile”?

最佳答案

Is there a way to tell the main Makefile, "I don't know if the target is out of date or not. Go ask the other Makefile"?

没有专门针对委派给另一个 makefile 的规定,但您可以通过确保始终运行相关目标的配方来获得类似的结果。有相应的机制和约定。

老派方法是声明对不存在且从未实际构建的目标的依赖。您可能会看到这样的目标被命名为 FORCE,尽管这只是一种约定。这个名字并不直接重要。示例:

some_dir/some_target: FORCE
cd some_dir && make some_target

# Dummy target
FORCE:

只要工作目录中实际上没有名为FORCE 的文件,FORCE 目标最初将被认为是过时的,因此每个目标直接或间接依赖于它的将被构建(另见下文)。

当然,这有一个弱点:如果实际上创建了一个名为 FORCE 的文件怎么办?不管这种情况多么不可能,如果它发生了,它就会搞砸整个计划。一些 make 实现,特别是 GNU 的,有一个特定于实现的方法来解决这个问题。 GNU 的方法是识别一个名为 .PHONY 的特殊内置目标(不要忽略前导 .)。 .PHONY 的所有先决条件在每个构建中都被认为是过时的,尽管文件系统上有任何内容。由于 make 实现不识别该约定不太可能因它的使用而受到困扰,因此使用它几乎没有缺点:

.PHONY: FORCE

您也可以跳过 FORCE 并直接声明 some_dir/some_target 本身是假的,正如另一个答案所建议的那样,但至少有两个问题:

  • 不是通常意义上的虚假。您希望构建该目标。因此,宣布它是虚假的会令人困惑。

  • 如果您碰巧尝试将这种方法用于无法识别 .PHONYmake,那么整个方案就会分崩离析。如果您改为使用中间假目标(例如上面的 FORCE),那么即使使用这样的 make,您的 makefile 仍然可以工作,除非文件名为与创建虚拟目标相同。

但请注意,无论如何实现,任何此类方案都有一个明显的缺点:如果您强制 some_dir/some_target 在每个构建中都被视为过时,那么sub-make 将无条件运行,然后每次都将重建直接或间接依赖于 some_dir/some_target 的所有其他目标。另一方面,如果您不强制重建它,那么它可能不会在应该重建的时候重建,正如您已经认识到的那样。这是著名论文的题目Recursive Make Considered Harmful .那么,作为替代方案,您应该考虑使用递归 make

关于makefile - makefile 调用其他 makefile 的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63532535/

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