How do I configure portable parallel builds in CMake?
Now it is very simple to parallel build with cmake. You can add "-j jobs_number" when using "cmake --build". For example:
cmake --build . -j 24
More details can be found in CMAKE manual: https://cmake.org/cmake/help/latest/manual/cmake.1.html#build-tool-mode
--parallel [], -j [] The maximum number of concurrent processes to use when building. If is omitted the native build tool’s default number is used.
The CMAKE_BUILD_PARALLEL_LEVEL environment variable, if set, specifies a default parallel level when this option is not given.
Some native build tools always build in parallel. The use of value of 1 can be used to limit to a single job.
With CMake 3.12 this is possible. From the release notes:
The
cmake(1)
Build a Project (cmake --build
) gained--parallel [<jobs>]
and-j [<jobs>]
options to specify a parallel build level. They map to corresponding options of the native build tool.
As mentioned by dkg, you can also set the environment variable CMAKE_BUILD_PARALLEL_LEVEL
.
Links to CMake's documentation:
- Build a Project
- CMAKE_BUILD_PARALLEL_LEVEL
If you have CMake v2.8.8 or higher, you may use Ninja as an alternative of GNU make
:
mkdir build
cd build
cmake -G Ninja ..
ninja # Parallel build (no need -j12)
or
mkdir build
cd build
cmake -G Ninja ..
cmake --build . # Parallel build using Ninja
As you can see, no need to use CMAKE_MAKE_PROGRAM
, the build is run in parallel by default, optimizing the number of jobs depending on available CPU cores.
Ninja is based on a low-level JSON configuration to speed up the startup phase. Therefore its JSON configuration is not easy to write by hand, and I always generate it using a high-level tool/IDE:
- CMake v2.8.8 (2012)
- Qt Creator v2.6 (2012)
- KDevelop v4.6 (2013)
- Meson on Linux (2013)
- ... see the generators of Ninja configuration at https://github.com/ninja-build/ninja/wiki/List-of-generators-producing-ninja-build-files
As a C++ build often requires lots of memory, your computer must provide as much memory as the number of CPU cores.
As pointed out by Ruslan, CMake 3.12 (2018) has a new option cmake --build -j <N>
to limit build to <N>
cores (jobs) thus limiting the memory consumption (see also the documentation). If you use an older CMake version, you can still use cmake --build -- -j <N>
. The option --
tells to CMake to pass the rest directly to the underlying builder tool, here it is Ninja.