From a8e4e71757eb1b6d99c66fc5aeaf604e39fae701 Mon Sep 17 00:00:00 2001 From: Matt Sturgeon Date: Fri, 29 Mar 2024 02:09:38 +0000 Subject: [PATCH] refactor: split up packages --- drawer/default.nix | 69 ----------------------- flake.nix | 110 ++----------------------------------- packages/default.nix | 8 +++ packages/draw.nix | 52 ++++++++++++++++++ packages/firmware.nix | 26 +++++++++ packages/flash.nix | 91 ++++++++++++++++++++++++++++++ packages/keymap-drawer.nix | 19 +++++++ 7 files changed, 200 insertions(+), 175 deletions(-) delete mode 100644 drawer/default.nix create mode 100644 packages/default.nix create mode 100644 packages/draw.nix create mode 100644 packages/firmware.nix create mode 100644 packages/flash.nix create mode 100644 packages/keymap-drawer.nix diff --git a/drawer/default.nix b/drawer/default.nix deleted file mode 100644 index b3de630..0000000 --- a/drawer/default.nix +++ /dev/null @@ -1,69 +0,0 @@ -{ - inputs, - ... -}: { - perSystem = { - config, - pkgs, - system, - ... - }: let - inherit (inputs.poetry2nix.lib.mkPoetry2Nix {inherit pkgs;}) mkPoetryApplication; - in { - packages = { - keymap-drawer = mkPoetryApplication { - projectDir = inputs.keymap-drawer; - preferWheels = true; - meta = { - mainProgram = "keymap"; - homepage = "https://github.com/caksoylar/keymap-drawer"; - }; - }; - - - # Draw SVG images of the keymap - draw = pkgs.writeShellApplication { - name = "draw"; - runtimeInputs = [ - pkgs.yq-go - config.packages.keymap-drawer - ]; - text = '' - set +e - - out=./img - keymap_dir=./config - - cmd() { - keymap --config "$keymap_dir"/keymap_drawer.yaml "$@" - } - - for file in "$keymap_dir"/*.keymap - do - name="$(basename --suffix=".keymap" "$file")" - config="$out/$name.yaml" - echo "Found $name keymap" - - echo "- Removing old images" - rm "$out"/"$name".yaml - rm "$out"/"$name".svg - rm "$out"/"$name"_*.svg - - echo "- Parsing keymap-drawer" - cmd parse --zmk-keymap "$file" > "$config" - - echo "- Drawing all layers" - cmd draw "$config" > "$out"/"$name".svg - - layers=$(yq '.layers | keys | .[]' "$config") - for layer in $layers - do - echo "- Drawing $layer layer" - cmd draw "$config" --select-layers "$layer" > "$out"/"$name"_"$layer".svg - done - done - ''; - }; - }; - }; -} diff --git a/flake.nix b/flake.nix index c1a3a09..ce4eeec 100644 --- a/flake.nix +++ b/flake.nix @@ -20,18 +20,15 @@ }; outputs = { - self, nixpkgs, - glove80-zmk, - keymap-drawer, - poetry2nix, flake-parts, + ... } @ inputs: flake-parts.lib.mkFlake {inherit inputs;} { systems = nixpkgs.lib.systems.flakeExposed; imports = [ - ./drawer + ./packages ]; perSystem = { @@ -40,113 +37,14 @@ system, ... }: { - # `nix build` - packages.default = let - firmware = import glove80-zmk {inherit pkgs;}; - - keymap = ./config/glove80.keymap; - kconfig = ./config/glove80.conf; - - glove80_left = firmware.zmk.override { - inherit keymap kconfig; - board = "glove80_lh"; - }; - - glove80_right = firmware.zmk.override { - inherit keymap kconfig; - board = "glove80_rh"; - }; - in - firmware.combine_uf2 glove80_left glove80_right; - # `nix run` apps.default = { type = "app"; program = config.packages.flash; }; - # Builds the firmware and copies it to the plugged-in keyboard half - packages.flash = pkgs.writeShellApplication { - name = "flash"; - text = '' - set +e - - # Disable -u because empty arrays are treated as "unbound" - set +u - - # Enable nullglob so that non-matching globs have no output - shopt -s nullglob - - # Indent piped input 4 spaces - indent() { - sed -e 's/^/ /' - } - - # Platform specific disk candidates - declare -a disks - if [[ "$OSTYPE" == "linux-gnu"* ]]; then - # Linux/GNU - # - /run/media// - disks=(/run/media/"$(whoami)"/GLV80*) - elif [[ "$OSTYPE" == "darwin"* ]]; then - # Mac OSX - # - /Volumes/ - disks=(/Volumes/GLV80*) - elif [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then - # Cygwin or Msys2 - # - / - disks=(/?) - elif (grep -sq Microsoft /proc/version); then - # WSL - # - /mnt/ - disks=(/mnt/?) - else - echo "Error: Unable to detect platform!" - echo "OSTYPE=$OSTYPE" - echo "/proc/version" - indent < /proc/version - exit 1 - fi - - # Disks that have a matching INFO_UF2 - declare -a matches - for disk in "''${disks[@]}"; do - if (grep -sq Glove80 "$disk"/INFO_UF2.TXT); then - matches+=("$disk") - fi - done - - # Assert we found exactly one keyboard - count="''${#matches[@]}" - if [[ "$count" -lt 1 ]]; then - # No matches. Exit - echo "Error: No Glove80 connected!" - exit 1 - elif [[ "$count" -gt 1 ]]; then - # Multiple matches. Print them and exit - echo "Error: $count Glove80s connected. Expected 1!" - for i in "''${!matches[@]}"; do - kb="''${matches[$i]}" - # Print the relevant lines from INFO_UF2 - echo "$((i + 1)). $kb" - grep --no-filename --color=never Glove80 "$kb"/INFO_UF2.TXT | indent - done - exit 1 - fi - - # We have a winner! - kb="''${matches[0]}" - echo "Found keyboard:" - echo "$kb" - indent < "$kb"/INFO_UF2.TXT - echo - - # Flash by copying the firmware package - echo "Flashing firmware..." - cp -r "${config.packages.default}" "$kb" \ - && echo "Done!" || echo "Error: Unable to flash firmware!" - ''; - }; + # `nix build` + packages.default = config.packages.firmware; formatter = pkgs.alejandra; }; diff --git a/packages/default.nix b/packages/default.nix new file mode 100644 index 0000000..07e8250 --- /dev/null +++ b/packages/default.nix @@ -0,0 +1,8 @@ +{ + imports = [ + ./flash.nix + ./firmware.nix + ./draw.nix + ./keymap-drawer.nix + ]; +} diff --git a/packages/draw.nix b/packages/draw.nix new file mode 100644 index 0000000..550f97a --- /dev/null +++ b/packages/draw.nix @@ -0,0 +1,52 @@ +{ + perSystem = { + config, + pkgs, + system, + ... + }: { + # Draw SVG images of the keymap + packages.draw = pkgs.writeShellApplication { + name = "draw"; + runtimeInputs = [ + pkgs.yq-go + config.packages.keymap-drawer + ]; + text = '' + set +e + + out=./img + keymap_dir=./config + + cmd() { + keymap --config "$keymap_dir"/keymap_drawer.yaml "$@" + } + + for file in "$keymap_dir"/*.keymap + do + name="$(basename --suffix=".keymap" "$file")" + config="$out/$name.yaml" + echo "Found $name keymap" + + echo "- Removing old images" + rm "$out"/"$name".yaml + rm "$out"/"$name".svg + rm "$out"/"$name"_*.svg + + echo "- Parsing keymap-drawer" + cmd parse --zmk-keymap "$file" > "$config" + + echo "- Drawing all layers" + cmd draw "$config" > "$out"/"$name".svg + + layers=$(yq '.layers | keys | .[]' "$config") + for layer in $layers + do + echo "- Drawing $layer layer" + cmd draw "$config" --select-layers "$layer" > "$out"/"$name"_"$layer".svg + done + done + ''; + }; + }; +} diff --git a/packages/firmware.nix b/packages/firmware.nix new file mode 100644 index 0000000..5bc6ccc --- /dev/null +++ b/packages/firmware.nix @@ -0,0 +1,26 @@ +{inputs, ...}: { + perSystem = { + config, + pkgs, + system, + ... + }: { + packages.firmware = let + firmware = import inputs.glove80-zmk {inherit pkgs;}; + + keymap = ../config/glove80.keymap; + kconfig = ../config/glove80.conf; + + left = firmware.zmk.override { + inherit keymap kconfig; + board = "glove80_lh"; + }; + + right = firmware.zmk.override { + inherit keymap kconfig; + board = "glove80_rh"; + }; + in + firmware.combine_uf2 left right; + }; +} diff --git a/packages/flash.nix b/packages/flash.nix new file mode 100644 index 0000000..e59cfdf --- /dev/null +++ b/packages/flash.nix @@ -0,0 +1,91 @@ +{ + perSystem = { + config, + pkgs, + system, + ... + }: { + # Builds the firmware and copies it to the plugged-in keyboard half + packages.flash = pkgs.writeShellApplication { + name = "flash"; + text = '' + set +e + + # Disable -u because empty arrays are treated as "unbound" + set +u + + # Enable nullglob so that non-matching globs have no output + shopt -s nullglob + + # Indent piped input 4 spaces + indent() { + sed -e 's/^/ /' + } + + # Platform specific disk candidates + declare -a disks + if [[ "$OSTYPE" == "linux-gnu"* ]]; then + # Linux/GNU + # - /run/media// + disks=(/run/media/"$(whoami)"/GLV80*) + elif [[ "$OSTYPE" == "darwin"* ]]; then + # Mac OSX + # - /Volumes/ + disks=(/Volumes/GLV80*) + elif [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then + # Cygwin or Msys2 + # - / + disks=(/?) + elif (grep -sq Microsoft /proc/version); then + # WSL + # - /mnt/ + disks=(/mnt/?) + else + echo "Error: Unable to detect platform!" + echo "OSTYPE=$OSTYPE" + echo "/proc/version" + indent < /proc/version + exit 1 + fi + + # Disks that have a matching INFO_UF2 + declare -a matches + for disk in "''${disks[@]}"; do + if (grep -sq Glove80 "$disk"/INFO_UF2.TXT); then + matches+=("$disk") + fi + done + + # Assert we found exactly one keyboard + count="''${#matches[@]}" + if [[ "$count" -lt 1 ]]; then + # No matches. Exit + echo "Error: No Glove80 connected!" + exit 1 + elif [[ "$count" -gt 1 ]]; then + # Multiple matches. Print them and exit + echo "Error: $count Glove80s connected. Expected 1!" + for i in "''${!matches[@]}"; do + kb="''${matches[$i]}" + # Print the relevant lines from INFO_UF2 + echo "$((i + 1)). $kb" + grep --no-filename --color=never Glove80 "$kb"/INFO_UF2.TXT | indent + done + exit 1 + fi + + # We have a winner! + kb="''${matches[0]}" + echo "Found keyboard:" + echo "$kb" + indent < "$kb"/INFO_UF2.TXT + echo + + # Flash by copying the firmware package + echo "Flashing firmware..." + cp -r "${config.packages.firmware}" "$kb" \ + && echo "Done!" || echo "Error: Unable to flash firmware!" + ''; + }; + }; +} diff --git a/packages/keymap-drawer.nix b/packages/keymap-drawer.nix new file mode 100644 index 0000000..f193c40 --- /dev/null +++ b/packages/keymap-drawer.nix @@ -0,0 +1,19 @@ +{inputs, ...}: { + perSystem = { + config, + pkgs, + system, + ... + }: let + inherit (inputs.poetry2nix.lib.mkPoetry2Nix {inherit pkgs;}) mkPoetryApplication; + in { + packages.keymap-drawer = mkPoetryApplication { + projectDir = inputs.keymap-drawer; + preferWheels = true; + meta = { + mainProgram = "keymap"; + homepage = "https://github.com/caksoylar/keymap-drawer"; + }; + }; + }; +}