- 构建工具
- 开发工具
- CLI
【免费下载链接】CMake
Mirror of CMake upstream repository
导读:CMake 除了通过命令行
-D选项和 CMakeLists.txt 传递配置外,还从操作系统环境读取一批具有特殊含义的环境变量,它们能够在配置阶段改变查找路径、TLS 行为,在构建阶段控制并行度、生成器选择与输出细节,并为各编程语言指定编译器与编译选项。本文以 CMake 官方手册 Help/manual/cmake-env-variables.7.rst 为骨架,逐一解读这些变量的作用、默认约定、使用场景与底层实现,帮助你在实际项目中精准地用环境变量接管 CMake 行为。
环境变量在 CMake 中的地位
环境变量与普通 CMake 变量的区别
在 CMake 语言中,环境变量是一类特殊的变量,其行为在 Help/manual/cmake-language.7.rst 的 "Environment Variables" 一节中有明确定义。与普通变量相比,环境变量有以下关键差异:
- 作用域:环境变量在 CMake 进程内具有全局作用域,且永远不会被缓存(不会进入 CMakeCache.txt);
- 引用方式:通过
$ENV{<variable>}语法读取,例如$ENV{HOME}; - 初始化:CMake 进程启动时,环境变量的初始值来自调用进程(即你运行
cmake命令时的 shell 环境); - 修改方式:可以用 set 与 unset 命令修改,但修改只影响当前运行的 CMake 进程,不会写回系统环境,也不会被后续的构建或测试进程看到;
- 辅助工具:需要带着修改后的环境运行子命令时,用
cmake -E env <var>=<value> <command>;需要查看当前全部环境变量时,用cmake -E environment。
正因环境变量具有"进程级、不缓存"的特性,它们非常适合承载不应写入 CMakeCache.txt 的临时性配置,例如凭据、本机特有的工具路径、以及希望每次配置都重新读取的开关。
手册的变量分类框架
手册 cmake-env-variables.7.rst 将全部特殊环境变量分为五大类,这也是本文的讲解主线:
| 分类 | 关注点 |
|---|---|
| Environment Variables that Change Behavior | 改变 CMake 自身行为(查找路径、颜色输出、TLS、策略版本) |
| Environment Variables that Control the Build | 控制构建过程(并行度、生成器、安装前缀、编译/链接启动器) |
| Environment Variables for Languages | 为各语言指定编译器与编译选项(CC、CXX、CFLAGS 等) |
| Environment Variables for CTest | 控制 CTest 测试行为(并行度、失败输出、仪表化) |
| Environment Variables for the CMake curses interface | 控制ccmake界面(如 CCMAKE_COLORS) |
每一类对应的单变量文档都存放在 Help/envvar 目录下(共 100 余个.rst文件),手册只是按主题聚合了它们的目录。所有变量条目都遵循统一模板(见 Help/envvar/include/ENV_VAR.rst):初始值取自调用进程环境,也就是说"你设置了它就生效,你没设置就使用 CMake 内置默认值"。
改变 CMake 行为的环境变量
这一类变量直接作用于配置阶段(configure),影响 CMake 如何寻找依赖、如何展示输出、如何验证远端证书等基础行为。
查找路径四件套:PREFIX / INCLUDE / LIBRARY / PROGRAM
CMake 的find_*系列命令是依赖管理的核心,它们不仅搜索系统默认路径,还会依次检查一批专用环境变量:
- CMAKE_PREFIX_PATH(见 Help/envvar/CMAKE_PREFIX_PATH.rst):存放一个或多个**安装前缀(prefix)**目录列表,会被 find_package、find_program、find_library、find_file、find_path 共同使用。每个命令会依据自身文档,在该前缀下继续查找
bin、lib、include等标准子目录。这是"把第三方库装在非标准位置(如/opt/mylib)后让 CMake 找到它"最常用的手段; - CMAKE_INCLUDE_PATH(见 Help/envvar/CMAKE_INCLUDE_PATH.rst):供 find_file 与 find_path 搜索头文件/文件所在目录;
- CMAKE_LIBRARY_PATH(见 Help/envvar/CMAKE_LIBRARY_PATH.rst):供 find_library 搜索库文件所在目录;
- CMAKE_PROGRAM_PATH(见 Help/envvar/CMAKE_PROGRAM_PATH.rst):供 find_program 搜索可执行程序所在目录。
这四个变量的共同语法约定是:在 UNIX 上以:分隔多个路径,在 Windows 上以;分隔(与各平台PATH的惯例一致)。以CMAKE_PREFIX_PATH为例,一个典型用法是:
# Linux/macOS export CMAKE_PREFIX_PATH=/opt/mylib:/opt/toolchain cmake -S . -B build # Windows PowerShell $env:CMAKE_PREFIX_PATH = "C:\libs\mylib;C:\libs\toolchain" cmake -S . -B build值得注意:这四个变量在 CMake 中都有同名的CMake 变量(CMAKE_PREFIX_PATH等),环境变量与同名 CMake 变量协同工作。若在 CMakeLists.txt 或命令行中同时设置了两者,查找顺序以 find_package 等命令的完整搜索规则为准;环境变量版本特别适合在不修改项目代码的情况下,为整个构建脚本补充搜索路径。
macOS 专属路径:FRAMEWORK 与 APPBUNDLE
针对 Apple 平台的生态特性,还有两个查找路径变量:
- CMAKE_FRAMEWORK_PATH(见 Help/envvar/CMAKE_FRAMEWORK_PATH.rst):存放搜索 macOS framework(
.framework目录)的路径列表,被 find_library、find_package、find_path、find_file 使用; - CMAKE_APPBUNDLE_PATH(见 Help/envvar/CMAKE_APPBUNDLE_PATH.rst):存放搜索 macOS应用包(application bundle)的路径列表,被 find_program 与 find_package 使用。
二者同样遵循:(UNIX)/;(Windows)分隔约定,且都有同名 CMake 变量版本。
输出颜色控制:CLICOLOR 家族与 NO_COLOR
终端输出是否带颜色,会影响 CI 日志的可读性与日志文件的解析:
- CLICOLOR与CLICOLOR_FORCE:控制 CMake 输出是否启用颜色(遵循通用终端约定,
CLICOLOR_FORCE强制启用颜色); - NO_COLOR:遵循社区通用的 NO_COLOR 惯例,设置后禁用输出颜色。当脚本或日志系统无法处理 ANSI 转义序列时,在 CI 中设置
export NO_COLOR=1可以保证输出纯净。
这三个变量决定了 CMake 配置与构建过程中的彩色输出行为。与它们配套的还有构建诊断着色变量 CMAKE_COLOR_DIAGNOSTICS(见下文"控制构建"一节)。
网络与 TLS:证书与校验
CMake 的file(DOWNLOAD)、file(UPLOAD)及FetchContent等网络操作遵循标准的 OpenSSL 证书环境变量:
- SSL_CERT_FILE:指定包含 CA 证书的文件路径;
- SSL_CERT_DIR:指定包含 CA 证书的目录路径;
- CMAKE_TLS_VERIFY:设为非空值可强制开启 TLS 证书校验(对应 CMake 变量 CMAKE_TLS_VERIFY 的行为);
- CMAKE_TLS_VERSION:指定 TLS 协议版本。
在企业内网使用自签名证书或私有 CA 时,正确设置SSL_CERT_FILE/SSL_CERT_DIR能避免下载失败;反之在完全受控的内网环境中,可用CMAKE_TLS_VERIFY关闭校验(需评估安全风险)。
安全与兼容:递归深度与策略版本
- CMAKE_MAXIMUM_RECURSION_DEPTH:限制
add_subdirectory等导致的目录递归深度,防止配置阶段因失控递归而栈溢出; - CMAKE_POLICY_VERSION_MINIMUM:为整个项目设置 CMake策略(policy)版本下限。当项目引用的依赖(如通过
find_package拉入的包)要求更高的策略版本,或你希望统一跨模块的策略行为时,通过该变量(或同名 CMake 变量 CMAKE_POLICY_VERSION_MINIMUM)可以避免因策略版本不一致导致的兼容性问题。这是 CMake 3.21+ 之后处理"依赖项目最低版本"问题的关键开关。
系统环境探测
- CMAKE_SYSTEM_ENVIRONMENT_ACTION与CMAKE_SYSTEM_ENVIRONMENT_ID:分别影响 CMake 对系统环境的处理方式与系统环境标识(system environment id)的读取,涉及 CMake 对平台环境的识别与记录。
控制构建过程的环境变量
这一类变量作用于生成阶段(generate)与构建阶段(build),决定用什么生成器、并行度多少、装到哪里、输出多详细。
生成器选择:CMAKE_GENERATOR 及其配套
- CMAKE_GENERATOR(3.15 新增,见 Help/envvar/CMAKE_GENERATOR.rst):指定当命令行未提供
-G选项时使用的默认生成器。若提供的值不是 CMake 已知的生成器名,则回退到内部默认值;无论如何,最终选定的生成器会记录到 CMake 变量CMAKE_GENERATOR中; - CMAKE_GENERATOR_PLATFORM:为生成器指定目标平台(如 Visual Studio 的
x64、ARM64); - CMAKE_GENERATOR_TOOLSET:为生成器指定工具集(如 Visual Studio 的
v143); - CMAKE_GENERATOR_INSTANCE:为生成器指定实例(如多实例安装的 Visual Studio 实例 ID)。
这三个配套变量可在多平台 CI 中"无参数化"地切换生成器与工具链,例如:
export CMAKE_GENERATOR="Ninja" export CMAKE_GENERATOR_PLATFORM=x64 cmake -S . -B build # 等价于 cmake -G Ninja -A x64 -S . -B build并行构建:CMAKE_BUILD_PARALLEL_LEVEL
- CMAKE_BUILD_PARALLEL_LEVEL(3.12 新增,见 Help/envvar/CMAKE_BUILD_PARALLEL_LEVEL.rst):指定
cmake --build(Build Tool Mode)可使用的最大并发进程数。例如设为 8,等价于调用cmake --build <dir> --parallel 8。若该变量被定义为空值,则使用底层构建工具自身的默认并发数。它不修改 CMakeLists.txt,适合在 CI 中按机器核数动态控制:
export CMAKE_BUILD_PARALLEL_LEVEL=$(nproc) cmake --build build安装相关:CMAKE_INSTALL_PREFIX / CMAKE_INSTALL_MODE / DESTDIR
- CMAKE_INSTALL_PREFIX:指定
cmake --install与install()规则默认使用的安装前缀(即cmake --install <dir> --prefix未显式给出时的默认值),对应同名 CMake 变量 CMAKE_INSTALL_PREFIX; - CMAKE_INSTALL_MODE:控制安装行为模式;
- DESTDIR(见 Help/envvar/DESTDIR.rst):用于staged install,把安装内容重定向到临时根目录下,便于打包成 deb/rpm 等软件包时收集文件列表。典型用法:
export DESTDIR=/tmp/stage cmake --install build # 文件被安装到 /tmp/stage/usr/local/...输出与诊断:VERBOSE / CMAKE_NO_VERBOSE / 导出编译数据库
- VERBOSE(3.14 新增,见 Help/envvar/VERBOSE.rst):只要该变量存在(其值被忽略),就激活 CMake 与底层构建工具的详细输出——也就是说
export VERBOSE=1和export VERBOSE=效果相同。构建时它会展开实际编译命令,便于排查头文件包含路径与链接参数; - CMAKE_NO_VERBOSE:与
VERBOSE相反,抑制详细输出; - CMAKE_EXPORT_COMPILE_COMMANDS:设为非空值后,CMake 会在构建目录生成
compile_commands.json,其中记录每个编译单元的实际编译命令。这是 clangd、ccls 等编辑器语言服务器和静态分析工具的输入; - CMAKE_EXPORT_BUILD_DATABASE:导出构建数据库;
- CMAKE_FASTBUILD_VERBOSE_GENERATOR:控制 Fastbuild 生成器的详细输出。
编译/链接启动器与隐式链接控制
- CMAKE_LANG_COMPILER_LAUNCHER(如
CMAKE_CXX_COMPILER_LAUNCHER):为编译命令前置启动器,最常见的用途是接入ccache或sccache以加速重复构建:export CMAKE_CXX_COMPILER_LAUNCHER=ccache - CMAKE_LANG_LINKER_LAUNCHER(如
CMAKE_CXX_LINKER_LAUNCHER):为链接命令前置启动器(同样可接ccache/sccache); - CMAKE_LANG_IMPLICIT_LINK_DIRECTORIES_EXCLUDE与CMAKE_LANG_IMPLICIT_LINK_LIBRARIES_EXCLUDE:从隐式链接目录/隐式链接库中排除指定项,用于精细控制链接命令,规避某些系统库带来的符号冲突。
其他构建控制变量
- CMAKE_TOOLCHAIN_FILE:指定交叉编译工具链文件路径(对应 CMAKE_TOOLCHAIN_FILE),跨平台构建时配合
-DCMAKE_TOOLCHAIN_FILE使用; - CMAKE_OSX_ARCHITECTURES与CMAKE_APPLE_SILICON_PROCESSOR:控制 macOS 构建的目标架构(如
arm64、x86_64); - MACOSX_DEPLOYMENT_TARGET:指定 macOS 最低部署版本;
- CMAKE_MSVCIDE_RUN_PATH:MSVC IDE 场景下运行可执行文件时的附加路径;
- CMAKE_CONFIG_DIR / CMAKE_CONFIG_TYPE / CMAKE_CONFIGURATION_TYPES:控制多配置生成器的配置目录与配置类型(Debug/Release 等);
- CMAKE_DISABLE_PRECOMPILE_HEADERS:全局禁用预编译头;
- CMAKE_CROSSCOMPILING_EMULATOR:交叉编译时为运行测试指定的模拟器;
- CMAKE_TEST_LAUNCHER:运行测试时前置的启动器(如
catch_discover_tests场景下的执行环境包装); - CMAKE_INTERMEDIATE_DIR_STRATEGY与CMAKE_AUTOGEN_INTERMEDIATE_DIR_STRATEGY:控制中间目录生成策略(影响 AUTOMOC/AUTOUIC/AUTORCC 的中间文件布局);
- PackageName_ROOT:
<PackageName>_ROOT形式的环境变量,为单个包指定根目录,供 find_package 的<PackageName>_ROOT搜索阶段使用(与同名 CMake 变量一致); - LDFLAGS:为链接阶段附加链接器标志;
- ADSP_ROOT:Analog Devices DSP 工具链根目录(用于 ADSP 交叉编译场景)。
各语言编译器与编译选项环境变量
CMake 确定编译器时遵循一套"环境变量优先"的规则:CC/CXX/FC等环境变量可以被视为默认编译器选择。这一节按语言分组列出手册收录的全部变量。
C 与 C++
- CC:默认 C 编译器(例如
export CC=clang后配置,C 编译器将优先使用 clang); - CXX:默认 C++ 编译器(例如
export CXX=g++-13); - CFLAGS:C 编译器的附加编译选项(会被追加到编译命令中);
- CXXFLAGS:C++ 编译器的附加编译选项。
典型用法是在构建"只读项目"时,不改 CMakeLists.txt 就能切换工具链:
export CC=clang export CXX=clang++ export CFLAGS="-O2 -Wall" export CXXFLAGS="-O2 -Wall -std=c++17" cmake -S . -B build注意:这些环境变量通常在首次配置时生效并固化进CMakeCache.txt(CMAKE_C_COMPILER、CMAKE_CXX_COMPILER);若需更换编译器,更可靠的做法是删除构建目录重新配置,或显式传递-DCMAKE_C_COMPILER=...。
CUDA 系列
- CUDACXX:默认 CUDA 编译器(nvcc);
- CUDAHOSTCXX:CUDA 编译时用于编译主机侧代码的 C++ 编译器;
- CUDAARCHS:指定 CUDA 架构列表(如
export CUDAARCHS=80;86,对应CMAKE_CUDA_ARCHITECTURES),决定生成的 PTX/SASS 面向哪些 GPU 架构; - CUDAFLAGS:CUDA 编译器附加选项。
Fortran 与 HIP
- FC:默认 Fortran 编译器(gfortran/flang 等);
- FFLAGS:Fortran 编译器附加选项;
- HIPCXX:默认 HIP 编译器(hipcc);
- HIPHOSTCXX:HIP 编译时主机侧 C++ 编译器;
- HIPFLAGS:HIP 编译器附加选项。
其他语言与方言
- OBJC/OBJCFLAGS:Objective-C 编译器与附加选项;
- OBJCXX/OBJCXXFLAGS:Objective-C++ 编译器与附加选项;
- ISPC/ISPCFLAGS:Intel ISPC 编译器与附加选项;
- RC/RCFLAGS:Windows 资源编译器(windres/rc)与附加选项;
- CSFLAGS:C# 编译器附加选项;
- SWIFTC:Swift 编译器;
- ASM_DIALECT与ASM_DIALECTFLAGS:汇编语言方言选择与附加选项。
关于CMAKE_LANG_*形式的通用约定
手册同时收录了一批以CMAKE_LANG_...命名的变量(如CMAKE_LANG_COMPILER_LAUNCHER、CMAKE_LANG_IMPLICIT_LINK_DIRECTORIES_EXCLUDE),其中LANG是占位符,实际使用时替换为具体语言名(C、CXX、CUDA、Fortran 等),例如CMAKE_CUDA_COMPILER_LAUNCHER、CMAKE_Fortran_IMPLICIT_LINK_LIBRARIES_EXCLUDE。
CTest 与 curses 界面的环境变量
CTest 行为控制
手册的第四类变量全部作用于 CTest 测试流程:
- CTEST_PARALLEL_LEVEL:CTest 并行运行测试的最大并发数;
- CTEST_OUTPUT_ON_FAILURE:设置后,测试失败时输出完整测试输出(对应
ctest --output-on-failure),是 CI 排查失败用例的标配:export CTEST_OUTPUT_ON_FAILURE=1 ctest --test-dir build - CTEST_NO_TESTS_ACTION:当没有测试可运行时 CTest 的行为(如报错或跳过);
- CTEST_PROGRESS_OUTPUT:控制进度输出;
- CTEST_INTERACTIVE_DEBUG_MODE:交互式调试模式;
- CTEST_USE_INSTRUMENTATION与CTEST_USE_VERBOSE_INSTRUMENTATION:控制仪表化(instrumentation)输出;
- CTEST_USE_LAUNCHERS_DEFAULT:控制 CTest 是否默认使用 launcher(配合 Makefile/Ninja 的
CMAKE_USE_LAUNCHERS); - CMAKE_CONFIG_TYPE:多配置构建下 CTest 运行所针对的配置类型;
- DASHBOARD_TEST_FROM_CTEST:标识当前测试由 CTest dashboard 驱动(供脚本区分执行上下文)。
ccmake 界面
- CCMAKE_COLORS:控制 curses 界面(
ccmake)的配色方案(见 Help/envvar/CCMAKE_COLORS.rst),可自定义前景/背景色组合,改善终端配色不佳环境下的可读性。
在源码与测试中的印证
以上变量并非文档虚构,均可在仓库源码与测试中找到对应实现:
- 编译器环境变量:
CC/CXX/FC等的读取逻辑位于 Source/Modules/CMakeDetermineCompiler.cmake 及各语言对应的CMakeDetermine*Compiler.cmake(如 Source/Modules/CMakeDetermineCXXCompiler.cmake),这些模块在确定编译器时会查询对应环境变量; - 查找路径变量:
CMAKE_PREFIX_PATH、CMAKE_INCLUDE_PATH等由find_*命令的实现(如 Source/cmFindPackageCommand.cxx、Source/cmFindLibraryCommand.cxx)在搜索阶段读取; - 并行构建:
CMAKE_BUILD_PARALLEL_LEVEL与--parallel选项在cmake --build(Build Tool Mode)实现中处理,最终转换为底层构建工具的-j参数; - 环境变量语义:
$ENV{}的解析与set/unset对环境的修改,由 Source/cmMakefile.cxx 与 Source/cmSetCommand.cxx 等实现,可结合 Help/command/set.rst 与 Help/command/unset.rst 文档查看; - 测试覆盖:
Tests目录中存在大量以环境变量为主题的测试用例,例如通过设置VERBOSE、CMAKE_BUILD_PARALLEL_LEVEL验证构建行为、通过CC/CXX验证编译器切换、通过DESTDIR验证 staged install 的RunCMake类测试,可用于回归验证这些变量的实际效果。
实战组合:一套"零参数"的 CI 构建方案
综合上述变量,可以在不改动任何 CMakeLists.txt 的情况下,用纯环境变量驱动一次完整构建与测试:
# 1. 工具链与编译选项(Languages 类) export CC=clang export CXX=clang++ export CFLAGS="-O2" export CXXFLAGS="-O2 -std=c++17" # 2. 依赖查找(Behavior 类) export CMAKE_PREFIX_PATH=/opt/deps:/opt/qt # 3. 生成器与并行度(Build 类) export CMAKE_GENERATOR=Ninja export CMAKE_BUILD_PARALLEL_LEVEL=8 # 4. 输出控制(Build 类) export VERBOSE=1 export CMAKE_EXPORT_COMPILE_COMMANDS=1 # 5. 配置、构建、测试 cmake -S . -B build cmake --build build export CTEST_OUTPUT_ON_FAILURE=1 ctest --test-dir build这套模式在 CI 矩阵(matrix)中尤其有用:同一份作业定义,通过注入不同的环境变量组合即可覆盖多编译器、多生成器、多依赖前缀的测试矩阵,且所有选择都显式可见、可审计。
小结
CMake 的特殊环境变量体系覆盖了配置行为、构建控制、语言工具链、测试执行、交互界面五个维度,其设计哲学与普通 CMake 变量互补:环境变量进程级、不缓存、来自调用环境,天然适合存放临时性、本机性、矩阵化的配置。建议读者在需要时:
- 先查 Help/manual/cmake-env-variables.7.rst 确认变量属于哪一分类;
- 再进入 Help/envvar 目录阅读对应单变量条目,确认引入版本、语义与同名 CMake 变量关系;
- 最后对照 Help/manual/cmake-language.7.rst 的 "Environment Variables" 一节,理解
$ENV{}引用与set/unset修改的作用范围限制。
掌握这套变量体系,你便能在不改项目源码的前提下,从"外部"精准控制 CMake 的每一次配置与构建。
- 构建工具
- 开发工具
- CLI
【免费下载链接】CMake
Mirror of CMake upstream repository
相关推荐
CMake 环境变量 OBJC 完全指南:为 Objective-C 语言指定首选编译器
CMake 环境变量 OBJC 完全指南:为 Objective C 语言指定首选编译器 导读 OBJC 是 CMake 在首次配置项目时用于定位 Object
构建工具开发工具CLICMake 环境变量 MACOSX_DEPLOYMENT_TARGET 完全指南:从环境变量到 CMAKE_OSX_DEPLOYMENT_TARGET 的 macOS 最低部署版本控制
CMake 环境变量 MACOSX_DEPLOYMENT_TARGET 完全指南:从环境变量到 CMAKE_OSX_DEPLOYMENT_TARGET 的 ma
构建工具开发工具CLICMake 环境变量 CMAKE_BUILD_PARALLEL_LEVEL 完全指南:控制 `cmake --build` 并发构建进程数
CMake 环境变量 CMAKE_BUILD_PARALLEL_LEVEL 完全指南:控制 cmake build 并发构建进程数 本文围绕 CMake 的 C
构建工具开发工具CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考