# ============================================================================
# Copyright 2017-2025, Schlumberger
# 
# 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.
# ============================================================================

ARG TARGET_ARCH=x86_64

# =================================================
# DEV STAGE
# =================================================

FROM rockylinux/rockylinux:8.10 AS dev

# unless you install the man pages first none of the subsequent packages install theirs.
RUN yum install -y -q man man-pages dnf-plugins-core epel-release \
   && yum config-manager --set-enabled powertools \
   && yum -y -q update
RUN yum install -y -q \
    glibc-devel \
    glibc-headers \
    glibc-static \
    tree file jq tmux expect which \
    emacs-nox \
    libtool automake m4 pkgconf-m4 \
    libpsl-devel \
    brotli-devel \
    libzstd-devel \
    libnghttp2-devel \
    libidn2-devel \
    wget which git perl-devel  xz-devel patch \
    doxygen \
    graphviz \
    lcov \
    python3-pip python3-setuptools python3-libs python3 python3-devel \
    gcc-toolset-10 \
    gcc-toolset-10-gcc-c++ \
    gcc-toolset-10-gdb \
    gcc-toolset-10-gcc-gfortran \
    gcc-toolset-10-libasan-devel \
    gcc-toolset-10-liblsan-devel \
    gcc-toolset-10-libstdc++-devel \
    gcc-toolset-10-libtsan-devel  \
    gcc-toolset-10-libubsan-devel \
    gcc-toolset-10-ltrace \
    gcc-toolset-10-make \
    gcc-toolset-10-strace \
    gcc-toolset-10-systemtap \
    gcc-toolset-10-toolchain \
    gcc-toolset-10-valgrind \
    llvm-toolset clang-devel clang-libs clang-analyzer libomp git-clang-format \
   && echo 'source scl_source enable gcc-toolset-10'      > /etc/profile.d/scl_source.sh

# FIXME set the compiler correctly in environment.

# build as root
USER 0

# library path
ARG LIBRARIES_INSTALL_PATH=/usr/local
ARG KEEP_DEPENDENCIES=false

# temporary working directory
WORKDIR /tmp

# [AUTOMAKE]

ARG TARGET_ARCH

ARG AUTOMAKE_VERSION=1.16.5
RUN wget -c https://ftp.gnu.org/gnu/automake/automake-${AUTOMAKE_VERSION}.tar.gz --no-check-certificate \
  && tar xf automake-${AUTOMAKE_VERSION}.tar.gz \
  && cd automake-${AUTOMAKE_VERSION} \
  && ./configure --prefix=${LIBRARIES_INSTALL_PATH} \
  && make install \
  && cd .. \
  && if [ "${KEEP_DEPENDENCIES}" = "false" ]; then rm -rf  automake-${AUTOMAKE_VERSION}  automake-${AUTOMAKE_VERSION}.tar.gz ; fi

# [CMAKE]

ARG CMAKE_VERSION=3.30.5
RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-${TARGET_ARCH}.tar.gz \
    && tar -zxvf cmake-${CMAKE_VERSION}-linux-${TARGET_ARCH}.tar.gz -C /usr/local \
    && ln -s /usr/local/cmake-${CMAKE_VERSION}-linux-${TARGET_ARCH}/bin/cmake /usr/bin/cmake \
    && ln -s /usr/local/cmake-${CMAKE_VERSION}-linux-${TARGET_ARCH}/bin/ctest /usr/bin/ctest \
    && ln -s /usr/local/cmake-${CMAKE_VERSION}-linux-${TARGET_ARCH}/bin/cpack /usr/bin/cpack \
    && ln -s /usr/local/cmake-${CMAKE_VERSION}-linux-${TARGET_ARCH}/bin/ccmake /usr/bin/ccmake \
    && if [ "${KEEP_DEPENDENCIES}" = "false" ]; then rm -rf cmake-${CMAKE_VERSION}-linux-${TARGET_ARCH}.tar.gz; fi

