fix: key the host PCM cache on source content, add clean, hash project args
Three follow-ons to the stale-build report, all cases of an identity not capturing something that changes the output. The host PCM cache under <cache>/crafter.build/<target>-<march>/ is shared by every crafter-build on the machine, and freshness was a per-file mtime comparison. That cannot tell "this PCM is newer than my source" from "this PCM was built from different sources that happen to be newer", so a package install and a working checkout — or two checkouts of different versions — silently compiled their project.cpp against each other's declarations. Invalidation now keys on a stamp over the bytes of every module source, which also covers the case one file's mtime never could: the cached PCMs import each other, so a change to :Interface invalidates :Clang's PCM with Crafter.Build-Clang.cppm untouched. Project args ApplyStandardArgs does not itself interpret are now folded into VariantId. Such a flag typically decides what gets compiled or bundled — the report's example is --no-webgpu dropping entries from cfg.files — and without it both settings shared one bin dir and interleaved their outputs there, leaving a bundle matching neither. Sorted and deduplicated so flag order doesn't split the cache, and inherited by test Configurations. `crafter-build clean` removes the project's bin/ and build/ trees. It deliberately does not load project.cpp: cleaning is most often reached when something is already wrong, and a clean that first needs the project to compile is useless exactly then.
This commit is contained in:
parent
13697cd026
commit
e8fde57582
9 changed files with 439 additions and 15 deletions
|
|
@ -96,6 +96,25 @@ int main() {
|
|||
b.march = "x86-64-v3";
|
||||
Check(a.VariantId() != b.VariantId(), "march change perturbs VariantId");
|
||||
}
|
||||
{
|
||||
// A project flag the framework can't interpret still decides what gets
|
||||
// compiled and bundled, so it has to key into VariantId. Otherwise both
|
||||
// settings share one bin dir and interleave their outputs there — an
|
||||
// index.html from one alongside a script from the other.
|
||||
Configuration a = MakeBase();
|
||||
Configuration b = MakeBase();
|
||||
b.projectArgs.push_back("--no-webgpu");
|
||||
Check(a.VariantId() != b.VariantId(), "project arg perturbs VariantId");
|
||||
Check(a.BinDir() != b.BinDir(), "project arg yields a distinct BinDir");
|
||||
}
|
||||
{
|
||||
// Distinct project args must not collide with each other either.
|
||||
Configuration a = MakeBase();
|
||||
a.projectArgs.push_back("--no-webgpu");
|
||||
Configuration b = MakeBase();
|
||||
b.projectArgs.push_back("--no-audio");
|
||||
Check(a.VariantId() != b.VariantId(), "different project args yield different VariantId");
|
||||
}
|
||||
{
|
||||
// PcmDir() differs between Executable (in BuildDir) and Library
|
||||
// (in BinDir) — Library PCMs land in the installable bin dir so
|
||||
|
|
|
|||
Loading…
Reference in a new issue