V2: WASI, -r flag, CI pipeline, examples & tests cleanup #1
1 changed files with 65 additions and 32 deletions
ci: ship per-march variants (v2/v3/v4) as individual artifacts
Replaces the single Linux + single Windows tarball with six self-
contained variants — three µarch levels × two OSes. End users on the
Releases page see them as six individually-downloadable archives:
crafter-build-{linux,windows}-x86_64-{v2,v3,v4}.{tar.gz,zip}
Pick the v-level your CPU supports:
v2: SSE4.2 baseline (every x86_64 since ~2011)
v3: AVX2 + FMA + BMI (Intel Haswell+, AMD Excavator+, ~2013+)
v4: AVX-512 (Skylake-X+, recent server-class)
How: the bootstrap binary stays at v2 because the CI SBC (N5105 / Tremont,
no AVX) can't execute v3 or v4 instructions and would crash before it
could rebuild itself for higher levels. Once bootstrap's done, the same
v2 binary is re-invoked with CRAFTER_BUILD_MARCH overridden per variant
to produce v2/v3/v4 outputs. Same again with --target=x86_64-w64-mingw32
for the Windows variants. ExternalDependency cache keys on (url, target,
march) already so glslang gets built per variant; subsequent CI runs hit
the cache.
Also drops the wrapper zip from workflow artifacts: instead of one
upload-artifact call producing crafter-build.zip containing six archives,
there's now one call per archive. The PR / run page shows six small
downloads named for what they are.
forgejo-release continues to upload release-dir/* as individual assets,
so the Releases page already has the right shape — this just brings the
workflow artifact UX in line.
Bumped the glslang cache key to v2 (one-time invalidation) since the
cache layout now needs space for six glslang builds rather than two.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
commit
af41ee5084
|
|
@ -12,10 +12,11 @@ jobs:
|
||||||
runs-on: arch-latest
|
runs-on: arch-latest
|
||||||
env:
|
env:
|
||||||
# x86-64-v2 = SSE4.2 baseline; runs on the CI SBC (Intel N5105 / Tremont,
|
# 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 —
|
# no AVX) and on essentially every x86_64 CPU since ~2011. The bootstrap
|
||||||
# it requires AVX2 the SBC doesn't have, so the bootstrap binary
|
# MUST stay v2 — anything higher would emit instructions the SBC can't
|
||||||
# wouldn't even run there. mtune=generic keeps codegen balanced across
|
# execute and the bootstrap binary itself would crash before it could
|
||||||
# consumer CPUs.
|
# 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_MARCH: x86-64-v2
|
||||||
CRAFTER_BUILD_MTUNE: generic
|
CRAFTER_BUILD_MTUNE: generic
|
||||||
steps:
|
steps:
|
||||||
|
|
@ -50,56 +51,85 @@ jobs:
|
||||||
persist-credentials: true
|
persist-credentials: true
|
||||||
|
|
||||||
- name: Cache glslang clone+build
|
- 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
|
uses: actions/cache@v4
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
~/.cache/crafter.build/external
|
~/.cache/crafter.build/external
|
||||||
key: glslang-${{ runner.os }}-v1
|
key: glslang-${{ runner.os }}-v2
|
||||||
|
|
||||||
- name: Bootstrap (build.sh)
|
- name: Bootstrap (build.sh)
|
||||||
run: ./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
|
- name: Run tests
|
||||||
run: CRAFTER_BUILD_HOME=$PWD/share/crafter-build ./bin/crafter-build test
|
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
|
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
|
- name: Package artifacts
|
||||||
run: |
|
run: |
|
||||||
set -eux
|
set -eux
|
||||||
mkdir -p dist
|
mkdir -p dist
|
||||||
|
|
||||||
# Linux: bin/, lib/, share/ at archive root
|
# 6 archives — 3 marches × 2 OSes. Each is self-contained: the
|
||||||
stage_lin=$(mktemp -d)
|
# Linux launcher is statically linked; the Windows launcher has
|
||||||
mkdir -p "$stage_lin/bin" "$stage_lin/lib"
|
# crafter-build.dll + libcrafter-build.dll.a alongside the exe.
|
||||||
cp bin/crafter-build "$stage_lin/bin/"
|
for march in x86-64-v2 x86-64-v3 x86-64-v4; do
|
||||||
cp lib/libcrafter-build.a "$stage_lin/lib/"
|
stage_lin=$(mktemp -d)
|
||||||
cp -r share "$stage_lin/"
|
mkdir -p "$stage_lin/bin" "$stage_lin/lib"
|
||||||
tar czf dist/crafter-build-linux-x86_64.tar.gz -C "$stage_lin" .
|
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/.
|
stage_win=$(mktemp -d)
|
||||||
# The output dir is named by march, which matches the env var, not
|
mkdir -p "$stage_win/bin"
|
||||||
# the literal "native" — keep these in sync.
|
cp "bin/crafter.build-exe-x86_64-w64-mingw32-$march"/* "$stage_win/bin/"
|
||||||
stage_win=$(mktemp -d)
|
cp -r share "$stage_win/"
|
||||||
mkdir -p "$stage_win/bin"
|
(cd "$stage_win" && zip -r "$GITHUB_WORKSPACE/dist/crafter-build-windows-x86_64-$march.zip" .)
|
||||||
cp "bin/crafter.build-exe-x86_64-w64-mingw32-${CRAFTER_BUILD_MARCH}"/* "$stage_win/bin/"
|
done
|
||||||
cp -r share "$stage_win/"
|
|
||||||
(cd "$stage_win" && zip -r "$GITHUB_WORKSPACE/dist/crafter-build-windows-x86_64.zip" .)
|
|
||||||
|
|
||||||
ls -la dist/
|
ls -la dist/
|
||||||
|
|
||||||
- name: Upload workflow artifacts
|
# Upload each archive as its own workflow artifact (one upload per file)
|
||||||
# v4+ uses a GHES-only upload API Forgejo Actions doesn't implement;
|
# so users browsing the PR / run page get six small, individually-named
|
||||||
# v3 stays on the older API that works on Forgejo.
|
# downloads instead of one wrapper zip containing the lot.
|
||||||
|
- name: Upload Linux v2 artifact
|
||||||
uses: actions/upload-artifact@v3
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with: { name: crafter-build-linux-x86_64-v2, path: dist/crafter-build-linux-x86_64-v2.tar.gz, if-no-files-found: error }
|
||||||
name: crafter-build
|
- name: Upload Linux v3 artifact
|
||||||
path: dist/
|
uses: actions/upload-artifact@v3
|
||||||
if-no-files-found: error
|
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
|
- name: Update rolling 'latest' tag
|
||||||
if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/master'
|
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
|
git push origin latest --force
|
||||||
|
|
||||||
- name: Publish rolling 'latest' release
|
- 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'
|
if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/master'
|
||||||
uses: https://code.forgejo.org/actions/forgejo-release@v2
|
uses: https://code.forgejo.org/actions/forgejo-release@v2
|
||||||
with:
|
with:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue