【问题标题】:In recursive make, prevent -j from cascading down在递归make中,防止-j级联
【发布时间】:2020-06-03 22:08:34
【问题描述】:

我有一个顶级 makefile,它指定 -jn 用于并行构建。这个顶级 makefile 调用许多不同的组件 makefile。不同的组件来自不同的存储库,其中一些支持并行构建,而另一些则不支持。我可以在顶层指定 -j1 以使所有组件都能正常工作。但是有没有办法在顶层指定 -jn ,让标志级联到某些组件,但对其他组件强制执行 -j1 ?如果我在选定的较低级别的 makefile 中使用 NOTPARALLEL 假目标,那会仅对这些组件强制执行 -j1 吗?

【问题讨论】:

    标签: gnu-make


    【解决方案1】:

    用单行创建一个文件

    .NOTPARALLEL:
    

    在里面说notparallel.mk,就像安德烈亚斯提议的那样。但是,不要简单地将它包含在对第一个子 makefile 的调用中,因为并行性问题将在此 makefile 调用下一级子子 makefile 时重新出现。而是将其添加到特殊变量 MAKEFILES 中,该变量包含生成文件列表,从那里开始每次调用 make 时都会自动包含该列表:

    MAKEFILES += notparallel.mk
    
    maintarget:
          $(MAKE) -f sub-makefile.mk
    

    【讨论】:

    • 我承认使用 MAKEFILES 变量是在整个 3rd 方库构建系统中强制执行 .NOTPARALLEL 的更好解决方案
    • @Andreas 没问题,在一些尴尬的比赛条件之后,我想问题作者也会回到这个解决方案;)
    【解决方案2】:

    如果我在选定的较低级别的 makefile 中使用 NOTPARALLEL 假目标,是否会仅对这些组件强制执行 -j1?

    是的。来自 GNU Make Special Targets 页面:

    .NOTPARALLEL

    如果 .NOTPARALLEL 作为目标被提及,那么这个 make 调用将连续运行,即使给出了“-j”选项。任何递归调用的 make 命令仍将并行运行配方(除非它的 makefile 也包含此目标)

    值得一提的是,对于那些没有正确设置 .NOTPARALLEL 的讨厌的第三方库,有一种方法可以通过递归 make 命令传递多个文件来实现:

    1. 创建内容为“.NOTPARALLEL”的文件,例如notparallel.mk
    2. 在制作图书馆的秘诀中,做$(MAKE) -f lib.mk -f notparallel.mk

    这将确保 .NOTPARALLEL 被提及为该 make 调用的目标,而无需您修改该库本身。

    【讨论】:

      猜你喜欢
      • 2021-08-07
      • 2017-03-24
      • 1970-01-01
      • 1970-01-01
      • 2011-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      相关资源
      最近更新 更多