aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Đorđević <vomindoraan@gmail.com>2018-12-08 18:42:46 +0100
committerMechMerlin <30334081+mechmerlin@users.noreply.github.com>2018-12-08 09:42:46 -0800
commit13ad6501361faa9433562dba4ea8c55f85bf1dc5 (patch)
treec6ac7ff8074cd4bb1f920fa0a204219d76fb8d0a
parent2ad2b73d685cf25268fa7d3726f45594edee70c4 (diff)
downloadqmk_firmware-13ad6501361faa9433562dba4ea8c55f85bf1dc5.tar.gz
qmk_firmware-13ad6501361faa9433562dba4ea8c55f85bf1dc5.zip
Add a better Docker build script + update Dockerfile (#4222)
* Add a Docker build script * Add usage and error messages * Add -r to reads Thanks mechmerlin * Add keyboard:keymap form, improve script * Add target argument, change usage forms in script * Add check for more than 3 args in keyboard:keymap:target form * Change Docker base image to debian, use community repo This matches what qmk_compiler uses (https://github.com/qmk/qmk_compiler/blob/master/Dockerfile#L1). I've removed the maintainer as we now have a community build on Docker Hub (https://hub.docker.com/r/qmkfm/qmk_firmware). This Dockerfile will also be maintained by the community. * Change build command format to keyboard:keymap * Call make directly in container run command * Simplify script, remove 3-arg form * Add COPY to Dockerfile so images are usable in and of themselves Also change WORKDIR from /qmk to /qmk_firmware * Add USB pass-through for Linux and docker-machine hosts * Read directly into variables instead of array * Alphabetically sort dependencies in Dockerfile * Set executable bit on util/docker_build.sh * Update Docker docs * Add warning about Docker on Windows * Expand comment in docs * Check docker-machine exit code instead of string * Only match --help with whole arguments * Make script POSIX-compliant * Convert script indentation to tabs
-rw-r--r--Dockerfile37
-rw-r--r--docs/getting_started_build_tools.md25
-rwxr-xr-xutil/docker_build.sh49
3 files changed, 82 insertions, 29 deletions
diff --git a/Dockerfile b/Dockerfile
index dfde33b5c..8f78dc2bf 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,28 +1,29 @@
1FROM debian:jessie 1FROM debian
2MAINTAINER Erik Dasque <erik@frenchguys.com>
3 2
4RUN apt-get update && apt-get install --no-install-recommends -y build-essential \ 3RUN apt-get update && apt-get install --no-install-recommends -y \
5 gcc \
6 unzip \
7 wget \
8 zip \
9 gcc-avr \
10 binutils-avr \
11 avr-libc \ 4 avr-libc \
5 avrdude \
6 binutils-arm-none-eabi \
7 binutils-avr \
8 build-essential \
12 dfu-programmer \ 9 dfu-programmer \
13 dfu-util \ 10 dfu-util \
11 gcc \
14 gcc-arm-none-eabi \ 12 gcc-arm-none-eabi \
15 binutils-arm-none-eabi \ 13 gcc-avr \
16 libnewlib-arm-none-eabi \
17 git \ 14 git \
15 libnewlib-arm-none-eabi \
18 software-properties-common \ 16 software-properties-common \
19 avrdude \ 17 unzip \
18 wget \
19 zip \
20 && rm -rf /var/lib/apt/lists/* 20 && rm -rf /var/lib/apt/lists/*
21 21
22ENV keyboard=ergodox 22ENV KEYBOARD=ergodox_ez
23ENV subproject=ez 23ENV KEYMAP=default
24ENV keymap=default 24
25VOLUME /qmk_firmware
26WORKDIR /qmk_firmware
27COPY . .
25 28
26VOLUME /qmk 29CMD make $KEYBOARD:$KEYMAP
27WORKDIR /qmk
28CMD make clean ; make keyboard=${keyboard} subproject=${subproject} keymap=${keymap}
diff --git a/docs/getting_started_build_tools.md b/docs/getting_started_build_tools.md
index 67bbe5434..375e9d108 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
123 123
124## Docker 124## Docker
125 125
126If 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: 126If 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:
127
128```bash 127```bash
129# You'll run this every time you want to build a keymap 128util/docker_build.sh keyboard:keymap
130# modify the keymap and keyboard assignment to compile what you want 129# For example: util/docker_build.sh ergodox_ez:steno
131# defaults are ergodox/default
132
133docker run -e keymap=gwen -e keyboard=ergodox_ez --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware
134``` 130```
131This 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`.
135 132
136On 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: 133You 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:
137
138```bash 134```bash
139docker run -e keymap=default -e keyboard=ergodox_ez --rm -v D:/Users/Sacapuces/Documents/Repositories/qmk:/qmk:rw edasque/qmk_firmware 135util/docker_build.sh
136# Reads parameters as input (leave blank for defaults)
137```
140 138
139There is also support for building _and_ flashing the keyboard straight from Docker by specifying the `target` as well:
140```bash
141util/docker_build.sh keyboard:keymap:target
142# For example: util/docker_build.sh planck/rev6:default:dfu-util
141``` 143```
144If 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.
142 145
143This will compile the targeted keyboard/keymap and leave it in your QMK directory for you to flash. 146!> 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**.
144 147
145## Vagrant 148## Vagrant
146If 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). 149If 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 000000000..26075cc90
--- /dev/null
+++ b/util/docker_build.sh
@@ -0,0 +1,49 @@
1#!/bin/sh
2# NOTE: This script uses tabs for indentation
3
4USAGE="Usage: $0 [keyboard[:keymap[:target]]]"
5
6# Check preconditions
7for arg; do
8 if [ "$arg" = "--help" ]; then
9 echo "$USAGE"
10 exit 0
11 fi
12done
13if [ $# -gt 1 ]; then
14 echo "$USAGE" >&2
15 exit 1
16elif ! command -v docker >/dev/null 2>&1; then
17 echo "Error: docker not found" >&2
18 echo "See https://docs.docker.com/install/#supported-platforms for installation instructions" >&2
19 exit 2
20fi
21
22# Determine arguments
23if [ $# -eq 0 ]; then
24 printf "keyboard=" && read -r keyboard
25 [ -n "$keyboard" ] && printf "keymap=" && read -r keymap
26 [ -n "$keymap" ] && printf "target=" && read -r target
27else
28 IFS=':' read -r keyboard keymap target x <<-EOF
29 $1
30 EOF
31 if [ -n "$x" ]; then
32 echo "$USAGE" >&2
33 exit 1
34 fi
35fi
36if [ -n "$target" ]; then
37 if [ "$(uname)" = "Linux" ] || docker-machine active >/dev/null 2>&1; then
38 usb_args="--privileged -v /dev/bus/usb:/dev/bus/usb"
39 else
40 echo "Error: target requires docker-machine to work on your platform" >&2
41 echo "See http://gw.tnode.com/docker/docker-machine-with-usb-support-on-windows-macos" >&2
42 exit 3
43 fi
44fi
45dir=$(pwd -W 2>/dev/null) || dir=$PWD # Use Windows path if on Windows
46
47# Run container and build firmware
48docker run --rm $usb_args -v "$dir":/qmk_firmware qmkfm/qmk_firmware \
49 make "$keyboard${keymap:+:$keymap}${target:+:$target}"