ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

CMake 的 Sublime Text 2 生成器(Extra Generator)完整指南:从生成原理到配置实践

CMake 的 Sublime Text 2 生成器(Extra Generator)完整指南:从生成原理到配置实践 构建工具开发工具CLI【免费下载链接】CMakeMirror of CMake upstream repository项目地址https://gitcode.com/gh_mirrors/cm/CMake点击查看免费下载Sublime Text 2 生成器是 CMake 提供的“附加生成器”Extra Generator之一它不直接产出可执行的构建脚本而是在底层 Makefile/Ninja 构建系统之上为 Sublime Text 2 生成.sublime-project项目文件使开发者可以在编辑器内直接浏览源码、执行构建与安装。本文基于 CMake 仓库中的官方文档 Help/generator/Sublime Text 2.rst结合 cmExtraSublimeTextGenerator.cxx 的源码实现完整讲解该生成器的功能、四种变体、配置变量与底层原理并说明其自 3.27 起被弃用的背景与迁移方向。阅读本文后你将掌握如何配置并使用该生成器理解生成出的.sublime-project文件结构以及如何通过cmake-file-api完成替代。一、功能概述附加生成器做什么Sublime Text 2 生成器属于 CMake 的“Extra Generators”体系。根据 CMAKE_EXTRA_GENERATOR 变量文档当使用 Eclipse、CodeBlocks、CodeLite、Kate 或 Sublime 等生成器时CMake 一方面照常生成 Makefiles或 Ninja 构建文件对应变量CMAKE_GENERATOR另一方面额外为对应 IDE 生成项目文件这个 IDE 项目文件生成器即存储在CMAKE_EXTRA_GENERATOR变量中例如Eclipse CDT4、Sublime Text 2。从源码看该类继承自cmExternalMakefileProjectGenerator工厂描述为 Generates Sublime Text 2 project files (deprecated)Source/cmExtraSublimeTextGenerator.cxx即“生成 Sublime Text 2 项目文件已弃用”。这意味着它并不是一个独立可用的“全局生成器”而是必须与某个底层构建系统生成器配对使用。二、生成产物项目文件与构建文件官方文档明确了该生成器的工作方式项目文件*.sublime-project会在顶层目录以及每一个包含project()命令调用的CMakeLists.txt所在的子目录中生成与此同时构建树中会照常生成Makefile或build.ninja文件底层 make 程序可通过默认的all目标构建整个项目同时还会提供一个install目标生成的项目内包含可供 Sublime Text 直接调用的“构建系统”build system条目。从源码实现可以印证这一流程Generate()遍历全局生成器的GetProjectMap()对每个子项目调用CreateProjectFile()Source/cmExtraSublimeTextGenerator.cxx。CreateProjectFile()以当前二进制目录为输出目录、项目名为文件名构造项目名.sublime-project路径再调用CreateNewProjectFile()写出 JSON 内容Source/cmExtraSublimeTextGenerator.cxx。生成的.sublime-project采用 JSON 格式主要包含以下区段folders以源码根目录相对构建目录的路径写入path如果构建目录位于源码树内部且开启了排除选项还会追加folder_exclude_patterns将构建目录从项目浏览树中剔除build_systems为每个可构建目标生成一个 Sublime Text 构建系统条目env可选的平台级环境变量区段依赖CMAKE_SUBLIME_TEXT_2_ENV_SETTINGS配置。三、支持的四种变体官方文档列出该附加生成器可以指定的四种名称生成器名称底层构建系统Sublime Text 2 - MinGW Makefiles基于 MinGW Makefiles 生成器 构建Sublime Text 2 - NMake Makefiles基于 NMake Makefiles 生成器 构建Sublime Text 2 - Ninja基于 Ninja 生成器 构建Sublime Text 2 - Unix Makefiles基于 Unix Makefiles 生成器 构建从源码的工厂注册逻辑Source/cmExtraSublimeTextGenerator.cxx可以看到更细致的平台约束在 Windows_WIN32下支持MinGW Makefiles与NMake Makefiles全平台支持Ninja与Unix MakefilesMSYS Makefiles因“尚无人实际测试”而被注释禁用。也就是说跨平台通用搭配是Sublime Text 2 - Ninja与Sublime Text 2 - Unix Makefiles而 MinGW/NMake 变体面向 Windows 下的开发环境。四、命令行使用方法在 CMake 配置阶段直接用-G指定完整生成器名称即可# 类 Unix 平台Linux / macOS cmake -G Sublime Text 2 - Unix Makefiles -S . -B build # 使用 Ninja 作为底层构建系统速度更快 cmake -G Sublime Text 2 - Ninja -S . -B build # Windows 平台 cmake -G Sublime Text 2 - MinGW Makefiles -S . -B build cmake -G Sublime Text 2 - NMake Makefiles -S . -B build配置完成后构建目录中会出现build/项目名.sublime-project。在 Sublime Text 2 中打开该文件即可浏览源码树并通过CtrlBBuild触发构建。生成器中每个目标都会成为独立的构建系统可通过Tools - Build Systems选择要构建的目标默认的all目标对应整项目构建此外还提供install目标。值得注意的是若希望配置完成后直接用subl命令打开项目可设置缓存变量CMAKE_SUBLIMETEXT_EXECUTABLE指向 Sublime Text 可执行文件——源码中的Open()方法会读取该缓存变量并执行subl --project 项目名.sublime-projectSource/cmExtraSublimeTextGenerator.cxx。该变量不存在或为NOTFOUND时CMake 不会尝试打开项目。五、可配置变量与生成行为控制5.1CMAKE_SUBLIME_TEXT_2_EXCLUDE_BUILD_TREE该变量自 CMake 3.8 引入见 Help/variable/CMAKE_SUBLIME_TEXT_2_EXCLUDE_BUILD_TREE.rst。当顶层CMakeLists.txt末尾求值该变量为ON时如果构建目录位于源码树内部附加生成器会将构建树排除在.sublime-project之外避免在编辑器的侧边栏中显示大量构建产物。# 顶层 CMakeLists.txt 末尾 set(CMAKE_SUBLIME_TEXT_2_EXCLUDE_BUILD_TREE ON)源码中Generate()通过GlobalSettingIsOn(CMAKE_SUBLIME_TEXT_2_EXCLUDE_BUILD_TREE)读取该设置Source/cmExtraSublimeTextGenerator.cxx并在写入folders时仅当构建目录相对源码根目录不以../开头即确实位于源码树内部时才写入folder_exclude_patternsSource/cmExtraSublimeTextGenerator.cxx。5.2CMAKE_SUBLIME_TEXT_2_ENV_SETTINGS该变量同样在 CMake 3.8 引入见 Help/release/3.8.rst用于把指定的环境变量写入生成的.sublime-project。其取值为形如KEYVALUE的字符串列表写入格式为以当前CMAKE_SYSTEM_NAME为键的平台分组set(CMAKE_SUBLIME_TEXT_2_ENV_SETTINGS MY_FLAG1 ANOTHER_VARhello)源码中CreateNewProjectFile()会将每个前的部分作为变量名、之后的部分作为变量值写入env: { 系统名: { 变量名: 变量值 } }结构若某个条目缺少则会以 FATAL_ERROR 报错提示“无法解析 CMAKE_SUBLIME_TEXT_2_ENV_SETTINGS 中损坏的字符串”Source/cmExtraSublimeTextGenerator.cxx。六、源码级剖析.sublime-project的构建系统如何生成6.1 目标遍历规则AppendAllTargets()负责把可构建目标写入build_systems区段Source/cmExtraSublimeTextGenerator.cxx其规则如下首先无条件添加all与clean两个目标对每个可执行/静态库/共享库/模块库/对象库目标额外添加一个目标名/fast变体跳过依赖关系检查的快速构建目标GLOBAL_TARGET仅从CMAKE_BINARY_DIR顶层二进制目录添加子目录中的不重复添加UTILITY目标全部添加但排除NightlyStart、ContinuousStart、ExperimentalStart这类以Nightly/Continuous/Experimental为前缀的 CTest 子目标保留完整的Nightly、Continuous、Experimental本身。6.2 构建命令的组装BuildMakeCommand()根据底层生成器组装不同的 make 调用参数Source/cmExtraSublimeTextGenerator.cxxNMake Makefiles使用/NOLOGO /f Makefile 目标带/NOLOGO抑制横幅输出Ninja使用-f build.ninja 目标MinGW Makefiles-f Makefile 目标且为规避历史 issue路径含空格问题不转义空格Unix Makefiles-f Makefile 目标其余路径会做输出路径转换。每个构建系统条目还包含working_dir${project_path}以及用于解析编译器报错行列号的file_regex正则表达式Source/cmExtraSublimeTextGenerator.cxx这样 Sublime Text 才能在输出面板中把“文件:行:列”格式的错误映射回源码位置。6.3 为补全/索引工具提取编译参数源码注释指出Sublime Text 与 sublimeclang 当时并不支持“按构建系统”设置编译参数只能“项目级”设置。因此AppendTarget()在为每个目标生成构建系统的同时会收集该目标所有源文件的编译信息ComputeFlagsForObject()Source/cmExtraSublimeTextGenerator.cxx汇总语言显式标志、目标编译标志、源文件的COMPILE_FLAGS与COMPILE_OPTIONS属性支持生成器表达式求值ComputeDefines()Source/cmExtraSublimeTextGenerator.cxx汇总目标与配置的预处理器宏定义含COMPILE_DEFINITIONS及COMPILE_DEFINITIONS_CONFIG源文件属性ComputeIncludes()Source/cmExtraSublimeTextGenerator.cxx汇总源文件与目标的 include 目录并转换为-I标志。这些标志、宏与头文件路径随后通过正则(^|[ ])-[DIOUWfgs][^ ]...从组合字符串中抽取存入以源文件全路径为键的映射最终以项目级settingssublimeclang 使用形式供代码补全与跳转使用。七、弃用状态与迁移建议从 CMake 3.27 起官方在文档中明确标注该生成器以及整个 Extra Generators 机制已弃用并将在未来版本中移除见 Help/generator/Sublime Text 2.rst 顶部 deprecation 说明与 Help/manual/cmake-generators.7.rst 中 Extra Generators 一节。迁移方向是使用 cmake-file-api(7)该 API 以 JSON 形式向 IDE 暴露 CMake 生成的构建树信息目标、源码、编译命令等不依赖特定生成器的专用项目文件格式。对于仍然在较老版本 CMake 中使用 Sublime Text 2 的存量项目建议规划迁移到基于cmake-file-api的现代 IDE 集成方案。八、参考与延伸阅读官方生成器文档Help/generator/Sublime Text 2.rst附加生成器机制CMAKE_EXTRA_GENERATOR 与 cmake-generators(7)行为控制变量CMAKE_SUBLIME_TEXT_2_EXCLUDE_BUILD_TREE3.8 版本新增变量说明Help/release/3.8.rst核心实现Source/cmExtraSublimeTextGenerator.h 与 Source/cmExtraSublimeTextGenerator.cxx弃用后的推荐替代Help/manual/cmake-file-api.7.rst赞分享构建工具开发工具CLI【免费下载链接】CMakeMirror of CMake upstream repository项目地址https://gitcode.com/gh_mirrors/cm/CMake点击查看免费下载相关推荐CMake 的 Kate 项目文件生成器Extra Generator使用与原理详解CMake 的 Kate 项目文件生成器Extra Generator使用与原理详解 导读 本指南面向使用 Kate https://kate editor构建工具开发工具CLICMake 的 CodeLite 额外生成器Extra Generator详解项目文件生成、目标模式与源码级原理CMake 的 CodeLite 额外生成器Extra Generator详解项目文件生成、目标模式与源码级原理 导读 本文围绕 CMake 仓库中 Co构建工具开发工具CLIaf-webpack 配置完全指南从 .webpackrc 到 webpack 配置生成的原理与实践af webpack 配置完全指南从 .webpackrc 到 webpack 配置生成的原理与实践 本文以 packages/af webpack/Conf前端开发工具上一篇Sonic 配置文件完全指南config.cfg 全部参数解析与生产环境调优实战下一篇快捷键突然失灵用 Hotkey Detective 热键冲突检测三步揪出真凶创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表