|
| 1 | +ARG REGISTRY="docker.io" |
| 2 | +FROM ${REGISTRY}/library/ubuntu:22.04 |
| 3 | + |
| 4 | +USER root |
| 5 | + |
| 6 | +SHELL ["/bin/bash", "-eo", "pipefail", "-c"] |
| 7 | + |
| 8 | +# APT configuration |
| 9 | +RUN echo 'Acquire::Retries "10";' > /etc/apt/apt.conf && \ |
| 10 | + echo 'APT::Get::Assume-Yes "true";' >> /etc/apt/apt.conf && \ |
| 11 | + echo 'APT::Get::Fix-Broken "true";' >> /etc/apt/apt.conf && \ |
| 12 | + echo 'APT::Get::no-install-recommends "true";' >> /etc/apt/apt.conf |
| 13 | + |
| 14 | +# Arm libraries are now in ports.ubuntu.com |
| 15 | +RUN sed -i 's/^deb /deb [arch=amd64] /g' /etc/apt/sources.list |
| 16 | +RUN echo -e "\ndeb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports jammy main universe\ndeb [arch=arm64] http://ports.ubuntu.com/ubuntu-ports jammy-updates main universe" >> /etc/apt/sources.list |
| 17 | + |
| 18 | +ENV DEBIAN_FRONTEND="noninteractive" \ |
| 19 | + TZ="Europe/London" |
| 20 | + |
| 21 | +RUN dpkg --add-architecture arm64 && \ |
| 22 | + apt-get update && \ |
| 23 | + apt-get install software-properties-common && \ |
| 24 | + apt-get update && \ |
| 25 | + apt-get install \ |
| 26 | + pciutils \ |
| 27 | + dmidecode \ |
| 28 | + clinfo \ |
| 29 | + lshw \ |
| 30 | + procps \ |
| 31 | + g++ \ |
| 32 | + ninja-build \ |
| 33 | + smbclient \ |
| 34 | + software-properties-common \ |
| 35 | + crossbuild-essential-arm64 \ |
| 36 | + libpython3-dev:arm64 \ |
| 37 | + python3-pip \ |
| 38 | + libsqlite3-dev \ |
| 39 | + libsqlite3-dev:arm64 \ |
| 40 | + zlib1g-dev:arm64 \ |
| 41 | + libgflags2.2:arm64 \ |
| 42 | + libgflags-dev:arm64 \ |
| 43 | + libpugixml1v5:arm64 \ |
| 44 | + libtbb2:arm64 \ |
| 45 | + nlohmann-json3-dev \ |
| 46 | + libpugixml-dev:arm64 \ |
| 47 | + libtbb-dev:arm64 \ |
| 48 | + shellcheck \ |
| 49 | + lintian \ |
| 50 | + libffi-dev \ |
| 51 | + libssl-dev \ |
| 52 | + chrpath \ |
| 53 | + libssl-dev \ |
| 54 | + libprotobuf-dev \ |
| 55 | + libprotoc-dev \ |
| 56 | + protobuf-compiler \ |
| 57 | + lcov \ |
| 58 | + # parallel gzip |
| 59 | + pigz \ |
| 60 | + # For ARM CPU plugin |
| 61 | + scons \ |
| 62 | + # To extract OpenCV .xz archives |
| 63 | + liblzma-dev \ |
| 64 | + # For wheel packaging |
| 65 | + patchelf \ |
| 66 | + # check python wheel for duplicated files |
| 67 | + fdupes \ |
| 68 | + # Need to curl from pypa without warnings |
| 69 | + openssl \ |
| 70 | + # For Java API |
| 71 | + default-jdk \ |
| 72 | + # To build documentation |
| 73 | + graphviz \ |
| 74 | + texlive \ |
| 75 | + liblua5.2-0 \ |
| 76 | + # JS API |
| 77 | + libgtk-3-0 \ |
| 78 | + libgbm1 \ |
| 79 | + && \ |
| 80 | + rm -rf /var/lib/apt/lists/* |
| 81 | + |
| 82 | +# Install build dependencies |
| 83 | +ADD install_build_dependencies.sh /install_build_dependencies.sh |
| 84 | +RUN chmod +x /install_build_dependencies.sh && \ |
| 85 | + bash -e /install_build_dependencies.sh && \ |
| 86 | + rm -rf /var/lib/apt/lists/* |
| 87 | + |
| 88 | +# For cross-compilation for ARM64. If installed in the first `apt-get install` command, it will be removed by the install_build_dependencies.sh script |
| 89 | +RUN apt-get update && \ |
| 90 | + apt-get install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu |
| 91 | + |
| 92 | +# Install sscache |
| 93 | +ARG SCCACHE_VERSION="v0.7.5" |
| 94 | +ENV SCCACHE_HOME="/opt/sccache" \ |
| 95 | + SCCACHE_PATH="/opt/sccache/sccache" |
| 96 | + |
| 97 | +RUN mkdir ${SCCACHE_HOME} && cd ${SCCACHE_HOME} && \ |
| 98 | + SCCACHE_ARCHIVE="sccache-${SCCACHE_VERSION}-x86_64-unknown-linux-musl.tar.gz" && \ |
| 99 | + curl -SLO https://github.com/mozilla/sccache/releases/download/${SCCACHE_VERSION}/${SCCACHE_ARCHIVE} && \ |
| 100 | + tar -xzf ${SCCACHE_ARCHIVE} --strip-components=1 && rm ${SCCACHE_ARCHIVE} |
| 101 | + |
| 102 | +ENV PIP_VERSION="24.0" |
| 103 | +# To cross-compile Python 3.11 we need to first compile it for the host |
| 104 | +RUN curl -O https://www.python.org/ftp/python/3.11.3/Python-3.11.3.tar.xz && \ |
| 105 | + tar -xf Python-3.11.3.tar.xz && \ |
| 106 | + cd Python-3.11.3 && ./configure && make -j4 && make altinstall && \ |
| 107 | + curl https://bootstrap.pypa.io/get-pip.py | python3.11 - --no-cache-dir pip==${PIP_VERSION} numpy cython crossenv |
| 108 | + |
| 109 | +# Cross-compile Python 3.11 for ARM64 |
| 110 | +RUN cd Python-3.11.3 && make distclean && \ |
| 111 | + ./configure \ |
| 112 | + --host=aarch64-linux-gnu \ |
| 113 | + --build=x86_64-linux-gnu \ |
| 114 | + --disable-ipv6 \ |
| 115 | + --enable-shared \ |
| 116 | + --prefix=/opt/python3.11_arm \ |
| 117 | + --with-build-python \ |
| 118 | + ac_cv_file__dev_ptmx=no \ |
| 119 | + ac_cv_file__dev_ptc=no && \ |
| 120 | + make -j4 && make altinstall |
| 121 | + |
| 122 | +ENV PATH="$SCCACHE_HOME:$PATH" |
| 123 | +ENV PIP_CACHE_DIR=/mount/caches/pip/linux/${PIP_VERSION} |
| 124 | + |
| 125 | +# Use Python 3.11 as default |
| 126 | +# Using venv here because other methods to switch the default Python break both system and wheels build |
| 127 | +RUN python3.11 -m venv venv |
| 128 | +ENV PATH="/venv/bin:$PATH" |
| 129 | + |
| 130 | +# Install Node |
| 131 | +ENV NODE_VERSION=21.7.3 |
| 132 | +ENV NVM_DIR=/.nvm |
| 133 | +RUN mkdir -p $NVM_DIR |
| 134 | +RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash |
| 135 | +RUN . "$NVM_DIR/nvm.sh" && nvm install ${NODE_VERSION} |
| 136 | +ENV PATH="$NVM_DIR/versions/node/v${NODE_VERSION}/bin/:${PATH}" |
| 137 | + |
| 138 | +# Install doxygen |
| 139 | +ENV DOXYGEN_HOME="/opt/doxygen" |
| 140 | +ENV DOXYGEN_VERSION='1.9.6' |
| 141 | +RUN mkdir -p ${DOXYGEN_HOME} && cd ${DOXYGEN_HOME} && wget https://www.doxygen.nl/files/doxygen-$DOXYGEN_VERSION.linux.bin.tar.gz && \ |
| 142 | + tar -I pigz -xf doxygen-$DOXYGEN_VERSION.linux.bin.tar.gz && \ |
| 143 | + rm -f doxygen-$DOXYGEN_VERSION.linux.bin.tar.gz |
| 144 | +ENV PATH="${DOXYGEN_HOME}/doxygen-$DOXYGEN_VERSION/bin:$PATH" |
0 commit comments