Skip to content

feat(manifest): 声明式清单能力 — features.sources / generated_files / cfg 条件 sources / per-glob flags#221

Closed
Sunrisepeak wants to merge 1 commit into
feat/asm-sourcesfrom
feat/declarative-manifest
Closed

feat(manifest): 声明式清单能力 — features.sources / generated_files / cfg 条件 sources / per-glob flags#221
Sunrisepeak wants to merge 1 commit into
feat/asm-sourcesfrom
feat/declarative-manifest

Conversation

@Sunrisepeak

Copy link
Copy Markdown
Member

概要

G1–G9 方案的 PR-B(叠在 #220 / feat/asm-sources 之上;#220 合入后本 PR 自动 retarget 到 main)。不 bump 版本;版本与发布随 PR-C。

内容(G5 + G6 + G1b + G4 + G8b)

G5 — [features] 表形式增 sources(与 xpkg 描述符逐字对等,补齐两语法不对称)

  • 顺带修了 gate 语义的真缺口:原 drop 只按字符串从 sources 删 glob,默认 glob src/** 仍罩住被门控的文件 → gate 形同虚设。现在未激活 feature 的 glob 变成 ! 排除,gate 真正生效(build 模式;mcpp test 保持 0.0.94 的解耦决策,e2e 100/79 回归全过)

G6 — [generated_files](路径 = 内容,越根路径解析期报错)

  • 根 manifest 补 materialize 调用(此前只对依赖做)
  • 自研 TOML 解析器补 """/''' 多行字符串(TOML 1.0 语义:首换行修剪、行尾反斜杠、闭合粘连引号)——整个 manifest 生态受益

G1b — [target.'cfg(...)'.build] sources(条件源 glob,x86 .asm 跨架构可用的前提)

  • 解析后的 target 求值(交叉编译正确);cfg 合并提炼为 merge_conditional_build补依赖侧求值——此前 conditionalConfigs 对依赖完全不求值,描述符写了也静默无效
  • xpkg 增 target_cfg 键(ffmpeg/x264 按 arch 选汇编目录的表达)

G4 — [build] flags = [{ glob, ... }] per-glob 旗标

  • 有序数组形式(TOML 表是 sorted map,声明序在解析层就丢了——数组才能承载"顺序即语义,后者胜")
  • 键:cflags/cxxflags/asmflags/defines(无 ldflags——链接没有 per-TU 作用域);零命中 glob 打 warning;全序列折入指纹;xpkg 对称 flags
  • asmflags 经新 packageAsmflags 通道接 PR-A 的 unit_asmflags

G8b — 已定位并修复:用户 cflags/cxxflags 里的相对 -I 按 ninja cwd(outputDir)解析而非项目根(实测 .cpp/.cppm 同病,非 .cppm 独有)。修 = scanner 单点绝对化(包根已知)+ plan 入口单元同步。

测试

  • 单测 35/35:toml↔xpkg 对称性契约测试(同一内容两语法产出相等 Manifest)、多行字符串、per-glob 顺序语义/未知键拒绝、cfg sources 双语法、相对 -I 绝对化
  • e2e 新增 106(featureSources 四象限:on/off × build/test)/ 107(generated_files 落盘+指纹重建+越根拒绝)/ 108(cfg sources,host-aware 双向)/ 109(per-glob 命中/隔离/顺序覆盖/零命中告警)
  • 全量 e2e:110 过 / 3 失败(22/54/62,均既有环境性)/ 5 跳
  • docs/05 中英同步(含补上 PR-A 汇编段落的中文版)

后续

PR-C(build.mcpp 环境契约 + cross 下运行 + 依赖包执行,bump 0.0.95 并触发发布)。

… sources / per-glob flags

设计: .agents/docs/2026-07-17-asm-sources-and-general-build-capabilities-design.md (PR-B)

- G5: mcpp.toml [features] 表形式增 sources 键 → featureSources(与 xpkg
  逐字对等);顺修 gate 语义真缺口:drop 只按字符串删 glob,默认 glob 仍罩住
  被门控文件——未激活 feature 的 glob 现在变成 `!` 排除,gate 真正生效
  (build 模式;test 模式保持 0.0.94 的解耦决策不变,e2e 100/79 回归全过)
- G6: mcpp.toml [generated_files] 节 → generatedFiles(路径越根解析期报错);
  根 manifest 补 materialize 调用(此前只对依赖做);自研 TOML 解析器补
  """/''' 多行字符串(TOML 1.0:首换行修剪、行尾反斜杠、闭合粘连引号)
- G1b: ConditionalConfig 增 sources,[target.'cfg(...)'.build] sources 按解析
  后 target 求值 APPEND(含 modules.sources 镜像);cfg 合并提炼为
  merge_conditional_build 并补依赖侧求值(此前 conditionalConfigs 对依赖
  完全不求值,descriptor 写了也静默无效);xpkg 增 target_cfg 键
- G4: [build] flags = [{ glob, cflags/cxxflags/asmflags/defines }] 有序数组
  (TOML 表是 sorted map 丢声明序,数组形式才能承载"顺序即语义");xpkg 增
  对称 flags 键;scanner 命中附加(声明序 append,后者胜)、零命中 warning、
  SourceUnit/CompileUnit 增 packageAsmflags 通道接 PR-A 的 unit_asmflags;
  全序列折入 canonical_compile_flags 指纹
- G8b 已定位并修复:用户 cflags/cxxflags 里的相对 -I 按 ninja cwd(outputDir)
  解析而非项目根(.cpp/.cppm 同病)——scanner 单点绝对化 + plan 入口单元同步
- 单测:toml/xpkg 对称性契约测试、多行字符串、per-glob 顺序语义、相对 -I;
  e2e 106(featureSources 四象限)/107(generated_files)/108(cfg sources,
  host-aware)/109(per-glob flags 顺序覆盖+零命中告警);全量 110 过,
  3 失败均既有环境性(22/54/62);docs/05 中英同步(含 PR-A 汇编段补中文)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant