qmk_me

QMK Firmware userspace, keyboards, & keymaps
git clone git://git.pngu.org.org/qmk_me
Log | Files | Refs | Submodules | README | LICENSE

commit 8352e26a04238daaecc565945cfbeeb8f1c229b3
parent e9e578aa121be5a3ebd16feaab6715dd03e993b6
Author: Jack Sangdahl <jack@pngu.org>
Date:   Fri, 19 Sep 2025 10:59:45 -0600

Improve link script for keyboards

Better allow for out-of-tree keyboard support by only linking keyboard
files, and ignoring keymaps directory.

Diffstat:
Musers/jack/config.h | 1+
Mutil/link.sh | 86++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------
2 files changed, 73 insertions(+), 14 deletions(-)

diff --git a/users/jack/config.h b/users/jack/config.h @@ -35,6 +35,7 @@ #endif #ifdef RGB_MATRIX_ENABLE +#define RGB_MATRIX_SLEEP #define RGB_MATRIX_FADE_TIMEOUT 180000 #define RGB_MATRIX_KEYPRESSES #define PALETTEFX_ENABLE_ALL_EFFECTS diff --git a/util/link.sh b/util/link.sh @@ -1,20 +1,78 @@ #!/bin/sh -QMK_ME="$HOME/git/qmk_me" -QMK_FIRMWARE="$HOME/git/qmk_firmware" +set -e -find $QMK_FIRMWARE -type l -not -path "$QMK_FIRMWARE/.venv/*" -delete -rm $QMK_FIRMWARE/.git/info/exclude +git_exclude() { + local subdir="$1" + local TARGET_DIR="$HOME/git/qmk_firmware" + local EXCLUDE_FILE="$TARGET_DIR/.git/info/exclude" + local EXCLUDE_PATTERN="keyboards/$subdir" -link_keyboard() { - src="$QMK_ME/keyboards/$1" - dst="$QMK_FIRMWARE/keyboards/$1" - ln -sv $src $dst - echo "keyboards/$1" >> $QMK_FIRMWARE/.git/info/exclude + if [[ ! -d "$TARGET_DIR/.git" ]]; then + printf "Warning: %s is not a git repository; skipping\n" $TARGET_DIR + return 0 + fi + + if ! grep -q "^$EXCLUDE_PATTERN" "$EXCLUDE_FILE" 2>/dev/null; then + printf "Excluding %s in .git/info/exclude\n" $EXCLUDE_PATTERN + echo "$EXCLUDE_PATTERN" >> "$EXCLUDE_FILE" + fi +} + +link() { + local subdir="$1" + local SOURCE_DIR="$HOME/git/qmk_me" + local TARGET_DIR="$HOME/git/qmk_firmware" + local SOURCE_PATH="$SOURCE_DIR/keyboards/$subdir" + local TARGET_PATH="$TARGET_DIR/keyboards/$subdir" + + printf "Linking: %s\n" $subdir + + if [[ ! -d "$SOURCE_PATH" ]]; then + printf "Error: %s does not exist!\n" $SOURCE_PATH + return 1 + fi + + if [[ ! -d "$TARGET_PATH" ]]; then + mkdir -p "$TARGET_PATH" + fi + + for item in "$SOURCE_PATH"/*; do + [[ ! -e "$item" ]] && continue + + local item_name=$(basename "$item") + local target_item="$TARGET_PATH/$item_name" + + if [[ "$item_name" == "keymaps" ]]; then + continue + fi + + if [[ -e "$target_item" || -L "$target_item" ]]; then + rm -rf "$target_item" + fi + + ln -sv "$(realpath "$item")" "$target_item" + + if [[ ! -L "$target_item" ]]; then + printf "Error: linking %s failed!\n" $subdir + fi + done + + git_exclude "$subdir" +} + +link_keyboards() { + local good_cnt=0 + local fail_cnt=0 + + for subdir in "$@"; do + if link "$subdir"; then + ((good_cnt++)) + else + ((fail_cnt++)) + fi + done + return $fail_cnt } -link_keyboard endgame -link_keyboard locus -link_keyboard pseusplit -link_keyboard sweep -link_keyboard xyz60 +link_keyboards endgame locus sweep xyz60