I want my CMake project to be built by make -j N
, whenever I call make
from the terminal. I don't want to set -j
option manually every time.
For that, I set CMAKE_MAKE_PROGRAM variable to the specific command line. I use the ProcessorCount()
function, which gives the number of procesors to perform build in parallel.
When I do make
, I do not see any speed up. However if I do make -j N
, then it is built definitely faster.
Would you please help me on this issue? (I am developing this on Linux.)
Here is the snippet of the code that I use in CMakeList.txt
:
include(ProcessorCount)
ProcessorCount(N)
message("number of processors: " ${N})
if(NOT N EQUAL 0)
set(CTEST_BUILD_FLAGS -j${N})
set(ctest_test_args ${ctest_test_args} PARALLEL_LEVEL ${N})
set(CMAKE_MAKE_PROGRAM "${CMAKE_MAKE_PROGRAM} -j ${N}")
endif()
message("cmake make program" ${CMAKE_MAKE_PROGRAM})
Thank you very much.
In case you want to speed up the build you can run multiple make processes in parallel but not cmake. To perform every build with predefined number of parallel processes you can define this in MAKEFLAGS.
Set MAKEFLAGS in your environment script, e.g. ~/.bashrc as you want:
On Linux the following sets MAKEFLAGS to the number of CPU - 1: (Keep one CPU free for other tasks while build) and is useful in environments with dynamic ressources, e.g. VMware:
Can this method be used for calling multiple functions? like function1,2,3 in parallel rather sequential, any other ideas appreciated.
example:
You may set the env variable MAKEFLAGS using this command
Via setting CMAKE_MAKE_PROGRAM variable you want to affect on build process. But:
This variable affects only on build via
cmake --build
, not on native tool (make
) call:This variable should be CACHE one. It is used in such way by make-like generators:
That is, you need to set this variable with
This variable should refer to an executable itself, not to a program with arguments:
That is, value "make -j 2" cannot be used for that variable (splitting arguments as list
wouldn't help too).
In summary, you may redefine behavior of
cmake --build
call with setting CMAKE_MAKE_PROGRAM variable to the script, which callsmake
with parallel options. But you may not affect on behavior for directmake
call.