# ----------------------------------------------------------------------------------------------------------------------------
# if we want to avoid adding shared libraries as depdendencies ( since in linux most of them export all their symbols)
# we need to see if static libraries with Position Indepdent Code are built ( aka, .a that can be used to build .so later on)
#
# the analysis is done with :
#  for slib in /usr/local/lib*/*.a; do echo $slib; readelf --relocs ${slib} | egrep -c '(GOT|PLT|JUMP_SLO)'; done
#
# aka : for all archives, read relocations, see if they are pointing to the global offset table, 
#       the procedure linkage table or are calls to shared libraries ( jump )
#       not quite sure this is exhaustive as this indicates _some relocatable code present_ 
#       not absence of relocations without indirections.
#
# otherwise we'd have to play with visibiliy at library build time, linker version scripts etc.
# ----------------------------------------------------------------------------------------------------------------------------
RUN echo "{" > /versions.json

# =================================================
# ZLIB-DEV STAGE
# =================================================

FROM dev as zlib-dev
ARG LIBRARIES_INSTALL_PATH=/usr/local
ARG KEEP_DEPENDENCIES=false

# [ZLIB]

ARG LIB_ZLIB_VERSION=1.3.1
# reverted together with openssl
RUN wget https://www.zlib.net/fossils/zlib-${LIB_ZLIB_VERSION}.tar.gz \
    && tar -zxvf zlib-${LIB_ZLIB_VERSION}.tar.gz \
    && cd zlib-${LIB_ZLIB_VERSION} \
    && source /etc/profile.d/scl_source.sh \
    && CFLAGS=-fPIC ./configure --prefix=${LIBRARIES_INSTALL_PATH} --static \
    && make -j $(nproc) \
    && make install \
    && cd .. \
    &&  if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
            rm -rf zlib-${LIB_ZLIB_VERSION}.tar.gz \
                   zlib-${LIB_ZLIB_VERSION}; \
	    fi

RUN echo " \"zlib\": { \"version\" : \"${LIB_ZLIB_VERSION}\", \"url\" : \"https://www.zlib.net\" }," >> /versions.json

# =================================================
# OPENSSL-DEV STAGE
# =================================================

FROM zlib-dev as openssl-dev
ARG LIBRARIES_INSTALL_PATH=/usr/local
ARG KEEP_DEPENDENCIES=false

# [OPENSSL]
# this has TCC implications
# consider instead RUN apt-get install openssl-libs openssl-dev
ARG LIB_OPENSSL_VERSION=3.3.2
RUN wget https://www.openssl.org/source/openssl-${LIB_OPENSSL_VERSION}.tar.gz --no-check-certificate \
    && tar -zxvf openssl-${LIB_OPENSSL_VERSION}.tar.gz \
    && cd /tmp/openssl-${LIB_OPENSSL_VERSION} \
    && yum install -y -q perl-IPC-Cmd \
    && source /etc/profile.d/scl_source.sh \
    && ./config --prefix=${LIBRARIES_INSTALL_PATH} no-shared \
    && make -j $(nproc) \
    && make install_sw \
    && cd .. \
    &&  if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
            rm -rf openssl-${LIB_OPENSSL_VERSION}.tar.gz \
                   openssl-${LIB_OPENSSL_VERSION}; \
	    fi

RUN echo " \"openssl\": { \"version\" : \"${LIB_OPENSSL_VERSION}\", \"url\" : \"https://www.openssl.org/\" }," >> /versions.json

# =================================================
# UUID-DEV STAGE
# =================================================

FROM openssl-dev as uuid-dev
ARG LIBRARIES_INSTALL_PATH=/usr/local
ARG KEEP_DEPENDENCIES=false

# [UUID]

ARG LIB_UUID_VERSION=1.0.3
RUN wget https://sourceforge.net/projects/libuuid/files/libuuid-${LIB_UUID_VERSION}.tar.gz --no-check-certificate \
    && tar -zxvf libuuid-${LIB_UUID_VERSION}.tar.gz \
    && cd /tmp/libuuid-${LIB_UUID_VERSION}  \
    && source /etc/profile.d/scl_source.sh \
    && ./configure --prefix=${LIBRARIES_INSTALL_PATH} --with-pic --enable-shared=no --enable-static=yes \
    && make -j $(nproc) \
    && make install \
    && cd .. \
    &&  if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
            rm -rf libuuid-${LIB_UUID_VERSION}.tar.gz \
                   libuuid-${LIB_UUID_VERSION}; \
    	fi

