Commit graph Crafter.Build/.forgejo
Author SHA1 Message Date
21746b188d
fix(ci): initialise the published repo when its directory is empty
All checks were successful
Flatpak / flatpak (push) Successful in 25m45s
The publish step created the OSTree repo only when the directory was
missing. On the runner host the web root exists before the first
publish, as an empty directory, so the init was skipped and
build-commit-from failed with `opendir(objects)`. The check now looks
for the repo's config file.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 14:40:09 +02:00
7eb837fd55
fix(ci): sign with a key kept on the runner host
Some checks failed
Flatpak / flatpak (push) Failing after 1h23m15s
The runner is our own machine, so the repo signing key does not need to
pass through the forge as a secret. It is generated once under
/etc/crafter-flatpak on the host and bind-mounted read-only into the job
container, where each run imports it into a throwaway keyring. One less
secret to manage, and the private key never leaves the box that uses it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-02 23:52:13 +02:00
ccfd607870
feat(ci): build and publish the Flatpak
One job replaces the tarball pipeline. On a pull request it builds the
Flatpak with flatpak-builder, which runs the bootstrap, the self-host
build and the test suite inside the sandbox, and smoke-tests the result
with `crafter-build --version` and the hello-world example. On a push to
master it also bundles the build, promotes it into the live repo as the
`beta` branch and refreshes the rolling `latest` prerelease. On a tag
X.Y.Z it promotes as `stable`, refuses to proceed unless the metainfo's
newest release is that version, and publishes a release whose notes are
that entry's description.

The job runs on the `flatpak` runner label: the privileged forgejo-runner
on the Hetzner box, with the Sdk install, the flatpak-builder state and
the repo's web root as volumes. The state volume is what keeps a normal
run short: flatpak-builder rebuilds the LLVM and WASI modules only when
their sources change. The live repo is canonical and never built into;
builds are promoted with build-commit-from, then build-update-repo signs
and prunes it and generates static deltas.

The musl job, the per-march tarballs, the toolchain packages the runner
used to install and the PKGBUILD go: the Flatpak is the one artifact.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-02 23:29:43 +02:00
68e9b6bfa5
docs: describe the Linux-only host
README and AGENTS.md stop documenting build.cmd, LIBCXX_DIR, the
DLL-plus-launcher design rule and the cmd-over-SSH gotcha. The runner
section also drops Ssh, SshWin and Wsl, which were removed from the
code earlier but still had README entries, and the stale pointer to a
deleted cross-arch test. ci.yaml loses the commented-out Windows build,
staging and upload steps and the comments that counted them.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-02 22:03:34 +02:00
dc239f4257 musl host support: bootstrap and run on Alpine (x86_64-alpine-linux-musl)
All checks were successful
CI / build-test-release (push) Successful in 7m43s
CI / release-musl (push) Successful in 8m56s
The Linux host code paths were gated on the x86_64_pc_linux_gnu target
define alone, and LoadProject hardcoded --target=x86_64-pc-linux-gnu when
compiling project.cpp and the module PCMs. Both break on musl hosts: the
glibc release launcher cannot run there at all (no glibc loader; gcompat
lacks libgcc_s and the __isoc23_* symbols), and a musl-built launcher
would still compile project.cpp for the wrong libc.

- The host gates test clang's __linux__ instead of one triple's define:
  they mean "Linux host", whatever the libc (or, later, the CPU).
- LoadProject derives the host triple from HostTarget() (clang's
  -print-target-triple), which is also more correct on glibc distros
  whose triple isn't x86_64-pc-linux-gnu.
- project.cpp / the cmake libc++ flags treat any *-linux-gnu or
  *-linux-musl target as Linux.
- build.sh targets the host toolchain's triple (CRAFTER_BUILD_TARGET
  overrides) and derives the per-target define from it. On Arch this is
  byte-for-byte the previous behaviour.
- CI: a release-musl job bootstraps on alpine:edge, runs the tests, and
  attaches crafter-build-linux-x86_64-musl-v2.tar.gz to the rolling
  latest release (via the API, so the glibc assets survive). Dynamic
  against musl libc++: the launcher dlopens project.so, so it cannot be
  fully static.

