September 12, 2010

vilpy vilpy
Lab Rat
3 posts

Multithreaded build with QtCreator in Windows

 

Hi, everybody!
Recently I have faced with a problem of realization of multithreaded build in Qt Creator 2.0 in Windows. I found thread in Qt-creator mailing list which says, that the flag “-jx”, specified in make params in Qt Creator, in Windows doesn’t work, because “The problem seems to be that child processes don’t get the parent arguments (as on Linux).”
But time – the most valuable resource and I don’t want to spend it for recompilation at debugging and refactoring, I found a solution. The main idea is to run mingw32-make from .bat-file with the necessary parameters.

First of all we must set environment variable with path to mingw and specify include/lib folders (if they doesn’t set by default)
Then we call mingw32-make.exe with following parameters:
-j4 — set number of jobs/threads to 4
-C % CD% — change to project dir before doing anything. “% CD%” sets automaticaly by Qt Creator
!!!remove space between % and CD. I used it because parser translate them as one symbol
-f Makefile.%1 — I used standard Debug/Release targets in QtCreator, so qmake creates two makefiles: Makefile.Debug and Makefile.Release. %1 – first argument which recieve build target name
Further in the “Build steps” section in the “Override make.exe” field in QtCreator we must specify path to our .bat-file. (e.g. C:\make.bat) and in the “make arguments” field we must specify target name.

We must set “Override make.exe” and make params in all build targets!

My .bat-file code:
Don’t forget to remove space between % and CD!
Paths to mingw can differ.

  1. @echo off
  2. set path=C:\Qt\2010.04\mingw\bin;%PATH%
  3. set LIBRARY_PATH=C:\Qt\2010.04\mingw\lib
  4. set C_INCLUDE_PATH=C:\Qt\2010.04\mingw\include
  5. set CPLUS_INCLUDE_PATH=C:\Qt\2010.04\mingw\include
  6.  
  7. C:\Qt\2010.04\mingw\bin\mingw32-make.exe -j4 -C % CD% -f Makefile.%1

9 replies

September 12, 2010

Tobias Hunger Tobias Hunger
Area 51 Engineer
3383 posts

The simpler approach is to use jom that we ship with creator. Just check “Use jom instead of nmake” in the Project options (in Tools->Options) and you are set. No fiddling with bat files necessary: Just pass -j 4 as additional argument to make in your project’s build settings page.

September 12, 2010

vilpy vilpy
Lab Rat
3 posts

Tobias Hunger wrote:
Just pass -j 4 as additional argument to make in your project's build settings page.

“Use jom instead of nmake” checked and after adding additional arg I have only one compiling thread.

September 13, 2010

Tobias Hunger Tobias Hunger
Area 51 Engineer
3383 posts

Is there anything to build in parallel? Jom works fine for me, using up to 30 jobs in parallel to build creator.

You did add -j X as additional argument to the make step, didn’t you? Does the build step configuration mention using jom? What are you trying to build? I assume your build supports more than one job at a time (otherwise your bat file would not have worked either).

September 13, 2010

vilpy vilpy
Lab Rat
3 posts

I tried to build adressbook sample with -j X argument, but still only one build thread.
Build step configuration by default contains only qmake and mingw32-make, there is no jom mentions.
-j 4 added to make arguments and make line is “Make: mingw32-make.exe -j 4 -w in C:\Qt\2010.04\qt\examples\itemviews\addressbook-build-desktop”

“Use jom instead nmake” surely checked

But multithreaded build works fine via .bat

Windows XP Sp3
jom 0.8.3
QtCreator 2.0.0 Built on Jun 21 2010 at 01:56:06 From revision 1c0f52a091

September 13, 2010

Tobias Hunger Tobias Hunger
Area 51 Engineer
3383 posts

Hmm… jom will replace nmake. So it is only relevant form MSVC based builds. The mingw make already supports -j X fine.

So are you using MSVC builds? I just assumed you did since mingw-make should woirk without the bat-file:-)

Please check the details of the make step: Are you overriding the make command there? If you do not then jom should be used for MSVC-based projects. You still need to provide the additional -j X parameter in additional parameters (both for jom and mingw-make).

September 13, 2010

vilpy vilpy
Lab Rat
3 posts

Oh, yeah.. jom override nmake and nmake it’s msvc make app, I forgot it. But I used mingw based builds and -j X doesn’t work for me.. I just try to build project with Qt for symbian (msvc) and it works fine with jom

Post from Qt-creator mailing list in which mentioned the same problem (Aug. 2009): http://lists.trolltech.com/pipermail/qt-creator/2009-August/004152.html [lists.trolltech.com]

UPD: By the way on Ubuntu -j X argument works fine

February 28, 2012

vwidor vwidor
Lab Rat
1 posts

you can set “MAKEFILES” to “jX” in the environment (where X is the desired count of threads) to build with X threaded.
mingw32-make will also build with multiple threads by set “make” to “mingw32-make -jX”.

the problem i have using jom with mingw is the fact, that jom will gather output from sterr and stout and put it on stout, which is not parsed by qt creator for errors/ warnings and therefore no issues are displayed.

same behavior using incredibuild (xgConsole) for distributed builds.

October 27, 2012

elmigranto elmigranto
Lab Rat
15 posts

-j4 -f Makefile.Debug (or Release) works, but it’s ugly.

November 14, 2012

Wilk Wilk
Lab Rat
120 posts

Hello.
If you are using mingw, than you may define environment variable MAKE_COMMAND=mingw32-make -j<number of processes you want>. It works for me. Also it will affect any build process, that uses mingw.

 
  ‹‹ Have any one successfully installed a development enviroment on Linux?      [Solved] After compiling I have no /include/QtDesigner, Why? ››

You must log in to post a reply. Not a member yet? Register here!