From 52f4eccf83d8c0f4519216fede7e8311fd275f70 Mon Sep 17 00:00:00 2001 From: Richard Weickelt Date: Thu, 23 May 2019 21:24:20 +0200 Subject: 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 --- .travis.yml | 15 ++-- docker-compose.yml | 29 +++++-- docker/bionic/Dockerfile | 180 ++++++++++++++++++++++++++++++++++++++++++++ docker/bionic/entrypoint.sh | 96 +++++++++++++++++++++++ 4 files changed, 308 insertions(+), 12 deletions(-) create mode 100644 docker/bionic/Dockerfile create mode 100755 docker/bionic/entrypoint.sh diff --git a/.travis.yml b/.travis.yml index 54455ff45..89d968b83 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,11 +17,11 @@ stages: jobs: include: - - &build-on-stretch + - &build-on-bionic stage: Build Qbs and and run autotests - name: With Qbs on Debian stretch (linux_amd64) + name: With Qbs on Ubuntu bionic (linux_gcc64) env: - SERVICE=stretch + SERVICE=bionic services: - docker before_install: @@ -29,11 +29,16 @@ jobs: script: - docker-compose run --rm ${SERVICE} scripts/build-qbs-with-qbs.sh - - <<: *build-on-stretch - name: With QMake on Debian stretch (linux_amd64) + - <<: *build-on-bionic + name: With QMake on Ubuntu bionic (linux_gcc64) script: - docker-compose run --rm ${SERVICE} scripts/build-qbs-with-qmake.sh + - <<: *build-on-bionic + name: With Qbs on Ubuntu bionic (mingw32_w64) + script: + - docker-compose run --rm ${SERVICE} qbs build profile:qt-mingw32_w64 + - &build-on-macos stage: Build Qbs and and run autotests name: With Qbs on macOS (xcode 10.2) diff --git a/docker-compose.yml b/docker-compose.yml index 251b09679..cdfa6ee55 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,28 @@ -version: "3.3" +version: "3.7" + +x-default-service: &linux + working_dir: /qbs + volumes: + - .:/qbs + network_mode: bridge + cap_add: + - SYS_PTRACE services: + bionic: + << : *linux + hostname: bionic + image: ${DOCKER_USER:-qbsbuild}/qbsdev:bionic + build: + dockerfile: docker/bionic/Dockerfile + context: . + args: + QT_VERSION: 5.12.4 + QTCREATOR_VERSION: 4.9.2 + stretch: + << : *linux + hostname: stretch image: ${DOCKER_USER:-qbsbuild}/qbsdev:stretch build: dockerfile: docker/stretch/Dockerfile @@ -9,9 +30,3 @@ services: args: QT_VERSION: 5.12.4 QTCREATOR_VERSION: 4.9.2 - working_dir: /qbs - volumes: - - .:/qbs - network_mode: bridge - cap_add: - - SYS_PTRACE 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 +## 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 -- cgit v1.2.3