|
| 1 | +FROM ubuntu:20.04 |
| 2 | + |
| 3 | +# Install APT packages |
| 4 | +ARG DEBIAN_FRONTEND=noninteractive |
| 5 | +RUN apt-get update -q && apt-get -y -q install --no-install-recommends \ |
| 6 | + bzip2 \ |
| 7 | + ca-certificates \ |
| 8 | + clang \ |
| 9 | + cmake \ |
| 10 | + curl \ |
| 11 | + dbus \ |
| 12 | + doxygen \ |
| 13 | + file \ |
| 14 | + g++ \ |
| 15 | + git \ |
| 16 | + graphviz \ |
| 17 | + libc++-dev \ |
| 18 | + libc++abi-dev \ |
| 19 | + libcups2 \ |
| 20 | + libegl1-mesa \ |
| 21 | + libffi-dev \ |
| 22 | + libfontconfig1 \ |
| 23 | + libfreetype6 \ |
| 24 | + libglu1-mesa-dev \ |
| 25 | + libodbc1 \ |
| 26 | + libpq5 \ |
| 27 | + libxcb-cursor0 \ |
| 28 | + libxcb-glx0 \ |
| 29 | + libxcb-icccm4 \ |
| 30 | + libxcb-icccm4 \ |
| 31 | + libxcb-image0 \ |
| 32 | + libxcb-keysyms1 \ |
| 33 | + libxcb-randr0 \ |
| 34 | + libxcb-render-util0 \ |
| 35 | + libxcb-shape0 \ |
| 36 | + libxcb-shm0 \ |
| 37 | + libxcb-xfixes0 \ |
| 38 | + libxcb-xinerama0 \ |
| 39 | + libxcb1 \ |
| 40 | + libxkbcommon-x11-0 \ |
| 41 | + make \ |
| 42 | + ninja-build \ |
| 43 | + p7zip-full \ |
| 44 | + python3 \ |
| 45 | + python3-pip \ |
| 46 | + python3-setuptools \ |
| 47 | + python3-wheel \ |
| 48 | + software-properties-common \ |
| 49 | + wget \ |
| 50 | + xvfb \ |
| 51 | + zlib1g \ |
| 52 | + zlib1g-dev \ |
| 53 | + && rm -rf /var/lib/apt/lists/* |
| 54 | + |
| 55 | +# Set Python3 as default Python version |
| 56 | +RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 100 |
| 57 | +RUN update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 100 |
| 58 | + |
| 59 | +# Allow installing pip packages system-wide since there's no risk in a container |
| 60 | +ENV PIP_BREAK_SYSTEM_PACKAGES=1 |
| 61 | + |
| 62 | +# Install OpenCascade |
| 63 | +ARG OCC_VERSION="7_7_2" |
| 64 | +ARG OCC_URL="https://github.com/Open-Cascade-SAS/OCCT/archive/refs/tags/V$OCC_VERSION.tar.gz" |
| 65 | +RUN wget -c "${OCC_URL}" -O /tmp.tar.gz \ |
| 66 | + && tar -xzf /tmp.tar.gz -C /opt \ |
| 67 | + && rm /tmp.tar.gz \ |
| 68 | + && cd "/opt/OCCT-$OCC_VERSION" \ |
| 69 | + && cmake . -G "Ninja" \ |
| 70 | + -DCMAKE_BUILD_TYPE=Release \ |
| 71 | + -DINSTALL_DIR=/usr \ |
| 72 | + -DBUILD_LIBRARY_TYPE=Shared \ |
| 73 | + -DBUILD_MODULE_ApplicationFramework=0 \ |
| 74 | + -DBUILD_MODULE_DataExchange=1 \ |
| 75 | + -DBUILD_MODULE_Draw=0 \ |
| 76 | + -DBUILD_MODULE_FoundationClasses=0 \ |
| 77 | + -DBUILD_MODULE_ModelingAlgorithms=0 \ |
| 78 | + -DBUILD_MODULE_ModelingData=0 \ |
| 79 | + -DBUILD_MODULE_Visualization=0 \ |
| 80 | + -DUSE_DRACO=0 \ |
| 81 | + -DUSE_FREEIMAGE=0 \ |
| 82 | + -DUSE_FREETYPE=0 \ |
| 83 | + -DUSE_GLES2=0 \ |
| 84 | + -DUSE_OPENGL=0 \ |
| 85 | + -DUSE_OPENVR=0 \ |
| 86 | + -DUSE_RAPIDJSON=0 \ |
| 87 | + -DUSE_TBB=0 \ |
| 88 | + -DUSE_TK=0 \ |
| 89 | + -DUSE_VTK=0 \ |
| 90 | + && ninja && ninja install \ |
| 91 | + && cd / && rm -rf "/opt/OCCT-$OCC_VERSION" |
| 92 | + |
| 93 | +# Install Qt Tools |
| 94 | +ARG QT_VERSION="6.6.2" |
| 95 | +ARG QT_BASEURL="https://download.qt.io/online/qtsdkrepository/linux_x64/desktop/qt6_662" |
| 96 | +ARG QT_URL="$QT_BASEURL/qt.qt6.662.gcc_64/6.6.2-0-202402121133" |
| 97 | +ENV QTDIR="/opt/qt/$QT_VERSION/gcc_64" \ |
| 98 | + PATH="/opt/qt/$QT_VERSION/gcc_64/bin:$PATH" \ |
| 99 | + LD_LIBRARY_PATH="/opt/qt/$QT_VERSION/gcc_64/lib:$LD_LIBRARY_PATH" \ |
| 100 | + PKG_CONFIG_PATH="/opt/qt/$QT_VERSION/gcc_64/lib/pkgconfig:$PKG_CONFIG_PATH" |
| 101 | +RUN mkdir /opt/qt \ |
| 102 | + && wget -c "${QT_URL}qttools-Linux-RHEL_8_8-GCC-Linux-RHEL_8_8-X86_64.7z" -O /tmp.7z \ |
| 103 | + && 7za x /tmp.7z -o/opt/qt \ |
| 104 | + && rm /tmp.7z \ |
| 105 | + # The AppImage deployment tools might read some paths from the Qt libraries, |
| 106 | + # but they are wrong so let's create a symlink to make them working anyway: |
| 107 | + && mkdir -p "/home/qt/work" \ |
| 108 | + && ln -s "/opt/qt/$QT_VERSION/gcc_64" "/home/qt/work/install" |
| 109 | + |
| 110 | +# Install Qt Base |
| 111 | +ARG QT_PRI="/opt/qt/$QT_VERSION/gcc_64/mkspecs/qconfig.pri" |
| 112 | +RUN wget -c "${QT_URL}qtbase-Linux-RHEL_8_8-GCC-Linux-RHEL_8_8-X86_64.7z" -O /tmp.7z \ |
| 113 | + && 7za x /tmp.7z -o/opt/qt \ |
| 114 | + && sed -i 's/Enterprise/OpenSource/' "$QT_PRI" \ |
| 115 | + && sed -i 's/licheck64//' "$QT_PRI" \ |
| 116 | + # Allow removing unneeded SQL plugins during CI job to fix deployment issue: |
| 117 | + # https://forum.qt.io/topic/151452/what-qt-specific-files-exactly-do-i-need-to-add-when-deploying |
| 118 | + && chmod 777 $QTDIR/plugins/sqldrivers \ |
| 119 | + && rm /tmp.7z |
| 120 | + |
| 121 | +# Install Qt SVG |
| 122 | +RUN wget -c "${QT_URL}qtsvg-Linux-RHEL_8_8-GCC-Linux-RHEL_8_8-X86_64.7z" -O /tmp.7z \ |
| 123 | + && 7za x /tmp.7z -o/opt/qt \ |
| 124 | + && rm /tmp.7z |
| 125 | + |
| 126 | +# Install Qt Declarative |
| 127 | +RUN wget -c "${QT_URL}qtdeclarative-Linux-RHEL_8_8-GCC-Linux-RHEL_8_8-X86_64.7z" -O /tmp.7z \ |
| 128 | + && 7za x /tmp.7z -o/opt/qt \ |
| 129 | + && rm /tmp.7z |
| 130 | + |
| 131 | +# Install Qt Translations |
| 132 | +RUN wget -c "${QT_URL}qttranslations-Linux-RHEL_8_8-GCC-Linux-RHEL_8_8-X86_64.7z" -O /tmp.7z \ |
| 133 | + && 7za x /tmp.7z -o/opt/qt \ |
| 134 | + && rm /tmp.7z |
| 135 | + |
| 136 | +# Install Qt5 Compat |
| 137 | +RUN wget -c "${QT_BASEURL}/qt.qt6.662.qt5compat.gcc_64/6.6.2-0-202402121133qt5compat-Linux-RHEL_8_8-GCC-Linux-RHEL_8_8-X86_64.7z" -O /tmp.7z \ |
| 138 | + && 7za x /tmp.7z -o/opt/qt \ |
| 139 | + && rm /tmp.7z |
| 140 | + |
| 141 | +# Install Qt Image Formats Plugin |
| 142 | +RUN wget -c "${QT_BASEURL}/qt.qt6.662.addons.qtimageformats.gcc_64/6.6.2-0-202402121133qtimageformats-Linux-RHEL_8_8-GCC-Linux-RHEL_8_8-X86_64.7z" -O /tmp.7z \ |
| 143 | + && 7za x /tmp.7z -o/opt/qt \ |
| 144 | + && rm /tmp.7z |
| 145 | + |
| 146 | +# Install libicu |
| 147 | +RUN wget -c "${QT_URL}icu-linux-Rhel7.2-x64.7z" -O /tmp.7z \ |
| 148 | + && 7za x /tmp.7z -o/opt/qt \ |
| 149 | + && rm /tmp.7z |
| 150 | + |
| 151 | +# Install linuxdeployqt |
| 152 | +ARG LINUXDEPLOYQT_URL="https://github.com/probonopd/linuxdeployqt/releases/download/10/linuxdeployqt-continuous-x86_64.AppImage" |
| 153 | +RUN wget -c "$LINUXDEPLOYQT_URL" -O /linuxdeployqt.AppImage \ |
| 154 | + && chmod a+x /linuxdeployqt.AppImage \ |
| 155 | + && /linuxdeployqt.AppImage --appimage-extract \ |
| 156 | + && chmod -R 755 /squashfs-root \ |
| 157 | + && mv /squashfs-root /opt/linuxdeployqt \ |
| 158 | + && ln -s /opt/linuxdeployqt/AppRun /usr/local/bin/linuxdeployqt \ |
| 159 | + && rm /linuxdeployqt.AppImage |
| 160 | + |
| 161 | +# Install beta appimagetool which should not depend on any system libraries |
| 162 | +# anymore, and should therefore run on Ubuntu 22.04 which doesn't provide |
| 163 | +# libfuse2 anymore (see https://github.com/LibrePCB/LibrePCB/issues/980). |
| 164 | +# However, since there are no official releases yet, the binary is downloaded |
| 165 | +# from the nightly build and added to the repository. Download URL: |
| 166 | +# https://github.com/probonopd/go-appimage/releases/download/continuous/appimagetool-765-x86_64.AppImage |
| 167 | +COPY appimagetool-x86_64.AppImage /appimagetool-x86_64.AppImage |
| 168 | +RUN /appimagetool-x86_64.AppImage --appimage-extract \ |
| 169 | + && chmod -R 755 /squashfs-root \ |
| 170 | + && mv /squashfs-root /opt/appimagetool \ |
| 171 | + && ln -s /opt/appimagetool/AppRun /usr/local/bin/appimagetool \ |
| 172 | + && rm /appimagetool-x86_64.AppImage |
| 173 | + |
| 174 | +# Install latest OpenSSL to avoid possible issues if servers some day stop |
| 175 | +# working with an old OpenSSL library (as already happened in the past). |
| 176 | +ARG OPENSSL_VERSION="3.2.1" |
| 177 | +RUN wget -c "https://www.openssl.org/source/openssl-$OPENSSL_VERSION.tar.gz" -O /tmp.tar.gz \ |
| 178 | + && tar -zxf /tmp.tar.gz \ |
| 179 | + && cd "./openssl-$OPENSSL_VERSION" \ |
| 180 | + && ./config --prefix=/usr --libdir=lib --openssldir=/etc/ssl '-Wl,--enable-new-dtags,-rpath,$(LIBRPATH)' \ |
| 181 | + && make -s -j8 \ |
| 182 | + && make install \ |
| 183 | + && ldconfig \ |
| 184 | + && cd .. \ |
| 185 | + && rm -rf "./openssl-$OPENSSL_VERSION" \ |
| 186 | + && rm /tmp.tar.gz |
| 187 | + |
| 188 | +# LibrePCB's unittests expect that there is a USERNAME environment variable |
| 189 | +ENV USERNAME="root" |
0 commit comments