From a82dd5ed0f38c8e07b9abde988a748ecee24f133 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 23 Jun 2024 22:19:41 +1000 Subject: [PATCH 1/4] Add support for userspace to docker build commands. --- lib/python/qmk/cli/__init__.py | 2 + lib/python/qmk/cli/path.py | 11 ++++ lib/python/qmk/cli/userspace/path.py | 11 ++++ util/docker_build.sh | 84 +--------------------------- util/docker_cmd.sh | 21 +++++-- 5 files changed, 40 insertions(+), 89 deletions(-) create mode 100755 lib/python/qmk/cli/path.py create mode 100755 lib/python/qmk/cli/userspace/path.py diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py index 6d05a5fc21ce..c695060d790e 100644 --- a/lib/python/qmk/cli/__init__.py +++ b/lib/python/qmk/cli/__init__.py @@ -80,12 +80,14 @@ 'qmk.cli.new.keyboard', 'qmk.cli.new.keymap', 'qmk.cli.painter', + 'qmk.cli.path', 'qmk.cli.pytest', 'qmk.cli.test.c', 'qmk.cli.userspace.add', 'qmk.cli.userspace.compile', 'qmk.cli.userspace.doctor', 'qmk.cli.userspace.list', + 'qmk.cli.userspace.path', 'qmk.cli.userspace.remove', 'qmk.cli.via2json', ] diff --git a/lib/python/qmk/cli/path.py b/lib/python/qmk/cli/path.py new file mode 100755 index 000000000000..1042944572cd --- /dev/null +++ b/lib/python/qmk/cli/path.py @@ -0,0 +1,11 @@ +"""QMK Python Hello World + +This is an example QMK CLI script. +""" +from milc import cli +from qmk.constants import QMK_FIRMWARE + +@cli.subcommand('Detected path to QMK Firmware.', hidden=True) +def path(cli): + print(QMK_FIRMWARE) + return diff --git a/lib/python/qmk/cli/userspace/path.py b/lib/python/qmk/cli/userspace/path.py new file mode 100755 index 000000000000..439a44b292f0 --- /dev/null +++ b/lib/python/qmk/cli/userspace/path.py @@ -0,0 +1,11 @@ +"""QMK Python Hello World + +This is an example QMK CLI script. +""" +from milc import cli +from qmk.constants import QMK_USERSPACE + +@cli.subcommand('Detected path to QMK Userspace.', hidden=True) +def userspace_path(cli): + print(QMK_USERSPACE) + return diff --git a/util/docker_build.sh b/util/docker_build.sh index 828b5751af53..2234fc96f674 100755 --- a/util/docker_build.sh +++ b/util/docker_build.sh @@ -1,85 +1,3 @@ #!/bin/sh -# NOTE: This script uses tabs for indentation -errcho() { - echo "$@" >&2 -} - -USAGE="Usage: $0 [keyboard[:keymap[:target]]]" - -# Check preconditions -for arg; do - if [ "$arg" = "--help" ]; then - echo "$USAGE" - exit 0 - fi -done -if [ $# -gt 1 ]; then - errcho "$USAGE" - exit 1 -fi - -# Allow $RUNTIME to be overridden by the user as an environment variable -# Else check if either podman or docker exit and set them as runtime -# if none are found error out -if [ -z "$RUNTIME" ]; then - if command -v podman >/dev/null 2>&1; then - RUNTIME="podman" - elif command -v docker >/dev/null 2>&1; then - RUNTIME="docker" - else - errcho "Error: no compatible container runtime found." - errcho "Either podman or docker are required." - errcho "See https://podman.io/getting-started/installation" - errcho "or https://docs.docker.com/install/#supported-platforms" - errcho "for installation instructions." - exit 2 - fi -fi - - -# Determine arguments -if [ $# -eq 0 ]; then - printf "keyboard=" && read -r keyboard - [ -n "$keyboard" ] && printf "keymap=" && read -r keymap - [ -n "$keymap" ] && printf "target=" && read -r target -else - IFS=':' read -r keyboard keymap target x <<-EOF - $1 - EOF - if [ -n "$x" ]; then - errcho "$USAGE" - exit 1 - fi -fi -if [ -z "$keyboard" ]; then - keyboard=all -fi -if [ -n "$target" ]; then - # IF we are using docker on non Linux and docker-machine isn't working print an error - # ELSE set usb_args - if [ ! "$(uname)" = "Linux" ] && [ "$RUNTIME" = "docker" ] && ! docker-machine active >/dev/null 2>&1; then - errcho "Error: target requires docker-machine to work on your platform" - errcho "See http://gw.tnode.com/docker/docker-machine-with-usb-support-on-windows-macos" - errcho "Consider flashing with QMK Toolbox (https://github.com/qmk/qmk_toolbox) instead" - exit 3 - else - usb_args="--privileged -v /dev:/dev" - fi -fi -dir=$(pwd -W 2>/dev/null) || dir=$PWD # Use Windows path if on Windows - -if [ "$RUNTIME" = "docker" ]; then - uid_arg="--user $(id -u):$(id -g)" -fi - -# Run container and build firmware -"$RUNTIME" run --rm -it $usb_args \ - $uid_arg \ - -w /qmk_firmware \ - -v "$dir":/qmk_firmware \ - -e ALT_GET_KEYBOARDS=true \ - -e SKIP_GIT="$SKIP_GIT" \ - -e MAKEFLAGS="$MAKEFLAGS" \ - ghcr.io/qmk/qmk_cli \ - make "$keyboard${keymap:+:$keymap}${target:+:$target}" +./util/docker_cmd.sh make "$@" diff --git a/util/docker_cmd.sh b/util/docker_cmd.sh index 4a82890603b8..c73403311bb0 100755 --- a/util/docker_cmd.sh +++ b/util/docker_cmd.sh @@ -1,4 +1,5 @@ #!/bin/sh +# vim: set ft=sh ts=4 sw=4 noexpandtab # NOTE: This script uses tabs for indentation errcho() { @@ -37,13 +38,20 @@ fi # IF we are using docker on non Linux and docker-machine isn't working print an error # ELSE set usb_args if [ ! "$(uname)" = "Linux" ] && [ "$RUNTIME" = "docker" ] && ! docker-machine active >/dev/null 2>&1; then - errcho "Error: target requires docker-machine to work on your platform" - errcho "See http://gw.tnode.com/docker/docker-machine-with-usb-support-on-windows-macos" - exit 3 + errcho "Error: target requires docker-machine to work on your platform" + errcho "See http://gw.tnode.com/docker/docker-machine-with-usb-support-on-windows-macos" + exit 3 else - usb_args="--privileged -v /dev:/dev" + usb_args="--privileged -v /dev:/dev" +fi + +qmk_firmware_dir=$(pwd -W 2>/dev/null) || qmk_firmware_dir=$PWD # Use Windows path if on Windows +qmk_userspace_dir="" +userspace_docker_args="" +if [ -n "$(qmk userspace-path)" ]; then + qmk_userspace_dir=$(cd "$(qmk userspace-path)" && pwd -W 2>/dev/null) || qmk_userspace_dir=$(qmk userspace-path) # Use Windows path if on Windows + userspace_docker_args="-v $qmk_userspace_dir:/qmk_userspace:z -e QMK_USERSPACE=/qmk_userspace" fi -dir=$(pwd -W 2>/dev/null) || dir=$PWD # Use Windows path if on Windows if [ "$RUNTIME" = "docker" ]; then uid_arg="--user $(id -u):$(id -g)" @@ -54,6 +62,7 @@ fi $usb_args \ $uid_arg \ -w /qmk_firmware \ - -v "$dir":/qmk_firmware \ + -v "$qmk_firmware_dir":/qmk_firmware:z \ + $userspace_docker_args \ ghcr.io/qmk/qmk_cli \ "$@" From ee54f4b9611ab0ed9310877fbeab750c46a0e828 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 23 Jun 2024 22:26:51 +1000 Subject: [PATCH 2/4] Tests and formatting. --- lib/python/qmk/cli/path.py | 1 + lib/python/qmk/cli/userspace/path.py | 1 + lib/python/qmk/tests/test_cli_commands.py | 2 +- util/docker_cmd.sh | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/python/qmk/cli/path.py b/lib/python/qmk/cli/path.py index 1042944572cd..084167bf8390 100755 --- a/lib/python/qmk/cli/path.py +++ b/lib/python/qmk/cli/path.py @@ -5,6 +5,7 @@ from milc import cli from qmk.constants import QMK_FIRMWARE + @cli.subcommand('Detected path to QMK Firmware.', hidden=True) def path(cli): print(QMK_FIRMWARE) diff --git a/lib/python/qmk/cli/userspace/path.py b/lib/python/qmk/cli/userspace/path.py index 439a44b292f0..9fd9b5cd1f5c 100755 --- a/lib/python/qmk/cli/userspace/path.py +++ b/lib/python/qmk/cli/userspace/path.py @@ -5,6 +5,7 @@ from milc import cli from qmk.constants import QMK_USERSPACE + @cli.subcommand('Detected path to QMK Userspace.', hidden=True) def userspace_path(cli): print(QMK_USERSPACE) diff --git a/lib/python/qmk/tests/test_cli_commands.py b/lib/python/qmk/tests/test_cli_commands.py index 1725e3ea792e..8b50d1c340d5 100644 --- a/lib/python/qmk/tests/test_cli_commands.py +++ b/lib/python/qmk/tests/test_cli_commands.py @@ -249,7 +249,7 @@ def test_c2json_nocpp_stdin(): def test_clean(): result = check_subcommand('clean', '-a') check_returncode(result) - assert result.stdout.count('done') == 2 + assert (result.stdout.count('done') == 2 and 'userspace' not in result.stdout) or (result.stdout.count('done') == 3 and 'userspace' in result.stdout) def test_generate_api(): diff --git a/util/docker_cmd.sh b/util/docker_cmd.sh index c73403311bb0..b6546a6d89e1 100755 --- a/util/docker_cmd.sh +++ b/util/docker_cmd.sh @@ -48,6 +48,7 @@ fi qmk_firmware_dir=$(pwd -W 2>/dev/null) || qmk_firmware_dir=$PWD # Use Windows path if on Windows qmk_userspace_dir="" userspace_docker_args="" + if [ -n "$(qmk userspace-path)" ]; then qmk_userspace_dir=$(cd "$(qmk userspace-path)" && pwd -W 2>/dev/null) || qmk_userspace_dir=$(qmk userspace-path) # Use Windows path if on Windows userspace_docker_args="-v $qmk_userspace_dir:/qmk_userspace:z -e QMK_USERSPACE=/qmk_userspace" From c453d8677d4b8afacdba913fb50641f3027ee077 Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Sun, 23 Jun 2024 22:31:54 +1000 Subject: [PATCH 3/4] Simplify. --- lib/python/qmk/cli/path.py | 4 ---- lib/python/qmk/cli/userspace/path.py | 4 ---- 2 files changed, 8 deletions(-) diff --git a/lib/python/qmk/cli/path.py b/lib/python/qmk/cli/path.py index 084167bf8390..91b0ceb01b19 100755 --- a/lib/python/qmk/cli/path.py +++ b/lib/python/qmk/cli/path.py @@ -1,7 +1,3 @@ -"""QMK Python Hello World - -This is an example QMK CLI script. -""" from milc import cli from qmk.constants import QMK_FIRMWARE diff --git a/lib/python/qmk/cli/userspace/path.py b/lib/python/qmk/cli/userspace/path.py index 9fd9b5cd1f5c..df4648e8c7d4 100755 --- a/lib/python/qmk/cli/userspace/path.py +++ b/lib/python/qmk/cli/userspace/path.py @@ -1,7 +1,3 @@ -"""QMK Python Hello World - -This is an example QMK CLI script. -""" from milc import cli from qmk.constants import QMK_USERSPACE From bf8328908c1caab3b9e379c276eacb28a5f0249a Mon Sep 17 00:00:00 2001 From: Nick Brassel Date: Mon, 24 Jun 2024 07:51:55 +1000 Subject: [PATCH 4/4] Review comments. --- lib/python/qmk/cli/__init__.py | 1 - lib/python/qmk/cli/path.py | 8 -------- util/docker_cmd.sh | 10 +++++++++- 3 files changed, 9 insertions(+), 10 deletions(-) delete mode 100755 lib/python/qmk/cli/path.py diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py index c695060d790e..b504aa5f8c63 100644 --- a/lib/python/qmk/cli/__init__.py +++ b/lib/python/qmk/cli/__init__.py @@ -80,7 +80,6 @@ 'qmk.cli.new.keyboard', 'qmk.cli.new.keymap', 'qmk.cli.painter', - 'qmk.cli.path', 'qmk.cli.pytest', 'qmk.cli.test.c', 'qmk.cli.userspace.add', diff --git a/lib/python/qmk/cli/path.py b/lib/python/qmk/cli/path.py deleted file mode 100755 index 91b0ceb01b19..000000000000 --- a/lib/python/qmk/cli/path.py +++ /dev/null @@ -1,8 +0,0 @@ -from milc import cli -from qmk.constants import QMK_FIRMWARE - - -@cli.subcommand('Detected path to QMK Firmware.', hidden=True) -def path(cli): - print(QMK_FIRMWARE) - return diff --git a/util/docker_cmd.sh b/util/docker_cmd.sh index b6546a6d89e1..18725db06895 100755 --- a/util/docker_cmd.sh +++ b/util/docker_cmd.sh @@ -49,8 +49,13 @@ qmk_firmware_dir=$(pwd -W 2>/dev/null) || qmk_firmware_dir=$PWD # Use Windows p qmk_userspace_dir="" userspace_docker_args="" -if [ -n "$(qmk userspace-path)" ]; then +if [ -n "$QMK_USERSPACE" ] && [ -e "$QMK_USERSPACE/qmk.json" ]; then + qmk_userspace_dir=$(cd "$QMK_USERSPACE" && pwd -W 2>/dev/null) || qmk_userspace_dir=$QMK_USERSPACE # Use Windows path if on Windows +elif [ -n "$(which qmk 2>/dev/null)" ] && [ -n "$(qmk userspace-path)" ]; then qmk_userspace_dir=$(cd "$(qmk userspace-path)" && pwd -W 2>/dev/null) || qmk_userspace_dir=$(qmk userspace-path) # Use Windows path if on Windows +fi + +if [ -n "$qmk_userspace_dir" ]; then userspace_docker_args="-v $qmk_userspace_dir:/qmk_userspace:z -e QMK_USERSPACE=/qmk_userspace" fi @@ -65,5 +70,8 @@ fi -w /qmk_firmware \ -v "$qmk_firmware_dir":/qmk_firmware:z \ $userspace_docker_args \ + -e SKIP_GIT="$SKIP_GIT" \ + -e SKIP_VERSION="$SKIP_VERSION" \ + -e MAKEFLAGS="$MAKEFLAGS" \ ghcr.io/qmk/qmk_cli \ "$@"