wo/justfile
2026-10-25 23:44:14 -04:00

127 lines
5.9 KiB
Makefile

set shell := ["bash", "-eu", "-o", "pipefail", "-c"]
# List available build and development recipes.
default:
@just --list
# Build the Rust executables in release mode.
build-rust:
cargo build --release --locked --bins
# Build the Electron application and its native addon.
build-electron:
cd electron && bun install --frozen-lockfile --ignore-scripts && bun run build && bun run build-native
cd electron && if [ ! -x node_modules/electron/dist/electron ] && ! command -v electron >/dev/null 2>&1; then node node_modules/electron/install.js; fi
cd electron && if [ ! -x node_modules/electron/dist/electron ] && ! command -v electron >/dev/null 2>&1; then echo "Electron runtime download failed; install Electron or retry with network access" >&2; exit 1; fi
# Install the local Wo types package before building comraw.
build-types:
cd electron/types && bun install --frozen-lockfile
# Build the compositor UI using the types shipped with this checkout.
build-comraw:
cd comraw && bun install --frozen-lockfile
mkdir -p comraw/node_modules/@wl-wo
rm -rf comraw/node_modules/@wl-wo/wo-types
cp -a electron/types comraw/node_modules/@wl-wo/wo-types
cd comraw && bun run build
# Build every runtime component in dependency order.
build: build-rust build-electron build-types build-comraw
# Build and install Wo for the current user under ~/.local and XDG directories.
# An existing user config is kept; a first install gets a config.toml derived
# from config.example.toml and serves the packaged comraw build on localhost.
install: build
#!/usr/bin/env bash
set -eu
repo_root="$(pwd)"
: "${HOME:?HOME must be set for a per-user install}"
xdg_data_home="${XDG_DATA_HOME:-$HOME/.local/share}"
data_home="$xdg_data_home/wo"
config_dir="${XDG_CONFIG_HOME:-$HOME/.config}/wo"
user_bin="$HOME/.local/bin"
electron_runtime="$data_home/electron-runtime"
electron_app="$data_home/electron"
comraw_dir="$data_home/comraw"
electron_source="$repo_root/electron/node_modules/electron/dist/electron"
install_tag="$(date +%Y%m%d%H%M%S).$$"
electron_runtime_stage="$data_home/.electron-runtime.new.$install_tag"
electron_app_stage="$data_home/.electron.new.$install_tag"
comraw_stage="$data_home/.comraw.new.$install_tag"
trap 'rm -rf "$electron_runtime_stage" "$electron_app_stage" "$comraw_stage"' EXIT
install -d "$data_home/bin" "$config_dir" "$user_bin"
install -m755 "$repo_root/target/release/wo" "$data_home/bin/wo"
install -m755 "$repo_root/target/release/wo-portal" "$data_home/bin/wo-portal"
install -m755 "$repo_root/target/release/xdg-desktop-portal-wo" "$data_home/bin/xdg-desktop-portal-wo"
if [ -x "$electron_source" ]; then
install -d "$electron_runtime_stage"
cp -a "$repo_root/electron/node_modules/electron/dist/." "$electron_runtime_stage/"
test -x "$electron_runtime_stage/electron" || { echo "Electron runtime copy is incomplete" >&2; exit 1; }
electron_bin="$electron_runtime/electron"
elif command -v electron >/dev/null 2>&1; then
electron_bin="$(command -v electron)"
else
echo "Electron runtime is missing. Install Electron or run: cd electron && node node_modules/electron/install.js" >&2
exit 1
fi
install -d "$electron_app_stage/dist" "$electron_app_stage/native" "$comraw_stage"
cp -a "$repo_root/electron/dist/." "$electron_app_stage/dist/"
cp -a "$repo_root/electron/native/." "$electron_app_stage/native/"
cp -a "$repo_root/comraw/dist/." "$comraw_stage/"
replace_installed_dir() {
stage="$1"
destination="$2"
if [ -e "$destination" ] || [ -L "$destination" ]; then
# Keep the prior tree available to processes that were already running.
mv "$destination" "$destination.previous.$install_tag"
fi
mv "$stage" "$destination"
}
if [ -d "$electron_runtime_stage" ]; then
replace_installed_dir "$electron_runtime_stage" "$electron_runtime"
fi
replace_installed_dir "$electron_app_stage" "$electron_app"
replace_installed_dir "$comraw_stage" "$comraw_dir"
cat > "$user_bin/wo" <<EOF
#!/bin/sh
export WO_DATA_DIR="$data_home"
export WO_ELECTRON_PATH="$electron_bin"
export WO_ELECTRON_APP_DIR="$electron_app"
exec "$data_home/bin/wo" "\$@"
EOF
chmod 755 "$user_bin/wo"
install -m755 "$data_home/bin/wo-portal" "$user_bin/wo-portal"
install -m755 "$data_home/bin/xdg-desktop-portal-wo" "$user_bin/xdg-desktop-portal-wo"
if [ ! -e "$config_dir/config.toml" ]; then
cp "$repo_root/config.example.toml" "$config_dir/config.toml"
fi
# Existing user configuration is preserved byte-for-byte. Keep any
# migrations explicit so installation cannot silently change launch
# commands, display variables, URLs, or user preferences.
install -D -m644 "$repo_root/packaging/wayland-sessions/wo.desktop" "$xdg_data_home/wayland-sessions/wo.desktop"
sed -i "s#Exec=wo#Exec=$user_bin/wo#; s#TryExec=wo#TryExec=$user_bin/wo#" "$xdg_data_home/wayland-sessions/wo.desktop"
install -D -m644 "$repo_root/packaging/portals/wo.portal" "$xdg_data_home/xdg-desktop-portal/portals/wo.portal"
install -D -m644 "$repo_root/packaging/dbus-services/org.freedesktop.impl.portal.desktop.wo.service" "$xdg_data_home/dbus-1/services/org.freedesktop.impl.portal.desktop.wo.service"
sed -i "s#Exec=/usr/bin/xdg-desktop-portal-wo#Exec=$user_bin/xdg-desktop-portal-wo#" "$xdg_data_home/dbus-1/services/org.freedesktop.impl.portal.desktop.wo.service"
echo "Installed Wo for the current user. Ensure $user_bin is on PATH and select Wo from your session manager."
# Run the Rust and Electron test suites.
test:
cargo test --locked
cd electron && bun run test
# Build a Debian package for the current Ubuntu/Debian architecture.
ubuntu-deb:
packaging/ubuntu/build-deb.sh
# Check formatting and compile the Rust binaries without producing a release build.
check:
cargo fmt --all -- --check
cargo check --locked --bins