From 3cfaa7d370b81a280204d23095af2c649292f2f4 Mon Sep 17 00:00:00 2001 From: jess Date: Sat, 25 Apr 2026 00:34:35 -0700 Subject: [PATCH] Cleanup, reorganize scripts. --- .cargo/config.toml | 2 + Cargo.toml | 5 ++ README.md | 20 +++-- build-linux.sh | 42 ----------- resources/icon-128.png | Bin 0 -> 5510 bytes resources/icon-256.png | Bin 0 -> 11117 bytes scripts/install-linux.sh | 28 ------- build.bat => scripts/windows/build.bat | 2 +- install.bat => scripts/windows/install.bat | 17 ++--- xtask/Cargo.toml | 9 +++ xtask/src/main.rs | 82 +++++++++++++++++++++ 11 files changed, 118 insertions(+), 89 deletions(-) create mode 100644 .cargo/config.toml delete mode 100755 build-linux.sh create mode 100644 resources/icon-128.png create mode 100644 resources/icon-256.png delete mode 100755 scripts/install-linux.sh rename build.bat => scripts/windows/build.bat (99%) rename install.bat => scripts/windows/install.bat (56%) create mode 100644 xtask/Cargo.toml create mode 100644 xtask/src/main.rs diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..c6536eb --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,2 @@ +[alias] +xtask = "run --quiet --release --package xtask --" diff --git a/Cargo.toml b/Cargo.toml index 000e5b5..3bc5f08 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,8 @@ +[workspace] +members = [".", "xtask"] +default-members = ["."] +resolver = "2" + [package] name = "layers" version = "0.1.0-dev" diff --git a/README.md b/README.md index efc4fd7..ff77596 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,9 @@ a pure-Rust KiCad-board-to-vectors crate. You would not technically need KiCad i ## Install -Every platform installs into KiCad 10's *10.0/plugin* directory. I'm 90% sure that's where they are supposed to go. +Every platform installs into KiCad 10's *10.0/plugins* directory (on Linux it'll also drop into 11.0, 12.0, etc. if you've already got those, native or flatpak, both). I'm 90% sure that's where they are supposed to go. + +`cargo xtask install` picks the right script and runs it. `cargo xtask build` stages without installing. `install-linux` / `install-macos` / `install-windows` force a specific platform if you ever need that. Close KiCad completely prior to running the install script or KiCad might crash, and you might lose work. Close KiCad completely when you update the plugin too. Turns out there's a lot of differences between python and Rust plugins, though maybe the better distiction is IPC plugins in general. I am yet to make a python IPC plugin though, so I can't say for certain. @@ -23,7 +25,7 @@ to regenerate icons from `resources/Layers.svg`). ```sh git clone https://git.else-if.org/jess/Layers cd Layers -./scripts/install.sh +cargo xtask install ``` Installs to `~/Documents/KiCad/10.0/plugins/com.jesshunter.layers/`. @@ -42,7 +44,7 @@ Download and run the installer from . Accept the defaults In the MSYS2 shell: ```sh -# ARM64 (Snapdragon X, Surface Pro 11, etc.) +# ARM64 (Apple M[x], Snapdragon X, Surface Pro 11, etc.) pacman -Syu pacman -S --needed \ mingw-w64-clang-aarch64-toolchain \ @@ -107,7 +109,7 @@ Close and reopen every PowerShell / cmd window after this so they pick up the ch ```bat git clone https://git.else-if.org/jess/Layers cd Layers -install.bat +cargo xtask install ``` Installs to `%USERPROFILE%\Documents\KiCad\10.0\plugins\com.jesshunter.layers\` @@ -128,10 +130,10 @@ source "$HOME/.cargo/env" git clone https://git.else-if.org/jess/Layers cd Layers -./scripts/install-linux.sh +cargo xtask install ``` -Installs to `~/.local/share/kicad/10.0/plugins/com.jesshunter.layers/`. +Installs to `~/.local/share/kicad/10.0/plugins/com.jesshunter.layers/` ### Linux — Arch / Manjaro (pacman) @@ -146,11 +148,15 @@ source "$HOME/.cargo/env" git clone https://git.else-if.org/jess/Layers cd Layers -./scripts/install-linux.sh +cargo xtask install ``` Installs to `~/.local/share/kicad/10.0/plugins/com.jesshunter.layers/`. +In both cases, it checks both the standard directory and the Flatpak directory. If you for some reason have both, it places it in both. If for some reason you have both but only want it in one of them, you can just delete it from the one you don't want it in. + +The Flatpak plugins dir is ` ~/.var/app/org.kicad.KiCad/data/kicad/10.0/plugins/com.jesshunter.layers/` + ## Configuration `resources/colors.toml` in the installed plugin directory controls every UI colour and the diff --git a/build-linux.sh b/build-linux.sh deleted file mode 100755 index f53256c..0000000 --- a/build-linux.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -ROOT="$(cd "$(dirname "$0")" && pwd)" -cd "$ROOT" - -render_plugin_json() { - local entrypoint="$1" - local out="$2" - local in="$ROOT/plugin.json.in" - if [ ! -f "$in" ]; then - echo "ERROR: $in not found" >&2 - exit 1 - fi - sed "s|@ENTRYPOINT@|$entrypoint|g" "$in" | sudo tee "$out" > /dev/null -} - -STAGE="$ROOT/build/bin/com.jesshunter.layers" -APPDIR="$STAGE/bin" - -sudo rm -rf "$STAGE" -sudo mkdir -p "$APPDIR" "$STAGE/resources" - -if command -v sudo rsvg-convert >/dev/null 2>&1 && [ -f "$ROOT/resources/Layers.svg" ]; then - for size in 24 48 128 256; do - if [ ! -f "$ROOT/resources/icon-${size}.png" ]; then - sudo rsvg-convert --width "$size" --height "$size" \ - "$ROOT/resources/Layers.svg" -o "$ROOT/resources/icon-${size}.png" - fi - done -fi - -cargo build --release --bin layers - -sudo cp "$ROOT/target/release/layers" "$APPDIR/Layers" -sudo chmod +x "$APPDIR/Layers" -render_plugin_json "bin/Layers" "$STAGE/plugin.json" -[ -f "$ROOT/LICENCE" ] && sudo cp "$ROOT/LICENCE" "$STAGE/LICENCE" -sudo cp -r "$ROOT/resources/." "$STAGE/resources/" - -echo "staged: $STAGE" -echo "bin: $APPDIR/Layers" diff --git a/resources/icon-128.png b/resources/icon-128.png new file mode 100644 index 0000000000000000000000000000000000000000..c7e1f691ad562326bf8719c3c551f4e620d5d79c GIT binary patch literal 5510 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 ZQSVaT>2Qqa!x=IF$V)3rRZ18I{SW)j2|WM+ literal 0 HcmV?d00001 diff --git a/scripts/install-linux.sh b/scripts/install-linux.sh deleted file mode 100755 index 4a75cbc..0000000 --- a/scripts/install-linux.sh +++ /dev/null @@ -1,28 +0,0 @@ -#!/usr/bin/env bash -set -euo pipefail - -ROOT="$(cd "$(dirname "$0")/.." && pwd)" -cd "$ROOT" - -case "$(uname -s)" in - Linux) : ;; - *) echo "use scripts/install.sh on macOS or install.bat on Windows" >&2; exit 1;; -esac - -bash "$ROOT/build-linux.sh" - -INSTALL_ROOT="${XDG_DATA_HOME:-$HOME/.local/share}/kicad/10.0/3rdparty/plugins" -INSTALL_DIR="$INSTALL_ROOT/com.jesshunter.layers" -mkdir -p "$INSTALL_ROOT" - -# Preserve user state (state/, cache/, logs/, settings.json) across reinstall. -rm -rf "$INSTALL_DIR/bin" "$INSTALL_DIR/resources" "$INSTALL_DIR/plugin.json" "$INSTALL_DIR/LICENCE" -mkdir -p "$INSTALL_DIR/bin" "$INSTALL_DIR/resources" - -STAGE="$ROOT/build/bin/com.jesshunter.layers" -cp -R "$STAGE/bin/." "$INSTALL_DIR/bin/" -[ -f "$STAGE/plugin.json" ] && cp "$STAGE/plugin.json" "$INSTALL_DIR/plugin.json" -[ -f "$STAGE/LICENCE" ] && cp "$STAGE/LICENCE" "$INSTALL_DIR/LICENCE" -cp -R "$STAGE/resources/." "$INSTALL_DIR/resources/" - -echo "installed: $INSTALL_DIR" diff --git a/build.bat b/scripts/windows/build.bat similarity index 99% rename from build.bat rename to scripts/windows/build.bat index 00e14a2..87dae2d 100644 --- a/build.bat +++ b/scripts/windows/build.bat @@ -6,7 +6,7 @@ rem ARM64 -> aarch64-pc-windows-gnullvm (clangarm64 llvm-mingw toolchain) rem x86_64 -> x86_64-pc-windows-gnu (ucrt64 gcc-mingw toolchain) rem LAYERS_RUST_TARGET overrides. -pushd %~dp0 +pushd %~dp0..\.. set "ROOT=%CD%" if defined LAYERS_RUST_TARGET ( diff --git a/install.bat b/scripts/windows/install.bat similarity index 56% rename from install.bat rename to scripts/windows/install.bat index 32e7c98..49a7b8d 100644 --- a/install.bat +++ b/scripts/windows/install.bat @@ -1,10 +1,10 @@ @echo off setlocal enabledelayedexpansion -pushd %~dp0 +pushd %~dp0..\.. set "ROOT=%CD%" -call "%ROOT%\build.bat" +call "%ROOT%\scripts\windows\build.bat" if %ERRORLEVEL% neq 0 ( echo build failed popd @@ -15,21 +15,16 @@ rem Resolve the real Documents folder (respects OneDrive / folder redirection). for /f "usebackq delims=" %%i in (`powershell -NoProfile -Command "[Environment]::GetFolderPath('MyDocuments')"`) do set "DOCS=%%i" if not defined DOCS set "DOCS=%USERPROFILE%\Documents" -set "INSTALL_ROOT=%DOCS%\KiCad\10.0\plugins" -set "INSTALL_DIR=%INSTALL_ROOT%\com.jesshunter.layers" -if not exist "%INSTALL_ROOT%" mkdir "%INSTALL_ROOT%" >nul 2>&1 +set "INSTALL_DIR=%DOCS%\KiCad\10.0\plugins\com.jesshunter.layers" -rem Preserve user state (state/, cache/, logs/, settings.json) across reinstall. -if exist "%INSTALL_DIR%\bin" rmdir /s /q "%INSTALL_DIR%\bin" -if exist "%INSTALL_DIR%\resources" rmdir /s /q "%INSTALL_DIR%\resources" +if exist "%INSTALL_DIR%\bin" rmdir /s /q "%INSTALL_DIR%\bin" +if exist "%INSTALL_DIR%\resources" rmdir /s /q "%INSTALL_DIR%\resources" if exist "%INSTALL_DIR%\plugin.json" del /q "%INSTALL_DIR%\plugin.json" if exist "%INSTALL_DIR%\LICENCE" del /q "%INSTALL_DIR%\LICENCE" set "STAGE=%ROOT%\build\bin\com.jesshunter.layers" -xcopy /e /i /y /q "%STAGE%" "%INSTALL_DIR%" >nul +xcopy /e /i /y /q "%STAGE%" "%INSTALL_DIR%" >nul -echo. echo installed: %INSTALL_DIR% -echo. popd endlocal diff --git a/xtask/Cargo.toml b/xtask/Cargo.toml new file mode 100644 index 0000000..f706b5b --- /dev/null +++ b/xtask/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "xtask" +version = "0.0.0" +edition = "2021" +publish = false + +[[bin]] +name = "xtask" +path = "src/main.rs" diff --git a/xtask/src/main.rs b/xtask/src/main.rs new file mode 100644 index 0000000..99c859d --- /dev/null +++ b/xtask/src/main.rs @@ -0,0 +1,82 @@ +use std::env; +use std::path::PathBuf; +use std::process::{Command, ExitCode}; + +fn main() -> ExitCode { + let args: Vec = env::args().skip(1).collect(); + let cmd = args.first().map(String::as_str).unwrap_or(""); + + let (action, platform) = match cmd { + "build" => ("build", current_platform()), + "install" => ("install", current_platform()), + "build-linux" => ("build", "linux"), + "install-linux" => ("install", "linux"), + "build-macos" => ("build", "macos"), + "install-macos" => ("install", "macos"), + "build-windows" => ("build", "windows"), + "install-windows" => ("install", "windows"), + _ => { + eprintln!("usage: cargo xtask "); + eprintln!(); + eprintln!("commands:"); + eprintln!(" build build for the current platform"); + eprintln!(" install build + install for the current platform"); + eprintln!(" build- force a specific platform (linux | macos | windows)"); + eprintln!(" install- force a specific platform"); + return ExitCode::from(2); + } + }; + + let repo_root = PathBuf::from(env!("CARGO_MANIFEST_DIR")) + .parent() + .expect("xtask manifest must have a parent") + .to_path_buf(); + + let (script, runner) = match platform { + "windows" => ( + repo_root.join(format!("scripts/windows/{action}.bat")), + vec!["cmd", "/c"], + ), + "linux" | "macos" => ( + repo_root.join(format!("scripts/{platform}/{action}.sh")), + vec!["bash"], + ), + other => { + eprintln!("unknown platform: {other}"); + return ExitCode::from(2); + } + }; + + if !script.exists() { + eprintln!("script not found: {}", script.display()); + return ExitCode::from(1); + } + + let mut command = Command::new(runner[0]); + for arg in &runner[1..] { + command.arg(arg); + } + command.arg(&script); + command.current_dir(&repo_root); + + match command.status() { + Ok(status) if status.success() => ExitCode::SUCCESS, + Ok(status) => ExitCode::from(status.code().unwrap_or(1) as u8), + Err(e) => { + eprintln!("failed to run {}: {e}", script.display()); + ExitCode::from(1) + } + } +} + +fn current_platform() -> &'static str { + match env::consts::OS { + "linux" => "linux", + "macos" => "macos", + "windows" => "windows", + other => { + eprintln!("unsupported OS: {other}"); + std::process::exit(2); + } + } +}