1# Dockerfile to build a manylinux 2010 compliant cross-compiler.
2#
3# Builds a devtoolset gcc/libstdc++ that targets manylinux 2010 compatible
4# glibc (2.12) and system libstdc++ (4.4).
5#
6# To push a new version, run:
7# $ docker build -f Dockerfile.rbe.ubuntu16.04-manylinux2010 \
8#  --tag "gcr.io/tensorflow-testing/nosla-ubuntu16.04-manylinux2010" .
9# $ docker push gcr.io/tensorflow-testing/nosla-ubuntu16.04-manylinux2010
10
11FROM ubuntu:16.04 as devtoolset
12
13ENV DEBIAN_FRONTEND=noninteractive
14RUN apt-get update && apt-get install -y \
15      bzip2 \
16      cpio \
17      file \
18      flex \
19      g++ \
20      make \
21      patch \
22      rpm2cpio \
23      unar \
24      wget \
25      tar \
26      xz-utils \
27      && \
28    rm -rf /var/lib/apt/lists/*
29
30ADD devtoolset/fixlinks.sh fixlinks.sh
31ADD devtoolset/build_devtoolset.sh build_devtoolset.sh
32ADD devtoolset/rpm-patch.sh rpm-patch.sh
33
34# Set up a sysroot for glibc 2.12 / libstdc++ 4.4 / devtoolset-7 in /dt7.
35RUN /build_devtoolset.sh devtoolset-7 /dt7
36# Set up a sysroot for glibc 2.12 / libstdc++ 4.4 / devtoolset-8 in /dt8.
37RUN /build_devtoolset.sh devtoolset-8 /dt8
38
39# TODO(klimek): Split up into two different docker images.
40FROM ubuntu:16.04
41COPY --from=devtoolset /dt7 /dt7
42COPY --from=devtoolset /dt8 /dt8
43
44# Copy and run the install scripts.
45COPY install/*.sh /install/
46ARG DEBIAN_FRONTEND=noninteractive
47RUN /install/install_bootstrap_deb_packages.sh
48RUN /install/install_deb_packages.sh
49RUN /install/install_clang.sh
50RUN /install/install_bazel.sh
51
52# Install golang.
53RUN /install/install_golang.sh
54env GOROOT=/usr/local/go
55env PATH=$GOROOT/bin:$PATH
56
57# Install python 3.6.
58RUN yes "" | add-apt-repository ppa:deadsnakes/ppa
59RUN apt-get update && apt-get install -y \
60    python3.6 python3.6-dev python3-pip python3.6-venv && \
61    rm -rf /var/lib/apt/lists/* && \
62    python3.6 -m pip install pip --upgrade && \
63    update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 0
64
65RUN /install/install_pip_packages.sh
66
67# Install python 3.8.
68RUN apt-get update && apt-get install -y python3.8 python3.8-dev python3.8-venv
69RUN rm -rf /var/lib/apt/lists/*
70# Have to download get-pip.py due to a pip circular issue
71# https://stackoverflow.com/questions/58758447/how-to-fix-module-platform-has-no-attribute-linux-distribution-when-instal
72RUN curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
73RUN python3.8 get-pip.py
74RUN python3.8 -m pip install --upgrade pip setuptools wheel
75
76# Overwrite include paths that are generated for the multipython image.
77RUN ln -sf "/usr/include/x86_64-linux-gnu/python2.7" "/dt7/usr/include/x86_64-linux-gnu/python2.7"
78RUN ln -sf "/usr/include/x86_64-linux-gnu/python2.7" "/dt8/usr/include/x86_64-linux-gnu/python2.7"
79
80RUN ln -sf "/usr/include/x86_64-linux-gnu/python3.6m" "/dt7/usr/include/x86_64-linux-gnu/python3.6m"
81RUN ln -sf "/usr/include/x86_64-linux-gnu/python3.6m" "/dt8/usr/include/x86_64-linux-gnu/python3.6m"
82
83RUN ln -sf "/usr/include/x86_64-linux-gnu/python3.8" "/dt7/usr/include/x86_64-linux-gnu/python3.8"
84RUN ln -sf "/usr/include/x86_64-linux-gnu/python3.8" "/dt8/usr/include/x86_64-linux-gnu/python3.8"