From 75ece38725b1532068ea357ea8bfd0859832e466 Mon Sep 17 00:00:00 2001 From: "E.T" Date: Sat, 6 Jan 2024 00:42:36 +0100 Subject: [PATCH] Dockerfile overhaul (#1726) Create entrypoint to orchestrate the build steps Supported commands: make, ninja Passes additional arguments to the make / ninja command at the end (like -jNN) There is a shortcut to make -jNN by just specifying -jNN Anything else will be directly executed (like getting a shell into the container with bash -li is still possible) --- dockerfile-nogit | 36 ++++++++++++++++++----------- dockerfile-nogit-arm | 36 ++++++++++++++++++----------- firmware/tools/docker-entrypoint.sh | 34 +++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 28 deletions(-) create mode 100755 firmware/tools/docker-entrypoint.sh diff --git a/dockerfile-nogit b/dockerfile-nogit index 0f962e35..1062e227 100644 --- a/dockerfile-nogit +++ b/dockerfile-nogit @@ -10,32 +10,40 @@ VOLUME /havoc WORKDIR /havoc/firmware # Fetch dependencies from APT -RUN apt-get update && \ - apt-get install -y git tar wget dfu-util cmake python3 ccache bzip2 liblz4-tool curl && \ - apt-get -qy autoremove +RUN apt-get update \ + && apt-get install -y git tar wget dfu-util cmake python3 ccache bzip2 liblz4-tool curl ninja-build \ + && apt-get -qy autoremove \ + && rm -rf /var/lib/apt/lists/* #Install current pip from PyPa RUN curl https://bootstrap.pypa.io/pip/3.4/get-pip.py -o get-pip.py && \ python3 get-pip.py #Fetch additional dependencies from Python 3.x pip -RUN pip install pyyaml -RUN ln -s /usr/bin/python3 /usr/bin/python && \ - ln -s /usr/bin/pip3 /usr/bin/pip +RUN pip install pyyaml \ + && ln -s /usr/bin/python3 /usr/bin/python \ + && ln -s /usr/bin/pip3 /usr/bin/pip ENV LANG C.UTF-8 ENV LC_ALL C.UTF-8 # Grab the GNU ARM toolchain from arm.com # Then extract contents to /opt/build/armbin/ -RUN mkdir /opt/build && cd /opt/build && \ - wget -O gcc-arm-none-eabi $ARMBINURL && \ - mkdir armbin && \ - tar --strip=1 -xjvf gcc-arm-none-eabi -C armbin +RUN mkdir /opt/build \ + && cd /opt/build \ + && wget -O gcc-arm-none-eabi $ARMBINURL \ + && mkdir armbin \ + && tar --strip=1 -xjvf gcc-arm-none-eabi -C armbin # Configure CCACHE -RUN mkdir ~/bin && cd ~/bin && \ - for tool in gcc g++ cpp c++;do ln -s $(which ccache) arm-none-eabi-$tool;done +RUN mkdir ~/bin \ + && cd ~/bin \ + && for tool in gcc g++ cpp c++; do \ + ln -s $(which ccache) arm-none-eabi-$tool \ + ; done -CMD cd .. && cd build && \ - cmake .. && make ppfw +ADD firmware/tools/docker-entrypoint.sh /usr/local/bin/entrypoint.sh +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] + +# replace make with ninja temporarily while building your image if you prefer to use that by default +CMD ["make"] diff --git a/dockerfile-nogit-arm b/dockerfile-nogit-arm index 385b7eb0..0a7a4fe2 100644 --- a/dockerfile-nogit-arm +++ b/dockerfile-nogit-arm @@ -10,32 +10,40 @@ VOLUME /havoc WORKDIR /havoc/firmware # Fetch dependencies from APT -RUN apt-get update && \ - apt-get install -y git tar wget dfu-util cmake python3 ccache bzip2 liblz4-tool curl && \ - apt-get -qy autoremove +RUN apt-get update \ + && apt-get install -y git tar wget dfu-util cmake python3 ccache bzip2 liblz4-tool curl ninja-build \ + && apt-get -qy autoremove \ + && rm -rf /var/lib/apt/lists/* #Install current pip from PyPa RUN curl https://bootstrap.pypa.io/pip/3.4/get-pip.py -o get-pip.py && \ python3 get-pip.py #Fetch additional dependencies from Python 3.x pip -RUN pip install pyyaml -RUN ln -s /usr/bin/python3 /usr/bin/python && \ - ln -s /usr/bin/pip3 /usr/bin/pip +RUN pip install pyyaml \ + && ln -s /usr/bin/python3 /usr/bin/python \ + && ln -s /usr/bin/pip3 /usr/bin/pip ENV LANG C.UTF-8 ENV LC_ALL C.UTF-8 # Grab the GNU ARM toolchain from arm.com # Then extract contents to /opt/build/armbin/ -RUN mkdir /opt/build && cd /opt/build && \ - wget -O gcc-arm-none-eabi $ARMBINURL && \ - mkdir armbin && \ - tar --strip=1 -xjvf gcc-arm-none-eabi -C armbin +RUN mkdir /opt/build \ + && cd /opt/build \ + && wget -O gcc-arm-none-eabi $ARMBINURL \ + && mkdir armbin \ + && tar --strip=1 -xjvf gcc-arm-none-eabi -C armbin # Configure CCACHE -RUN mkdir ~/bin && cd ~/bin && \ - for tool in gcc g++ cpp c++;do ln -s $(which ccache) arm-none-eabi-$tool;done +RUN mkdir ~/bin \ + && cd ~/bin \ + && for tool in gcc g++ cpp c++; do \ + ln -s $(which ccache) arm-none-eabi-$tool \ + ; done -CMD cd .. && cd build && \ - cmake .. && make ppfw +ADD firmware/tools/docker-entrypoint.sh /usr/local/bin/entrypoint.sh +ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] + +# replace make with ninja temporarily while building your image if you prefer to use that by default +CMD ["make"] diff --git a/firmware/tools/docker-entrypoint.sh b/firmware/tools/docker-entrypoint.sh new file mode 100755 index 00000000..b564de0f --- /dev/null +++ b/firmware/tools/docker-entrypoint.sh @@ -0,0 +1,34 @@ +#!/bin/bash + +set -e # exit immediatelly on any failure + +build_make() { + cd .. + mkdir -p build + cd build + cmake .. + make "$@" + exit 0 # Report success :) +} + +build_ninja() { + cd .. + mkdir -p build + cd build + cmake -G Ninja .. + ninja "$@" + exit 0 # Report success :) +} + +if [ "$1" = 'make' ]; then # build the default (or specified) target with make + shift # remove the first item from $@ as we consumed it, we can then pass the rest on to make + build_make "$@" +elif [[ $1 == -j* ]]; then # allow passing -j without typing make_default + # dont shift here as we wanna pass the -j + build_make "$@" +elif [ "$1" = 'ninja' ]; then # build the default (or specified) target with ninja + shift # remove the first item from $@ as we consumed it, we can then pass the rest on to make + build_ninja "$@" +fi + +exec "$@"