RUN echo " \"libuuid\":           { \"version\" : \"${LIB_UUID_VERSION}\",              \"url\" : \"https://sourceforge.net/projects/libuuid/\"      }," >> /versions.json

# =================================================
# CURL-DEV STAGE
# =================================================

FROM uuid-dev as curl-dev
ARG LIBRARIES_INSTALL_PATH=/usr/local
ARG KEEP_DEPENDENCIES=false

# ---------------------------------------------------------------------------
# in order to make sure that we have no thread safety and signal related issues
# read https://curl.se/libcurl/c/threadsafe.html
# ---------------------------------------------------------------------------

# [C-ARES]

ARG LIB_C_ARES_VERSION=1_28_1
RUN wget --no-check-certificate -q https://github.com/c-ares/c-ares/archive/cares-${LIB_C_ARES_VERSION}.tar.gz \
    &&  tar -xf cares-${LIB_C_ARES_VERSION}.tar.gz \
    && source /etc/profile.d/scl_source.sh \
    && \
    cmake \
    -DCMAKE_BUILD_TYPE=Release \
    -DCMAKE_INSTALL_PREFIX=${LIBRARIES_INSTALL_PATH} \
    -DCARES_STATIC=ON \
    -DCARES_SHARED=OFF \
    -DCARES_STATIC_PIC=ON \
    -DZLIB_USE_STATIC_LIBS=ON \
    -H/tmp/c-ares-cares-${LIB_C_ARES_VERSION} \
    -B/tmp/c-ares-cares-${LIB_C_ARES_VERSION}/cmake-out \
    && \
    cmake --build /tmp/c-ares-cares-${LIB_C_ARES_VERSION}/cmake-out \
          --target install -- -j $( nproc ) \
    && if  [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
        rm -rf /tmp/cares-${LIB_C_ARES_VERSION}.tar.gz \
    	       /tmp/c-ares-cares-${LIB_C_ARES_VERSION}; \
       fi

RUN echo " \"c_ares\":            { \"version\" : \"${LIB_C_ARES_VERSION}\",            \"url\" : \"https://github.com/c-ares/c-ares\"               }," >> /versions.json

# [CURL]

# ---------------------------------------------------------------------------
# this is not equivalent to the system one built with libtool ... 
# soname, versions are not done the same way.
# may require a patch for locally built nghttp2? or http3 libraries
# ---------------------------------------------------------------------------

ARG LIB_CURL_VERSION=8.12.0
RUN git clone --depth 1 -b curl-$(echo "$LIB_CURL_VERSION" | tr . _) https://github.com/curl/curl.git curl --recursive \
    && cd curl \
    && source /etc/profile.d/scl_source.sh \
    && env PKG_CONFIG_PATH=${LIBRARIES_INSTALL_PATH}/lib/pkgconfig:${LIBRARIES_INSTALL_PATH}/lib64/pkgconfig \
       cmake \
        -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_INSTALL_PREFIX=${LIBRARIES_INSTALL_PATH} \
        -DBUILD_SHARED_LIBS=OFF \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DENABLE_ARES=ON \
        -DZLIB_USE_STATIC_LIBS=ON \
        -DCMAKE_FIND_DEBUG_MODE=FALSE \
        -DOPENSSL_USE_STATIC_LIBS=ON \
        -H. -Bcmake-out \
    && cmake --build cmake-out --target install -- -j $(nproc) \
    && echo "Requires: libcares openssl zlib" >>  ${LIBRARIES_INSTALL_PATH}/lib64/pkgconfig/libcurl.pc \
    && cd .. \
    &&  if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
            rm -rf curl; \
    	fi \
    && ldconfig

RUN echo " \"curl\":              { \"version\" : \"${LIB_CURL_VERSION}\",              \"url\" : \"https://github.com/curl/curl\"                   }," >> /versions.json

# =================================================
# SHARED-DEV STAGE
# =================================================

FROM curl-dev as shared-dev
ARG LIBRARIES_INSTALL_PATH=/usr/local
ARG KEEP_DEPENDENCIES=false

# [LIB_XML2]

ARG LIB_XML2_VERSION=2.12.10
# FIXME: build with cmake _as a cmake package_
RUN wget https://github.com/GNOME/libxml2/archive/v${LIB_XML2_VERSION}.tar.gz \
    && tar -zxvf v${LIB_XML2_VERSION}.tar.gz \
    && cd libxml2-${LIB_XML2_VERSION} \
    && source /etc/profile.d/scl_source.sh \
    && export ACLOCAL_PATH=/usr/share/aclocal/ \
    && cmake \
        -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_INSTALL_PREFIX=${LIBRARIES_INSTALL_PATH} \
        -DBUILD_SHARED_LIBS=OFF \
        -DLIBXML2_WITH_PYTHON=OFF \
        -DLIBXML2_WITH_LZMA=OFF \
        -DZLIB_USE_STATIC_LIBS=ON \
        -DZLIB_ROOT=${LIBRARIES_INSTALL_PATH} \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
         -S . -B cmake-out \
    && cmake --build cmake-out -- -j $(nproc) \
    && cmake --install cmake-out \
    && cd .. \
    &&  if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
            rm -rf v${LIB_XML2_VERSION}.tar.gz \
                   libxml2-${LIB_XML2_VERSION}; \
    	fi

RUN echo " \"libxml2\":           { \"version\" : \"${LIB_XML2_VERSION}\",              \"url\" : \"https://github.com/GNOME/libxml2\"               }," >> /versions.json

# ---------------------------------------------------------------------------
# Google cloud storage client library - dependencies
# ---------------------------------------------------------------------------

# [ABSEIL_CPP]

ARG ABSEIL_VERSION=20240116.2
ARG ABSEIL_DIR=abseil-cpp-${ABSEIL_VERSION}
RUN mkdir -p ${ABSEIL_DIR} \
    && wget -q https://github.com/abseil/abseil-cpp/archive/${ABSEIL_VERSION}.tar.gz \
    && tar -xf ${ABSEIL_VERSION}.tar.gz -C ${ABSEIL_DIR} --strip-components=1 \
    && rm -rf ${ABSEIL_VERSION}.tar.gz \
    && perl -pi -e 's@#define ABSL_OPTION_USE_STD_ANY 2@#define ABSL_OPTION_USE_STD_ANY 0@g' ${ABSEIL_DIR}/absl/base/options.h \
    && perl -pi -e 's@#define ABSL_OPTION_USE_STD_OPTIONAL 2@#define ABSL_OPTION_USE_STD_OPTIONAL 0@g' ${ABSEIL_DIR}/absl/base/options.h \
    && perl -pi -e 's@#define ABSL_OPTION_USE_STD_STRING_VIEW 2@#define ABSL_OPTION_USE_STD_STRING_VIEW 0@g' ${ABSEIL_DIR}/absl/base/options.h \
    && perl -pi -e 's@#define ABSL_OPTION_USE_STD_VARIANT 2@#define ABSL_OPTION_USE_STD_VARIANT 0@g' ${ABSEIL_DIR}/absl/base/options.h

RUN source /etc/profile.d/scl_source.sh \
    && cmake -DCMAKE_CXX_STANDARD=17 \
          -DCMAKE_BUILD_TYPE=Release \
          -DCMAKE_INSTALL_PREFIX=${LIBRARIES_INSTALL_PATH} \
          -DBUILD_TESTING=OFF \
          -DBUILD_SHARED_LIBS=NO \
          -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
          -DCMAKE_CXX_FLAGS='-D_GLIBCXX_USE_CXX11_ABI=0' \
          -H${ABSEIL_DIR} \
          -B${ABSEIL_DIR}/cmake-out \
    && cmake --build ${ABSEIL_DIR}/cmake-out \
             --target install -- -j $(nproc) \
    &&  if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
        rm -rf ${ABSEIL_DIR}; \
    fi \
    && ldconfig

RUN echo " \"abseil_cpp\": { \"version\" : \"${ABSEIL_VERSION}\", \"url\" : \"https://github.com/abseil/abseil-cpp/archive/${ABSEIL_VERSION}.tar.gz\" }," >> /versions.json

# [NLOHMANN/JSON]

ARG NLOHMANN_JSON_VERSION="3.11.2"
RUN git clone --depth 1 --branch v${NLOHMANN_JSON_VERSION} https://github.com/nlohmann/json

RUN source /etc/profile.d/scl_source.sh \
    && cmake -DCMAKE_BUILD_TYPE=Release \
          -DBUILD_SHARED_LIBS=NO \
          -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
          -DBUILD_TESTING=OFF \
          -DJSON_BuildTests=OFF \
          -DCMAKE_INSTALL_PREFIX=${LIBRARIES_INSTALL_PATH} \
          -Hjson -Bjson/cmake-out \
    && cmake --build json/cmake-out --target install -- -j $(nproc) \
    &&  if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
        rm -rf json; \
    fi \
    && ldconfig

RUN echo " \"nlohmann_json\": { \"version\" : \"${NLOHMANN_JSON_VERSION}\", \"url\" : \"https://github.com/nlohmann/json\" }," >> /versions.json

# [RE2]

ARG RE2_VERSION=2024-06-01
RUN git clone --depth 1 --branch ${RE2_VERSION} https://github.com/google/re2

RUN source /etc/profile.d/scl_source.sh \
    && cmake -DCMAKE_BUILD_TYPE=Release \
          -DCMAKE_INSTALL_PREFIX=${LIBRARIES_INSTALL_PATH} \
          -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_STANDARD_REQUIRED=ON -DCMAKE_CXX_EXTENSIONS=NO \
          -DCMAKE_CXX_FLAGS='-D_GLIBCXX_USE_CXX11_ABI=0' \
          -DBUILD_SHARED_LIBS=NO \
          -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
          -DRE2_BUILD_TESTING=OFF \
          -Hre2 -Bre2/cmake-out \
    && cmake --build re2/cmake-out --target install -- -j $(nproc) \
    &&  if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
        rm -rf re2; \
    fi \
    && ldconfig

RUN echo " \"re2\": { \"version\" : \"${RE2_VERSION}\", \"url\" : \"https://github.com/google/re2\" }," >> /versions.json

# [PROTOBUF]

ARG PROTOBUF_VERSION=4.25.1
ARG PROTOBUF_DIR=protobuf-${PROTOBUF_VERSION}

RUN curl -sL https://github.com/protocolbuffers/protobuf/archive/refs/tags/v${PROTOBUF_VERSION}.tar.gz -o protobuf-${PROTOBUF_VERSION}.tar.gz \
    && tar -zxvf protobuf-${PROTOBUF_VERSION}.tar.gz \
    && source /etc/profile.d/scl_source.sh \
    && cmake -DCMAKE_BUILD_TYPE=Release \
          -DCMAKE_INSTALL_PREFIX=${LIBRARIES_INSTALL_PATH} \
          -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_STANDARD_REQUIRED=ON -DCMAKE_CXX_EXTENSIONS=NO \
          -DCMAKE_CXX_FLAGS='-D_GLIBCXX_USE_CXX11_ABI=0' \
          -DBUILD_SHARED_LIBS=NO \
          -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
          -Dprotobuf_BUILD_TESTS=OFF \
          -Dprotobuf_ABSL_PROVIDER=package \
          -DCMAKE_POLICY_DEFAULT_CMP0074=NEW -DZLIB_ROOT=/usr/local \
          -H${PROTOBUF_DIR} -B${PROTOBUF_DIR}/cmake-out \
    && cmake --build ${PROTOBUF_DIR}/cmake-out --target install -- -j $(nproc) \
    &&  if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
        rm -rf ${PROTOBUF_DIR}; \
    fi \    
    && ldconfig

RUN echo " \"protobuf\": { \"version\" : \"${PROTOBUF_VERSION}\", \"url\" : \"https://github.com/protocolbuffers/protobuf\" }," >> /versions.json

# [GRPC]

ARG GRPC_VERSION=1.60.2
ARG GRPC_DIR=grpc-${GRPC_VERSION}

RUN curl -sL https://github.com/grpc/grpc/archive/v${GRPC_VERSION}.tar.gz -o grpc-${GRPC_VERSION}.tar.gz \
    && tar -zxvf grpc-${GRPC_VERSION}.tar.gz \
    && source /etc/profile.d/scl_source.sh \
    && cmake -DCMAKE_BUILD_TYPE=Release \
          -DCMAKE_INSTALL_PREFIX=${LIBRARIES_INSTALL_PATH} \
          -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_STANDARD_REQUIRED=ON -DCMAKE_CXX_EXTENSIONS=NO \
          -DCMAKE_CXX_FLAGS='-D_GLIBCXX_USE_CXX11_ABI=0' \
          -DBUILD_SHARED_LIBS=NO \
          -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
          -DgRPC_PROTOBUF_PACKAGE_TYPE:STRING=CONFIG \
          -DgRPC_ZLIB_PROVIDER=package \
          -DgRPC_SSL_PROVIDER=package \
          -DgRPC_CARES_PROVIDER=package \
          -DgRPC_PROTOBUF_PROVIDER=package \
          -DgRPC_ABSL_PROVIDER=package \
          -DgRPC_RE2_PROVIDER=package \
          -DCMAKE_POLICY_DEFAULT_CMP0074=NEW -DZLIB_USE_STATIC_LIBS=ON -DZLIB_ROOT=/usr/local \
          -DOPENSSL_ROOT_DIR=/usr/local \
          -H${GRPC_DIR} -B${GRPC_DIR}/cmake-out \
    && cmake --build ${GRPC_DIR}/cmake-out --target install -- -j $(nproc) \
    &&  if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
        rm -rf ${GRPC_DIR} ; \
    fi \    
    && ldconfig

RUN echo " \"grpc\": { \"version\" : \"${GRPC_VERSION}\", \"url\" : \"https://github.com/grpc/grpc\" }," >> /versions.json

# ---------------------------------------------------------------------------
# for now, opentelemetry without gRPC, just with HTTP, and without plugin.
# not picking -DWITH_STL=CXX17 is due to the fact that 
# azure-sdk-for-cpp _hard-codes_ CMAKE_CXX_STANDARD=14 in every subproject
# probably because that's what it likes.
# hence _abseil_.
# ---------------------------------------------------------------------------

# [OPENTELEMETRY-CPP]

ARG OTEL_CPP_VERSION=1.16.0
ARG OTEL_CPP_TAG=v${OTEL_CPP_VERSION}
RUN curl -sL https://github.com/open-telemetry/opentelemetry-cpp/archive/refs/tags/${OTEL_CPP_TAG}.tar.gz -o opentelemetry-cpp-${OTEL_CPP_VERSION}.tar.gz \
    && tar -zxvf opentelemetry-cpp-${OTEL_CPP_VERSION}.tar.gz \
    && cd opentelemetry-cpp-${OTEL_CPP_VERSION} \
    && perl -pi -e 's@find_package\(Threads\)@find_package(Threads)\nfind_package(absl CONFIG REQUIRED)\n@g' cmake/opentelemetry-cpp-config.cmake.in \
    && source /etc/profile.d/scl_source.sh \
    && env  PKG_CONFIG_PATH=${LIBRARIES_INSTALL_PATH}/lib/pkgconfig:${LIBRARIES_INSTALL_PATH}/lib64/pkgconfig \
       cmake \
        -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_STANDARD_REQUIRED=ON -DCMAKE_CXX_EXTENSIONS=OFF \
        -DCMAKE_CXX_FLAGS='-D_GLIBCXX_USE_CXX11_ABI=0' \
        -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS=NO \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DWITH_STL=OFF \
        -DWITH_ABSEIL=YES \
        -DWITH_OTLP_GRPC:BOOL=YES \
        -DWITH_OTLP_HTTP:BOOL=YES \
        -DWITH_ASYNC_EXPORT_PREVIEW:BOOL=YES \
        -DBUILD_TESTING=NO \
        -DCMAKE_FIND_DEBUG_MODE=FALSE \
        -H. -Bcmake-out \
    && cmake --build cmake-out --target install -- -j $(nproc) \
    && cd .. \
    && if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
        rm -rf opentelemetry-cpp-${OTEL_CPP_VERSION} \
               opentelemetry-cpp-${OTEL_CPP_VERSION}.tar.gz; \
        fi \
    && ldconfig

RUN echo " \"opentelemetry_cpp\": { \"version\" : \"${OTEL_CPP_VERSION}\", \"url\" : \"https://github.com/opentelemetry/opentelemetry-cpp\"     }," >> /versions.json

# =================================================
# AZURE-DEV STAGE
# =================================================

FROM shared-dev as azure-dev
ARG LIBRARIES_INSTALL_PATH=/usr/local
ARG KEEP_DEPENDENCIES=false

# ---------------------------------------------------------------------------
# Azure storage for c++ now requires opentelemetry-cpp
# albeit desirable, it would be desirable to have opentelemetry-cpp -> {gcp,azure,aws}  
# direct + {http,grpc} to local server ...
#
# ditto. reverted to openssl 1.1.1w
#
# this is c++14 only. has impact on opentelemetry as well
# && perl -pi -e 's@set\(CMAKE_CXX_STANDARD 14\)@set\(CMAKE_CXX_STANDARD17\)@g' `find -name CMakeLists.txt`  \
# ---------------------------------------------------------------------------

# [AZURE_STORAGE_FOR_CPP]

ARG AZURE_STORAGE_FOR_CPP_VERSION=12.11.0
RUN wget https://github.com/Azure/azure-sdk-for-cpp/archive/refs/tags/azure-storage-blobs_${AZURE_STORAGE_FOR_CPP_VERSION}.tar.gz \
    && tar -zxvf azure-storage-blobs_${AZURE_STORAGE_FOR_CPP_VERSION}.tar.gz \
    && cd azure-sdk-for-cpp-azure-storage-blobs_${AZURE_STORAGE_FOR_CPP_VERSION} \
    && source /etc/profile.d/scl_source.sh \
    && env AZURE_SDK_DISABLE_AUTO_VCPKG=ON PKG_CONFIG_PATH=${LIBRARIES_INSTALL_PATH}/lib/pkgconfig:${LIBRARIES_INSTALL_PATH}/lib64/pkgconfig \
      cmake \
      -DCMAKE_PREFIX_PATH="${LIBRARIES_INSTALL_PATH}/lib64/cmake;${LIBRARIES_INSTALL_PATH}/lib/cmake;${LIBRARIES_INSTALL_PATH}/cmake" \
      -DCMAKE_CXX_STANDARD=17 \
      -DCMAKE_CXX_STANDARD_REQUIRED=ON \
      -DCMAKE_CXX_EXTENSIONS=OFF \
      -DCMAKE_CXX_FLAGS='-DCARES_STATICLIB -DCURL_STATICLIB -D_GLIBCXX_USE_CXX11_ABI=0 -Wno-maybe-uninitialized' \
      -DCMAKE_SHARED_LINKER_FLAGS="-Wl,--exclude-libs,ALL -Wl,--no-allow-shlib-undefined" \
      -DCMAKE_BUILD_TYPE=Release \
      -DBUILD_SHARED_LIBS:BOOL=NO \
      -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON \
      -DBUILD_TRANSPORT_CURL:BOOL=ON \
      -DBUILD_WINDOWS_UWP=ON \
      -DCMAKE_POLICY_DEFAULT_CMP0074=NEW -DZLIB_USE_STATIC_LIBS=ON -DZLIB_ROOT=${LIBRARIES_INSTALL_PATH} \
      -DOPENSSL_USE_STATIC_LIBS=ON -DOPENSSL_ROOT_DIR=${LIBRARIES_INSTALL_PATH} \
      -DCURL_USE_STATIC_LIBS=ON \
      -DCARES_USE_STATIC_LIBS=ON \
      -H. -Bcmake-out \
    && cmake --build cmake-out --target install -- -j $(nproc) \
    && cd .. \
    &&  if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
            rm -rf azure-sdk-for-cpp-azure-storage-blobs_${AZURE_STORAGE_FOR_CPP_VERSION} \
                   azure-storage-blobs_${AZURE_STORAGE_FOR_CPP_VERSION}.tar.gz; \
        fi \
    && ldconfig

RUN echo " \"azure_sdk_for_cpp\": { \"version\" : \"${AZURE_STORAGE_FOR_CPP_VERSION}\", \"url\" : \"https://github.com/Azure/azure-sdk-for-cpp\"     }," >> /versions.json

# =================================================
# AWS-DEV STAGE
# =================================================

FROM azure-dev as aws-dev
ARG LIBRARIES_INSTALL_PATH=/usr/local
ARG KEEP_DEPENDENCIES=false

# [CRC32C]

ARG CRC32C_VERSION=1.1.2
RUN wget -O crc32c-${CRC32C_VERSION}.tar.gz https://github.com/google/crc32c/archive/refs/tags/${CRC32C_VERSION}.tar.gz --no-check-certificate \
    && tar -zxvf crc32c-${CRC32C_VERSION}.tar.gz \
    && cd crc32c-${CRC32C_VERSION} \
    && source /etc/profile.d/scl_source.sh \
    && cmake \
        -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS=NO \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DCRC32C_BUILD_TESTS=0 \
        -DCRC32C_BUILD_BENCHMARKS=0 \
        -DCRC32C_USE_GLOG=OFF \
        -DENABLE_TESTING=OFF \
        -DCMAKE_CXX_FLAGS='-D_GLIBCXX_USE_CXX11_ABI=0' \
        -H. -Bcmake-out  \
    && cmake --build cmake-out --target install -- -j $(nproc) \
    && cd .. \
    &&  if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
            rm -rf crc32c-${CRC32C_VERSION} \
                   crc32c-${CRC32C_VERSION}.tar.gz; \
        fi \
    && ldconfig

RUN echo " \"crc32c\":            { \"version\" : \"${CRC32C_VERSION}\",            \"url\" : \"https://github.com/google/crc32c\"               }," >> /versions.json

# [AWS_SDK_CPP]

ARG AWS_SDK_CPP_TAG=1.11.381
RUN git clone --recursive https://github.com/aws/aws-sdk-cpp \
    && cd aws-sdk-cpp \
    && git checkout ${AWS_SDK_CPP_TAG} \
    && cmake  \
        -DCMAKE_BUILD_TYPE=Release \
        -DCMAKE_INSTALL_PREFIX=${LIBRARIES_INSTALL_PATH} \
        -DCMAKE_PREFIX_PATH=${LIBRARIES_INSTALL_PATH} \
        -DBUILD_SHARED_LIBS=OFF \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DCMAKE_CXX_FLAGS='-D_GLIBCXX_USE_CXX11_ABI=0' \
        -DBUILD_ONLY="s3;transfer" \
        -DENABLE_TESTING=OFF \
        -DCMAKE_CXX_STANDARD=17 \
        -DCMAKE_CXX_STANDARD_REQUIRED=ON \
        -DCMAKE_CXX_EXTENSIONS=OFF \
        -H. -Bcmake-out \
    && cmake --build cmake-out --target install -- -j 16 \
    && cd .. \
    && if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
            rm -rf aws-sdk-cpp; \
        fi \
    && ldconfig

RUN echo " \"aws_sdk_cpp\": { \"version\" : \"${AWS_SDK_CPP_TAG}\", \"url\" : \"https://github.com/aws/aws-sdk-cpp\"     }," >> /versions.json

# =================================================
# GCS-CL-DEV STAGE
# =================================================

FROM aws-dev as gcs-cl-dev
ARG LIBRARIES_INSTALL_PATH=/usr/local
ARG KEEP_DEPENDENCIES=false

# =================================================
# ABI-CHECK-DEV STAGE
# =================================================

FROM gcs-cl-dev as abi-check-dev

# [ABI CHECKER]

WORKDIR /
RUN git clone https://github.com/lvc/abi-compliance-checker \
    && cd abi-compliance-checker \
    && git checkout 8e819827e8d707c7addc4a08f5cf74045f2302bb
WORKDIR /tmp

RUN ldconfig /usr/local/lib*

RUN echo "\"end\":\"end\" }" >> /versions.json

RUN perl -pi -e 's/ +/ /g' /versions.json \
    && cat /versions.json

# [SHELL BASICS]

RUN echo $'export PS1="\\[\\e[32m\\]\\w\\[\\e[m\\]\\[\\e[36m\\]-\\[\\e[m\\]\\[\\e[36m\\]\\\\$\\[\\e[m\\] " \n\
alias ll="ls -AlF" \n\
alias h="history" \n\
' >> ~/.bashrc

WORKDIR /

ENV BASH_ENV=/etc/profile.d/scl_source.sh \
    PROMPT_COMMAND=". /etc/profile.d/scl_source.sh"