Files
lanspread/justfile
T
ddidderr b42cb89364 feat(build): add real-data launcher workflows
The default GUI build previously selected the peer-CLI fixture catalog, which
made a successful no-bundle build unsuitable as a launcher built from real
packages. Route `build` through the production resource map and production
profile, retaining `build-fixture` for test-only GUI builds. Add explicit
production run/build recipes, generate the catalog before a package-dir build,
and let the default `run` route through that workflow when
`LANSPREAD_GAMES_DIR` or a Just variable override is supplied. Integrate the
metadata cache so unchanged `--all` generation is skipped, with
`LANSPREAD_CATALOG_FORCE=1` available for an explicit refresh.

The pre-existing release-mode change in the catalog recipe remains unstaged
and is intentionally not part of this commit.

Test Plan:
- `just --fmt --check` -- passed
- `just --dry-run build-production /srv/games` -- passed
- `just --dry-run catalog-generate-production /srv/games` -- passed
- `git diff --cached --check` -- passed
2026-08-20 09:05:51 +02:00

252 lines
11 KiB
Makefile

export RUSTFLAGS := "-C target-cpu=native"
export WEBKIT_DISABLE_COMPOSITING_MODE := "1"
export DOCKER_CONFIG := env_var_or_default("DOCKER_CONFIG", ".lanspread-peer-cli/docker-config")
default: run
FIXTURE_CATALOG_SOURCE := "crates/lanspread-tauri-deno-ts/src-tauri/game.db"
FIXTURE_CATALOG_ROOT := "crates/lanspread-peer-cli/catalogs"
PRODUCTION_CATALOG_DB := "crates/lanspread-tauri-deno-ts/src-tauri/game.db"
PRODUCTION_MANIFEST_ROOT := "crates/lanspread-tauri-deno-ts/src-tauri/manifests"
CATALOG_CACHE_STAMP := ".lanspread/catalog-cache/production.json"
CATALOG_UNRAR := env_var_or_default("LANSPREAD_UNRAR", "crates/lanspread-tauri-deno-ts/src-tauri/binaries/unrar-x86_64-unknown-linux-gnu")
GAMES_DIR := env_var_or_default("LANSPREAD_GAMES_DIR", "")
CATALOG_FORCE := env_var_or_default("LANSPREAD_CATALOG_FORCE", "0")
TAURI_DEV_CONFIG := '{"bundle":{"resources":{"../../lanspread-peer-cli/catalogs/default/game.db":"game.db","../../lanspread-peer-cli/catalogs/default/manifests/":"manifests/","assets/*":"assets/"}}}'
TAURI_FIXTURE_ENV := "LANSPREAD_USE_FIXTURE_CATALOG=1"
setup:
cargo install tauri-cli
cd crates/lanspread-tauri-deno-ts && deno install --frozen=true
run:
if [ -n "{{ GAMES_DIR }}" ]; then \
just run-production "{{ GAMES_DIR }}"; \
else \
just run-fixture; \
fi
run-fixture: fixture-catalog-check
{{ TAURI_FIXTURE_ENV }} cargo tauri dev --config crates/lanspread-tauri-deno-ts/src-tauri/tauri.dev.conf.json --release
run-production GAMES_DIR:
just catalog-generate-production "{{ GAMES_DIR }}"
just catalog-check-production
cargo tauri dev --config crates/lanspread-tauri-deno-ts/src-tauri/tauri.production.conf.json --release
build:
just build-production "{{ GAMES_DIR }}"
build-fixture: fixture-catalog-check
{{ TAURI_FIXTURE_ENV }} cargo tauri build --config crates/lanspread-tauri-deno-ts/src-tauri/tauri.dev.conf.json --no-bundle #-- --profile dev
build-production GAMES_DIR="":
if [ -n "{{ GAMES_DIR }}" ]; then \
just catalog-generate-production "{{ GAMES_DIR }}"; \
else \
just catalog-check-production; \
fi
cargo tauri build --config crates/lanspread-tauri-deno-ts/src-tauri/tauri.production.conf.json --no-bundle -- --profile production
bundle: catalog-check-production
cargo tauri build --config crates/lanspread-tauri-deno-ts/src-tauri/tauri.production.conf.json -- --profile production
fmt:
cargo +nightly fmt
tombi format
fd -tf -e md -x prettier --write --prose-wrap always --print-width 80
rumdl check --flavor commonmark --fix
just --fmt
_fix:
{{ TAURI_FIXTURE_ENV }} TAURI_CONFIG='{{ TAURI_DEV_CONFIG }}' cargo fix --workspace --all-targets --all-features
{{ TAURI_FIXTURE_ENV }} TAURI_CONFIG='{{ TAURI_DEV_CONFIG }}' cargo clippy --workspace --all-targets --all-features --fix
fix: _fix fmt
clippy:
{{ TAURI_FIXTURE_ENV }} TAURI_CONFIG='{{ TAURI_DEV_CONFIG }}' cargo clippy --workspace --all-targets --all-features -- -D warnings
test:
{{ TAURI_FIXTURE_ENV }} TAURI_CONFIG='{{ TAURI_DEV_CONFIG }}' cargo test --workspace --all-targets --all-features
# Regenerate the committed acceptance catalogs from their fixture packages.
fixture-catalogs:
cargo run -p lanspread-compat --bin lanspread-fixture-catalog -- \
--source-catalog-db {{ FIXTURE_CATALOG_SOURCE }} \
--output-dir {{ FIXTURE_CATALOG_ROOT }}/default \
--unrar {{ CATALOG_UNRAR }} \
--game-root crates/lanspread-peer-cli/fixtures/fixture-alpha/alienswarm \
--game-root crates/lanspread-peer-cli/fixtures/fixture-alpha/bf1942 \
--game-root crates/lanspread-peer-cli/fixtures/fixture-alpha/ggoo \
--game-root crates/lanspread-peer-cli/fixtures/fixture-bravo/bfbc2 \
--game-root crates/lanspread-peer-cli/fixtures/fixture-bravo/cnc4 \
--game-root crates/lanspread-peer-cli/fixtures/fixture-bravo/cnctw \
--game-root crates/lanspread-peer-cli/fixtures/fixture-charlie/cod5 \
--game-root crates/lanspread-peer-cli/fixtures/fixture-charlie/cod6 \
--game-root crates/lanspread-peer-cli/fixtures/fixture-charlie/coh \
--game-root crates/lanspread-peer-cli/fixtures/fixture-persona/css
cargo run -p lanspread-compat --bin lanspread-fixture-catalog -- \
--source-catalog-db {{ FIXTURE_CATALOG_SOURCE }} \
--output-dir {{ FIXTURE_CATALOG_ROOT }}/solid \
--unrar {{ CATALOG_UNRAR }} \
--game-root crates/lanspread-peer-cli/fixtures/fixture-solid/cnctw
cargo run -p lanspread-compat --bin lanspread-fixture-catalog -- \
--source-catalog-db {{ FIXTURE_CATALOG_SOURCE }} \
--output-dir {{ FIXTURE_CATALOG_ROOT }}/multi \
--unrar {{ CATALOG_UNRAR }} \
--game-root crates/lanspread-peer-cli/fixtures/fixture-multi/cnctw
cargo run -p lanspread-compat --bin lanspread-fixture-catalog -- \
--source-catalog-db {{ FIXTURE_CATALOG_SOURCE }} \
--output-dir {{ FIXTURE_CATALOG_ROOT }}/unknown \
--unrar {{ CATALOG_UNRAR }} \
--game-root crates/lanspread-peer-cli/fixtures/fixture-unknown/cod2
fixture-catalog OUTPUT GAME_ROOT:
cargo run -p lanspread-compat --bin lanspread-fixture-catalog -- \
--source-catalog-db {{ FIXTURE_CATALOG_SOURCE }} \
--output-dir "{{ OUTPUT }}" \
--unrar {{ CATALOG_UNRAR }} \
--game-root "{{ GAME_ROOT }}"
fixture-download-only-catalog OUTPUT GAME_ID GAME_ROOT:
cargo run -p lanspread-compat --bin lanspread-fixture-catalog -- \
--source-catalog-db {{ FIXTURE_CATALOG_SOURCE }} \
--output-dir "{{ OUTPUT }}" \
--unrar {{ CATALOG_UNRAR }} \
--game-root "{{ GAME_ROOT }}" \
--no-stream-install "{{ GAME_ID }}"
fixture-catalog-check:
cargo run -p lanspread-compat --bin lanspread-catalog-publisher -- check \
--catalog-db {{ FIXTURE_CATALOG_ROOT }}/default/game.db --all
# Check every catalog profile used by the peer-CLI acceptance matrix.
fixture-catalogs-check: fixture-catalog-check
cargo run -p lanspread-compat --bin lanspread-catalog-publisher -- check \
--catalog-db {{ FIXTURE_CATALOG_ROOT }}/solid/game.db --all
cargo run -p lanspread-compat --bin lanspread-catalog-publisher -- check \
--catalog-db {{ FIXTURE_CATALOG_ROOT }}/multi/game.db --all
cargo run -p lanspread-compat --bin lanspread-catalog-publisher -- check \
--catalog-db {{ FIXTURE_CATALOG_ROOT }}/unknown/game.db --all
catalog-check-production:
cargo run -p lanspread-compat --bin lanspread-catalog-publisher -- check \
--catalog-db {{ PRODUCTION_CATALOG_DB }} \
--manifests-dir {{ PRODUCTION_MANIFEST_ROOT }} \
--all
# Generate the complete production authority from PACKAGES_DIR/<game_id>/.
catalog-generate-production PACKAGES_DIR:
@if [ "{{ CATALOG_FORCE }}" = "1" ] || ! python3 tools/catalog_source_cache.py check \
--stamp {{ CATALOG_CACHE_STAMP }} \
--packages-dir "{{ PACKAGES_DIR }}" \
--catalog-db {{ PRODUCTION_CATALOG_DB }} \
--manifests-dir {{ PRODUCTION_MANIFEST_ROOT }} \
--unrar "{{ CATALOG_UNRAR }}"; then \
cargo run -p lanspread-compat --bin lanspread-catalog-publisher -- generate \
--catalog-db {{ PRODUCTION_CATALOG_DB }} \
--packages-dir "{{ PACKAGES_DIR }}" \
--manifests-dir {{ PRODUCTION_MANIFEST_ROOT }} \
--unrar "{{ CATALOG_UNRAR }}" \
--all && \
python3 tools/catalog_source_cache.py record \
--stamp {{ CATALOG_CACHE_STAMP }} \
--packages-dir "{{ PACKAGES_DIR }}" \
--catalog-db {{ PRODUCTION_CATALOG_DB }} \
--manifests-dir {{ PRODUCTION_MANIFEST_ROOT }} \
--unrar "{{ CATALOG_UNRAR }}"; \
else \
echo "catalog generation skipped: source metadata matches {{ CATALOG_CACHE_STAMP }}"; \
fi
# Regenerate one game in an already complete production authority.
catalog-generate-production-game PACKAGES_DIR GAME_ID:
cargo run -p lanspread-compat --bin lanspread-catalog-publisher -- generate \
--catalog-db {{ PRODUCTION_CATALOG_DB }} \
--packages-dir "{{ PACKAGES_DIR }}" \
--manifests-dir {{ PRODUCTION_MANIFEST_ROOT }} \
--unrar "{{ CATALOG_UNRAR }}" \
--game-id "{{ GAME_ID }}"
frontend-test:
cd crates/lanspread-tauri-deno-ts && deno test --unstable-sloppy-imports tests
clean:
cargo clean
peer-cli-build:
cargo build -p lanspread-peer-cli
peer-cli-image: fixture-catalogs-check
mkdir -p "$DOCKER_CONFIG"
docker build -f crates/lanspread-peer-cli/Dockerfile -t lanspread-peer-cli:dev .
peer-cli-tests *SCENARIOS: peer-cli-image
python3 crates/lanspread-peer-cli/scripts/run_extended_scenarios.py {{ SCENARIOS }}
# macvlan: each peer container gets its own MAC/IP on the real LAN.
# Override on the command line if your LAN differs, e.g.
# just LANSPREAD_PARENT_IFACE=enp4s0 LANSPREAD_SUBNET=10.0.0.0/24 LANSPREAD_GATEWAY=10.0.0.1 peer-cli-net
LANSPREAD_NET := "lanspread"
LANSPREAD_PARENT_IFACE := "eth0"
LANSPREAD_SUBNET := "192.168.1.0/24"
LANSPREAD_GATEWAY := "192.168.1.1"
peer-cli-net:
mkdir -p "$DOCKER_CONFIG"
docker network inspect {{ LANSPREAD_NET }} >/dev/null 2>&1 || \
docker network create -d macvlan \
--subnet={{ LANSPREAD_SUBNET }} \
--gateway={{ LANSPREAD_GATEWAY }} \
-o parent={{ LANSPREAD_PARENT_IFACE }} \
{{ LANSPREAD_NET }}
peer-cli-run NAME: peer-cli-net
mkdir -p ".lanspread-peer-cli/{{ NAME }}/state" ".lanspread-peer-cli/{{ NAME }}/games"
docker run --rm --init --network {{ LANSPREAD_NET }} --name "lanspread-peer-cli-{{ NAME }}" -i \
-v "$PWD/.lanspread-peer-cli/{{ NAME }}/state:/state" \
-v "$PWD/.lanspread-peer-cli/{{ NAME }}/games:/games" \
lanspread-peer-cli:dev \
--name "{{ NAME }}" \
--games-dir /games \
--state-dir /state \
--catalog-db /app/game.db \
--manifests-dir /app/manifests
peer-cli-alpha: peer-cli-net
mkdir -p ".lanspread-peer-cli/alpha/state"
docker run --rm --init --network lanspread --name "lanspread-peer-cli-alpha" -i \
-v "$PWD/.lanspread-peer-cli/alpha/state:/state" \
-v "$PWD/crates/lanspread-peer-cli/fixtures/fixture-alpha:/games:ro" \
lanspread-peer-cli:dev \
--name "alpha" \
--games-dir /games \
--state-dir /state \
--catalog-db /app/game.db \
--manifests-dir /app/manifests
peer-cli-bravo: peer-cli-net
mkdir -p ".lanspread-peer-cli/bravo/state"
docker run --rm --init --network lanspread --name "lanspread-peer-cli-bravo" -i \
-v "$PWD/.lanspread-peer-cli/bravo/state:/state" \
-v "$PWD/crates/lanspread-peer-cli/fixtures/fixture-bravo:/games:ro" \
lanspread-peer-cli:dev \
--name "bravo" \
--games-dir /games \
--state-dir /state \
--catalog-db /app/game.db \
--manifests-dir /app/manifests
peer-cli-charlie: peer-cli-net
mkdir -p ".lanspread-peer-cli/charlie/state"
docker run --rm --init --network lanspread --name "lanspread-peer-cli-charlie" -i \
-v "$PWD/.lanspread-peer-cli/charlie/state:/state" \
-v "$PWD/crates/lanspread-peer-cli/fixtures/fixture-charlie:/games:ro" \
lanspread-peer-cli:dev \
--name "charlie" \
--games-dir /games \
--state-dir /state \
--catalog-db /app/game.db \
--manifests-dir /app/manifests