# Licensed 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.

#
# Apache Thrift Docker build environment for Ubuntu Jammy
# with some updated packages.
#

FROM buildpack-deps:jammy-scm
LABEL MAINTAINER="Apache Thrift <dev@thrift.apache.org>"
ENV DEBIAN_FRONTEND=noninteractive

### Add apt repos

RUN apt-get update -yq && \
  apt-get dist-upgrade -y && \
  apt-get install -y --no-install-recommends --fix-missing \
  apt \
  apt-transport-https \
  apt-utils \
  curl \
  dirmngr \
  software-properties-common \
  wget

# Create a user
ARG user=build
ARG group=build
ARG uid=1000
ARG gid=1000

RUN apt-get install -y --no-install-recommends sudo && \
    echo "Running with: UID: ${uid}, User: ${user}, GID: ${gid}, Group: ${group}" && \
    if [ -z `cat /etc/group | grep "${group}:"` ] && [ -z `cat /etc/group | grep ":${gid}:"` ]; then addgroup --gid ${gid} ${group}; fi && \
    if [ -z `cat /etc/passwd | grep "${user}:"` ] && [ -z `cat /etc/passwd | grep ":${uid}:"` ]; then adduser --uid ${uid} --gid ${gid} --shell /bin/bash ${user} --disabled-password -q --gecos ""; fi && \
    echo "${user} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers && \
    mkdir -p /home/${user} && \
    chown -R ${user}:${group} /home/${user}

# Dart
RUN curl https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - && \
  curl https://storage.googleapis.com/download.dartlang.org/linux/debian/dart_stable.list > \
  /etc/apt/sources.list.d/dart_stable.list

# dotnet (netcore)
RUN curl https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor > /etc/apt/trusted.gpg.d/microsoft.gpg && \
  wget -q -O /etc/apt/sources.list.d/microsoft-prod.list https://packages.microsoft.com/config/ubuntu/22.04/prod.list && \
  chown root:root /etc/apt/trusted.gpg.d/microsoft.gpg && \
  chown root:root /etc/apt/sources.list.d/microsoft-prod.list

# node.js
RUN curl -sL https://deb.nodesource.com/gpgkey/nodesource.gpg.key | apt-key add - && \
  echo "deb https://deb.nodesource.com/node_16.x focal main" | tee /etc/apt/sources.list.d/nodesource.list

### install general dependencies
RUN apt-get update -yq && \
  apt-get install -y --no-install-recommends \
  `# General dependencies` \
  bash-completion \
  bison \
  build-essential \
  clang \
  cmake \
  debhelper \
  flex \
  gdb \
  libasound2 \
  libatk-bridge2.0-0 \
  libgtk-3-0 \
  llvm \
  ninja-build \
  pkg-config \
  unzip \
  valgrind \
  vim
ENV PATH /usr/lib/llvm-6.0/bin:$PATH

# lib/as3 (ActionScript)
RUN mkdir -p /usr/local/adobe/flex/4.6 && \
  cd /usr/local/adobe/flex/4.6 && \
  wget -q "http://download.macromedia.com/pub/flex/sdk/flex_sdk_4.6.zip" && \
  unzip flex_sdk_4.6.zip
ENV FLEX_HOME /usr/local/adobe/flex/4.6

# TODO: "apt-get install" without "apt-get update" in the same "RUN" step can cause cache issues if modified later.
# See https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run
RUN apt-get install -y --no-install-recommends \
  `# C++ dependencies` \
  libboost-all-dev \
  libevent-dev \
  libssl-dev \
  qtbase5-dev \
  qtbase5-dev-tools

ENV SBCL_VERSION 1.5.3
RUN \
  `# Common Lisp (sbcl) dependencies` \
  curl --version && \
  curl -o sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 -J -L https://sourceforge.net/projects/sbcl/files/sbcl/${SBCL_VERSION}/sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2/download?use_mirror=managedway# && \
  tar xjf sbcl-${SBCL_VERSION}-x86-64-linux-binary.tar.bz2 && \
  cd sbcl-${SBCL_VERSION}-x86-64-linux && \
  ./install.sh && \
  sbcl --version && \
  cd .. && \
  rm -rf sbcl*

