【问题标题】:Makefile: how to find out dependencies are no longer used in other rulesMakefile:如何找出其他规则中不再使用的依赖项
【发布时间】:2011-08-25 07:24:56
【问题描述】:

我有一个有点复杂的 Makefile,它运行 perl 脚本和其他工具并生成大约 1000 个文件。在生成所有文件后,我想编辑/修改其中一些生成的文件。所以我想我可以像这样简单地添加一个新规则:

(phony new rule): $LIST_OF_FILES_TO_EDIT
    file_modifier ...

然而,这里的重点是一些我想编辑的生成文件 ($LIST_OF_FILES_TO_EDIT) 在同一个 make 过程中用于生成一长串文件。所以我必须等待以确保在制作过程中不再需要这些文件,然后才能继续编辑它们。但我不知道该怎么做。更不用说在$LIST_OF_FILES_TO_EDIT的帮助下很难找出生成了哪些文件。

如果可以在 Makefile 中提到这条规则只能作为最后一条规则运行,那么我的问题就解决了。但据我所知,这是不可能的。那么有人有想法吗?

几点:

  • 要编辑的文件列表 ($LIST_OF_FILES_TO_EDIT) 是动态确定的(在制作过程之前未知)

  • 我不确定我是否为这个问题选择了一个好的标题。 :)

【问题讨论】:

    标签: makefile


    【解决方案1】:

    1) 如果您要像这样修改文件,您可能应该为目标指定不同的名称,例如 foo_unmodifiedfoo_modified,以便 Make 的依赖处理会处理这个问题。

    2) 如果你的虚假新规则是你在命令行中调用的规则(“make phonyNewRule”),那么 Make 将在执行 file_modifier 命令之前构建它要构建的任何其他内容。如果您想构建不在该列表中的目标,您可以这样做:

    (phony new rule): $(LIST_OF_FILES_TO_EDIT) $(OTHER_TARGETS)
        file_modifier ...
    

    3) 如果你的依赖设置正确,你可以找出哪些目标依赖于$(LIST_OF_FILES_TO_EDIT),但不是很整齐。您可以只 touch 其中一个文件,运行 make,查看它构建了哪些目标,对所有文件重复。使用 Make 参数可以节省一点时间:“make -n -W foo1 -W foo2 -W foo3 ... -W foo99 all”。这将打印 commands Make 将运行 - 我不知道有什么方法可以告诉你它将重建哪些 targets

    【讨论】:

    • 1) 是的,换个名字会好很多,但我做不到。因为有一些工具可以查找这些文件,所以不同的名称会破坏该过程。 2和3)感谢您的笔记。让我提一下,我不应该使用“make rule”或“make -n -W foo1 ...”来生成文件。我应该只使用“make”命令来完成整个工作,并且 make 过程应该处理所有事情。原因是很多人都在使用这个 Makefile,我们不想让其他人变得复杂。
    • @aminfar:“make -n -W whatever...”只适合您,以找出依赖于这些文件的内容。如果你想用简单的“make”来完成整个工作,只需将phonyNewRule: 放在顶部(在你定义了它需要的东西之后,将完整的规则放在下面)。这样phonyNewRule 将成为默认目标。
    • 谢谢!我以前从未使用过“make -n -W 文件名”,所以这很好。我不能将PhonyNewRule 作为我的默认目标。仅仅因为有些文件应该生成但与PhonyNewRule 完全无关。所以我不能(也不应该)把这些文件放在PhonyNewRule 依赖列表中。我希望这很清楚。
    • @aminfar:如果make 现在有效,那么您现在的默认目标是什么?将其设为 phonyNewRule 的 preq,将 phonyNewRule 设为默认目标,一切都会正常进行。
    • 现在我明白你的意思了。你的方法可以正常工作。谢谢!只是为了让您了解这个 makefile 的复杂性,让我提一下。 phonyNewRule 仅在定义特定 env_var 时定义。无论如何,你会猜到我在这项工作中获得了很多乐趣:)。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多