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

# base image
FROM ubuntu:22.04 AS dev

# build as root
USER 0

# install required build tools via packet manager
RUN apt-get -y update && apt-get -y install \
    libpsl-dev \
    libbrotli-dev \
    libzstd-dev \
    libnghttp2-dev \
    libidn2-dev

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

# install required build tools via packet manager
RUN apt-get -y update && apt-get -y install \
    wget git g++ make libtool pkgconf liblzma-dev \
    python3-pip python3-setuptools python3

# temporary working directory
WORKDIR /tmp

# [CMAKE]
ARG CMAKE_VERSION=3.27.7
RUN wget https://github.com/Kitware/CMake/releases/download/v${CMAKE_VERSION}/cmake-${CMAKE_VERSION}-linux-x86_64.tar.gz \
    && tar -zxvf cmake-${CMAKE_VERSION}-linux-x86_64.tar.gz -C /usr/local \
    && ln -s /usr/local/cmake-${CMAKE_VERSION}-linux-x86_64/bin/cmake /usr/bin/cmake \
    && ln -s /usr/local/cmake-${CMAKE_VERSION}-linux-x86_64/bin/ctest /usr/bin/ctest \
    && ln -s /usr/local/cmake-${CMAKE_VERSION}-linux-x86_64/bin/cpack /usr/bin/cpack \
    && ln -s /usr/local/cmake-${CMAKE_VERSION}-linux-x86_64/bin/ccmake /usr/bin/ccmake \
    && if [ "${KEEP_DEPENDENCIES}" = "false" ]; then rm -rf cmake-${CMAKE_VERSION}-linux-x86_64.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

FROM dev as zlib-dev
# every time you write FROM
# you have to re-declare the build arguments you use.
# otherwise they are discarded...
ARG LIBRARIES_INSTALL_PATH=/usr/local
ARG KEEP_DEPENDENCIES=false

# [ZLIB]
ARG LIB_ZLIB_VERSION=1.3.1
RUN wget https://www.zlib.net/zlib-${LIB_ZLIB_VERSION}.tar.gz \
    && tar -zxvf zlib-${LIB_ZLIB_VERSION}.tar.gz \
    && cd zlib-${LIB_ZLIB_VERSION} \
    && cmake \
       -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON \
       -DCMAKE_BUILD_TYPE=Release \
       -DBUILD_SHARED_LIBS:BOOL=NO \
       -DCMAKE_INSTALL_PREFIX=${LIBRARIES_INSTALL_PATH} \
       -H. -Bcmake-out \
    && cmake --build cmake-out --target install \
    && cd .. \
    && if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
            rm -rf zlib-${LIB_ZLIB_VERSION}.tar.gz \
            zlib-${LIB_ZLIB_VERSION}; \
        fi \
    && ldconfig

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

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=1.1.1w
RUN wget https://www.openssl.org/source/openssl-${LIB_OPENSSL_VERSION}.tar.gz \
    && tar -zxvf openssl-${LIB_OPENSSL_VERSION}.tar.gz \
    && cd openssl-${LIB_OPENSSL_VERSION} \
    && ./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 \
    && ldconfig

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

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 \
    && tar -zxvf libuuid-${LIB_UUID_VERSION}.tar.gz \
    && cd /tmp/libuuid-${LIB_UUID_VERSION}  \
    && ./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 \
    && ldconfig

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

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_20_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 \
    && 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 \
    && ldconfig

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 librarie
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 \
    && mkdir build \
    && cd build \
    && 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 \
    && make -j $(nproc) \
    && make install \
    && perl -pi -e 's@ -lcurl @ \${libdir}/libcurl.a @g' ${LIBRARIES_INSTALL_PATH}/lib/pkgconfig/libcurl.pc \
    && echo "Requires: libcares openssl zlib" >> ${LIBRARIES_INSTALL_PATH}/lib/pkgconfig/libcurl.pc \
    && cat ${LIBRARIES_INSTALL_PATH}/lib/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

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

# [XZ]
# because we need liblzma that can be found and consumed by CMake
ARG LIB_XZ_COMMIT=v5.8.1
RUN git clone -b ${LIB_XZ_COMMIT} https://github.com/tukaani-project/xz.git xz \
    && cd xz \
    && cmake \
        -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON \
        -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS:BOOL=NO \
        -H. -Bcmake-out \
    && cmake --build cmake-out --target install --  -j $(nproc ) \
    && cd .. \
    && if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
            rm -rf xz; \
        fi \
    && ldconfig

