include(${CMAKE_CURRENT_LIST_DIR}/../utils.cmake)

file(READ "${DEPENDENCY_JSON_FILE}" DEP_JSON_STRING)
download_open_source("${OPENSOURCE_COMPONENT_NAME}" "${FILE_GLOB_PATTERN}" "${THIRD_PARTY_CACHE_DIR}")

set(THREAD_NUM "${THREAD_NUM}") # clean warning
list(JOIN THIRD_PARTY_CXX_FLAGS " " THIRD_PARTY_CXX_FLAGS_STR)

if(EXISTS "${ABSEILCPP_OUTPUT_DIR}/lib/libabsl_crc32c.so")
    message(STATUS "${OPENSOURCE_COMPONENT_NAME} already built, skipping.")
    return()
endif()

set(PKG_DOWNLOAD_DIR "${THIRD_PARTY_SRC_DIR}/${OPENSOURCE_COMPONENT_NAME}")
file(MAKE_DIRECTORY "${PKG_DOWNLOAD_DIR}/SOURCE")
file(GLOB ABSEILCPP_TAR "${PKG_DOWNLOAD_DIR}/*.tar.*")
execute_process(
    COMMAND tar xf ${ABSEILCPP_TAR} -C ${PKG_DOWNLOAD_DIR}/SOURCE
    WORKING_DIRECTORY ${PKG_DOWNLOAD_DIR}
)

apply_patches("${PKG_DOWNLOAD_DIR}" "${FILE_GLOB_PATTERN}")
file(GLOB SOURCE_DIR_LIST "${PKG_DOWNLOAD_DIR}/SOURCE/${FILE_GLOB_PATTERN}")
list(GET SOURCE_DIR_LIST 0 SOURCE_DIR)
file(READ "${SOURCE_DIR}/absl/base/options.h" ABSL_INTERNAL_OPTIONS_H_CONTENTS)
string(REGEX REPLACE
    "#define ABSL_OPTION_USE_STD_([^ ]*) 2"
    "#define ABSL_OPTION_USE_STD_\\1 0"
    ABSL_INTERNAL_OPTIONS_H_PINNED
    "${ABSL_INTERNAL_OPTIONS_H_CONTENTS}")
file(WRITE "${SOURCE_DIR}/absl/base/options.h" "${ABSL_INTERNAL_OPTIONS_H_PINNED}")

set(ABSEILCPP_BUILD_DIR "${SOURCE_DIR}/build")
file(MAKE_DIRECTORY "${ABSEILCPP_BUILD_DIR}")
execute_process(
    COMMAND ${CMAKE_COMMAND} 
        -DCMAKE_INSTALL_PREFIX=${ABSEILCPP_OUTPUT_DIR}
        -DCMAKE_BUILD_TYPE=Release
        -DBUILD_SHARED_LIBS=ON
        -DCMAKE_POSITION_INDEPENDENT_CODE=ON
        -DCMAKE_CXX_FLAGS=${THIRD_PARTY_CXX_FLAGS_STR}
        ..
    WORKING_DIRECTORY ${ABSEILCPP_BUILD_DIR}
    OUTPUT_QUIET
)

execute_process(
    COMMAND ${CMAKE_COMMAND} --build . --parallel ${THREAD_NUM}
    WORKING_DIRECTORY ${ABSEILCPP_BUILD_DIR}
    OUTPUT_QUIET
)

execute_process(
    COMMAND ${CMAKE_COMMAND} --install .
    WORKING_DIRECTORY ${ABSEILCPP_BUILD_DIR}
    OUTPUT_QUIET
)
message(STATUS "${OPENSOURCE_COMPONENT_NAME} has been built and installed to ${ABSEILCPP_OUTPUT_DIR}")