test: header-change incrementality across every compile path
Some checks failed
CI / build-test-release (pull_request) Failing after 12m4s

One header per pass, asserting both directions — the objects that include
it recompile, the ones that don't are untouched — then running the binary,
since "was recompiled" only matters if the program agrees with itself.

Covers the module interface (a macro in its global module fragment decides
an exported class's layout), the implementation unit, a C source, an idle
rebuild that must recompile nothing, and an object whose depfile is gone.
The implementation unit's header has a space in its name so the depfile
spells it escaped.
This commit is contained in:
catbot 2026-07-31 11:11:49 +00:00
commit 7975cb1df8
12 changed files with 317 additions and 0 deletions

View file

@ -0,0 +1,21 @@
// SPDX-License-Identifier: LGPL-3.0-only
// SPDX-FileCopyrightText: Copyright (C) 2026 Catcrafts®
module;
// The whole point of the fixture: an input to this interface unit that the
// module scanner cannot see. WIDGET_SLOTS comes from a header, so the class
// layout below changes without Widget.cppm being touched.
#include "widget-layout.h"
export module Widget;
import std;
export struct Widget {
std::array<std::int64_t, WIDGET_SLOTS> slots;
};
// Out-of-line in the library's implementation unit, so the value reflects the
// layout the *library* was compiled against rather than the caller's — same
// reasoning as the IncrementalInterfaceChange fixture.
export std::size_t WidgetSizeInLibrary();
// Reads a macro from a header only the implementation unit includes.
export std::int64_t WidgetCountInLibrary();