完全指南:从脚本命令到目标构建命令)
构建工具开发工具CLI【免费下载链接】CMakeMirror of CMake upstream repository项目地址https://gitcode.com/gh_mirrors/cm/CMake点击查看免费下载CMake 的cmake-commands(7)手册是构建系统的核心参考它把 CMake 语言中全部可用命令按“脚本命令Scripting Commands”“项目命令Project Commands”“CTest 命令”“废弃命令Deprecated Commands”四大类组织起来是编写CMakeLists.txt时的权威索引。本文以该手册为主线逐类梳理命令清单与调用场景并结合当前仓库中对应命令的官方文档Help/command 目录下的 148 份命令文档与命令注册源码Source/cmCommands.cxx展开讲解帮助你建立完整的命令心智地图写出结构清晰、可维护的构建脚本。命令分类总览手册的四级骨架cmake-commands(7)手册通过四张toctree目录树将命令划分为四个类别每类的“可用性”约束各不相同类别可用范围核心特征脚本命令Scripting Commands任何 CMake 脚本中始终可用属于 CMake 语言本身与“是否是一个项目”无关项目命令Project Commands仅在 CMake 项目CMakeLists.txt中可用定义目标、配置编译、安装导出等构建系统语义CTest 命令仅在 CTest 脚本中可用ctest -S script.cmake以ctest_前缀命名驱动测试流程废弃命令Deprecated Commands仅为向后兼容保留文档标注了弃用版本新代码不应使用从源码层面看这个分类并非文档的随意编排。在 Source/cmCommands.cxx 中GetScriptingCommands()函数将if、foreach、while、function、macro、block、return等注册为FlowControlCommand流程控制命令将set、string、list、message、file、find_package等注册为BuiltinCommand内置命令——它们不依赖任何项目上下文恰好对应手册第一类“始终可用”的脚本命令。而add_executable、add_library等目标相关命令在文件后半部分通过CM_UNEXPECTED_PROJECT_COMMAND宏注册只能在项目作用域中调用。这说明命令分类有真实的代码实现作为支撑。脚本命令Scripting CommandsCMake 语言的基石这一类命令“始终可用”它们构成 CMake 脚本语言本身的语法与标准库。手册列出 60 个命令可进一步细分为以下几组。流程控制命令block/break/continue/else/elseif/endblock/endforeach/endfunction/endif/endmacro/endwhile/foreach/function/if/macro/return/while共同实现分支、循环与子例程。if条件求值是使用最频繁的命令之一其完整文档见 Help/command/if.rst条件语法按优先级求值括号 → 一元测试 → 二元比较 →NOT→AND/OR从左到右无短路。实际用法覆盖常量与变量if(constant)中1、ON、YES、TRUE、Y及非零数为真0、OFF、NO、FALSE、N、IGNORE、NOTFOUND、空串或以-NOTFOUND结尾的值为假命名布尔常量大小写不敏感if(variable)在变量被定义且值不是假常量时为真但宏参数不是变量if(ENV{some_var})也恒为假。存在性检查if(COMMAND name)判断命令/宏/函数是否可调用if(POLICY CMPxxxx)、if(TARGET name)、if(TEST name)、if(DEFINED name|CACHE{name}|ENV{name})分别判断策略、目标、测试与变量是否存在。注意if(DEFINED someName)无法区分普通变量与缓存变量需要同时测试if(DEFINED someName AND NOT DEFINED CACHE{someName})才能确认非缓存变量存在。文件操作if(EXISTS path)判断文件或目录是否存在解析符号链接空路径为假if(IS_READABLE)/if(IS_WRITABLE)/if(IS_EXECUTABLE)3.29 起检查权限另有IS_DIRECTORY、IS_SYMLINK、IS_ABSOLUTE。IS_ABSOLUTE在 Windows 上对C:、/、\开头都判定为真。比较运算数值比较LESS/GREATER/EQUAL/LESS_EQUAL/GREATER_EQUAL按 Cdouble解析、字符串比较STRLESS/STRGREATER/STREQUAL等、版本比较VERSION_LESS/VERSION_GREATER/VERSION_EQUAL等按major[.minor[.patch[.tweak]]]逐组件整数比较缺失组件视为 0、路径比较PATH_EQUAL3.24逐组件比较且不访问文件系统/a//b/c与/a/b/c相等但STREQUAL不相等与PATH_IS_PREFIX4.5。正则匹配if(var|string MATCHES regex)匹配时捕获的()分组存入CMAKE_MATCH_n变量。一个容易踩坑的点是变量的自动求值if命令早于${}语法出现因此会对参数中的变量名自动解引用。set(var1 OFF)后if(${var2})其中var2值为var1等价于if(var1)为假而去掉${}后if(var2)因var2有定义而为真。自 3.1 起带引号或方括号的参数会被当作字符串处理而不解引用见策略 CMP0054。foreach循环支持四种形态见 Help/command/foreach.rst普通列表迭代、RANGE stop、RANGE start stop [step]要求全部为非负整数且stop start、IN [LISTS lists] [ITEMS items]以及 3.17 新增的IN ZIP_LISTS lists并行迭代多个列表单变量名时生成loop_var_N多变量名时逐一对应列表不等长时缺失项为空。循环变量作用域受策略 CMP0124 约束break/continue可跳出或跳过迭代。function与macro定义可复用子例程见 Help/command/function.rst。函数内部会自动设置ARGC参数个数、ARGV全部参数列表、ARGV0/ARGV1/...各参数值、ARGN超出形参的额外参数4.5 起还有ARGNC。函数打开新作用域向父作用域传值需用set(var PARENT_SCOPE)宏则不打开新作用域其参数是文本替换而非变量这是两者最重要的区别。函数调用不区分大小写foo()、Foo()、FOO()均可3.18 起还可用cmake_language(CALL foo)动态调用。变量、属性与字符串操作setHelp/command/set.rst设置普通变量、缓存条目或环境变量。普通变量形态set(variable value... [PARENT_SCOPE])可回写父作用域缓存形态set(CACHE{variable} [TYPE type] [HELP helpstring...] [FORCE] VALUE [value...])4.2 起的新签名支持BOOL/FILEPATH/PATH/STRING/INTERNAL五种类型其中INTERNAL隐含FORCE用于跨运行持久保存PATH/FILEPATH会把命令行-D传入的相对路径转换为绝对路径环境变量形态set(ENV{var} [value])只影响当前 CMake 进程不影响父进程或后续构建进程的环境。string/list/math/separate_arguments字符串处理、列表操作、算术求值与参数拆分是脚本中的“标准库”。messageHelp/command/message.rst输出日志模式从FATAL_ERROR报错并终止生成、返回非零退出码、SEND_ERROR报错但继续处理、跳过生成、WARNING、AUTHOR_WARNING、DEPRECATION、默认/NOTICE到面向用户的STATUS以及 3.15 新增的VERBOSE/DEBUG/TRACE分级日志。属性访问get_property/set_property/get_cmake_property/get_directory_property/get_filename_component等构成属性系统与路径解析的统一入口。file与configure_file文件读写与“模板配置”命令configure_file在生成构建系统时把VAR或${VAR}占位符替换为变量值输出到目标文件是生成配置文件的标准手段。cmake_language以cmake_language(CALL ...)调用命令、以cmake_language(EXPORT ...)导出命令集等实现元编程能力。其他cmake_minimum_required声明最低版本并隐式启用策略、cmake_policy策略管理、option用户可切换的缓存布尔选项、include/include_guard脚本包含与防重复包含、unset、variable_watch变量读写监控调试利器、site_name、load_cache、cmake_path3.20 起的新路径命令功能超越get_filename_component、mark_as_advanced、cmake_parse_arguments解析函数命名参数、cmake_host_system_information、cmake_diagnostic、cmake_pkg_config、execute_process运行子进程、find_file/find_library/find_package/find_path/find_program五件套查找命令find_package是依赖管理核心。项目命令Project Commands定义构建系统语义这一类命令“仅在 CMake 项目中可用”共 61 个是编写CMakeLists.txt的主力。手册将其一并列出实际使用中可按职责归为几大块。目标定义与配置add_executableHelp/command/add_executable.rst与add_libraryHelp/command/add_library.rst是定义构建目标的两大命令各有多种签名普通形态add_executable(name [WIN32] [MACOSX_BUNDLE] [EXCLUDE_FROM_ALL] sources...)add_library(name [STATIC|SHARED|MODULE] [EXCLUDE_FROM_ALL] sources...)不指定类型时由BUILD_SHARED_LIBS决定STATIC还是SHARED。WIN32/MACOSX_BUNDLE/EXCLUDE_FROM_ALL分别等价于设置同名目标属性。目标名在整个项目中必须全局唯一实际产物文件名由平台约定决定如name.exe、libname.a。OBJECT 对象库只编译不归档其他目标用$TARGET_OBJECTS:objlib引用其目标文件。INTERFACE 接口库不产生磁盘产物只通过INTERFACE_*属性target_link_libraries(INTERFACE)、target_include_directories(INTERFACE)等向依赖方传递使用要求。4.2 起支持add_library(name INTERFACE SYMBOLIC)符号接口库用于表达包中的可选组件可通过链接它来强制校验find_package声明的必需组件。IMPORTED 导入目标引用项目外部的库/可执行文件通过IMPORTED_LOCATION及IMPORTED_LOCATION_CONFIG、IMPORTED_IMPLIB、IMPORTED_OBJECTS、IMPORTED_SONAME等IMPORTED_*属性描述文件位置GLOBAL选项使其全局可见。ALIAS 别名目标为既有目标创建别名name不会出现在生成的构建系统中4.5 起别名可作为set_property、target_link_libraries、install、export的操作对象CMake 4.4 及更早版本不允许。add_custom_commandHelp/command/add_custom_command.rst用于为构建系统添加自定义规则有两种形态OUTPUT形态生成文件add_custom_command(OUTPUT output... COMMAND cmd... [MAIN_DEPENDENCY] [DEPENDS] [BYPRODUCTS] [WORKING_DIRECTORY] [COMMENT] [VERBATIM] [USES_TERMINAL] [JOB_POOL] [DEPFILE] [IMPLICIT_DEPENDS] [COMMAND_EXPAND_LISTS] [APPEND] [DEPENDS_EXPLICIT_ONLY] [CODEGEN])。OUTPUT文件自动标记GENERATED源文件属性VERBATIM保证参数原样传递到命令强烈推荐多个COMMAND按顺序执行但不会合并进同一个状态化 shell 脚本需要跑完整脚本时应先用configure_file或file(GENERATE)生成脚本DEPENDS按“目标 → 绝对路径 → 源文件 → 当前源码目录相对路径 → 当前二进制目录相对路径”的优先级解析依赖3.31 起CODEGEN选项仅 Ninja 与 Makefile 生成器、需策略 CMP0171 为 NEW把自定义命令挂到内置codegen目标便于做静态分析而不构建整个项目。TARGET形态构建事件add_custom_command(TARGET target PRE_BUILD|PRE_LINK|POST_BUILD COMMAND ...)。PRE_BUILD仅对 Visual Studio 生成器有独特语义在其他生成器上等同PRE_LINKPRE_LINK在源文件编译后、链接/归档前运行POST_BUILD在所有规则之后运行。典型场景如链接后用someHasher -i $TARGET_FILE:myExe生成校验文件。配套的add_custom_target定义纯逻辑目标不产生文件仅作为依赖锚点add_dependencies添加目标级依赖add_custom_rule4.x 新命令将命令组织成可复用的规则。编译与链接控制作用域级add_compile_options/add_compile_definitions/add_definitions/remove_definitions、include_directories/link_directories/link_libraries/add_link_options——作用于目录及其子目录的所有目标属于旧式用法。目标级现代推荐target_compile_options/target_compile_definitions/target_compile_features、target_include_directories/target_link_directories/target_link_options/target_link_libraries/target_precompile_headers/target_sources——通过PRIVATE/PUBLIC/INTERFACE三关键字精确控制“自身使用 / 自身与依赖方使用 / 仅依赖方使用”并把使用要求usage requirements通过INTERFACE_*属性传递给依赖方。target_link_librariesHelp/command/target_link_libraries.rst是链接依赖声明的核心其item可以是库目标名链接行使用关联库文件的完整路径构建系统自动加入“库先于目标构建”的排序依赖库文件完整路径通常原样保留路径无SONAME的共享库可能被转换为-lfoo搜索形式macOS 框架的Headers目录会作为使用要求传播纯库名如foo→-lfoo或foo.lib作为命令行字符串片段原样使用链接标志以-开头非-l/-framework视为链接器标志会随依赖传播建议仅作为PRIVATE项使用如需精确控制位置应改用target_link_options或LINK_OPTIONS属性生成器表达式$...可求值为上述任意项或分号分隔的列表若展开后含;必须显式加引号$...debug/optimized/general关键字限定对应构建配置debug对应Debug配置或DEBUG_CONFIGURATIONS全局属性指定的配置。PUBLIC/PRIVATE/INTERFACE语义PUBLIC项既参与链接又进入链接接口PRIVATE项仅参与链接INTERFACE项只进入接口。3.12 起对象库也可作为target_link_libraries的目标其使用要求会传播而目标文件不会3.21 起可用$TARGET_OBJECTS:obj把对象库的目标文件放到链接行库之前。对于相互依赖的静态库环A↔BCMake 允许图中有强连通分量链接时整段重复main链接A B A B。包含::的项如Foo::Bar被视为导入或别名库名不存在则报错见 CMP0028。测试、安装与导出测试enable_testing/add_test/set_tests_properties/get_test_property/create_test_sourcelist/discover_tests结合ctest驱动测试。项目用enable_testing()开启后add_test(NAME name COMMAND cmd)注册测试ctest即可执行。安装与导出install支持install(TARGETS ...)、install(FILES ...)、install(DIRECTORY ...)等形态、export、include_external_msproject把外部.vcxproj纳入生成结果、export与install(EXPORT)配合生成可被find_package消费的包。其他项目命令project声明项目名与语言触发编译器探测、enable_language按需启用语言、try_compile/try_run配置期试编译/试运行用于特性探测、aux_source_directory、source_group、build_command、fltk_wrap_ui、define_property、cmake_file_api、cmake_instrumentation、get_source_file_property、get_target_property、get_test_property、include_regular_expression、set_source_files_properties、set_target_properties、set_tests_properties。CTest 命令驱动测试流程手册第三类共 13 个命令全部以ctest_为前缀仅在 CTest 脚本ctest -S中可用用于把测试流程脚本化ctest_start开始一轮测试并记录时间戳、ctest_configure/ctest_build/ctest_test/ctest_coverage/ctest_memcheck分别驱动配置、构建、测试、覆盖率与内存检查阶段、ctest_submit/ctest_upload向 CDash 等仪表板提交结果与上传文件、ctest_update更新版本库、ctest_read_custom_files读取CTestCustom.ctest自定义文件、ctest_run_script运行嵌套脚本、ctest_sleep、ctest_empty_binary_directory清空构建目录后重建。CTest 命令的完整实现位于 Source/CTest 目录对应头文件与命令文档一一对应。废弃命令兼容旧代码勿用于新项目手册第四类列出 24 个废弃命令仅用于向后兼容每个命令的文档都标注了弃用版本新代码严禁使用。典型包括subdirs已被add_subdirectory取代、exec_program已被execute_process取代、install_files/install_programs/install_targets已被install取代、make_directory已被file(MAKE_DIRECTORY)取代、remove已被file(REMOVE)取代、write_file已被file(WRITE)取代、qt_wrap_cpp/qt_wrap_ui已被qt6_wrap_cpp/qt6_wrap_ui等取代、build_name、export_library_dependencies、load_command、output_required_files、subdir_depends、use_mangled_mesa、utility_source、variable_requires。迁移到新代码时一律查找对应替代命令的文档Help/command 中同名.rst文件确认现代写法。命令行入口如何查阅这份手册当前仓库的文档与源码版本一致查阅方式有两种在线文档构建 CMake 文档后cmake-commands(7)手册的 HTML 版本即 Help/manual/cmake-commands.7.rst 渲染而成目录树中的每个链接都指向 Help/command 下对应的.rst源文件。命令行已安装 CMake 后直接运行cmake --help-command command查看单个命令文档运行cmake --help-command-list查看全部命令列表。该手册也随 CMake 以 man page 形式安装man 7 cmake-commands。小结以命令分类为索引组织你的 CMakeLists.txt脚本命令是语言基础任何脚本里都能用重点掌握if条件语法、foreach四种迭代形态、function/macro作用域差异与set的三种作用对象项目命令定义构建系统语义现代项目应优先使用target_*目标级命令配合PUBLIC/PRIVATE/INTERFACE精确控制使用要求传播用add_custom_command扩展自定义构建规则CTest 命令只在测试脚本中可用用于流水线化测试流程废弃命令仅保兼容新代码一律迁移到替代命令。掌握这份手册的分类与命令语义就等于拿到了 CMake 构建脚本的“总索引”——遇到任何构建需求都可以先在 Help/command 中找到对应命令的精确定义再回到 Source/cmCommands.cxx 确认其注册与可用范围实现文档到实现的闭环印证。赞分享构建工具开发工具CLI【免费下载链接】CMakeMirror of CMake upstream repository项目地址https://gitcode.com/gh_mirrors/cm/CMake点击查看免费下载相关推荐AlaSQL命令参考手册从CREATE TABLE到EXPORT的全命令AlaSQL命令参考手册从CREATE TABLE到EXPORT的全命令 你还在为JavaScript数据处理烦恼想在浏览器或Node.js中使用SQL却不嵌入式数据库数据工程beets 命令行参考从 import 到 config 的完整命令手册beets 命令行参考从 import 到 config 的完整命令手册 beets 是一个音乐库管理器与 MusicBrainz 标签器它的全部功能都通过音频CLICMake build_command 命令实战指南生成可移植的 cmake --build 构建命令行CMake build_command 命令实战指南生成可移植的 cmake build 构建命令行 导读 build_command 是 CMake 提供的构建工具开发工具CLI上一篇告别单体困境Resque事件驱动架构的5个实战技巧下一篇3B参数撬动企业AI变革IBM Granite-4.0-Micro改写轻量化部署规则创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考