# -----------------------------------------------------------------------------------------------------------
# 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(ExternalProject)
if (BUILD_WITH_INSTALLED_DEPENDENCY_CANN_PKG)
set(LOCAL_SRC_DIR "${OPEN_SOURCE_DIR}/libboundscheck-v1.1.16")
set(REQ_URL "https://gitcode.com/cann-src-third-party/libboundscheck/releases/download/v1.1.16/libboundscheck-v1.1.16.tar.gz")
set(SO_NEW_NAME libc_sec.so)
set(STATIC_NEW_NAME libc_sec.a)
set(CSEC_DOWNLOAD_DIR ${CMAKE_BINARY_DIR}/libc_sec)
set(CSEC_SOURCE_DIR ${CMAKE_BINARY_DIR}/libc_sec/source)
if(EXISTS "${LOCAL_SRC_DIR}" AND IS_DIRECTORY "${LOCAL_SRC_DIR}")
message(STATUS "Using local csec source: ${LOCAL_SRC_DIR}")
if(NOT EXISTS "${CSEC_SOURCE_DIR}/Makefile")
message(STATUS "Copying source to build directory: ${CSEC_SOURCE_DIR}")
file(REMOVE_RECURSE "${CSEC_SOURCE_DIR}")
file(MAKE_DIRECTORY "${CSEC_SOURCE_DIR}")
file(COPY "${LOCAL_SRC_DIR}/" DESTINATION "${CSEC_SOURCE_DIR}")
endif()
ExternalProject_Add(csec_src
SOURCE_DIR ${CSEC_SOURCE_DIR}
CONFIGURE_COMMAND ""
BUILD_IN_SOURCE 1
BUILD_COMMAND
${CMAKE_MAKE_PROGRAM} -C <SOURCE_DIR> lib
CC=${CMAKE_C_COMPILER}
AR=${CMAKE_AR}
LINK=${CMAKE_C_COMPILER}
INSTALL_COMMAND ""
# 禁用更新和下载
UPDATE_DISCONNECTED 1
PATCH_COMMAND ${CMAKE_COMMAND}
-D CSEC_SOURCE_DIR=<SOURCE_DIR>
-P ${CMAKE_CURRENT_LIST_DIR}/csec_patch.cmake
)
else()
ExternalProject_Add(csec_src
URL ${REQ_URL}
DOWNLOAD_DIR ${CSEC_DOWNLOAD_DIR}
SOURCE_DIR ${CSEC_SOURCE_DIR}
PATCH_COMMAND ${CMAKE_COMMAND}
-D CSEC_SOURCE_DIR=<SOURCE_DIR>
-P ${CMAKE_CURRENT_LIST_DIR}/csec_patch.cmake
CONFIGURE_COMMAND ""
BUILD_IN_SOURCE 1
BUILD_COMMAND
${CMAKE_MAKE_PROGRAM} -C <SOURCE_DIR> lib
CC=${CMAKE_C_COMPILER}
AR=${CMAKE_AR}
LINK=${CMAKE_C_COMPILER}
INSTALL_COMMAND ""
)
endif()
add_library(shared_c_sec_lib SHARED IMPORTED)
set_property(TARGET shared_c_sec_lib PROPERTY
IMPORTED_LOCATION ${CSEC_SOURCE_DIR}/lib/${SO_NEW_NAME}
)
add_library(shared_c_sec INTERFACE)
target_link_libraries(shared_c_sec INTERFACE shared_c_sec_lib)
add_dependencies(shared_c_sec csec_src)
add_custom_target(csec_build DEPENDS csec_src)
add_library(c_sec ALIAS shared_c_sec)
if(PRODUCT_SIDE STREQUAL "device")
install(FILES
${CSEC_SOURCE_DIR}/lib/${SO_NEW_NAME} ${CSEC_SOURCE_DIR}/lib/${STATIC_NEW_NAME}
DESTINATION lib
)
else()
install(FILES
${CSEC_SOURCE_DIR}/lib/${SO_NEW_NAME} ${CSEC_SOURCE_DIR}/lib/${STATIC_NEW_NAME}
DESTINATION runtime/lib
)
endif()
set(LIBC_SEC_HEADER ${CSEC_SOURCE_DIR}/include)
add_library(c_sec_headers INTERFACE)
target_include_directories(c_sec_headers INTERFACE
$<BUILD_INTERFACE:${LIBC_SEC_HEADER}>
)
else()
message("not download csec source code")
endif()