diff --git a/.forgejo/workflows/ci.yaml b/.forgejo/workflows/ci.yaml index e6ef147..c53f564 100644 --- a/.forgejo/workflows/ci.yaml +++ b/.forgejo/workflows/ci.yaml @@ -12,10 +12,11 @@ jobs: 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. + # no AVX) and on essentially every x86_64 CPU since ~2011. The bootstrap + # MUST stay v2 — anything higher would emit instructions the SBC can't + # execute and the bootstrap binary itself would crash before it could + # rebuild for higher levels. v3/v4 variants are produced from this v2 + # bootstrap by re-running it with CRAFTER_BUILD_MARCH overridden. CRAFTER_BUILD_MARCH: x86-64-v2 CRAFTER_BUILD_MTUNE: generic steps: @@ -50,56 +51,85 @@ jobs: persist-credentials: true - name: Cache glslang clone+build + # Cache covers crafter-build's per-(target, march) external dep cache. + # First run builds glslang up to 6 times (3 marches × 2 targets); the + # cache makes subsequent runs reuse those builds. uses: actions/cache@v4 with: path: | ~/.cache/crafter.build/external - key: glslang-${{ runner.os }}-v1 + key: glslang-${{ runner.os }}-v2 - name: Bootstrap (build.sh) run: ./build.sh - - name: Self-rebuild via crafter-build (Linux) - run: CRAFTER_BUILD_HOME=$PWD/share/crafter-build ./bin/crafter-build - - name: Run tests run: CRAFTER_BUILD_HOME=$PWD/share/crafter-build ./bin/crafter-build test - - name: Cross-compile for Windows (mingw32) + - name: Build Linux x86-64-v2 (matches bootstrap) + run: CRAFTER_BUILD_HOME=$PWD/share/crafter-build ./bin/crafter-build + + - name: Build Linux x86-64-v3 + run: CRAFTER_BUILD_HOME=$PWD/share/crafter-build CRAFTER_BUILD_MARCH=x86-64-v3 ./bin/crafter-build + + - name: Build Linux x86-64-v4 + run: CRAFTER_BUILD_HOME=$PWD/share/crafter-build CRAFTER_BUILD_MARCH=x86-64-v4 ./bin/crafter-build + + - name: Build Windows x86-64-v2 (mingw) run: CRAFTER_BUILD_HOME=$PWD/share/crafter-build ./bin/crafter-build --target=x86_64-w64-mingw32 + - name: Build Windows x86-64-v3 (mingw) + run: CRAFTER_BUILD_HOME=$PWD/share/crafter-build CRAFTER_BUILD_MARCH=x86-64-v3 ./bin/crafter-build --target=x86_64-w64-mingw32 + + - name: Build Windows x86-64-v4 (mingw) + run: CRAFTER_BUILD_HOME=$PWD/share/crafter-build CRAFTER_BUILD_MARCH=x86-64-v4 ./bin/crafter-build --target=x86_64-w64-mingw32 + - name: Package artifacts run: | set -eux mkdir -p dist - # Linux: bin/, lib/, share/ at archive root - stage_lin=$(mktemp -d) - mkdir -p "$stage_lin/bin" "$stage_lin/lib" - cp bin/crafter-build "$stage_lin/bin/" - cp lib/libcrafter-build.a "$stage_lin/lib/" - cp -r share "$stage_lin/" - tar czf dist/crafter-build-linux-x86_64.tar.gz -C "$stage_lin" . + # 6 archives — 3 marches × 2 OSes. Each is self-contained: the + # Linux launcher is statically linked; the Windows launcher has + # crafter-build.dll + libcrafter-build.dll.a alongside the exe. + for march in x86-64-v2 x86-64-v3 x86-64-v4; do + stage_lin=$(mktemp -d) + mkdir -p "$stage_lin/bin" "$stage_lin/lib" + cp "bin/crafter.build-exe-x86_64-pc-linux-gnu-$march/crafter-build" "$stage_lin/bin/" + cp "bin/crafter.build-lib-x86_64-pc-linux-gnu-$march/libcrafter-build.a" "$stage_lin/lib/" + cp -r share "$stage_lin/" + tar czf "dist/crafter-build-linux-x86_64-$march.tar.gz" -C "$stage_lin" . - # Windows: bin/ contents (exe + auto-bundled mingw DLLs) and share/. - # The output dir is named by march, which matches the env var, not - # the literal "native" — keep these in sync. - stage_win=$(mktemp -d) - mkdir -p "$stage_win/bin" - cp "bin/crafter.build-exe-x86_64-w64-mingw32-${CRAFTER_BUILD_MARCH}"/* "$stage_win/bin/" - cp -r share "$stage_win/" - (cd "$stage_win" && zip -r "$GITHUB_WORKSPACE/dist/crafter-build-windows-x86_64.zip" .) + stage_win=$(mktemp -d) + mkdir -p "$stage_win/bin" + cp "bin/crafter.build-exe-x86_64-w64-mingw32-$march"/* "$stage_win/bin/" + cp -r share "$stage_win/" + (cd "$stage_win" && zip -r "$GITHUB_WORKSPACE/dist/crafter-build-windows-x86_64-$march.zip" .) + done ls -la dist/ - - name: Upload workflow artifacts - # v4+ uses a GHES-only upload API Forgejo Actions doesn't implement; - # v3 stays on the older API that works on Forgejo. + # Upload each archive as its own workflow artifact (one upload per file) + # so users browsing the PR / run page get six small, individually-named + # downloads instead of one wrapper zip containing the lot. + - name: Upload Linux v2 artifact uses: actions/upload-artifact@v3 - with: - name: crafter-build - path: dist/ - if-no-files-found: error + with: { name: crafter-build-linux-x86_64-v2, path: dist/crafter-build-linux-x86_64-v2.tar.gz, if-no-files-found: error } + - name: Upload Linux v3 artifact + uses: actions/upload-artifact@v3 + with: { name: crafter-build-linux-x86_64-v3, path: dist/crafter-build-linux-x86_64-v3.tar.gz, if-no-files-found: error } + - name: Upload Linux v4 artifact + uses: actions/upload-artifact@v3 + with: { name: crafter-build-linux-x86_64-v4, path: dist/crafter-build-linux-x86_64-v4.tar.gz, if-no-files-found: error } + - name: Upload Windows v2 artifact + uses: actions/upload-artifact@v3 + with: { name: crafter-build-windows-x86_64-v2, path: dist/crafter-build-windows-x86_64-v2.zip, if-no-files-found: error } + - name: Upload Windows v3 artifact + uses: actions/upload-artifact@v3 + with: { name: crafter-build-windows-x86_64-v3, path: dist/crafter-build-windows-x86_64-v3.zip, if-no-files-found: error } + - name: Upload Windows v4 artifact + uses: actions/upload-artifact@v3 + with: { name: crafter-build-windows-x86_64-v4, path: dist/crafter-build-windows-x86_64-v4.zip, if-no-files-found: error } - name: Update rolling 'latest' tag if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/master' @@ -110,6 +140,9 @@ jobs: git push origin latest --force - name: Publish rolling 'latest' release + # forgejo-release uploads each file in release-dir as a separate + # release asset, so the Releases page shows six individually + # downloadable archives — pick the v-level matching your CPU. if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/master' uses: https://code.forgejo.org/actions/forgejo-release@v2 with: