blob: 962a67b4b772af3aa6640aa5be2b41e486a6f483 [file] [log] [blame]
# Copyright 2020 The IREE Authors
#
# Licensed under the Apache License v2.0 with LLVM Exceptions.
# See https://llvm.org/LICENSE.txt for license information.
# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
FROM ubuntu@sha256:fd25e706f3dea2a5ff705dbc3353cf37f08307798f3e360a13e9385840f73fb3
# Disable apt-key parse waring. If someone knows how to do whatever the "proper"
# thing is then feel free. The warning complains about parsing apt-key output,
# which we're not even doing.
ARG APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1
######## Basic stuff ########
# Default compiler environment variables for IREE.
# Matches the version of clang installed below.
ENV CC /usr/bin/clang-9
ENV CXX /usr/bin/clang++-9
RUN apt-get update \
&& apt-get install -y \
# For updating IREE's submodules.
git \
# Install our minimum supported clang version.
clang-9 \
lld-9 \
# IREE transitive dependencies
libsdl2-dev \
libssl-dev \
# A much better CMake builder
ninja-build \
# For building child images. Best practices would tell us to use multi-stage
# builds (https://docs.docker.com/develop/develop-images/multistage-build/)
# but it turns out that Dockerfile is a thoroughly non-composable awful
# format and that doesn't actually work that well. These deps are pretty
# small.
unzip \
wget \
gnupg2 \
# Needed for installing Bazel, per https://bazel.build/install/ubuntu
apt-transport-https \
curl \
gnupg \
# Needed for building lld with Bazel (as currently configured)
libxml2-dev \
# Optional for tools like llvm-symbolizer, which we could build from
# source but would rather just have available ahead of time
llvm-dev \
# Someone is welcome to tell me a better way to just install lld-9 as lld
# (lld=9 doesn't work)
&& ln -s lld-9 /usr/bin/lld \
&& ln -s ld.lld-9 /usr/bin/ld.lld
######## CMake ########
WORKDIR /install-cmake
# These are separate args because there's no way to strip the patch version off
# to get the /usr/share path.
# See https://github.com/moby/moby/issues/41383
ARG CMAKE_MAJOR_VERSION=3
ARG CMAKE_MINOR_VERSION=21
ARG CMAKE_PATCH_VERSION=6
ENV CMAKE_VERSION="${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}.${CMAKE_PATCH_VERSION}"
# Install our CMake version, which may be ahead of apt-get's version.
RUN wget "https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION?}/cmake-${CMAKE_VERSION?}-Linux-x86_64.sh" \
&& chmod +x "./cmake-${CMAKE_VERSION?}-Linux-x86_64.sh" \
&& "./cmake-${CMAKE_VERSION?}-Linux-x86_64.sh" --skip-license --prefix=/usr/ \
&& rm -rf /install-cmake
##############
######## Bazel ########
WORKDIR /install-bazel
# Making a required Bazel version change? Most images derive from this one
# and will get it automatically. However these don't. Please update them as
# well:
# manylinux2014_x86_64-release
ARG BAZEL_VERSION=5.1.0
# https://bazel.build/install/ubuntu
RUN curl -fsSL https://bazel.build/bazel-release.pub.gpg \
| gpg --dearmor >bazel-archive-keyring.gpg \
&& mv bazel-archive-keyring.gpg /usr/share/keyrings \
&& echo "deb [arch=amd64 signed-by=/usr/share/keyrings/bazel-archive-keyring.gpg] https://storage.googleapis.com/bazel-apt stable jdk1.8" \
| tee /etc/apt/sources.list.d/bazel.list \
&& apt-get update \
&& apt-get install -y "bazel=${BAZEL_VERSION?}" \
&& rm -rf /install-bazel
##############
######## Python ########
# Note that we use --ignore-installed when installing packages that may have
# been auto-installed by the OS package manager (i.e. PyYAML is often an
# implicit OS-level dep). This should not break so long as we do not
# subsequently reinstall it on the OS side. Failing to do this will yield a
# hard error with pip along the lines of:
# Cannot uninstall 'PyYAML'. It is a distutils installed project and thus we
# cannot accurately determine which files belong to it which would lead to
# only a partial uninstall.
WORKDIR /install-python
RUN apt-get update \
&& apt-get install -y \
python3.7 \
python3.7-dev \
&& update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.7 1 \
&& apt-get install -y \
python3-pip \
python3-setuptools \
python3-distutils \
python3-venv \
python3.7-venv \
&& python3 -m pip install --upgrade pip>=21.3 \
&& python3 -m pip install --upgrade setuptools \
# Versions for things required to build IREE should match the minimum versions
# in runtime/bindings/python/iree/runtime/build_requirements.txt
&& python3 -m pip install --ignore-installed \
# For building
numpy==1.19.4 \
PyYAML==5.4.1 \
wheel==0.36.2 \
pybind11==2.8.0 \
# For scripting only
requests
ENV PYTHON_BIN /usr/bin/python3
##############
######## IREE CUDA DEPS ########
COPY fetch_cuda_deps.sh /usr/local/bin
RUN /usr/local/bin/fetch_cuda_deps.sh /usr/local/iree_cuda_deps
ENV IREE_CUDA_DEPS_DIR="/usr/local/iree_cuda_deps"
##############
######## Vulkan ########
WORKDIR /install-vulkan
ARG VULKAN_SDK_VERSION=1.2.154.0
RUN wget -q \
# This file disappeared from the canonical source:
# "https://sdk.lunarg.com/sdk/download/${VULKAN_SDK_VERSION?}/linux/vulkansdk-linux-${VULKAN_SDK_VERSION?}.tar.gz"
"https://storage.googleapis.com/iree-shared-files/vulkansdk-linux-${VULKAN_SDK_VERSION?}.tar.gz" \
&& mkdir -p /opt/vulkan-sdk \
&& tar -xzf "vulkansdk-linux-${VULKAN_SDK_VERSION?}.tar.gz" -C /opt/vulkan-sdk \
&& rm -rf /install-vulkan
WORKDIR /
ENV VULKAN_SDK="/opt/vulkan-sdk/${VULKAN_SDK_VERSION}/x86_64"
ENV PATH="${VULKAN_SDK}/bin:$PATH"
# Symlink the Vulkan loader to a system library directory. This is needed to
# allow Vulkan applications to find the Vulkan loader. It also avoids using
# LD_LIBRARY_PATH, which is not supported well by Docker.
RUN ln -s "${VULKAN_SDK}/lib/libvulkan.so" /usr/lib/x86_64-linux-gnu/ \
&& ln -s "${VULKAN_SDK}/lib/libvulkan.so.1" /usr/lib/x86_64-linux-gnu/
##############
######## GCC ########
WORKDIR /
# Avoid apt-add-repository, which requires software-properties-common, which is
# a rabbit hole of python version compatibility issues. See
# https://mondwan.blogspot.com/2018/05/alternative-for-add-apt-repository-for.html
# We use gcc-9 because it's what manylinux had (at time of authorship) and
# we don't aim to support older versions. We need a more modern lld to handle
# --push-state flags
RUN echo "deb http://ppa.launchpad.net/ubuntu-toolchain-r/test/ubuntu bionic main" >> /etc/apt/sources.list \
&& apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 1E9377A2BA9EF27F \
&& apt-get update \
&& apt-get install -y gcc-9 g++-9
##############
WORKDIR /