#!/bin/bash

set -ex

image="$1"
shift

if [ -z "${image}" ]; then
  echo "Usage: $0 IMAGE"
  exit 1
fi

UBUNTU_VERSION="$(echo "${image}" | perl -n -e'/ubuntu(\d+\.\d+)/ && print $1')"
CENTOS_VERSION="$(echo "${image}" | perl -n -e'/centos(\d+)/ && print $1')"

if [ -n "${UBUNTU_VERSION}" ]; then
  OS="ubuntu"
  DOCKERFILE="ubuntu/Dockerfile"
elif [ -n "${CENTOS_VERSION}" ]; then
  OS="centos"
  DOCKERFILE="centos/Dockerfile"
else
  echo "Unable to derive operating system base..."
  exit 1
fi

if [[ "$image" == py* ]]; then
  PYTHON_VERSION="$(echo "${image}" | perl -n -e'/py(\d+(\.\d+)?)/ && print $1')"
fi

if [[ "$image" == *cuda* ]]; then
  CUDA_VERSION="$(echo "${image}" | perl -n -e'/cuda(\d+\.\d+)/ && print $1')"
  CUDNN_VERSION="$(echo "${image}" | perl -n -e'/cudnn(\d+)/ && print $1')"
  DOCKERFILE="${OS}-cuda/Dockerfile"
fi

# TODO: the version number here actually doesn't do anything at the
# moment
if [[ "$image" == *rocm* ]]; then
  ROCM_VERSION="$(echo "${image}" | perl -n -e'/rocm(\d+\.\d+\.\d+|nightly)/ && print $1')"
  DOCKERFILE="${OS}-rocm/Dockerfile"
  # newer cmake version needed
  CMAKE_VERSION=3.6.3
fi

if [[ "$image" == *conda* ]]; then
  # Unlike python version, Anaconda version is either 2 or 3
  ANACONDA_VERSION="$(echo "${image}" | perl -n -e'/conda(\d)/ && print $1')"
fi

if [[ "$image" == *-mkl-* ]]; then
  MKL=yes
fi

if [[ "$image" == *-android-* ]]; then
  ANDROID=yes

  # The Android NDK requires CMake 3.6 or higher.
  # See https://github.com/caffe2/caffe2/pull/1740 for more info.
  CMAKE_VERSION=3.6.3

  if [[ "$image" == *-ndk-* ]]; then
    ANDROID_NDK_VERSION="$(echo "${image}" | perl -n -e'/-ndk-([^-]+)/ && print $1')"
  fi
fi

if [[ "$image" == *-gcc* ]]; then
  GCC_VERSION="$(echo "${image}" | perl -n -e'/gcc(\d+(\.\d+)?)/ && print $1')"
fi

if [[ "$image" == *-clang* ]]; then
  CLANG_VERSION="$(echo "${image}" | perl -n -e'/clang(\d+(\.\d+)?)/ && print $1')"
fi


if [[ "$image" == *-devtoolset* ]]; then
  DEVTOOLSET_VERSION="$(echo "${image}" | perl -n -e'/devtoolset(\d+(\.\d+)?)/ && print $1')"
fi

if [[ "$image" == *-glibc* ]]; then
  GLIBC_VERSION="$(echo "${image}" | perl -n -e'/glibc(\d+(\.\d+)?)/ && print $1')"
fi

# Copy over common scripts to directory containing the Dockerfile to build
cp -a common/* "$(dirname ${DOCKERFILE})"

# Set Jenkins UID and GID if running Jenkins
if [ -n "${JENKINS:-}" ]; then
  JENKINS_UID=$(id -u jenkins)
  JENKINS_GID=$(id -g jenkins)
fi

# Build image
docker build \
       --build-arg "BUILD_ENVIRONMENT=${image}" \
       --build-arg "EC2=${EC2:-}" \
       --build-arg "JENKINS=${JENKINS:-}" \
       --build-arg "JENKINS_UID=${JENKINS_UID:-}" \
       --build-arg "JENKINS_GID=${JENKINS_GID:-}" \
       --build-arg "UBUNTU_VERSION=${UBUNTU_VERSION}" \
       --build-arg "CENTOS_VERSION=${CENTOS_VERSION}" \
       --build-arg "DEVTOOLSET_VERSION=${DEVTOOLSET_VERSION}" \
       --build-arg "GLIBC_VERSION=${GLIBC_VERSION}" \
       --build-arg "PYTHON_VERSION=${PYTHON_VERSION}" \
       --build-arg "ANACONDA_VERSION=${ANACONDA_VERSION}" \
       --build-arg "CUDA_VERSION=${CUDA_VERSION}" \
       --build-arg "CUDNN_VERSION=${CUDNN_VERSION}" \
       --build-arg "MKL=${MKL}" \
       --build-arg "ANDROID=${ANDROID}" \
       --build-arg "ANDROID_NDK=${ANDROID_NDK_VERSION}" \
       --build-arg "GCC_VERSION=${GCC_VERSION}" \
       --build-arg "CLANG_VERSION=${CLANG_VERSION}" \
       --build-arg "CMAKE_VERSION=${CMAKE_VERSION:-}" \
       --build-arg "ROCM_VERSION=${ROCM_VERSION}" \
       "$@" \
       "$(dirname ${DOCKERFILE})"
