#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.

FROM centos:centos7

# This is passed to the heron build command via the --config flag
ENV TARGET_PLATFORM linux

RUN yum -y upgrade && yum -y install centos-release-scl-rh
RUN yum -y install \
      ant \
      automake \
      curl \
      cmake \
      openssl-devel \
      file \
      devtoolset-8-gcc \
      devtoolset-8-gcc-c++ \
      git \
      glibc-langpack-en \
      kernel-devel \
      libtool \
      make \
      patch \
      rh-python38-python \
      rh-python38-python-devel \
      zip \
      unzip \
      wget \
      which \
      tree \
      java-11-openjdk \
      java-11-openjdk-devel

ENV LC_ALL en_US.utf8
ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk

ENV bazelVersion 6.0.0

RUN wget -O /tmp/bazel.sh https://github.com/bazelbuild/bazel/releases/download/$bazelVersion/bazel-$bazelVersion-installer-linux-x86_64.sh \
      && chmod +x /tmp/bazel.sh \
      && /tmp/bazel.sh \
      && rm -rf /tmp/bazel.sh

ENV PATH /opt/rh/devtoolset-8/root/bin:/opt/rh/rh-python38/root/usr/bin:${PATH}
ENV LD_LIBRARY_PATH /opt/rh/devtoolset-8/root/lib64:/opt/rh/rh-python38/root/usr/lib64:/usr/local/lib:${LD_LIBRARY_PATH}
ENV MANPATH /opt/rh/devtoolset-8/root/usr/share/man:/opt/rh/rh-python38/root/usr/share/man
ENV PKG_CONFIG_PATH /opt/rh/rh-python38/root/usr/lib64/pkgconfig:${PKG_CONFIG_PATH}

RUN /usr/bin/ln -sfT /opt/rh/rh-python38/root/usr/bin/python3 /usr/bin/python3 \
      && /usr/bin/ln -sfT /opt/rh/rh-python38/root/usr/bin/python3 /usr/bin/python \
      && /usr/bin/ln -sfT /opt/rh/rh-python38/root/usr/bin/python3.8 /usr/bin/python3.8 \
      && /usr/bin/ln -sfT /opt/rh/devtoolset-8/root/bin/gcc /usr/bin/gcc \
      && /usr/bin/ln -sfT /opt/rh/devtoolset-8/root/bin/g++ /usr/bin/g++ \
      && /usr/bin/ln -sfT /opt/rh/devtoolset-8/root/bin/cpp /usr/bin/cpp

ADD scripts/compile-platform.sh /compile-platform.sh
