C 使用GNUmake运行并行构建

C 使用GNUmake运行并行构建,c,makefile,compilation,gnu-make,C,Makefile,Compilation,Gnu Make,我们支持两种构建模式(32位和64位)。为此,我们有两个目标: 对于32位,我们有make32 对于64位,我们有make64 每当用户尝试使用make32运行make命令时,它将运行32bitbuild,与使用make64相同,它将运行64bitbuild。我们有另一个名为makeboth的目标,它按顺序运行32位和64位构建 makeboth: $(MAKE) make32 $(MAKE) make64 上面的makesnippet位于顶级GNUmak

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

对于32位,我们有
make32

对于64位,我们有
make64

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

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

上面的makesnippet位于顶级GNUmakefile中,我们在它的子目录中运行几个makefile。我想在用户通过target
makeboth
时并行运行32位和64位构建。有可能吗?有人能在这里帮忙吗。

安排一下,以便
使这两个
都有另外两个作为先决条件

makeboth: make32 make64
    @echo makeboth done

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

安排它,以便
makeboth
将其他两个作为先决条件

makeboth: make32 make64
    @echo makeboth done

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

您可以使用
-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

您可以使用
-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

GNUmake允许您使用make的-j参数并发运行两个命令:

您可以通过命令行编辑此手册:

其中N是要生成的进程号

make -j <N> make32 make64

GNUmake允许您使用make的-j参数并发运行两个命令:

您可以通过命令行编辑此手册:

其中N是要生成的进程号

make -j <N> make32 make64


司法部,谢谢你的回复。你能详细说明一下我们为什么需要包装纸吗?还有-s选项的作用是什么?我们如何在GNUmakefile中添加用户已通过-j的检查并继续并行构建?1。包装器的必要性取决于make32和make64及其先决条件的实现方式。如果它们是以允许并行执行的方式实现的,那么这里就不需要包装器。一般情况下,它们在parralel中可能工作不正确,因此这只是为了安全
-s
表示子动画的“静默”,我在这里添加它只是为了在示例代码中获得好看的输出:)3
-j N
是GNU make的本机选项。要检查Makefile代码内部是否已指定,您可以尝试使用
$(MAKEFLAGS)
变量。好的,根据您的第一点,我理解我们只并行运行make32、make64目标,而不是依赖于它们的目标,对吗?在我们的实现中,依赖于make32/64的pre-req不是并行运行的。所以我想我们需要包装好。。。下面是kaylum贴出的答案,对我也有用吧?这有什么缺点吗?司法部,谢谢你的回复。你能详细说明一下我们为什么需要包装纸吗?还有-s选项的作用是什么?我们如何在GNUmakefile中添加用户已通过-j的检查并继续并行构建?1。包装器的必要性取决于make32和make64及其先决条件的实现方式。如果它们是以允许并行执行的方式实现的,那么这里就不需要包装器。一般情况下,它们在parralel中可能工作不正确,因此这只是为了安全
-s
表示子动画的“静默”,我在这里添加它只是为了在示例代码中获得好看的输出:)3
-j N
是GNU make的本机选项。要检查Makefile代码内部是否已指定,您可以尝试使用
$(MAKEFLAGS)
变量。好的,根据您的第一点,我理解我们只并行运行make32、make64目标,而不是依赖于它们的目标,对吗?在我们的实现中,依赖于make32/64的pre-req不是并行运行的。所以我想我们需要包装好。。。下面是kaylum贴出的答案,对我也有用吧?同样的方法有什么缺点吗?Kayulum,我们可以使用-j的任何数字吗?或者我们基于某些标准/负载有任何限制吗?@naga我通常使用比我的系统上的内核数少一点的数字。另请参见:谢谢Kaylim,我有一个疑问,这里如果我们通过-j,那么并行执行应该应用于gnumake文件中的所有目标?或者只使用我们传递的目标,即makeboth(只有makeboth的pre-req并行运行)。它将并行运行尽可能多的构建。也就是说,
make
将计算出哪些目标是独立的,并将并行运行这些目标。很好……那么它适用于所有目标。Kayulum,我们可以用-j来表示任何数字,或者我们可以根据某些标准/负载进行任何限制吗?@naga我通常使用的核数略少于我系统上的核数。另请参见:谢谢Kaylim,我有一个疑问,这里如果我们通过-j,那么并行执行应该应用于gnumake文件中的所有目标?或者只使用我们传递的目标,即makeboth(只有makeboth的pre-req并行运行)。它将并行运行尽可能多的构建。也就是说,
make
将计算出哪些目标是独立的,并将并行运行这些目标。很好……那么它适用于所有目标。