RUN echo " \"xz\":                { \"version\" : \"${LIB_XZ_COMMIT}\",                 \"url\" : \"https://git.tukaani.org/xz.git\"                 }," >> /versions.json

# [XML2]
ARG LIB_XML2_VERSION=2.12.10
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} \
    && export ACLOCAL_PATH=/usr/share/aclocal/ \
    && ./autogen.sh --prefix=${LIBRARIES_INSTALL_PATH} --with-pic --enable-static=yes --enable-shared=no \
    && make -j $(nproc) \
    && make install \
    && cd .. \
    && if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
            rm -rf v${LIB_XML2_VERSION}.tar.gz \
            libxml2-${LIB_XML2_VERSION}; \
        fi \
    && ldconfig

## Abseil
ARG ABSEIL_VERSION=20210324.0
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 \
    && perl -pi -e 's@\(SIGSTKSZ, 65536\)@\(SIGSTKSZ, 65536l\)@g' ${ABSEIL_DIR}/absl/debugging/failure_signal_handler.cc
RUN 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 \
          -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

# 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.12.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 \
    && cmake \
        -DCMAKE_CXX_STANDARD=17 -DCMAKE_CXX_STANDARD_REQUIRED=ON -DCMAKE_CXX_EXTENSIONS=OFF \
        -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS=NO \
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON \
        -DWITH_STL=OFF \
        -DWITH_ABSEIL=YES \
        -DWITH_OTLP_GRPC:BOOL=NO \
        -DWITH_OTLP_HTTP:BOOL=NO \
        -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


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

# https://github.com/Azure/azure-c-shared-utility
# had to
#        -DCMAKE_C_FLAGS="-DOPENSSL_API_COMPAT=10000 -Wno-discarded-qualifiers"
#        -DCMAKE_CXX_FLAGS="-DOPENSSL_API_COMPAT=10000 -Wno-discarded-qualifiers"
# to use OpenSSL 3.x and still it fails...

# skip samples because it does not know how to link c-ares zlib and libcurl static.
# look at pkgconfig and the like.

# patching with perl regex as explained here https://github.com/Azure/azure-c-shared-utility/pull/537/files

# this one looks for libcurl and does not find cares.
ARG AZURE_C_SHARED_UTILITY_VERSION=LTS_07_2020_Ref02
COPY patches/azure-c-shared-utility-${AZURE_C_SHARED_UTILITY_VERSION}.patch /tmp
RUN git clone --recursive -b ${AZURE_C_SHARED_UTILITY_VERSION} https://github.com/Azure/azure-c-shared-utility  \
    && cd azure-c-shared-utility \
    && git apply /tmp/azure-c-shared-utility-${AZURE_C_SHARED_UTILITY_VERSION}.patch \
    && env PKG_CONFIG_PATH=${LIBRARIES_INSTALL_PATH}/lib/pkgconfig \
      cmake \
        -DCMAKE_PREFIX_PATH="${LIBRARIES_INSTALL_PATH}/lib/cmake" \
        -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS:BOOL=NO \
        -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON \
        -DCMAKE_CXX_STANDARD=17 \
        -DCMAKE_CXX_STANDARD_REQUIRED=ON \
        -DCMAKE_CXX_EXTENSIONS=OFF \
        -DCMAKE_C_FLAGS="-DCURL_STATICLIB -DCARES_STATICLIB" \
        -DOPENSSL_USE_STATIC_LIBS=ON \
        -DZLIB_USE_STATIC_LIBS=ON \
        -DCMAKE_FIND_DEBUG_MODE=OFF \
        -Dskip_samples=OFF \
        -Duse_c_ares=ON \
        -DZLIB_ROOT=${LIBRARIES_INSTALL_PATH} \
        -H. -Bcmake-out \
    && cmake --build cmake-out --target install -- -j $(nproc) \
    && cd .. \
    && if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
            rm -rf azure-c-shared-utility \
            azure-c-shared-utility-${AZURE_C_SHARED_UTILITY_VERSION}.patch; \
        fi \
    && ldconfig

RUN echo " \"azure_c_shared_utility\": { \"version\" : \"${AZURE_C_SHARED_UTILITY_VERSION}\", \"url\" : \"https://github.com/Azure/azure-c-shared-utility\"     }," >> /versions.json

