CMake get CPU count
For moderately advanced tasks in CMake it can be useful to get the CPU count to allow building or testing in parallel with non-CMake-based
ExternalProject.
Building a non-CMake ExternalProject from CMake with GNU Make by default builds serially, which can be very slow.
This is because CMake doesn’t know if the non-CMake ExternalProject is capable of being built in parallel.
When it’s known that the non-CMake-based ExternalProject can be built in parallel, it’s necessary to get the CPU count in CMake as simply putting make -j
can
overwhelm the computer.
There are two methods to get CPU count in CMake.
- ProcessorCount: less accurate, works on more systems
- cmake_host_system_information: more accurate, but doesn’t support as many systems
An example is on ARM systems such as Raspberry Pi 4, with four CPU cores:
- ProcessorCount: 4
- cmake_host_system_information(RESULT … QUERY NUMBER_OF_PHYSICAL_CORES): 1
One could make a function that first tries cmake_host_system_information and then ProcessorCount, but usually we just use cmake_host_system_information alone.
Example: specify the parameters relevant to CPU count:
cmake_host_system_information(RESULT Ncpu QUERY NUMBER_OF_PHYSICAL_CORES)
message(STATUS "CMake ${CMAKE_VERSION} using ${Ncpu} threads")
include(ExternalProject)
ExternalProject_Add(demo
BUILD_COMMAND make -j${Ncpu}
)