diff --git a/Dockerfile b/Dockerfile index dfde33b5cc..8f78dc2bfe 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,28 +1,29 @@ -FROM debian:jessie -MAINTAINER Erik Dasque +FROM debian -RUN apt-get update && apt-get install --no-install-recommends -y build-essential \ +RUN apt-get update && apt-get install --no-install-recommends -y \ + avr-libc \ + avrdude \ + binutils-arm-none-eabi \ + binutils-avr \ + build-essential \ + dfu-programmer \ + dfu-util \ gcc \ + gcc-arm-none-eabi \ + gcc-avr \ + git \ + libnewlib-arm-none-eabi \ + software-properties-common \ unzip \ wget \ zip \ - gcc-avr \ - binutils-avr \ - avr-libc \ - dfu-programmer \ - dfu-util \ - gcc-arm-none-eabi \ - binutils-arm-none-eabi \ - libnewlib-arm-none-eabi \ - git \ - software-properties-common \ - avrdude \ && rm -rf /var/lib/apt/lists/* -ENV keyboard=ergodox -ENV subproject=ez -ENV keymap=default +ENV KEYBOARD=ergodox_ez +ENV KEYMAP=default -VOLUME /qmk -WORKDIR /qmk -CMD make clean ; make keyboard=${keyboard} subproject=${subproject} keymap=${keymap} +VOLUME /qmk_firmware +WORKDIR /qmk_firmware +COPY . . + +CMD make $KEYBOARD:$KEYMAP diff --git a/docs/getting_started_build_tools.md b/docs/getting_started_build_tools.md index 67bbe54344..375e9d108f 100644 --- a/docs/getting_started_build_tools.md +++ b/docs/getting_started_build_tools.md @@ -123,24 +123,27 @@ If you have trouble and want to ask for help, it is useful to generate a *Win_Ch ## Docker -If this is a bit complex for you, Docker might be the turn-key solution you need. After installing [Docker](https://www.docker.com/products/docker), run the following command at the root of the QMK folder to build a keyboard/keymap: - +If this is a bit complex for you, Docker might be the turn-key solution you need. After installing [Docker CE](https://docs.docker.com/install/#supported-platforms), run the following command from the `qmk_firmware` directory to build a keyboard/keymap: ```bash -# You'll run this every time you want to build a keymap -# modify the keymap and keyboard assignment to compile what you want -# defaults are ergodox/default +util/docker_build.sh keyboard:keymap +# For example: util/docker_build.sh ergodox_ez:steno +``` +This will compile the targeted keyboard/keymap and leave the resulting `.hex` or `.bin` file in the QMK directory for you to flash. If `:keymap` is omitted, the `default` keymap is used. Note that the parameter format is the same as when building with `make`. -docker run -e keymap=gwen -e keyboard=ergodox_ez --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware +You can also start the script without any parameters, in which case it will ask you to input the build parameters one by one, which you may find easier to use: +```bash +util/docker_build.sh +# Reads parameters as input (leave blank for defaults) ``` -On Windows Docker seems to have issues with the VOLUME tag in Dockerfile, and `$('pwd')` won't print a Windows compliant path; use full path instead, like this: - +There is also support for building _and_ flashing the keyboard straight from Docker by specifying the `target` as well: ```bash -docker run -e keymap=default -e keyboard=ergodox_ez --rm -v D:/Users/Sacapuces/Documents/Repositories/qmk:/qmk:rw edasque/qmk_firmware - +util/docker_build.sh keyboard:keymap:target +# For example: util/docker_build.sh planck/rev6:default:dfu-util ``` +If you're on Linux, this should work out of the box. On Windows and macOS, it requires [Docker Machine](http://gw.tnode.com/docker/docker-machine-with-usb-support-on-windows-macos/) to be running. This is tedious to set up, so it's not recommended; use QMK Toolbox instead. -This will compile the targeted keyboard/keymap and leave it in your QMK directory for you to flash. +!> Docker for Windows requires [Hyper-V](https://docs.microsoft.com/en-us/virtualization/hyper-v-on-windows/quick-start/enable-hyper-v) to be enabled. This means that it cannot work on versions of Windows which don't have Hyper-V, such as Windows 7, Windows 8 and **Windows 10 Home**. ## Vagrant If you have any problems building the firmware, you can try using a tool called Vagrant. It will set up a virtual computer with a known configuration that's ready-to-go for firmware building. OLKB does NOT host the files for this virtual computer. Details on how to set up Vagrant are in the [vagrant guide](getting_started_vagrant.md). diff --git a/util/docker_build.sh b/util/docker_build.sh new file mode 100755 index 0000000000..26075cc908 --- /dev/null +++ b/util/docker_build.sh @@ -0,0 +1,49 @@ +#!/bin/sh +# NOTE: This script uses tabs for indentation + +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 + echo "$USAGE" >&2 + exit 1 +elif ! command -v docker >/dev/null 2>&1; then + echo "Error: docker not found" >&2 + echo "See https://docs.docker.com/install/#supported-platforms for installation instructions" >&2 + exit 2 +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 + echo "$USAGE" >&2 + exit 1 + fi +fi +if [ -n "$target" ]; then + if [ "$(uname)" = "Linux" ] || docker-machine active >/dev/null 2>&1; then + usb_args="--privileged -v /dev/bus/usb:/dev/bus/usb" + else + echo "Error: target requires docker-machine to work on your platform" >&2 + echo "See http://gw.tnode.com/docker/docker-machine-with-usb-support-on-windows-macos" >&2 + exit 3 + fi +fi +dir=$(pwd -W 2>/dev/null) || dir=$PWD # Use Windows path if on Windows + +# Run container and build firmware +docker run --rm $usb_args -v "$dir":/qmk_firmware qmkfm/qmk_firmware \ + make "$keyboard${keymap:+:$keymap}${target:+:$target}"