# ditto witht OPENSSL_API_COMPAT
# produce a patch instead.
# Version LTS_07_2020_Ref02 requires next 2 lines that fix the CMakeLists.txt to build.
# && perl -pi -e 's@^.*SHARED_UTIL_FOLDER}/configs/azure_iot_build_rules.cmake\)$@@g' CMakeLists.txt \
# && perl -pi -e 's@([ \t]*)(set_platform_files\(\$\{SHARED_UTIL_FOLDER\}\))@set(_shared_util_folder \${SHARED_UTIL_FOLDER})\n${1}include(\${_shared_util_folder}/azure_c_shared_utilityConfig.cmake)\n${1}include(\${_shared_util_folder}/azure_c_shared_utilityFunctions.cmake)\n$1$2\n\n${1}include(\${_shared_util_folder}/azure_iot_build_rules.cmake)\n${1}include_directories(\${MACRO_UTILS_INC_FOLDER}/azureiot)\n@g' CMakeLists.txt \       
COPY patches/azure-uamqp-c-9c8c180.patch /tmp/
COPY patches/safe_math.h ${LIBRARIES_INSTALL_PATH}/include/azureiot/azure_c_shared_utility
ARG UAMQP_VERSION=9c8c1805fac797e2d14a32ff6a7d9756a5ee82e1
ARG UAMQP_SHORT_VERSION=9c8c180
RUN git clone https://github.com/Azure/azure-uamqp-c \
    && cd azure-uamqp-c \
    && git checkout ${UAMQP_VERSION} \
    && patch -p0 < /tmp/azure-uamqp-c-${UAMQP_SHORT_VERSION}.patch \
    && export 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" \
        -DCMAKE_BUILD_TYPE=Release \
        -DBUILD_SHARED_LIBS:BOOL=NO \
        -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON \
        -DCMAKE_CXX_STANDARD=17 \
        -DCMAKE_CXX_STANDARD_REQUIRED=ON \
        -DCMAKE_CXX_EXTENSIONS=OFF \
        -DSHARED_UTIL_FOLDER="${LIBRARIES_INSTALL_PATH}/cmake"  \
        -DOPENSSL_USE_STATIC_LIBS=ON \
        -H. -Bcmake-out \
    &&  cmake --build cmake-out --target install -- -j $(nproc) \
    && cd .. \
    &&  if [ "${KEEP_DEPENDENCIES}" = "false" ]; then \
            rm -rf azure-uamqp-c; \
        fi \
    && ldconfig

RUN echo " \"azure_uamqp_c\": { \"version\" : \"${UAMQP_VERSION}\", \"url\" : \"https://github.com/Azure/azure-uamqp-c\"     }," >> /versions.json

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

ARG AZURE_STORAGE_FOR_CPP_VERSION=12.10.0
COPY patches/azure-sdk-for-cpp-azure-storage-blobs_${AZURE_STORAGE_FOR_CPP_VERSION}.patch /tmp

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} \
    && patch -p0 <  /tmp/azure-sdk-for-cpp-azure-storage-blobs_${AZURE_STORAGE_FOR_CPP_VERSION}.patch \
    && env AZURE_SDK_DISABLE_AUTO_VCPKG=ON PKG_CONFIG_PATH=${LIBRARIES_INSTALL_PATH}/lib/pkgconfig: \
      cmake \
      -DCMAKE_PREFIX_PATH="${LIBRARIES_INSTALL_PATH}/lib/cmake;${LIBRARIES_INSTALL_PATH}/cmake" \
      -DCMAKE_CXX_STANDARD=17 \
      -DCMAKE_CXX_STANDARD_REQUIRED=ON \
      -DCMAKE_BUILD_TYPE=Release \
      -DBUILD_SHARED_LIBS:BOOL=NO \
      -DCMAKE_POSITION_INDEPENDENT_CODE:BOOL=ON \
      -DBUILD_TRANSPORT_CURL:BOOL=ON \
      -DOPENSSL_USE_STATIC_LIBS=ON \
      -DZLIB_ROOT=${LIBRARIES_INSTALL_PATH} \
      -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-sdk-for-cpp-azure-storage-blobs_${AZURE_STORAGE_FOR_CPP_VERSION}.patch \
            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

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} \
    && 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

# Shell basics
WORKDIR /
RUN ldconfig /usr/local/lib*
RUN echo "\"end\":\"end\" }" >> /versions.json
RUN perl -pi -e 's/ +/ /g' /versions.json && cat /versions.json
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