From 87a64d3b3c3352c5743d6f40336d75422bda6981 Mon Sep 17 00:00:00 2001 From: Jorijn van der Graaf Date: Tue, 28 Apr 2026 23:57:43 +0200 Subject: [PATCH] ci: pin march to x86-64-v2, drop upload-artifact to v3 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Two CI fixes from run #276 (got all the way through tests + mingw cross- compile + packaging, only failed on artifact upload): march: workflow now sets CRAFTER_BUILD_MARCH=x86-64-v2 / MTUNE=generic; project.cpp reads both and applies them to the lib + exe Configurations so the self-rebuild and mingw cross-compile honor the same baseline. v3 is unusable on the runner — Intel N5105 (Tremont) has no AVX2, so a v3 bootstrap binary wouldn't even start. v2 (SSE4.2) runs on the SBC and on every x86_64 CPU since ~2011. upload-artifact: pinned to v3. v4+ uses a GHES-only API that Forgejo Actions doesn't implement; the v3 action stays on the older API that Forgejo supports. Co-Authored-By: Claude Sonnet 4.6 --- .forgejo/workflows/ci.yaml | 12 +++++++++++- project.cpp | 13 +++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/ci.yaml b/.forgejo/workflows/ci.yaml index 41d6305..b59b17e 100644 --- a/.forgejo/workflows/ci.yaml +++ b/.forgejo/workflows/ci.yaml @@ -10,6 +10,14 @@ on: jobs: build-test-release: runs-on: arch-latest + env: + # x86-64-v2 = SSE4.2 baseline; runs on the CI SBC (Intel N5105 / Tremont, + # no AVX) and on essentially every x86_64 CPU since ~2011. v3 is out — + # it requires AVX2 the SBC doesn't have, so the bootstrap binary + # wouldn't even run there. mtune=generic keeps codegen balanced across + # consumer CPUs. + CRAFTER_BUILD_MARCH: x86-64-v2 + CRAFTER_BUILD_MTUNE: generic steps: - name: Install build dependencies run: | @@ -83,7 +91,9 @@ jobs: ls -la dist/ - name: Upload workflow artifacts - uses: actions/upload-artifact@v4 + # v4+ uses a GHES-only upload API Forgejo Actions doesn't implement; + # v3 stays on the older API that works on Forgejo. + uses: actions/upload-artifact@v3 with: name: crafter-build path: dist/ diff --git a/project.cpp b/project.cpp index af5b272..54ac2c0 100644 --- a/project.cpp +++ b/project.cpp @@ -11,11 +11,22 @@ extern "C" Configuration CrafterBuildProject(std::span a else if (arg.starts_with("--target=")) target = std::string(arg.substr(std::string_view("--target=").size())); } + // Honor CRAFTER_BUILD_MARCH/MTUNE so CI (which sets these for portability) + // applies them to both the self-rebuild and the mingw cross-compile — + // otherwise Configuration's "native" defaults bake in the build host's + // CPU and the published artifact's portability becomes accidental. + const char* envMarch = std::getenv("CRAFTER_BUILD_MARCH"); + const char* envMtune = std::getenv("CRAFTER_BUILD_MTUNE"); + std::string march = (envMarch && *envMarch) ? envMarch : "native"; + std::string mtune = (envMtune && *envMtune) ? envMtune : "native"; + static auto crafterBuildLib = std::make_unique(); crafterBuildLib->path = "./"; crafterBuildLib->name = "crafter.build-lib"; crafterBuildLib->outputName = "crafter-build"; crafterBuildLib->target = target; + crafterBuildLib->march = march; + crafterBuildLib->mtune = mtune; crafterBuildLib->type = ConfigurationType::LibraryStatic; crafterBuildLib->debug = debug; { @@ -60,6 +71,8 @@ extern "C" Configuration CrafterBuildProject(std::span a cfg.name = "crafter.build-exe"; cfg.outputName = "crafter-build"; cfg.target = target; + cfg.march = march; + cfg.mtune = mtune; cfg.type = ConfigurationType::Executable; cfg.debug = debug; cfg.dependencies = { crafterBuildLib.get() };