# # 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 # Work-around for QTBUG-79020 RUN echo "QT_NO_GLIB=1" >> /etc/profile.d/qt.sh