【问题标题】:avoid expansion of dependencies for unused makefile targets避免扩展未使用的 makefile 目标的依赖关系
【发布时间】:2020-11-10 15:33:50
【问题描述】:

有没有办法避免扩展未使用的目标的目标依赖关系。如果调用下面的 makefile 来构建 fasttarget,shell 慢命令仍然被调用。其他会阻止 fasttarget 运行 slowcommand 的选项也将不胜感激,尽管我更愿意避免递归 make。

slow = $(shell slowcommand)

.PHONY: fasttarget slowtarget

fasttarget :
    fastcommand    

slowtarget : $(slow)

%.slowitem.output : %.slowitem.input
    buildslowitem $< $@

【问题讨论】:

    标签: makefile


    【解决方案1】:

    引用自manual

    规则定义

    无论形式如何,规则总是以相同的方式展开:

    immediate : immediate ; deferred
        deferred
    

    immediate 在此上下文中表示“在 makefile 检查的第一阶段”,即在构建用于稍后执行规则的依赖树的阶段。显然make此时需要将依赖关系target : prerequisites的所有变量内容解决为具体值,即从变量引用和函数调用到文件系统中(此时)确实存在的文件名。再多的诡计也无法驱使make 远离这项任务,因为它不具备“随时随地”动态评估依赖关系图的能力。这样做的好处是make 可以很好地并行化其规则,但缺点是必须提前知道完整的依赖关系图,即使是不会使用的部分。构建的唯一方法是使用两个不同的 makefile(或相同但通过 if 等具有不同可见性)并仅在随后的调用中将 slow 目标及其先决条件呈现给 make 评估器.

    【讨论】:

      【解决方案2】:

      您没有指定您使用的是 GNU make,但由于您使用的是 GNU make 语法,所以我会以实物形式回复。

      你可以试试secondary expansion:

      .SECONDEXPANSION:
      
      slowtarget: $$(slow)
      

      这应该防止 $(slow) 变量被扩展,直到/除非 slowtarget 目标实际上需要构建。

      【讨论】:

      • 是的,我正在使用 GNU make。在我添加 .SECONDEPANSION: 之前添加额外的 $(慢)阻止了扩展。在我添加 .SECONDEPANSION: 之后,事情又回到了我开始的地方,并且在运行 fasttarget 时仍然会扩展慢速。
      • 没有 .SECONDEXPANSION 将无法运行 slowtarget;你基本上只是说 slowtarget 取决于文字字符串 $(slow) 显然不存在。如果这不起作用,那么没有递归 make 可能无法避免它。
      猜你喜欢
      • 2011-12-18
      • 2012-01-15
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2013-06-05
      • 2021-02-24
      • 2017-06-13
      • 1970-01-01
      相关资源
      最近更新 更多