C 使用GNUmake运行并行构建
我们支持两种构建模式(32位和64位)。为此,我们有两个目标: 对于32位,我们有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
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
将计算出哪些目标是独立的,并将并行运行这些目标。很好……那么它适用于所有目标。