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

set(C_SEC_NAME "secure_c")
message(STATUS "Build third party library secure_c")

if(POLICY CMP0135)
    cmake_policy(SET CMP0135 NEW)
endif()

set(C_SEC_HEAD_SEARCH_PATHS
    ${CANN_3RD_LIB_PATH}/abl/libc_sec/include             # compile with ci
    ${CANN_3RD_LIB_PATH}/libboundscheck
)

find_path(C_SEC_INCLUDE NAMES securec.h PATHS ${C_SEC_HEAD_SEARCH_PATHS} NO_DEFAULT_PATH)
if(NOT C_SEC_INCLUDE)
    set(C_SEC_URL "https://gitcode.com/cann-src-third-party/libboundscheck/releases/download/v1.1.16/libboundscheck-v1.1.16.tar.gz")
    message(STATUS "Downloading ${C_SEC_NAME} from ${C_SEC_URL}")

    include(FetchContent)
    FetchContent_Declare(
        ${C_SEC_NAME}
        URL ${C_SEC_URL}
        DOWNLOAD_DIR ${EXTERN_DEPEND_DOWNLOAD_DIR}
        SOURCE_DIR ${EXTERN_DEPEND_SOURCE_DIR}/libc_sec
    )
    FetchContent_MakeAvailable(${C_SEC_NAME})

    set(C_SEC_INCLUDE ${EXTERN_DEPEND_SOURCE_DIR}/libc_sec/include)

    configure_file(
        ${PROJECT_SOURCE_DIR}/cmake/config/c_sec_config/c_sec.cmake
        ${EXTERN_DEPEND_SOURCE_DIR}/libc_sec/CMakeLists.txt
        COPYONLY
    )

    execute_process(
            COMMAND bash -c "cp ${PROJECT_SOURCE_DIR}/src/sdk_driver/seclib/Makefile ${EXTERN_DEPEND_SOURCE_DIR}/libc_sec/Makefile"
            COMMAND bash -c "cp ${PROJECT_SOURCE_DIR}/src/sdk_driver/seclib/securecmodule.c ${EXTERN_DEPEND_SOURCE_DIR}/libc_sec/src/securecmodule.c"
            WORKING_DIRECTORY ${EXTERN_DEPEND_SOURCE_DIR}/libc_sec/src
        )
endif()

get_filename_component(SECURE_C_DIR ${C_SEC_INCLUDE} DIRECTORY)

include(ExternalProject)
ExternalProject_Add(secure_c
    SOURCE_DIR ${SECURE_C_DIR}
    CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}
)

link_directories(${CMAKE_CURRENT_BINARY_DIR}/lib)
include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)

ExternalProject_Get_Property(secure_c BINARY_DIR)
add_library(c_sec SHARED IMPORTED)
add_dependencies(c_sec secure_c)
set_target_properties(c_sec PROPERTIES
    INTERFACE_INCLUDE_DIRECTORIES "${C_SEC_INCLUDE}"
    IMPORTED_LOCATION             "${BINARY_DIR}/libc_sec.so"
)

add_library(c_sec_headers INTERFACE IMPORTED)
target_include_directories(c_sec_headers INTERFACE ${C_SEC_INCLUDE})

if("${BUILD_COMPONENT}" STREQUAL "DRIVER")
    add_host_ko(LOCAL_MODULE drv_seclib_host
        KO_SRC_FOLDER ${SECURE_C_DIR}
        MAKE_ARGS ${MAKE_ARGS})
endif()