Skip to content

Commit a8e4e71

Browse files
committed
refactor: split up packages
1 parent a1e6f1a commit a8e4e71

File tree

7 files changed

+200
-175
lines changed

7 files changed

+200
-175
lines changed

drawer/default.nix

-69
This file was deleted.

flake.nix

+4-106
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,15 @@
2020
};
2121

2222
outputs = {
23-
self,
2423
nixpkgs,
25-
glove80-zmk,
26-
keymap-drawer,
27-
poetry2nix,
2824
flake-parts,
25+
...
2926
} @ inputs:
3027
flake-parts.lib.mkFlake {inherit inputs;} {
3128
systems = nixpkgs.lib.systems.flakeExposed;
3229

3330
imports = [
34-
./drawer
31+
./packages
3532
];
3633

3734
perSystem = {
@@ -40,113 +37,14 @@
4037
system,
4138
...
4239
}: {
43-
# `nix build`
44-
packages.default = let
45-
firmware = import glove80-zmk {inherit pkgs;};
46-
47-
keymap = ./config/glove80.keymap;
48-
kconfig = ./config/glove80.conf;
49-
50-
glove80_left = firmware.zmk.override {
51-
inherit keymap kconfig;
52-
board = "glove80_lh";
53-
};
54-
55-
glove80_right = firmware.zmk.override {
56-
inherit keymap kconfig;
57-
board = "glove80_rh";
58-
};
59-
in
60-
firmware.combine_uf2 glove80_left glove80_right;
61-
6240
# `nix run`
6341
apps.default = {
6442
type = "app";
6543
program = config.packages.flash;
6644
};
6745

68-
# Builds the firmware and copies it to the plugged-in keyboard half
69-
packages.flash = pkgs.writeShellApplication {
70-
name = "flash";
71-
text = ''
72-
set +e
73-
74-
# Disable -u because empty arrays are treated as "unbound"
75-
set +u
76-
77-
# Enable nullglob so that non-matching globs have no output
78-
shopt -s nullglob
79-
80-
# Indent piped input 4 spaces
81-
indent() {
82-
sed -e 's/^/ /'
83-
}
84-
85-
# Platform specific disk candidates
86-
declare -a disks
87-
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
88-
# Linux/GNU
89-
# - /run/media/<user>/<disk>
90-
disks=(/run/media/"$(whoami)"/GLV80*)
91-
elif [[ "$OSTYPE" == "darwin"* ]]; then
92-
# Mac OSX
93-
# - /Volumes/<disk>
94-
disks=(/Volumes/GLV80*)
95-
elif [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
96-
# Cygwin or Msys2
97-
# - /<drive letter>
98-
disks=(/?)
99-
elif (grep -sq Microsoft /proc/version); then
100-
# WSL
101-
# - /mnt/<drive letter>
102-
disks=(/mnt/?)
103-
else
104-
echo "Error: Unable to detect platform!"
105-
echo "OSTYPE=$OSTYPE"
106-
echo "/proc/version"
107-
indent < /proc/version
108-
exit 1
109-
fi
110-
111-
# Disks that have a matching INFO_UF2
112-
declare -a matches
113-
for disk in "''${disks[@]}"; do
114-
if (grep -sq Glove80 "$disk"/INFO_UF2.TXT); then
115-
matches+=("$disk")
116-
fi
117-
done
118-
119-
# Assert we found exactly one keyboard
120-
count="''${#matches[@]}"
121-
if [[ "$count" -lt 1 ]]; then
122-
# No matches. Exit
123-
echo "Error: No Glove80 connected!"
124-
exit 1
125-
elif [[ "$count" -gt 1 ]]; then
126-
# Multiple matches. Print them and exit
127-
echo "Error: $count Glove80s connected. Expected 1!"
128-
for i in "''${!matches[@]}"; do
129-
kb="''${matches[$i]}"
130-
# Print the relevant lines from INFO_UF2
131-
echo "$((i + 1)). $kb"
132-
grep --no-filename --color=never Glove80 "$kb"/INFO_UF2.TXT | indent
133-
done
134-
exit 1
135-
fi
136-
137-
# We have a winner!
138-
kb="''${matches[0]}"
139-
echo "Found keyboard:"
140-
echo "$kb"
141-
indent < "$kb"/INFO_UF2.TXT
142-
echo
143-
144-
# Flash by copying the firmware package
145-
echo "Flashing firmware..."
146-
cp -r "${config.packages.default}" "$kb" \
147-
&& echo "Done!" || echo "Error: Unable to flash firmware!"
148-
'';
149-
};
46+
# `nix build`
47+
packages.default = config.packages.firmware;
15048

15149
formatter = pkgs.alejandra;
15250
};

packages/default.nix

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
imports = [
3+
./flash.nix
4+
./firmware.nix
5+
./draw.nix
6+
./keymap-drawer.nix
7+
];
8+
}

packages/draw.nix

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
{
2+
perSystem = {
3+
config,
4+
pkgs,
5+
system,
6+
...
7+
}: {
8+
# Draw SVG images of the keymap
9+
packages.draw = pkgs.writeShellApplication {
10+
name = "draw";
11+
runtimeInputs = [
12+
pkgs.yq-go
13+
config.packages.keymap-drawer
14+
];
15+
text = ''
16+
set +e
17+
18+
out=./img
19+
keymap_dir=./config
20+
21+
cmd() {
22+
keymap --config "$keymap_dir"/keymap_drawer.yaml "$@"
23+
}
24+
25+
for file in "$keymap_dir"/*.keymap
26+
do
27+
name="$(basename --suffix=".keymap" "$file")"
28+
config="$out/$name.yaml"
29+
echo "Found $name keymap"
30+
31+
echo "- Removing old images"
32+
rm "$out"/"$name".yaml
33+
rm "$out"/"$name".svg
34+
rm "$out"/"$name"_*.svg
35+
36+
echo "- Parsing keymap-drawer"
37+
cmd parse --zmk-keymap "$file" > "$config"
38+
39+
echo "- Drawing all layers"
40+
cmd draw "$config" > "$out"/"$name".svg
41+
42+
layers=$(yq '.layers | keys | .[]' "$config")
43+
for layer in $layers
44+
do
45+
echo "- Drawing $layer layer"
46+
cmd draw "$config" --select-layers "$layer" > "$out"/"$name"_"$layer".svg
47+
done
48+
done
49+
'';
50+
};
51+
};
52+
}

packages/firmware.nix

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
{inputs, ...}: {
2+
perSystem = {
3+
config,
4+
pkgs,
5+
system,
6+
...
7+
}: {
8+
packages.firmware = let
9+
firmware = import inputs.glove80-zmk {inherit pkgs;};
10+
11+
keymap = ../config/glove80.keymap;
12+
kconfig = ../config/glove80.conf;
13+
14+
left = firmware.zmk.override {
15+
inherit keymap kconfig;
16+
board = "glove80_lh";
17+
};
18+
19+
right = firmware.zmk.override {
20+
inherit keymap kconfig;
21+
board = "glove80_rh";
22+
};
23+
in
24+
firmware.combine_uf2 left right;
25+
};
26+
}

packages/flash.nix

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
{
2+
perSystem = {
3+
config,
4+
pkgs,
5+
system,
6+
...
7+
}: {
8+
# Builds the firmware and copies it to the plugged-in keyboard half
9+
packages.flash = pkgs.writeShellApplication {
10+
name = "flash";
11+
text = ''
12+
set +e
13+
14+
# Disable -u because empty arrays are treated as "unbound"
15+
set +u
16+
17+
# Enable nullglob so that non-matching globs have no output
18+
shopt -s nullglob
19+
20+
# Indent piped input 4 spaces
21+
indent() {
22+
sed -e 's/^/ /'
23+
}
24+
25+
# Platform specific disk candidates
26+
declare -a disks
27+
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
28+
# Linux/GNU
29+
# - /run/media/<user>/<disk>
30+
disks=(/run/media/"$(whoami)"/GLV80*)
31+
elif [[ "$OSTYPE" == "darwin"* ]]; then
32+
# Mac OSX
33+
# - /Volumes/<disk>
34+
disks=(/Volumes/GLV80*)
35+
elif [[ "$OSTYPE" == "msys" || "$OSTYPE" == "cygwin" ]]; then
36+
# Cygwin or Msys2
37+
# - /<drive letter>
38+
disks=(/?)
39+
elif (grep -sq Microsoft /proc/version); then
40+
# WSL
41+
# - /mnt/<drive letter>
42+
disks=(/mnt/?)
43+
else
44+
echo "Error: Unable to detect platform!"
45+
echo "OSTYPE=$OSTYPE"
46+
echo "/proc/version"
47+
indent < /proc/version
48+
exit 1
49+
fi
50+
51+
# Disks that have a matching INFO_UF2
52+
declare -a matches
53+
for disk in "''${disks[@]}"; do
54+
if (grep -sq Glove80 "$disk"/INFO_UF2.TXT); then
55+
matches+=("$disk")
56+
fi
57+
done
58+
59+
# Assert we found exactly one keyboard
60+
count="''${#matches[@]}"
61+
if [[ "$count" -lt 1 ]]; then
62+
# No matches. Exit
63+
echo "Error: No Glove80 connected!"
64+
exit 1
65+
elif [[ "$count" -gt 1 ]]; then
66+
# Multiple matches. Print them and exit
67+
echo "Error: $count Glove80s connected. Expected 1!"
68+
for i in "''${!matches[@]}"; do
69+
kb="''${matches[$i]}"
70+
# Print the relevant lines from INFO_UF2
71+
echo "$((i + 1)). $kb"
72+
grep --no-filename --color=never Glove80 "$kb"/INFO_UF2.TXT | indent
73+
done
74+
exit 1
75+
fi
76+
77+
# We have a winner!
78+
kb="''${matches[0]}"
79+
echo "Found keyboard:"
80+
echo "$kb"
81+
indent < "$kb"/INFO_UF2.TXT
82+
echo
83+
84+
# Flash by copying the firmware package
85+
echo "Flashing firmware..."
86+
cp -r "${config.packages.firmware}" "$kb" \
87+
&& echo "Done!" || echo "Error: Unable to flash firmware!"
88+
'';
89+
};
90+
};
91+
}

0 commit comments

Comments
 (0)