【问题标题】:Running parallel builds using GNUmake使用 GNUmake 运行并行构建
【发布时间】:2020-07-07 06:18:56
【问题描述】:

我们支持两种构建模式(32 位和 64 位)。为此,我们有两个目标:

对于 32 位,我们有 make32

对于 64 位,我们有 make64

每当用户尝试使用make32 运行make 命令时,它将运行32bit 构建,并且与make64 相同的方式将运行64bit 构建。我们还有另一个名为 makeboth 的目标,它按顺序运行 32 位和 64 位构建。

makeboth:
         $(MAKE) make32 
         $(MAKE) make64

上面的 make sn-p 位于顶级 GNUmakefile 中,我们在其子目录中运行多个 makefile。当用户传递目标makeboth 时,我想同时运行 32 位和 64 位版本。可以这样做吗?哪位大神可以帮忙看看。

【问题讨论】:

    标签: c makefile compilation gnu-make


    【解决方案1】:

    安排它,使makeboth 具有其他两个作为先决条件。

    makeboth: make32 make64
        @echo makeboth done
    

    然后make -jN makeboth 应该进行并行构建。

    【讨论】:

    • Kayulum,我们可以有任何带有 -j 的数字还是我们有任何基于某些标准/负载的限制?
    • @naga 我通常使用的内核数量比我系统上的内核数量少一点。另见:What's best value for make -j
    • 谢谢 Kaylim,我有一个疑问,这里如果我们通过 -j ,应该对我们的 GNUmakefile 中的所有目标应用并行执行?或仅使用我们传递的目标,即 makeboth(仅 makeboth 的前置要求并行运行。)
    • 它将尽可能多地并行运行构建。也就是说,make 将计算出哪些目标是独立的,并将并行运行这些目标。
    • 很好...那么它适用于所有目标。
    【解决方案2】:

    您可以使用-j N 选项并行运行目标:

    makeboth: make32wrapper make64wrapper;
        @echo makeboth done
    
    # We need wrappers here to prevent parallel execution deeper in the
    # make32 and make64 targets
    make32wrapper:
        @$(MAKE) -s make32
    make64wrapper:
        @$(MAKE) -s make64
    
    make32:
        echo make32 started
        sleep 3
        echo make32 done
    
    make64:
        echo make64 started
        sleep 3
        echo make64 done
    

    例子:

    $ make -j 10 makeboth
    make32 started
    make64 started
    make64 done
    make32 done
    makeboth done
    

    【讨论】:

    • Doj,感谢您的回复。您能否详细说明为什么我们需要包装器? -s 选项还有什么作用?我们如何在 GNUmakefile 中添加用户使用 -j 传递的检查并继续并行构建?
    • 1.包装器的必要性取决于 make32 和 make64 的实现方式及其先决条件。如果它们以允许并行执行的方式实现,我们不需要这里的包装器。在一般情况下,它们可能在并行中工作不正确,所以它只是为了安全。
    • 2. -s 表示子制作的“静音”,我在这里添加它只是为了在示例代码中输出好看:)
    • 3. -j N 是 GNU make 的本机选项。要检查内部 Makefile 代码是否已指定,您可以尝试使用 $(MAKEFLAGS) 变量。
    • 好吧,根据你的第一点,我知道我们只运行 make32 , make64 目标并行而不是依赖于它们的目标,对吗?在我们的实现中,依赖于 make32/64 的 pre reqs 没有并行运行。所以我想我们需要正确的包装器...... kaylum发布的以下答案也适用于我,对吗?有什么缺点吗?
    【解决方案3】:

    GNUmake 使您可以使用 make 的 -j 参数同时运行两个命令:

    您可以通过命令行执行此操作:

    其中 N 是要生成的进程号

    make -j <N> make32 make64
    

    此命令将同时运行两个命令/目标。你甚至可以通过创建一个新的 make 目标来处理这个问题。回到 Makefile:

    N 部分中的供应编号!

    makeboth:
        make -j <N> make32 make64
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-01
      • 2019-10-21
      • 1970-01-01
      • 2019-09-18
      • 1970-01-01
      • 2015-10-03
      • 2016-02-29
      • 2017-01-23
      相关资源
      最近更新 更多