aboutsummaryrefslogtreecommitdiffstats
path: root/docker/bionic
diff options
context:
space:
mode:
authorRichard Weickelt <richard@weickelt.de>2019-05-23 21:24:20 +0200
committerRichard Weickelt <richard@weickelt.de>2019-08-27 04:41:42 +0000
commit52f4eccf83d8c0f4519216fede7e8311fd275f70 (patch)
tree754bc40a68118ac6a6e9d68fa31026fa54b7ff2a /docker/bionic
parentc6e49568deaf973df276d5168714df0c9a2aad85 (diff)
Add Ubuntu 18.04 Docker image
Contains: - Qbs 1.13.1 (from QtCreator 4.9.2) - Qt 5.12.4 for Linux (prebuilt) - Qt 5.12.4 for Windows (compiled from source) - gcc 7.4 - mingw-w64 (7.3) This image can build Qbs and all its components for Linux and Windows targets. It might supersede Debian stretch which is not officially supported by Qt 5.12. The only limitation is that it can neither build Chocolatey packages nor run windeployqt. Change-Id: Icee1f002483f68839d39c8c152a9c5d886dabcfb Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'docker/bionic')
-rw-r--r--docker/bionic/Dockerfile180
-rwxr-xr-xdocker/bionic/entrypoint.sh96
2 files changed, 276 insertions, 0 deletions
diff --git a/docker/bionic/Dockerfile b/docker/bionic/Dockerfile
new file mode 100644
index 000000000..7522c47cd
--- /dev/null
+++ b/docker/bionic/Dockerfile
@@ -0,0 +1,180 @@
+#
+# Downloads and builds Qt from source. We do it in a
+# separate stage to keep the number of dependencies low in
+# the final Docker image.
+#
+FROM ubuntu:bionic as build-qt-mingw32_w64
+ARG QT_VERSION
+
+RUN apt-get update -qq && \
+ apt-get install -qq -y --no-install-recommends \
+ build-essential \
+ ca-certificates \
+ libclang-3.9-dev \
+ libgl1-mesa-dev \
+ mingw-w64 \
+ python \
+ xz-utils \
+ wget
+
+ENV LLVM_INSTALL_DIR=/usr/lib/llvm-3.9
+
+RUN mkdir -p /qt/source && \
+ wget -nv --continue --tries=20 --waitretry=10 --retry-connrefused \
+ --no-dns-cache --timeout 300 -qO- \
+ https://download.qt.io/official_releases/qt/${QT_VERSION%??}/${QT_VERSION}/single/qt-everywhere-src-${QT_VERSION}.tar.xz \
+ | tar --strip-components=1 -C /qt/source -xJf-
+
+RUN mkdir -p qt/build && \
+ cd qt/build && \
+ ../source/configure \
+ -prefix /opt/Qt/${QT_VERSION}/mingw32_w64 \
+ -release \
+ -shared \
+ -opensource \
+ -confirm-license \
+ -nomake examples \
+ -nomake tests \
+ -xplatform win32-g++ \
+ -opengl desktop \
+ -device-option CROSS_COMPILE=/usr/bin/x86_64-w64-mingw32- \
+ -qt-sqlite -qt-libpng \
+ -no-cups -no-dbus -no-pch \
+ -no-feature-accessibility \
+ -skip qtactiveqt \
+ -skip qt3d \
+ -skip qtcanvas3d \
+ -skip qtcharts \
+ -skip qtconnectivity \
+ -skip qtdatavis3d \
+ -skip qtdeclarative \
+ -skip qtdoc \
+ -skip qtgamepad \
+ -skip qtgraphicaleffects \
+ -skip qtimageformats \
+ -skip qtlocation \
+ -skip qtmultimedia \
+ -skip qtnetworkauth \
+ -skip qtquickcontrols \
+ -skip qtquickcontrols2 \
+ -skip qtpurchasing \
+ -skip qtremoteobjects \
+ -skip qtscxml \
+ -skip qtsensors \
+ -skip qtserialbus \
+ -skip qtserialport \
+ -skip qtspeech \
+ -skip qtsvg \
+ -skip qttranslations \
+ -skip qtwayland \
+ -skip qtvirtualkeyboard \
+ -skip qtwebchannel \
+ -skip qtwebengine \
+ -skip qtwebsockets \
+ -skip qtwebview \
+ -skip qtwinextras \
+ -skip qtxmlpatterns \
+ -skip qtx11extras
+
+# Build and transform stdout into . to reduce the noise
+RUN cd qt/build && \
+ make -j $(nproc --all) | stdbuf -o0 tr -cd '\n' | stdbuf -o0 tr '\n' '.' && \
+ make install
+
+#
+# Install Qt and Qbs for Linux and combine that with Qt for Windows from the
+# previous stage
+#
+FROM ubuntu:bionic
+LABEL Description="Ubuntu development environment for Qbs with Qt and various dependencies for testing Qbs modules and functionality"
+ARG QT_VERSION
+ARG QTCREATOR_VERSION
+
+# Allow colored output on command line.
+ENV TERM=xterm-color
+
+#
+# Make it possible to change UID/GID in the entrypoint script. The docker
+# container usually runs as root user on Linux hosts. When the Docker container
+# mounts a folder on the host and creates files there, those files would be
+# owned by root instead of the current user. Thus we create a user here who's
+# UID will be changed in the entrypoint script to match the UID of the current
+# host user.
+#
+ARG USER_UID=1000
+ARG USER_NAME=devel
+RUN apt-get update -qq && \
+ apt-get install -qq -y \
+ ca-certificates \
+ gosu \
+ sudo && \
+ groupadd -g ${USER_UID} ${USER_NAME} && \
+ useradd -s /bin/bash -u ${USER_UID} -g ${USER_NAME} -o -c "" -m ${USER_NAME} && \
+ usermod -a -G sudo ${USER_NAME} && \
+ echo "%devel ALL = (ALL) NOPASSWD: ALL" >> /etc/sudoers
+
+COPY docker/bionic/entrypoint.sh /sbin/entrypoint.sh
+ENTRYPOINT ["/sbin/entrypoint.sh"]
+
+# Qbs build dependencies
+RUN apt-get update -qq && \
+ apt-get install -qq -y --no-install-recommends \
+ build-essential \
+ ca-certificates \
+ curl \
+ git \
+ libclang-3.9 \
+ libdbus-1-3 \
+ libfreetype6 \
+ libfontconfig1 \
+ libgl1-mesa-dev \
+ libgl1-mesa-glx \
+ pkg-config \
+ help2man \
+ python-pip \
+ p7zip-full && \
+ pip install beautifulsoup4 lxml # for building the documentation
+
+ENV LLVM_INSTALL_DIR=/usr/lib/llvm-3.9
+
+
+#
+# Install Qt and Qbs for Linux from qt.io
+#
+COPY scripts/install-qt.sh install-qt.sh
+
+RUN ./install-qt.sh --version ${QT_VERSION} qtbase qtdeclarative qtscript qttools qtx11extras icu && \
+ ./install-qt.sh --version ${QTCREATOR_VERSION} qtcreator && \
+ echo "export PATH=/opt/Qt/${QT_VERSION}/gcc_64/bin:/opt/Qt/Tools/QtCreator/bin:\${PATH}" > /etc/profile.d/qt.sh
+
+ENV PATH=/opt/Qt/${QT_VERSION}/gcc_64/bin:/opt/Qt/Tools/QtCreator/bin:${PATH}
+
+
+#
+# Install Qt installation from build stage
+#
+COPY --from=build-qt-mingw32_w64 /opt/Qt/${QT_VERSION}/mingw32_w64 /opt/Qt/${QT_VERSION}/mingw32_w64
+
+#
+# Install mingw toolchain to cross build for Windows and select
+# POSIX API to make use of threading support in the stl. That
+# is required by Qbs.
+#
+RUN apt-get install -qq -y --no-install-recommends \
+ mingw-w64 && \
+ printf "1\n" | update-alternatives --config x86_64-w64-mingw32-g++
+
+
+# Configure Qbs
+USER $USER_NAME
+RUN qbs-setup-toolchains /usr/bin/g++ gcc && \
+ qbs-setup-qt /opt/Qt/${QT_VERSION}/gcc_64/bin/qmake qt-gcc_64 && \
+ qbs config profiles.qt-gcc_64.baseProfile gcc && \
+ qbs config defaultProfile qt-gcc_64 && \
+ \
+ qbs-setup-toolchains /usr/bin/x86_64-w64-mingw32-g++ mingw && \
+ qbs-setup-qt /opt/Qt/${QT_VERSION}/mingw32_w64/bin/qmake qt-mingw32_w64 && \
+ qbs config profiles.qt-mingw32_w64.baseProfile mingw
+
+# Switch back to root user for the entrypoint script.
+USER root
diff --git a/docker/bionic/entrypoint.sh b/docker/bionic/entrypoint.sh
new file mode 100755
index 000000000..9d7b7c10f
--- /dev/null
+++ b/docker/bionic/entrypoint.sh
@@ -0,0 +1,96 @@
+#!/usr/bin/env bash
+set -e
+
+#############################################################################
+##
+## Copyright (C) 2019 Richard Weickelt <richard@weickelt.de>
+## Contact: https://www.qt.io/licensing/
+##
+## This file is part of Qbs.
+##
+## $QT_BEGIN_LICENSE:LGPL$
+## Commercial License Usage
+## Licensees holding valid commercial Qt licenses may use this file in
+## accordance with the commercial license agreement provided with the
+## Software or, alternatively, in accordance with the terms contained in
+## a written agreement between you and The Qt Company. For licensing terms
+## and conditions see https://www.qt.io/terms-conditions. For further
+## information use the contact form at https://www.qt.io/contact-us.
+##
+## GNU Lesser General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU Lesser
+## General Public License version 3 as published by the Free Software
+## Foundation and appearing in the file LICENSE.LGPL3 included in the
+## packaging of this file. Please review the following information to
+## ensure the GNU Lesser General Public License version 3 requirements
+## will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+##
+## GNU General Public License Usage
+## Alternatively, this file may be used under the terms of the GNU
+## General Public License version 2.0 or (at your option) the GNU General
+## Public license version 3 or any later version approved by the KDE Free
+## Qt Foundation. The licenses are as published by the Free Software
+## Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+## included in the packaging of this file. Please review the following
+## information to ensure the GNU General Public License requirements will
+## be met: https://www.gnu.org/licenses/gpl-2.0.html and
+## https://www.gnu.org/licenses/gpl-3.0.html.
+##
+## $QT_END_LICENSE$
+##
+#############################################################################
+
+#
+# Entrypoint script when starting the container. The script checks the current
+# working directory and changes the uid/gid of developer/users to match whatever
+# is found in the working directory. This is useful to match the user and group
+# of mounted volumes into the container
+
+#
+# If not root, re-run script as root to fix ids
+#
+if [ "$(id -u)" != "0" ]; then
+ exec gosu root /sbin/entrypoint.sh "$@"
+fi
+
+#
+# Try to determine the uid of the working directory and adjust the current
+# user's uid/gid accordingly.
+#
+USER_GID=${USER_GID:-$(stat -c "%g" .)}
+USER_UID=${USER_UID:-$(stat -c "%u" .)}
+USER_NAME=${USER_NAME:-devel}
+USER_GROUP=${USER_GROUP:-devel}
+EXEC=""
+export HOME=/home/${USER_NAME}
+
+#
+# This is a problem on Linux hosts when we mount a folder from the
+# user file system and write artifacts into that. Thus, we downgrade
+# the current user and make sure that the uid and gid matches the one
+# of the mounted project folder.
+#
+# This work-around is not needed on Windows hosts as Windows doesn't
+# have such a concept.
+#
+if [ "${USER_UID}" != "0" ]; then
+ if [ "$(id -u ${USER_NAME})" != "${USER_UID}" ]; then
+ usermod -u ${USER_UID} ${USER_NAME}
+ # After changing the user's uid, all files in user's home directory
+ # automatically get the new uid.
+ fi
+ current_gid=$(id -g ${USER_NAME})
+ if [ "$(id -g ${USER_NAME})" != "${USER_GID}" ]; then
+ groupmod -g ${USER_GID} ${USER_GROUP}
+ # Set the new gid on all files in the home directory that still have the
+ # old gid.
+ find /home/${USER_NAME} -gid "${current_gid}" ! -type l -exec chgrp ${USER_GID} {} \;
+ fi
+fi
+EXEC="exec gosu ${USER_NAME}:${USER_GROUP}"
+
+if [ -z "$1" ]; then
+ ${EXEC} bash -l
+else
+ ${EXEC} bash -l -c "$*"
+fi