ENV D_VERSION     2.087.0
ENV DMD_DEB       dmd_2.087.0-0_amd64.deb
RUN \
  `# D dependencies` \
  wget -q http://downloads.dlang.org/releases/2.x/${D_VERSION}/${DMD_DEB} && \
  dpkg --install ${DMD_DEB} && \
  rm -f ${DMD_DEB} && \
  mkdir -p /usr/include/dmd/druntime/import/deimos /usr/include/dmd/druntime/import/C && \
  git clone -b 'v2.0.2+2.0.16' https://github.com/D-Programming-Deimos/libevent.git deimos-libevent-2.0 && \
  mv deimos-libevent-2.0/deimos/* /usr/include/dmd/druntime/import/deimos/ && \
  mv deimos-libevent-2.0/C/* /usr/include/dmd/druntime/import/C/ && \
  rm -rf deimos-libevent-2.0 && \
  git clone -b 'v2.0.0+1.1.0h' https://github.com/D-Programming-Deimos/openssl.git deimos-openssl-1.1.0h && \
  mv deimos-openssl-1.1.0h/deimos/* /usr/include/dmd/druntime/import/deimos/ && \
  mv deimos-openssl-1.1.0h/C/* /usr/include/dmd/druntime/import/C/ && \
  rm -rf deimos-openssl-1.1.0h

ENV DART_VERSION 2.7.2-1
RUN apt-get install -y --no-install-recommends \
  `# Dart dependencies` \
  dart=$DART_VERSION
ENV PATH /usr/lib/dart/bin:$PATH

RUN apt-get install -y --no-install-recommends \
  `# dotnet core dependencies` \
  dotnet-sdk-9.0 \
  dotnet-runtime-9.0 \
  aspnetcore-runtime-9.0 \
  dotnet-apphost-pack-9.0

# Erlang dependencies
ARG ERLANG_OTP_VERSION=25.3.2.9
ARG ERLANG_REBAR_VERSION=3.18.0
RUN apt-get update && apt-get install -y --no-install-recommends libncurses5-dev && \
  curl -ssLo /usr/local/bin/kerl https://raw.githubusercontent.com/kerl/kerl/master/kerl && chmod +x /usr/local/bin/kerl && \
  kerl build $ERLANG_OTP_VERSION && kerl install $ERLANG_OTP_VERSION /usr/local/lib/otp/ && . /usr/local/lib/otp/activate && \
  curl -ssLo /usr/local/bin/rebar3 https://github.com/erlang/rebar3/releases/download/${ERLANG_REBAR_VERSION}/rebar3 && chmod +x /usr/local/bin/rebar3 && \
  rebar3 --version
ENV PATH /usr/local/lib/otp/bin:$PATH

RUN apt-get install -y --no-install-recommends \
  `# GlibC dependencies` \
  libglib2.0-dev

# golang
ENV GOLANG_VERSION 1.21.7
ENV GOLANG_DOWNLOAD_URL https://go.dev/dl/go$GOLANG_VERSION.linux-amd64.tar.gz
ENV GOLANG_DOWNLOAD_SHA256 13b76a9b2a26823e53062fa841b07087d48ae2ef2936445dc34c4ae03293702c
RUN curl -fsSL "$GOLANG_DOWNLOAD_URL" -o golang.tar.gz && \
  echo "$GOLANG_DOWNLOAD_SHA256  golang.tar.gz" | sha256sum -c - && \
  tar -C /usr/local -xzf golang.tar.gz && \
  ln -s /usr/local/go/bin/go /usr/local/bin && \
  rm golang.tar.gz

# HAXE
ARG HAXE_VERSION=4.2.1
ARG NEKO_VERSION=2.3.0
RUN cd $HOME && \
    `# Haxe dependencies` && \
    wget https://github.com/HaxeFoundation/haxe/releases/download/${HAXE_VERSION}/haxe-${HAXE_VERSION}-linux64.tar.gz && \
    tar xvf haxe-${HAXE_VERSION}-linux64.tar.gz && \
    rm haxe-${HAXE_VERSION}-linux64.tar.gz && \
    mv haxe_* /opt/haxe && \
    wget https://github.com/HaxeFoundation/neko/releases/download/v`echo ${NEKO_VERSION} | sed "s/\./-/g"`/neko-${NEKO_VERSION}-linux64.tar.gz && \
    tar xvf neko-${NEKO_VERSION}-linux64.tar.gz && \
    rm neko-${NEKO_VERSION}-linux64.tar.gz && \
    mv neko-* /opt/neko
ENV PATH /opt/haxe:/opt/neko:$PATH
RUN echo "/opt/neko" > /etc/ld.so.conf.d/neko.conf && \
    ldconfig
USER ${user}
RUN mkdir -p $HOME/haxe/lib && \
    haxelib setup --always $HOME/haxe/lib && \
    haxelib install --always hxcpp 2>&1 > /dev/null && \
    haxelib install --always uuid 2>&1 > /dev/null
USER root

ENV GRADLE_VERSION="8.4"
RUN apt-get install -y --no-install-recommends \
  `# Java dependencies` \
  ant \
  ant-optional \
  maven \
  openjdk-17-jdk-headless && \
  `# Gradle` \
  wget https://services.gradle.org/distributions/gradle-$GRADLE_VERSION-bin.zip -q -O /tmp/gradle-$GRADLE_VERSION-bin.zip && \
  (echo "3e1af3ae886920c3ac87f7a91f816c0c7c436f276a6eefdb3da152100fef72ae  /tmp/gradle-$GRADLE_VERSION-bin.zip" | sha256sum -c -) && \
  unzip -d /tmp /tmp/gradle-$GRADLE_VERSION-bin.zip && \
  mv /tmp/gradle-$GRADLE_VERSION /usr/local/gradle && \
  ln -s /usr/local/gradle/bin/gradle /usr/local/bin

RUN apt-get install -y --no-install-recommends \
  `# Lua dependencies` \
  lua5.4 \
  liblua5.4-dev
# https://bugs.launchpad.net/ubuntu/+source/lua5.3/+bug/1707212
# lua5.3 does not install alternatives!
# need to update our luasocket code, lua doesn't have luaL_openlib any more

RUN apt-get install -y --no-install-recommends \
  `# Node.js dependencies` \
  nodejs

# Test dependencies for running puppeteer
RUN apt-get install -y --no-install-recommends \
  `# JS dependencies` \
  libxss1 \
  libxtst6

RUN apt-get install -y --no-install-recommends \
  `# OCaml dependencies` \
  ocaml \
  opam && \
  `# disable sandboxing see https://github.com/ocaml/opam/issues/4327` \
  opam init --yes --disable-sandboxing && \
  opam install --yes oasis

RUN apt-get install -y --no-install-recommends \
  `# Perl dependencies` \
  libbit-vector-perl \
  libclass-accessor-class-perl \
  libcrypt-ssleay-perl \
  libio-socket-ssl-perl \
  libnet-ssleay-perl \
  libtest-exception-perl

RUN apt-get install -y --no-install-recommends \
  `# Php dependencies` \
  php8.1 \
  php8.1-cli \
  php8.1-dev \
  php8.1-mbstring \
  php8.1-xml \
  php8.1-curl \
  php8.1-xdebug \
  php-pear \
  re2c \
  composer

RUN apt-get install -y --no-install-recommends \
  `# Python3 dependencies` \
  python3-all \
  python3-all-dbg \
  python3-all-dev \
  python3-pip \
  python3-setuptools \
  python3-tornado \
  python3-twisted \
  python3-wheel \
  python3-zope.interface

RUN apt-get install -y --no-install-recommends \
  `# Ruby dependencies` \
  ruby \
  ruby-dev \
  ruby-bundler

USER ${user}
RUN `# Rust dependencies` \
    curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain 1.65.0 -y
ENV PATH /home/${user}/.cargo/bin:$PATH
USER root

# Swift on Linux for cross tests
RUN apt-get install -yq \
  libedit-dev \
  libz3-dev \
  libpython2-dev \
  libxml2-dev && \
  cd / && \
  wget --quiet https://download.swift.org/swift-5.7-release/ubuntu2204/swift-5.7-RELEASE/swift-5.7-RELEASE-ubuntu22.04.tar.gz && \
  tar xf swift-5.7-RELEASE-ubuntu22.04.tar.gz && \
  mv swift-5.7-RELEASE-ubuntu22.04 /usr/share/swift && \
  rm swift-5.7-RELEASE-ubuntu22.04.tar.gz

ENV PATH /usr/share/swift/usr/bin:$PATH
RUN swift --version

# Locale(s) for cpp unit tests
RUN apt-get install -y --no-install-recommends \
  `# Locale dependencies` \
  locales && \
  locale-gen en_US.UTF-8 && \
  locale-gen de_DE.UTF-8 && \
  update-locale

RUN apt-get install -y --no-install-recommends \
  `# Static Code Analysis dependencies` \
  cppcheck \
  sloccount && \
  pip install flake8

# NOTE: this does not reduce the image size but adds an additional layer.
# # Clean up
# RUN rm -rf /var/cache/apt/* && \
#     rm -rf /var/lib/apt/lists/* && \
#     rm -rf /tmp/* && \
#     rm -rf /var/tmp/*

ENV THRIFT_ROOT /thrift
RUN mkdir -p $THRIFT_ROOT/src && \
    chown -R ${uid}:${uid} $THRIFT_ROOT/
COPY Dockerfile $THRIFT_ROOT/
WORKDIR $THRIFT_ROOT/src

USER ${user}
