Skip to content

2026.9.30.2: a selected workspace member declares as the root, the clang MSVC row states its compiler version (#746), and a shared member is compiled once per configuration - #747

Merged
speak-agent merged 2 commits into
mainfrom
fix/rooted-workspace-root-declaration-and-msvc-version
Sep 30, 2026
Merged

speak-agent merged 2 commits into
mainfrom
fix/rooted-workspace-root-declaration-and-msvc-version

Conversation

@speak-agent

Copy link
Copy Markdown
Member

Summary

The release run of v2026.9.30.2 stopped at its canary on mcpp-language-server. This pull request fixes that defect, mcpp#746, and a test gap, for release as 2026.9.30.2. The tag has published nothing: every build job was skipped, and no GitHub release exists.

  • A selected workspace member declares as the root.
    • mcpp-language-server's root package overrides openkal-linux by path against the version request of openkal-musl, and "the root's declaration wins" settles that. 2026.9.28.3 builds it; 2026.9.29.1 to 2026.9.30.2 refuse it with "Pick one".
    • The cause: the workspace plan's virtual root declares only its members, and the rule read only the virtual root's edges.
    • One predicate, PrepareState::declaredByRoot, now answers for the root and for each selected member. Every root privilege of the planner was inventoried against it:
      • the dependency kind clash and the reference clash;
      • the git lock;
      • the identity a declaration adopts, written back to the member's manifests for the lock names;
      • linkage on the member's dependency edges;
      • which target-side candidates are direct;
      • the index refresh, which never considered a member's own registry dependencies.
    • Two selected members that disagree about one dependency's checkout (its kind or its reference) or its link form are refused, naming both. One configuration holds one checkout and builds one form.
    • The refusal to mangle the root's own sources stays with the root. A member reaches it only when two members pin two versions of one package, which one plan builds by mangling.
  • mcpp#746.
    • The version of the toolset's cl.exe, read from its VS_FIXEDFILEINFO as clang reads it (bin/Host{x64|x86}/<target>/cl.exe), is passed as -fms-compatibility-version with the toolset words.
    • It therefore reaches the compile line, the std module precompile, the build.mcpp host compile, the link line and every cache key.
    • A std module compiled under one runner image's cl.exe can no longer be served to another image whose cl.exe differs under the same toolset directory name.
  • A shared member across two configurations (e2e 851).
    • A member that two members of different configurations use is compiled once in each build directory.
    • Within one configuration it is compiled once with the union of its consumers' features, and a consumer's own flags stay out of it.
    • The behaviour was correct; the criterion was absent.

Tests

  • e2e 850: A to F, one per privilege and one per refusal. Every criterion fails on the published 2026.9.30.2 binary (a non-fatal run of the script).
  • e2e 851.
  • e2e 760: the MSVC compiler version is said once and is unchanged by a VCToolsInstallDir the pin ignores.
  • Unit tests: pe_file_version, compiler_version_in_tools_dir (the target's compiler under both host directories) and the link model word.
  • mcpp-language-server at the canary's commit, with this branch: build, build -p devtools and test (33 passed).
  • The sandbox verification script gains section 9 (the canary's shape); 10 of 10 pass locally with this branch.
  • Unit suite: 138 passed. The workspace, dependency and cache e2e batch: see the comment below. The tests that fail locally fail identically on the published binary, since this machine's default toolchain is LLVM and they require GCC.
  • An independent review found three defects before the push, each fixed and covered:
    • the arguments of the link-form refusal were out of order;
    • two members pointing one dependency at two directories were only warned about;
    • link-form conflicts were keyed by a short name that two packages can share.

Compatibility

  • A rooted workspace, or a -p selection, that overrides a transitive declaration builds again, as it did with 2026.9.28.3.
  • A clang build for *-windows-msvc rebuilds once after the upgrade, because its commands gain one word.
  • A workspace whose selected members point one dependency at two checkouts, or ask for two link forms of one package, is refused with both members named. Such a workspace previously built against one of the two checkouts with a warning, or with both link-form requests ignored.

…states its compiler version

The workspace plan's virtual root declares only its members, and the rules
that grant the root's own declarations a privilege read its edges alone, so a
rooted workspace's own package and a member selected with -p lost the
position each held when planned as its own root (2026.9.28.3). The release
canary on mcpp-language-server, whose root package overrides openkal-linux by
path against a transitive version request, was refused with "Pick one".
PrepareState::declaredByRoot now answers for the root and each selected
member, and the kind and reference clashes, the git lock, the identity
write-back, edge linkage, direct target-side candidates and the index refresh
ask it. Two selected members that disagree about one dependency's checkout or
link form are refused, naming both (e2e 850).

mcpp#746: the version of the toolset's cl.exe, read from its
VS_FIXEDFILEINFO as clang reads it, is passed as -fms-compatibility-version
with the toolset words, so it is on every command and in every key (e2e 760,
unit tests).

e2e 851 states that a member two configurations use is compiled once in each.
Sunrisepeak added a commit to Sunrisepeak/GalTranslPP that referenced this pull request Sep 30, 2026
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