summaryrefslogtreecommitdiff
path: root/bin/build.sh
diff options
context:
space:
mode:
authorjakobst1n <jakob.stendahl@outlook.com>2023-11-29 21:40:14 +0100
committerjakobst1n <jakob.stendahl@outlook.com>2023-11-29 21:40:14 +0100
commit6cf3e48b4da8953ee2ba2fd71dbfc4a29b9bc0f3 (patch)
tree70c3bca63ccb0438a5cc5e63ed0caca3da1fe1da /bin/build.sh
parenta553e2e81a673aeb10bd34d2aca06fd19714137d (diff)
downloadzmk-config-6cf3e48b4da8953ee2ba2fd71dbfc4a29b9bc0f3.tar.gz
zmk-config-6cf3e48b4da8953ee2ba2fd71dbfc4a29b9bc0f3.zip
Move keymap from main zmk source to separate zmk-config repo.master
Basically adhere to the "new way of doing things". Also, since I made the keymap the first time, the ckp boards has made it into the core zmk repo. So it is a hassle to compile without changing things in the source now.
Diffstat (limited to 'bin/build.sh')
-rwxr-xr-xbin/build.sh181
1 files changed, 181 insertions, 0 deletions
diff --git a/bin/build.sh b/bin/build.sh
new file mode 100755
index 0000000..b0314d8
--- /dev/null
+++ b/bin/build.sh
@@ -0,0 +1,181 @@
+#!/usr/bin/env bash
+# Pulled from https://github.com/urob/zmk-config/, with some minor modifications
+
+# Parse input arguments
+while [[ $# -gt 0 ]]; do
+ case $1 in
+ # needed when user isn't in docker group
+ -s|--su)
+ SUDO="sudo"
+ ;;
+
+ -m|--multithread)
+ MULTITHREAD="true"
+ ;;
+
+ -c|--clear-cache)
+ CLEAR_CACHE="true"
+ ;;
+
+ # comma or space separated list of boards (use quotes if space separated)
+ # if ommitted, will compile list of boards in build.yaml
+ -b|--board)
+ BOARDS="$2"
+ shift
+ ;;
+
+ -v|--version)
+ ZEPHYR_VERSION="$2"
+ shift
+ ;;
+
+ -o|--output-dir)
+ OUTPUT_DIR="$2"
+ shift
+ ;;
+
+ --log-dir)
+ LOG_DIR="$2"
+ shift
+ ;;
+
+ --host-config-dir)
+ HOST_CONFIG_DIR="$2"
+ shift
+ ;;
+
+ --host-zmk-dir)
+ HOST_ZMK_DIR="$2"
+ shift
+ ;;
+
+ --docker-config-dir)
+ DOCKER_CONFIG_DIR="$2"
+ shift
+ ;;
+
+ --docker-zmk-dir)
+ DOCKER_ZMK_DIR="$2"
+ shift
+ ;;
+
+ --)
+ WEST_OPTS="${@:2}"
+ break
+ ;;
+
+ *)
+ echo "Unknown option $1"
+ exit 1
+ ;;
+
+ esac
+ shift
+done
+
+# Set defaults
+[[ -z $ZEPHYR_VERSION ]] && ZEPHYR_VERSION="3.2"
+
+[[ -z $OUTPUT_DIR ]] && OUTPUT_DIR="$HOME/Downloads"
+[[ -z $LOG_DIR ]] && LOG_DIR="/tmp"
+
+[[ -z $HOST_ZMK_DIR ]] && HOST_ZMK_DIR="$HOME/_code/zmk"
+[[ -z $HOST_CONFIG_DIR ]] && HOST_CONFIG_DIR="$HOME/_code/zmk-config"
+
+[[ -z $DOCKER_ZMK_DIR ]] && DOCKER_ZMK_DIR="/workspace/zmk"
+[[ -z $DOCKER_CONFIG_DIR ]] && DOCKER_CONFIG_DIR="/workspace/zmk-config"
+
+[[ -z $BOARDS ]] && BOARDS="$(grep '^[[:space:]]*\-[[:space:]]*board:' $HOST_CONFIG_DIR/build.yaml | sed 's/^.*: *//')"
+
+[[ -z $CLEAR_CACHE ]] && CLEAR_CACHE="false"
+
+DOCKER_IMG="zmkfirmware/zmk-dev-arm:$ZEPHYR_VERSION"
+DOCKER_BIN="docker"
+
+# +--------------------+
+# | BUILD THE FIRMWARE |
+# +--------------------+
+
+echo "Build mode: docker"
+# DOCKER_CMD="$DOCKER_BIN run --name zmk-$ZEPHYR_VERSION --rm \
+DOCKER_CMD="$DOCKER_BIN run --rm \
+ --mount type=bind,source=$HOST_ZMK_DIR,target=$DOCKER_ZMK_DIR \
+ --mount type=bind,source=$HOST_CONFIG_DIR,target=$DOCKER_CONFIG_DIR,readonly \
+ --mount type=volume,source=zmk-root-user-$ZEPHYR_VERSION,target=/root \
+ --mount type=volume,source=zmk-zephyr-$ZEPHYR_VERSION,target=$DOCKER_ZMK_DIR/zephyr \
+ --mount type=volume,source=zmk-zephyr-modules-$ZEPHYR_VERSION,target=$DOCKER_ZMK_DIR/modules \
+ --mount type=volume,source=zmk-zephyr-tools-$ZEPHYR_VERSION,target=$DOCKER_ZMK_DIR/tools"
+
+# Reset volumes
+if [[ $CLEAR_CACHE = true ]]
+then
+ $DOCKER_BIN volume rm $($DOCKER_BIN volume ls -q | grep "^zmk-.*-$ZEPHYR_VERSION$")
+fi
+
+# Update west if needed
+OLD_WEST="/root/west.yml.old"
+$DOCKER_CMD -w "$DOCKER_ZMK_DIR" "$DOCKER_IMG" /bin/bash -c " \
+ if [[ ! -f .west/config ]]; then west init -l app/; fi \
+ && if [[ -f $OLD_WEST ]]; then md5_old=\$(md5sum $OLD_WEST | cut -d' ' -f1); fi \
+ && [[ \$md5_old != \$(md5sum app/west.yml | cut -d' ' -f1) ]] \
+ && west update \
+ && cp app/west.yml $OLD_WEST"
+
+# Build parameters
+DOCKER_PREFIX="$DOCKER_CMD -w $DOCKER_ZMK_DIR/app $DOCKER_IMG"
+SUFFIX="${ZEPHYR_VERSION}_docker"
+CONFIG_DIR="$DOCKER_CONFIG_DIR/config"
+
+# usage: compile_board board
+compile_board () {
+ BUILD_DIR="${1}_$SUFFIX"
+ LOGFILE="$LOG_DIR/zmk_build_$1.log"
+ [[ $MULTITHREAD = "true" ]] || echo -en "\n$(tput setaf 2)Building $1... $(tput sgr0)"
+ [[ $MULTITHREAD = "true" ]] && echo -e "$(tput setaf 2)Building $1... $(tput sgr0)"
+ $DOCKER_PREFIX west build -d "build/$BUILD_DIR" -b $1 $WEST_OPTS \
+ -- -DZMK_CONFIG="$CONFIG_DIR" -Wno-dev > "$LOGFILE" 2>&1
+ if [[ $? -eq 0 ]]
+ then
+ [[ $MULTITHREAD = "true" ]] || echo "$(tput setaf 2)done$(tput sgr0)"
+ echo "Build log saved to \"$LOGFILE\"."
+ if [[ -f $HOST_ZMK_DIR/app/build/$BUILD_DIR/zephyr/zmk.uf2 ]]
+ then
+ TYPE="uf2"
+ else
+ TYPE="bin"
+ fi
+ OUTPUT="$OUTPUT_DIR/$1-zmk.$TYPE"
+ [[ -f $OUTPUT ]] && [[ ! -L $OUTPUT ]] && mv "$OUTPUT" "$OUTPUT.bak"
+ cp "$HOST_ZMK_DIR/app/build/$BUILD_DIR/zephyr/zmk.$TYPE" "$OUTPUT"
+ else
+ echo
+ cat "$LOGFILE"
+ echo "$(tput setaf 1)Error: $1 failed$(tput sgr0)"
+ fi
+}
+
+cd "$HOST_ZMK_DIR/app"
+if [[ $MULTITHREAD = "true" ]]; then
+ i=1
+ for board in $(echo $BOARDS | sed 's/,/ /g')
+ do
+ compile_board $board &
+ eval "T${i}=\${!}"
+ eval "B${i}=\$board" # Store the board name in a corresponding variable
+ ((i++))
+ done
+
+ echo "Starting $(($i - 1)) background threads:"
+ for ((x=1; x<i; x++))
+ do
+ pid="T$x"
+ wait "${!pid}"
+ board="B$x" # Retrieve the board name from the corresponding variable
+ echo -e "$(tput setaf 3)Thread $x with PID ${!pid} has finished: ${!board}$(tput sgr0)"
+ done
+else
+ for board in $(echo $BOARDS | sed 's/,/ /g')
+ do
+ compile_board $board
+ done
+fi