# # 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-android ARG QT_VERSION RUN apt-get update -qq && \ apt-get install -qq -y --no-install-recommends \ build-essential \ ca-certificates \ default-jre \ openjdk-8-jdk-headless \ curl \ wget \ unzip COPY scripts/install-android-ndk-sdk.sh install-android-ndk-sdk.sh RUN ./install-android-ndk-sdk.sh 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}/android_armv7 \ -android-ndk /opt/Android/android-ndk-r19b \ -android-sdk /opt/Android \ -android-ndk-host linux-x86_64 \ -release \ -shared \ -opensource \ -confirm-license \ -nomake examples \ -nomake tests \ -xplatform android-clang \ -qt-sqlite -qt-libpng \ -no-cups -no-dbus -no-pch \ -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 \ openjdk-8-jdk-headless \ p7zip-full && \ pip install beautifulsoup4 lxml # for building the documentation ENV LLVM_INSTALL_DIR=/usr/lib/llvm-3.9 ENV JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 # # 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/Tools/QtCreator/bin:\${PATH}" > /etc/profile.d/qt.sh ENV PATH=/opt/Qt/Tools/QtCreator/bin:${PATH} # # Install Qt installation from build stage # COPY --from=build-qt-android /opt/Android /opt/Android COPY --from=build-qt-android /opt/Qt/${QT_VERSION}/android_armv7 /opt/Qt/${QT_VERSION}/android_armv7 # # # 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 profiles.qt-gcc_64.moduleProviders.Qt.qmakeFilePaths /opt/Qt/${QT_VERSION}/gcc_64/bin/qmake #RUN qbs-setup-toolchains /opt/Android/android-ndk-r19b/toolchains/llvm/prebuilt/linux-x86_64/bin/clang++ clang RUN qbs config profiles.clang.cpp.cCompilerName clang && \ qbs config profiles.clang.cpp.compilerName clang++ && \ qbs config profiles.clang.cpp.cxxCompilerName clang++ && \ qbs config profiles.clang.cpp.toolchainInstallPath /opt/Android/android-ndk-r19b/toolchains/llvm/prebuilt/linux-x86_64/bin RUN qbs-setup-android --ndk-dir /opt/Android/android-ndk-r19b --sdk-dir /opt/Android --qt-dir /opt/Qt/${QT_VERSION}/android_armv7/bin/qmake qt-android_armv7 && \ qbs config profiles.qt-android_armv7.baseProfile clang && \ qbs config profiles.qt-android_armv7.moduleProviders.Qt.qmakeFilePaths /opt/Qt/${QT_VERSION}/android_armv7/bin/qmake && \ qbs config profiles.qt-android_armv7.qbs.architecture armv7a && \ qbs config defaultProfile qt-android_armv7 # Switch back to root user for the entrypoint script. USER root