Semifold
工作区

C++ 工作区

基于 CMake 的静态软件包发现、版本修改、内部链接排序和当前限制。

C++ 内置适配器围绕能够静态分析的 CMake 项目工作。它不运行 CMake,也不尝试解释构建时才出现的目录和 target。

根项目要求

项目根必须包含 CMakeLists.txt,并能从 project(...) 调用中读取数字版本:

project(my_library VERSION 1.4.0 LANGUAGES CXX)

缺少 VERSION 的根项目不能作为当前 C++ 工作区入口。project 名称是清单名称,用于同一 C++ 工作区内的软件包匹配。

子项目发现

Semifold 递归跟随字面量形式的:

add_subdirectory(libs/core)

中间目录可以只负责分组;每个可达目录只要自己的 CMakeLists.txt 包含带 VERSIONproject(...),就会被发现为软件包。

为保证发现是确定且安全的,当前不会解释:

  • 变量拼接的子目录;
  • generator expression;
  • 下载、脚本或配置阶段生成的路径;
  • 逃出项目根目录的相对路径。

解析后的路径如果离开项目根目录会直接失败,而不是读取外部项目。

内部依赖

适配器识别以当前项目名为第一个参数的静态调用:

target_link_libraries(my_library PRIVATE support_library)

support_library 也是同一工作区中发现的 project 名称时,建立内部依赖边。PUBLICPRIVATEINTERFACE 当前都只影响依赖顺序,不自动触发版本传播。

变量、别名 target、generator expression 或其他间接链接无法可靠匹配时,不会猜测关系。需要重新发布语义时,在 Semifold 配置中加入 depends-on

版本修改

Semifold 修改对应 CMakeLists.txtproject(... VERSION ...)。如果软件包目录存在 vcpkg.json,还会同步其根级 version 字段,避免两个公开版本来源漂移。

CMake 适配器当前只接受稳定数字版本,因此不支持 alphabetarc 等命名发布通道。为 C++ 软件包设置命名 channel 会让版本规划失败;需要预发布语义时,应先评估自定义插件和发布流程是否能完整表达目标格式。

发布

CMake 描述构建图,不规定统一的软件包仓库,因此内置发现缺省把 C++ 软件包视为可发布。不需要 registry 流程的软件包应显式配置 publish = false。Semifold 把检查、构建、上传和发布行为留在 [resolver.cpp] 的命令配置中,并在统一发布计划中按依赖顺序运行。

使用 smif publish --dry-run 检查将运行的预检与命令。命令在软件包目录中执行;复杂的 CMake 配置、打包或 registry 客户端逻辑应放在仓库脚本中,而不是依赖 shell 操作符写进 args

何时使用插件

以下情况通常超出内置静态规则:

  • 版本不在 project(... VERSION ...)
  • workspace 成员由自定义元数据或运行时脚本生成;
  • 内部依赖来自无法静态展开的 CMake 逻辑;
  • 需要非数字或自定义预发布版本格式。

插件可以为这些仓库定义发现、读取和候选版本修改,但发布命令仍由 resolver 配置负责。

本页内容