Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for userspace to docker build commands. #23988

Merged
merged 4 commits into from
Jun 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions lib/python/qmk/cli/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@
'qmk.cli.userspace.compile',
'qmk.cli.userspace.doctor',
'qmk.cli.userspace.list',
'qmk.cli.userspace.path',
'qmk.cli.userspace.remove',
'qmk.cli.via2json',
]
Expand Down
8 changes: 8 additions & 0 deletions lib/python/qmk/cli/userspace/path.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
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
2 changes: 1 addition & 1 deletion lib/python/qmk/tests/test_cli_commands.py
Original file line number Diff line number Diff line change
Expand Up @@ -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():
Expand Down
84 changes: 1 addition & 83 deletions util/docker_build.sh
Original file line number Diff line number Diff line change
@@ -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 "$@"
30 changes: 24 additions & 6 deletions util/docker_cmd.sh
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#!/bin/sh
# vim: set ft=sh ts=4 sw=4 noexpandtab
# NOTE: This script uses tabs for indentation

errcho() {
Expand Down Expand Up @@ -37,13 +38,26 @@ 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" ] && [ -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
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)"
Expand All @@ -54,6 +68,10 @@ fi
$usb_args \
$uid_arg \
-w /qmk_firmware \
-v "$dir":/qmk_firmware \
-v "$qmk_firmware_dir":/qmk_firmware:z \
$userspace_docker_args \
tzarc marked this conversation as resolved.
Show resolved Hide resolved
-e SKIP_GIT="$SKIP_GIT" \
-e SKIP_VERSION="$SKIP_VERSION" \
-e MAKEFLAGS="$MAKEFLAGS" \
ghcr.io/qmk/qmk_cli \
"$@"
Loading