Commit graph

162 commits

Author SHA1 Message Date
988c1821af LoadProject: extend DLL search path to mingw / libcxx bin dir
All checks were successful
CI / build-test-release (push) Successful in 14m49s
Before LoadLibraryA on the project.dll, point Windows's loader at the
directory we already know holds the runtime DLLs the dll depends on
(libstdc++/libgcc/libwinpthread for mingw-host, c++.dll for msvc-host).
Lets a user run crafter-build.exe straight out of the release zip
without having to prepend C:\msys64\ucrt64\bin (or the libc++ bin
dir) to PATH first.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-30 05:00:25 +02:00
50ae80a206 ArgQuery: out-of-line CRAFTER_API methods for Windows DLL crossing
All checks were successful
CI / build-test-release (push) Successful in 14m37s
In-class inline methods on a module-exported class get the @<module>
linkage attachment, and clang does not emit their bodies into
consumers; the resulting external reference fails to resolve when a
project.dll on Windows tries to call ArgQuery::Has after consuming
ApplyStandardArgs's return value. Move the bodies to the implementation
unit and dllexport them.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-30 04:15:29 +02:00
730e763718 ShellQuote: use double quotes on Windows
All checks were successful
CI / build-test-release (push) Successful in 14m41s
cmd.exe treats single quotes as literal characters, so the existing
single-quote wrapping broke git/cmake invocations on a Windows host
("could not create leading directories of '<path>'").

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-30 03:50:06 +02:00
0ab30a1d81 fixes
Some checks failed
CI / build-test-release (push) Failing after 8m31s
2026-04-30 02:20:19 +02:00
bc9ceb8f24 config from args
All checks were successful
CI / build-test-release (push) Successful in 9m2s
2026-04-29 18:59:01 +02:00
52c4eed8c6 help command
All checks were successful
CI / build-test-release (push) Successful in 9m11s
2026-04-29 04:00:07 +02:00
c0e4067639 CI fix 2
All checks were successful
CI / build-test-release (push) Successful in 14m45s
2026-04-29 03:37:09 +02:00
4d09eaac2a loading bar
Some checks failed
CI / build-test-release (push) Failing after 4m41s
2026-04-29 03:27:11 +02:00
307db7169d home autodetect 2026-04-29 03:00:53 +02:00
bed4a7c9e4 Cross-compiled mingw artifact: full DLL+launcher pattern + MSVC target
Some checks failed
CI / build-test-release (pull_request) Has been cancelled
Linux→mingw cross-compile now produces the same architectural shape as
build.cmd (DLL + import lib + launcher exe) instead of a single static
binary. The CI Windows artifact becomes a first-class drop-in: a user
on Windows can run crafter-build.exe against any project.cpp and have
it produce real Windows binaries — for either mingw or MSVC ABI.

What changed:

project.cpp: when target=mingw or target=msvc, crafter.build-lib is
built as LibraryDynamic instead of LibraryStatic so the link emits a
DLL + import lib (matching what build.cmd produces natively).

Crafter.Build-Clang.cpp Build():
- LibraryDynamic now branches per target — mingw emits <name>.dll +
  lib<name>.dll.a via lld --out-implib; msvc emits <name>.dll +
  <name>.lib via /IMPLIB; unix unchanged.
- expectedOutputFor returns .dll for Windows-target dynamic libs.
- Executable on Windows host now branches per target: mingw target
  uses simple link (no -lc++/-nostdlib++/LIBCXX_DIR), msvc target keeps
  the existing path. Both auto-copy LibraryDynamic dep DLLs + import
  libs alongside the launcher exe (Windows resolves DLLs from the exe's
  own directory at load time).
- Mingw-target Executables get -D CRAFTER_BUILD_DLL_IMPORT so
  CRAFTER_API resolves to dllimport in their PCMs.
