在Windows上进行(并行作业)

时间:2009-10-07 18:39:33

标签: build-process makefile gnu-make

什么设置适用于GNU在Windows上制作并行作业(-j)?

我尝试使用MinGW make 3.81将shell设置为cmd.exe,这适用于创建多个进程但是使用“等待作业”消息失败。

这可行吗?什么是最好的设置? (MinGW / Cygwin / ???) 有人可以指点我一个有效的例子进行测试吗?

5 个答案:

答案 0 :(得分:4)

可能有助于CMake用户的提示

当makefile以cmake-makefiles通常的方式进行递归调用时,-jN选项不起作用。 但是有一种补救办法再次起作用,因为在生成的makefile中,CMake通过这种语法调用。

$(MAKE) -f CMakeFiles\Makefile2 <subproject>

这意味着您可以修改变量MAKE:

mingw32-make "MAKE=mingw32-make -j3"

现在每次启动子项目时,它都会再次获得“-j3”选项。 但请注意,这实际上并没有像您期望的那样将并行编译的数量限制为3。如果在同一层次结构中有超过3个不相互依赖的项目,那么所有3个项目将并行构建,并且每个项目都会启动3个编译步骤。导致9个并行编译步骤。

当我们再仔细研究cmake生成的顶级Makefile时,我们发现目标“all”基本上只启动了一个子make。

$(MAKE) -f CMakeFiles\Makefile2 all

因此我们可以通过调用

来删除一层子项目并行性
mingw32-make "MAKE=mingw32-make -j3" -f CMakeFiles\Makefile2 all

但这会牺牲进度报告。

我希望这会有所帮助。

答案 1 :(得分:3)

据我所知,GNU Make的并行作业取决于提供(CPU)负载信息的底层平台。遗憾的是,这是以非Windows兼容的方式完成的,只有“make -j”命令以缩放方式执行任何操作。那个命令(没有最大数量的工作)可能非常危险,因为它会像狂热的饥饿狗一样吃掉内存(我在Qt上尝试过它,它在Qt上最大的项目Qt,4GB RAM,Win7上崩溃了。) / p>

第二个想法,我觉得make -j3运行速度比make快,但鉴于我在网上可以找到的东西(论坛,手册......),它看起来非常具有POSIX / linux功能。

顺便说一句,我很惊讶你的问题被否决了。

答案 2 :(得分:3)

我发现this Danny Thorpe's blog entry解释了在Windows上并行make build的问题。基本上它建议首先设置以下环境变量:

set SHELL=cmd.exe

有了这个,我能够运行make -j样式命令,但遗憾的是不是受控的make -jN样式命令。

答案 3 :(得分:3)

我已经解决了这个问题,所以我与大家分享了解决方案。

您可以尝试使用MinGW-TDM(主页:http://tdm-gcc.tdragon.net/)或MinGW-Equation(下载页面:http://www.equation.com/servlet/equation.cmd?fa=fortran)。

例如,将32位版本安装到D:\MinGW\MinGW32(如果您希望使用64位编译二进制文件,则将64位版本安装到D:\ MinGW \ MinGW64)

创建如下的批处理文件,然后在构建目录中运行它:

Set MinGW_bin=D:\MinGW\MinGW32\bin
Set MSys_bin=D:\MinGW\msys\bin
Set Path=%MSys_bin%;%MinGW_bin%
mingw32-make SHELL=CMD.exe -j6 -f makefile

您可以从http://sourceforge.net/apps/trac/mingw-w64/wiki/MSYS下载MSYS。它有许多类UNIX实用程序,需要构建许多开源库,应用程序。

其中-j6是运行6个并行编译作业的选项。

提示:您可以设置选项-jN,其中N =您的CPU核心(线程)数量乘以1.5。在我的情况下,我的CPU有4个线程,所以我将此值设置为6。

注意:您可以运行

  

make.exe -jN -f makefile

没有 SHELL=CMD.exe选项,您的编译是并行运行的,但在某些情况下它不兼容(其中make.exe来自MSYS目录)。

此致

答案 4 :(得分:2)

我从来没有在Cygwin下使用make -jn的任何问题。它工作得很好。我经常将它与微软的cl.exe编译器一起使用。它对我来说开箱即用。很像UNIX,这是一件好事™。构建脚本很好地适用于Linux和Mac。彻底推荐。

从来没有喜欢MinGW制作,因为我到了一个5个反斜杠太少的地方,但是有6个太多了。叹! (与MinGW hacks有关,在make AFAIK中允许使用反斜杠分隔的路径名。)