如何让CMake默认以合适的-jX参数调用make?
如何让CMake默认使用合适的
-jX参数调用make? 当然可以!其实CMake本身就提供了几种无需额外编写shell脚本的方法,能帮你在初始配置或全局层面设置默认的并行编译参数,彻底摆脱硬编码make -j$NCP的麻烦。下面是几个实用方案:
1. 使用CMAKE_BUILD_PARALLEL_LEVEL环境变量(推荐,跨生成器通用)
这是CMake官方推荐的跨生成器解决方案,不仅适用于Unix Makefiles,对Ninja、Xcode等生成器也同样有效。
- 临时生效:在执行构建命令前直接指定环境变量:
CMAKE_BUILD_PARALLEL_LEVEL=10 cmake --build . - 永久生效:把环境变量加入你的shell配置文件(比如
~/.bashrc或~/.zshrc):
这样之后所有的export CMAKE_BUILD_PARALLEL_LEVEL=$(nproc) # 自动使用CPU核心数cmake --build调用都会自动使用指定的并行数,甚至直接调用make时也会继承这个参数(因为CMake会把它传递给底层构建工具)。
2. 在CMakeLists.txt中设置MAKEFLAGS(仅针对Unix Makefiles)
如果你只需要针对Unix Makefiles生成器设置默认参数,可以在顶层CMakeLists.txt的开头添加以下配置:
set(MAKEFLAGS "-j10")
这个设置会让CMake生成的Makefile默认带上-j10参数,后续执行cmake --build .时无需额外传参。如果需要临时覆盖,直接在命令行传参即可(命令行参数优先级更高):
cmake --build . -- -j12 # 会覆盖CMakeLists.txt中的-j10
3. 通过缓存变量CMAKE_MAKE_PROGRAM指定带参数的make命令
在初始配置CMake时,你可以直接指定带有-jX参数的make程序路径:
cmake -G"Unix Makefiles" -DCMAKE_MAKE_PROGRAM="make -j10" ..
这个配置会被存在CMakeCache.txt中,之后所有的cmake --build调用都会使用这个带参数的make命令。如果之后需要修改并行数,需要重新执行配置命令更新缓存。
额外提示
- 如果你使用Ninja生成器,它默认会自动使用所有可用CPU核心,但
CMAKE_BUILD_PARALLEL_LEVEL同样可以用来限制它的并行数。 - 优先选择
CMAKE_BUILD_PARALLEL_LEVEL方案,因为它的通用性最强,无需关心当前使用的构建生成器类型。
内容的提问来源于stack exchange,提问作者James Moore
相关产品推荐
相关产品推荐