First consumer: imsd's package CI, which cross-compiles for aarch64 from
an Alpine container.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-09-02 00:05:44 +02:00
046b5eee61 disable windows CI
All checks were successful
CI / build-test-release (push) Successful in 13m37s
2026-08-05 06:08:01 +02:00
672aabf215 disabled lint CI
Some checks failed
CI / build-test-release (push) Failing after 10m16s
2026-07-31 12:47:32 +02:00
667c908f94 AST linter
Some checks failed
CI / build-test-release (push) Failing after 6m8s
2026-07-31 02:11:24 +02:00
8892154b28 linting
Some checks failed
CI / build-test-release (push) Failing after 7m15s
2026-07-23 01:24:42 +02:00
catbot
779de55e58 ci: skip variant builds and artifact uploads on pull requests
All checks were successful
CI / build-test-release (pull_request) Successful in 9m55s
PRs now stop after bootstrap + tests. The per-march variant builds,
packaging, and upload-artifact steps reuse the same guard the rolling
'latest' tag/release steps already had, so artifacts are only produced
on push to master (or manual workflow_dispatch).
2026-05-27 02:05:39 +00:00
c6018581c1 fixed CI
All checks were successful
CI / build-test-release (push) Successful in 14m49s
2026-04-30 03:05:35 +02:00
4d09eaac2a loading bar
Some checks failed
CI / build-test-release (push) Failing after 4m41s
2026-04-29 03:27:11 +02:00
be1986ca08 CI fix
Some checks failed
CI / build-test-release (push) Failing after 14m58s
2026-04-29 03:02:23 +02:00
af41ee5084 ci: ship per-march variants (v2/v3/v4) as individual artifacts
Some checks failed
CI / build-test-release (pull_request) Failing after 14m50s
CI / build-test-release (push) Failing after 14m45s
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>
2026-04-29 02:29:50 +02:00
f1199429b7 ci: package mingw output dir by march, not 'native'
All checks were successful
CI / build-test-release (pull_request) Successful in 12m30s
Setting CRAFTER_BUILD_MARCH=x86-64-v2 made crafter-build emit the
mingw cross-compile to bin/crafter.build-exe-x86_64-w64-mingw32-x86-64-v2/
but the package step still hardcoded -native, causing cp to fail.

Use ${CRAFTER_BUILD_MARCH} in the path so workflow env and packaging
stay in sync.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 00:17:19 +02:00
87a64d3b3c ci: pin march to x86-64-v2, drop upload-artifact to v3
Some checks failed
CI / build-test-release (pull_request) Failing after 12m27s
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 <noreply@anthropic.com>
2026-04-28 23:57:43 +02:00
f0b1fd899c ci: pacman-key --init/--populate before keyring upgrade
Some checks failed
CI / build-test-release (pull_request) Failing after 12m22s
archlinux:latest slim image has no local pacman master key and an
unpopulated upstream keyring, so:
  - the archlinux-keyring upgrade fails with "no secret key available to
    sign with" because pacman can't sign the keyring it's rewriting
  - falling through to -Syu hits the original "unknown trust" errors on
    libseccomp and zip

Run pacman-key --init then --populate archlinux before any pacman -S.
This is the documented bootstrap for slim Arch CI containers.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-28 23:40:27 +02:00
fa202c49f1 ci: refresh archlinux-keyring before installing deps
Some checks failed
CI / build-test-release (pull_request) Failing after 18s
archlinux:latest container ships a snapshot keyring; packages signed by
keys added after the snapshot date fail PGP verification (zip-3.0-13 hit
this with a "signature from Robin Candau is unknown trust" error). Update
the keyring first via pacman -Sy archlinux-keyring, then -Syu the rest.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-28 23:36:51 +02:00
eaee502e8c V2: WASI, -r flag, CI pipeline, examples & tests cleanup
Some checks failed
CI / build-test-release (pull_request) Failing after 44s
WASI / wasm32 target support
- Auto-detect /usr/share/wasi-sysroot on Linux when target starts_with("wasm32")
- Skip -march/-mtune for wasm (clang rejects them)
- Apply -fno-exceptions -fno-c++-static-destructors -mllvm -wasm-enable-sjlj
  -D_WASI_EMULATED_SIGNAL to wasm builds (compile + std PCM, kept in sync)
- .wasm output extension in expectedOutputFor and link command
- EnableWasiBrowserRuntime(cfg): opt-in helper that drops index.html +
  runtime.js next to the .wasm; runtime.js reads window.CRAFTER_WASM_URL
  set in the templated index.html so a single shim handles any output name

-r run flag in the CLI: build then exec the artifact (host targets only;
  rejects libraries; auto .exe/.wasm extension handling)

CI pipeline (.forgejo/workflows/ci.yaml)
- Triggers: PR/push to master + manual dispatch
- Single arch-latest container job: install deps, bootstrap, self-rebuild,
  run tests, cross-compile mingw, package both archives, upload artifacts
- Rolling 'latest' release published only on push/dispatch to master

mingw cross-compile from Linux now works end-to-end:
- ExternalDependency cache key includes target so per-target glslang builds
  don't collide; CMAKE_BUILD_TYPE=Release pinned (otherwise glslang appends
  'd' to lib names and breaks linking); cross-compile cmake flags
  (CMAKE_SYSTEM_NAME=Windows, CMAKE_*_COMPILER_TARGET=...)