- mingw link adds -static-libstdc++ -static-libgcc -Wl,-Bstatic
  -lpthread so produced .exe/.dll don't depend on a particular
  libstdc++-6.dll / libwinpthread-1.dll being on the consumer's PATH
  (avoids the Arch UCRT vs msys2 UCRT vs msys2 MSVCRT ABI rabbit hole).
  Drops the old auto-copy of /usr/x86_64-w64-mingw32/bin/*.dll which
  is now dead weight.
- -r flag resolves to an absolute path before std::system, otherwise
  cmd.exe rejects "./bin/..." with "'.' is not recognized...".

Crafter.Build-Platform.cpp:
- Split the Windows-host block into shared shell helpers (#if MSVC ||
  MINGW) plus separate #if MSVC and #if MINGW blocks for LoadProject /
  EnsureCrafterBuildPcms / GetBaseCommand / BuildStdPcm.
- Mingw-host LoadProject compiles project.cpp with --target=mingw,
  --sysroot=C:\msys64\ucrt64 (default; override with CRAFTER_MINGW_DIR),
  -femulated-tls, -Wl,--export-all-symbols (mingw-lld doesn't accept
  /EXPORT:NAME), and links against libcrafter-build.dll.a from the
  launcher's directory.
- Mingw-host GetBaseCommand and BuildStdPcm dispatch on config.target
  so a mingw-host crafter-build can also build msvc-target outputs
  (uses LIBCXX_DIR + libc++ headers, same as native build.cmd) when
  the user sets cfg.target = "x86_64-pc-windows-msvc".

README adds a Quick start (Windows) section covering both build paths
(native MSVC via build.cmd and the cross-compiled mingw artifact),
documenting the msys2 UCRT toolchain prerequisite.

Verified end-to-end on the winvm:
- mingw target: cross-compiled crafter-build.exe builds hello-world's
  project.cpp, compiles main.cpp, links a hello.exe that runs without
  any custom PATH (only Windows system DLLs needed).
- msvc target: same crafter-build.exe builds an MSVC-ABI hello.exe
  linked against c++.dll (auto-copied from LIBCXX_DIR), runs cleanly.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-29 02:23:42 +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
cdfdb976c8 test runner, cross-target runners, lib/exe split
- subprocess-isolated test runner (replaces V1 dlopen-RunTest);
  Pass/Fail/Crash/Timeout/Skipped outcomes via :Test partition
- TestRunner abstraction with command templates: Local, Ssh,
  SshWin (cmd.exe-shell), QemuUser, FromEnv; probe-based skip
  when runner unreachable
- transitive PCM-path propagation in Build(); resolveImport
  walks deps recursively; depResults cache keyed by PcmDir()
  so per-target builds don't collide
- cfg.sysroot threaded through BuildStdPcm + base compile/link
  command (enables aarch64 cross via Arch Linux ARM rootfs)
- lib + exe split: project.cpp defines crafterBuildLib
  (LibraryStatic) + crafterBuildExe (Executable depending on
  it); build.sh produces lib/libcrafter-build.a alongside
  bin/crafter-build for downstream static-link consumers
- Windows DLL+launcher: CRAFTER_API macro, /EXPORT flag for
  project.dll's CrafterBuildProject; Crafter::Run as the real
  entry point with main.cpp as a thin wrapper
- 18 tests: HelloWorld/WithModule/Defines/CrossProjectModule/
  Diamond × (Linux + sshwin:winvm), plus Incremental,
  BuildError, Libraries, RunnerClassification, QemuUser,
  SshRunner, WindowsViaSsh, CrossArchAarch64
- single ./bin/crafter-build test runs everything; Windows
  variants skip gracefully if winvm SSH alias unreachable

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-04-27 22:32:19 +02:00
f13671b2be v2 nearly done 2026-04-27 07:04:42 +02:00
5e1fcd8590 V2 progress 2026-04-23 01:57:25 +02:00
d2f5863552 windows define fix
Some checks failed
demo.yaml / windows define fix (push) Failing after 0s
2026-04-14 16:34:35 +02:00
d4ec1127f8 msvc pcm folder fix
Some checks failed
demo.yaml / msvc pcm folder fix (push) Failing after 0s
2026-04-14 16:25:37 +02:00
b906fa55fb msvc pcm march
Some checks failed
demo.yaml / msvc pcm march (push) Failing after 0s
2026-04-14 16:23:40 +02:00
4f6a77fb54 fixed msvc stdpcm
Some checks failed
demo.yaml / fixed msvc stdpcm (push) Failing after 0s
2026-04-14 16:12:06 +02:00
2d89528bdf fixed mingw
Some checks failed
demo.yaml / fixed mingw (push) Failing after 0s
2026-04-02 16:53:07 +02:00
e4e4e67cc0 cmake lib fix
Some checks failed
demo.yaml / cmake lib fix (push) Failing after 0s
2026-03-24 01:12:36 +01:00
cbdcfee462 std pcm march dependant 2026-03-22 20:40:59 +01:00
a6fbed5d5f added config target string 2026-03-15 01:52:07 +01:00
8d521340d4 windows exception handler
Some checks failed
demo.yaml / windows exception handler (push) Failing after 0s
2026-03-09 20:22:01 +01:00
64945d95ef windows exception handler
Some checks failed
demo.yaml / windows exception handler (push) Failing after 0s
2026-03-09 20:20:17 +01:00
7a64859d24 windows exception handler
Some checks failed
demo.yaml / windows exception handler (push) Failing after 0s
2026-03-09 20:14:44 +01:00
898e3f8a16 windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-03 00:06:00 +01:00
515294c7e6 windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 23:46:36 +01:00
0f1ca7f636 windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 23:45:13 +01:00
ffbec94c08 windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 23:44:09 +01:00
fe4e552e31 windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 23:14:40 +01:00
a5e08a0c5b windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 23:08:17 +01:00
8c80cab079 windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 23:02:13 +01:00
25f7a1371d windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:59:56 +01:00
ee19729ee5 windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:55:42 +01:00
b20d5e3140 windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:51:54 +01:00
7d09937076 windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:51:14 +01:00
4614b93c3f windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:49:51 +01:00
0b9a27cb7c windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:48:54 +01:00
58c43f2942 windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:48:30 +01:00
3823d4360f windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:47:14 +01:00
81512e8e9b windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:46:45 +01:00
6118ade781 windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:43:24 +01:00
2bdf218a54 windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:36:56 +01:00
d824f88cb5 windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:32:07 +01:00
bdfa10e835 windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:28:03 +01:00
46b00d714f windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:25:54 +01:00
8c44aba5bc windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:22:35 +01:00
1311ece26f windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:20:37 +01:00
e8edd610f5 windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:15:22 +01:00
04533b5778 windows build fix
Some checks failed
demo.yaml / windows build fix (push) Failing after 0s
2026-03-02 22:14:56 +01:00