# -----------------------------------------------------------------------------------------------------------
# Copyright (c) 2025 Huawei Technologies Co., Ltd.
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of 
# CANN Open Software License Agreement Version 2.0 (the "License").
# Please refer to the License for details. You may not use this file except in compliance with the License.
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, 
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
# See LICENSE in the root of the software repository for the full text of the License.
# -----------------------------------------------------------------------------------------------------------
include_guard(GLOBAL)
if(POLICY CMP0135)
    cmake_policy(SET CMP0135 NEW)
endif()
include(ExternalProject)

set(ZLIB_INSTALL_DIR ${CANN_3RD_LIB_PATH}/lib_cache/zlib)
set(ZLIB_INCLUDE_DIR ${ZLIB_INSTALL_DIR}/include)
if(NOT EXISTS ${ZLIB_INCLUDE_DIR})
    file(MAKE_DIRECTORY "${ZLIB_INCLUDE_DIR}")
endif()

set(ZLIB_LIBRARY ${ZLIB_INSTALL_DIR}/lib/libz.a)
add_library(zlib_static STATIC IMPORTED)
set_target_properties(zlib_static PROPERTIES
    INTERFACE_INCLUDE_DIRECTORIES "${ZLIB_INCLUDE_DIR}"
    IMPORTED_LOCATION             "${ZLIB_LIBRARY}"
)

set(MINIZIP_LIBRARY ${ZLIB_INSTALL_DIR}/lib/libminizip.a)
add_library(minizip_static STATIC IMPORTED)
set_target_properties(minizip_static PROPERTIES
    INTERFACE_INCLUDE_DIRECTORIES "${ZLIB_INCLUDE_DIR}"
    IMPORTED_LOCATION             "${MINIZIP_LIBRARY}"
    # 自动添加libminizip.a对libz.a的依赖
    INTERFACE_LINK_LIBRARIES ${ZLIB_LIBRARY}
)

set(REQ_URL "${CANN_3RD_LIB_PATH}/zlib/zlib-1.2.13.tar.xz")
set(REQ_URL_BACK "${CANN_3RD_LIB_PATH}/zlib/zlib-1.2.13.tar.gz")
if(EXISTS ${REQ_URL})
    message(STATUS "[ThirdParty][zlib] ${REQ_URL} found.")
elseif(EXISTS ${REQ_URL_BACK})
    message(STATUS "[ThirdParty][zlib] ${REQ_URL_BACK} found.")
    set(REQ_URL ${REQ_URL_BACK})
else()
    message(STATUS "[ThirdParty][zlib] ${REQ_URL} not found, need download.")
    set(REQ_URL "https://cann-3rd.obs.cn-north-4.myhuaweicloud.com/zlib/zlib-1.2.13.tar.gz")
endif()
ExternalProject_Add(zlib_src                        
    URL ${REQ_URL}
    PATCH_COMMAND patch -p1 < ${CMAKE_CURRENT_LIST_DIR}/zlib_add_minizip_static_lib.patch
    CONFIGURE_COMMAND ""
    BUILD_COMMAND ""
    INSTALL_COMMAND ""
    EXCLUDE_FROM_ALL TRUE
)
ExternalProject_Get_Property(zlib_src SOURCE_DIR)
set(ZLIB_SRC_DIR ${SOURCE_DIR})

if(EXISTS ${ZLIB_LIBRARY} AND EXISTS ${MINIZIP_LIBRARY})
    message(STATUS "zlib lib found in ${ZLIB_LIBRARY}.")
else()
    set(ZLIB_C_FLAGS "-fPIC -fexceptions -O2")
    ExternalProject_Add(zlib_bin_build
                        DOWNLOAD_COMMAND ""
                        UPDATE_COMMAND ""
                        SOURCE_DIR ${ZLIB_SRC_DIR}
                        CONFIGURE_COMMAND ${CMAKE_COMMAND}
                            -DCMAKE_INSTALL_PREFIX=${ZLIB_INSTALL_DIR}
                            -DCMAKE_C_FLAGS=${ZLIB_C_FLAGS}
                            -DCMAKE_POLICY_VERSION_MINIMUM=3.5
                            -DCMAKE_C_COMPILER_LAUNCHER=${CMAKE_C_COMPILER_LAUNCHER}
                            -DCMAKE_CXX_COMPILER_LAUNCHER=${CMAKE_CXX_COMPILER_LAUNCHER}
                            -DLLVM_PATH=${LLVM_PATH}
                            -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE}
                            <SOURCE_DIR>
                        BUILD_COMMAND $(MAKE)
                        INSTALL_COMMAND $(MAKE) install
                        DEPENDS zlib_src
                        EXCLUDE_FROM_ALL TRUE
    )
    add_dependencies(zlib_static zlib_bin_build)
    add_dependencies(minizip_static zlib_bin_build)
endif()