- project.cpp accepts --target=<triple>; Linux-only -Wl,--export-dynamic
  and -ldl are gated; mingw glslang skips the standalone exe (its libgcc_eh
  link pulls pthread which mingw doesn't link by default)
- mingw compile uses -femulated-tls so std::__once_callable etc reference
  the same emutls symbols libstdc++ provides
- mingw link auto-adds -lstdc++exp -lpthread

GetCrafterBuildHome() exposed from the Platform module; LoadProject (Linux
+ Windows) now both use it instead of duplicating the resolution.

Examples reorg: hello-world, library, with-module, wasi, tests — each with
its own README. Tests reorg: per-test directory with inner/ fixture, no
shared tests/fixtures/ tree. New Wasi test verifies .wasm magic bytes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-28 23:24:46 +02:00
5e1fcd8590 V2 progress 2026-04-23 01:57:25 +02:00
c2bb9023d4 threaded exception handling
Some checks failed
demo.yaml / threaded exception handling (push) Failing after 0s
2025-11-15 19:20:33 +01:00
598c666e91 test
Some checks failed
/ test (push) Failing after 1s
2025-11-14 21:48:36 +01:00
abd58eb57b test
Some checks failed
/ test (push) Has been cancelled
2025-11-14 21:47:49 +01:00
e8a608dde6 test
Some checks failed
/ test (push) Failing after 1s
2025-11-14 21:06:55 +01:00
a51cc01047 test
Some checks failed
/ test (push) Failing after 5s
2025-11-14 20:44:00 +01:00
69ffeed5f4 test
Some checks failed
/ test (push) Failing after 3s
2025-11-14 20:43:12 +01:00
957c0f54e0 test
Some checks failed
/ test (push) Failing after 4s
2025-11-14 20:42:37 +01:00
ea317ccf1b test
Some checks failed
/ test (push) Failing after 25s
2025-11-14 20:41:59 +01:00
30572c1696 test
Some checks failed
/ test (push) Failing after 4s
2025-11-14 20:39:16 +01:00
c01c89cc8e test
All checks were successful
/ test (push) Successful in 4s
2025-11-14 20:36:57 +01:00
a457f7d9ad test
Some checks failed
/ test (push) Failing after 3s
2025-11-14 20:35:17 +01:00
4274e09fda test
Some checks failed
/ test (push) Failing after 4s
2025-11-14 20:35:11 +01:00
3115ddda46 test
Some checks failed
/ test (push) Failing after 4s
2025-11-14 20:34:10 +01:00
865ec91ea7 test
Some checks failed
demo.yaml / test (push) Failing after 0s
2025-11-14 20:33:53 +01:00
e948ea9ee3 test
Some checks failed
demo.yaml / test (push) Failing after 0s
2025-11-14 20:33:16 +01:00
379968a521 test
Some checks failed
/ test (push) Failing after 6s
2025-11-14 20:29:43 +01:00
d766bb36a4 test
Some checks failed
/ test (push) Failing after 4s
2025-11-14 20:29:25 +01:00
2c748bca00 test
Some checks failed
/ test (push) Failing after 10s
2025-11-14 20:27:05 +01:00
dfaca0e871 test
Some checks failed
/ test (push) Failing after 8s
2025-11-14 20:26:20 +01:00
53198ea42d test
All checks were successful
/ test (push) Successful in 4s
2025-11-14 20:24:45 +01:00
2917fd7549 test
All checks were successful
/ test (push) Successful in 4s
2025-11-14 20:23:48 +01:00
f691e01556 test
Some checks failed
/ test (push) Failing after 4s
2025-11-14 20:23:01 +01:00
670937516d test
Some checks failed
/ test (push) Failing after 3s
2025-11-14 20:22:25 +01:00
4346917a98 test
Some checks failed
/ test (push) Failing after 4s
2025-11-14 20:20:39 +01:00
f84a112736 test
Some checks failed
/ test (push) Failing after 4s
2025-11-14 20:19:04 +01:00
446ca66397 test
Some checks failed
/ test (push) Failing after 4s
2025-11-14 20:16:48 +01:00
aab21639a4 test
All checks were successful
/ test (push) Successful in 4s
2025-11-14 20:16:13 +01:00
b761616998 test
Some checks failed
/ test (push) Failing after 4s
2025-11-14 20:15:45 +01:00
da3f51faaf test
Some checks failed
/ test (push) Failing after 4s
2025-11-14 20:15:24 +01:00
8933ba33b0 test
Some checks failed
/ test (push) Failing after 5s
2025-11-14 20:14:12 +01:00