From 6a1053418c70eb3b76f351e674ad24e33b0d50fd Mon Sep 17 00:00:00 2001 From: ddidderr Date: Mon, 12 Oct 2026 08:16:14 +0200 Subject: [PATCH] build: add reproducible macOS, Windows and wasm cross-check scripts The non-Linux code paths can only be compile-checked on this machine; agents had used ad-hoc wrapper setups. These scripts make the checks reproducible and are wired into `just check-macos`, `check-windows`, `check-wasm` and `check-all`: - macos-crosscheck.sh: zig cc wrappers (dropping -arch/-mmacosx- version-min) plus a declaration-only os/log.h stub so the few C build scripts compile; clippy -D warnings on all 17 cross-platform crates for aarch64/x86_64-apple-darwin. - windows-crosscheck.sh: mingw toolchain and a stub fontconfig.pc; clippy -D warnings for x86_64-pc-windows-gnu. - wasm-check.sh: wasm32 clippy/build and the node-based wasm tests. Also fixes a needless_pass_by_value lint in osbytes' non-Unix branch that only the Windows check surfaces. Test Plan: - just check-macos; just check-macos x86_64-apple-darwin - just check-windows; just check-wasm --- crates/ghostty-os/src/osbytes.rs | 6 +++- justfile | 29 +++++++++++---- scripts/macos-crosscheck.sh | 61 ++++++++++++++++++++++++++++++++ scripts/wasm-check.sh | 9 +++++ scripts/windows-crosscheck.sh | 22 ++++++++++++ 5 files changed, 120 insertions(+), 7 deletions(-) create mode 100755 scripts/macos-crosscheck.sh create mode 100755 scripts/wasm-check.sh create mode 100755 scripts/windows-crosscheck.sh diff --git a/crates/ghostty-os/src/osbytes.rs b/crates/ghostty-os/src/osbytes.rs index 73fdce8..ad68666 100644 --- a/crates/ghostty-os/src/osbytes.rs +++ b/crates/ghostty-os/src/osbytes.rs @@ -84,7 +84,11 @@ pub fn os_from_bytes(b: Vec) -> OsString { #[cfg(not(unix))] pub fn os_from_bytes(b: Vec) -> OsString { - OsString::from(String::from_utf8_lossy(&b).into_owned()) + // Windows OS strings are WTF-16; valid UTF-8 converts losslessly and is + // reused without copying, anything else is replaced like Zig's utf8ToUtf16. + OsString::from( + String::from_utf8(b).unwrap_or_else(|e| String::from_utf8_lossy(e.as_bytes()).into_owned()), + ) } /// OS string to reversible `String` (see the module docs). diff --git a/justfile b/justfile index e9132a8..09dcb7a 100644 --- a/justfile +++ b/justfile @@ -28,11 +28,11 @@ fix: _fix fmt # Build libghostty-vt (C ABI, include/ghostty/vt.h) as target//libghostty-vt.{so,a} # and, if the target is installed, target/wasm32-unknown-unknown//ghostty-vt.wasm. vt-lib profile="release": - cargo build -p ghostty-vt-capi --profile {{profile}} - cp target/{{profile}}/libghostty_vt_capi.so target/{{profile}}/libghostty-vt.so - cp target/{{profile}}/libghostty_vt_capi.a target/{{profile}}/libghostty-vt.a - cargo build -p ghostty-vt-capi --profile {{profile}} --target wasm32-unknown-unknown - cp target/wasm32-unknown-unknown/{{profile}}/ghostty_vt_capi.wasm target/wasm32-unknown-unknown/{{profile}}/ghostty-vt.wasm + cargo build -p ghostty-vt-capi --profile {{ profile }} + cp target/{{ profile }}/libghostty_vt_capi.so target/{{ profile }}/libghostty-vt.so + cp target/{{ profile }}/libghostty_vt_capi.a target/{{ profile }}/libghostty-vt.a + cargo build -p ghostty-vt-capi --profile {{ profile }} --target wasm32-unknown-unknown + cp target/wasm32-unknown-unknown/{{ profile }}/ghostty_vt_capi.wasm target/wasm32-unknown-unknown/{{ profile }}/ghostty-vt.wasm # Run the libghostty-vt ABI check and the C/wasm example tests. vt-test: @@ -107,7 +107,7 @@ locales OUT="target/locale": # (dev, release) installs the "-debug" application id # (com.mitchellh.ghostty-debug, "Ghostty (Debug)"), which is # the id the binary uses at runtime when built with debug -# assertions. +# assertions. install PREFIX="/usr/local" FLATPAK="false" SYSTEM_PACKAGE="false" PROFILE="production": build-data docs locales #!/usr/bin/env bash set -euo pipefail @@ -253,3 +253,20 @@ dist: # `zig build distcheck`). distcheck: dist scripts/dist.sh --check + +# Compile-check (clippy -D warnings) the macOS code paths from Linux. +check-macos target="aarch64-apple-darwin": + scripts/macos-crosscheck.sh clippy {{ target }} + +# Compile-check (clippy -D warnings) the Windows code paths from Linux. +check-windows: + scripts/windows-crosscheck.sh + +# Build, lint and test the wasm32 targets. +check-wasm: + scripts/wasm-check.sh + +# Everything: native gate plus all cross-platform checks. +check-all: clippy test check-wasm check-windows + scripts/macos-crosscheck.sh clippy aarch64-apple-darwin + scripts/macos-crosscheck.sh clippy x86_64-apple-darwin diff --git a/scripts/macos-crosscheck.sh b/scripts/macos-crosscheck.sh new file mode 100755 index 0000000..5431ee6 --- /dev/null +++ b/scripts/macos-crosscheck.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +# Compile-check the macOS code paths from Linux (no macOS SDK needed). +# Uses `zig cc` wrappers for the few C build scripts in the dependency +# tree; real macOS builds need none of this. See docs/rewrite/notes/macos-M1.md. +# Usage: scripts/macos-crosscheck.sh [check|clippy] [target] +set -euo pipefail +cd "$(dirname "$0")/.." +MODE=${1:-clippy} +TARGET=${2:-aarch64-apple-darwin} +case "$TARGET" in + aarch64-apple-darwin) ZT=aarch64-macos ;; + x86_64-apple-darwin) ZT=x86_64-macos ;; + *) echo "unsupported target $TARGET" >&2; exit 2 ;; +esac +W="$PWD/target/macos-cross/$ZT" +mkdir -p "$W/stub/os" "$W/zig-cache" +for tool in cc c++; do + cat > "$W/z$tool" < "$W/stub/os/log.h" <<'EOS' +#pragma once +/* Declaration-only stand-in for the SDK header, enough for cc-rs to + compile the oslog crate's wrapper during a cross *check*. */ +typedef void *os_log_t; +typedef unsigned char os_log_type_t; +#define OS_LOG_DEFAULT ((os_log_t)0) +os_log_t os_log_create(const char *subsystem, const char *category); +void os_log_with_type(os_log_t log, os_log_type_t type, const char *fmt, ...); +#define os_log(l, ...) os_log_with_type(l, 0, __VA_ARGS__) +#define os_log_info(l, ...) os_log_with_type(l, 1, __VA_ARGS__) +#define os_log_debug(l, ...) os_log_with_type(l, 2, __VA_ARGS__) +#define os_log_error(l, ...) os_log_with_type(l, 16, __VA_ARGS__) +#define os_log_fault(l, ...) os_log_with_type(l, 17, __VA_ARGS__) +EOS +T=${TARGET//-/_} +export CARGO_BUILD_RUSTC_WRAPPER= RUSTC_WRAPPER= +export "CC_$T=$W/zcc" "CXX_$T=$W/zc++" "AR_$T=zig ar" "CFLAGS_$T=-I$W/stub" +export GETTEXT_DIR=/nonexistent ZIG_GLOBAL_CACHE_DIR="$W/zig-cache" ZIG_LOCAL_CACHE_DIR="$W/zig-cache" +CRATES=(-p ghostty-vt -p ghostty-unicode -p ghostty-datastruct -p ghostty-os -p ghostty-input + -p ghostty-config -p ghostty-terminal -p ghostty-font -p ghostty-renderer -p ghostty-termio + -p ghostty-core -p ghostty-apprt -p ghostty-inspector -p ghostty-lib -p ghostty-crash + -p ghostty-bench -p ghostty-vt-capi) +if [ "$MODE" = clippy ]; then + cargo clippy --target "$TARGET" "${CRATES[@]}" --lib --tests -- -D warnings +else + cargo check --target "$TARGET" "${CRATES[@]}" --lib --tests +fi diff --git a/scripts/wasm-check.sh b/scripts/wasm-check.sh new file mode 100755 index 0000000..9e1160a --- /dev/null +++ b/scripts/wasm-check.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +# Build + clippy the wasm32 targets (Ghostty's wasm build and libghostty-vt +# for wasm), then run the node-based wasm tests. +set -euo pipefail +cd "$(dirname "$0")/.." +cargo clippy --target wasm32-unknown-unknown -p ghostty-wasm -p ghostty-vt-capi \ + -p ghostty-font -p ghostty-config -p ghostty-terminal -p ghostty-vt --lib -- -D warnings +cargo build --target wasm32-unknown-unknown --release -p ghostty-wasm -p ghostty-vt-capi +cargo test -p ghostty-wasm -p ghostty-vt-capi --test node --test wasm_examples diff --git a/scripts/windows-crosscheck.sh b/scripts/windows-crosscheck.sh new file mode 100755 index 0000000..fdc2d5c --- /dev/null +++ b/scripts/windows-crosscheck.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +# Compile-check (clippy -D warnings) the Windows code paths from Linux with +# mingw. No linking happens, so a stub fontconfig.pc is enough. See +# docs/rewrite/notes/windows-WIN.md. +set -euo pipefail +cd "$(dirname "$0")/.." +W="$PWD/target/windows-cross" +mkdir -p "$W/pkgconfig" +cat > "$W/pkgconfig/fontconfig.pc" <<'EOS' +Name: fontconfig +Description: stub for cross cargo check +Version: 2.15.0 +Libs: -lfontconfig +Cflags: +EOS +export RUSTC_WRAPPER= CARGO_BUILD_RUSTC_WRAPPER= PKG_CONFIG_ALLOW_CROSS=1 PKG_CONFIG_PATH="$W/pkgconfig" +export CC_x86_64_pc_windows_gnu=x86_64-w64-mingw32-gcc CXX_x86_64_pc_windows_gnu=x86_64-w64-mingw32-g++ \ + AR_x86_64_pc_windows_gnu=x86_64-w64-mingw32-ar +cargo clippy --target x86_64-pc-windows-gnu --lib --tests \ + -p ghostty-vt -p ghostty-unicode -p ghostty-datastruct -p ghostty-input -p ghostty-os \ + -p ghostty-config -p ghostty-terminal -p ghostty-termio -p ghostty-crash -p ghostty-core \ + -p ghostty-cli -- -D warnings