Merged
csec.cmake引入lib_cache二进制缓存复用,合并重复ExternalProject_Add,统一日志输出 #276
zhengfeitengAdd on Aug 12
csec.cmake引入lib_cache二进制缓存复用,合并重复ExternalProject_Add,统一日志输出 #276
Merged
Merged fromzhengfeiteng/cmake20260811-refactor-csecintocann/cmakemaster
Total: 1 files changed+79-67
| @@ -9,6 +9,7 @@ | |||
| 9 | # ----------------------------------------------------------------------------------------------------------- | 9 | # ----------------------------------------------------------------------------------------------------------- |
| 10 | include_guard(GLOBAL) | 10 | include_guard(GLOBAL) |
| 11 | include(ExternalProject) | 11 | include(ExternalProject) |
| 12 | +include(FindPackageHandleStandardArgs) | ||
| 12 | 13 | ||
| 13 | if(CMAKE_GENERATOR MATCHES "Makefiles") | 14 | if(CMAKE_GENERATOR MATCHES "Makefiles") |
| 14 | set(CSEC_BUILD_JOB_SERVER_AWARE TRUE) | 15 | set(CSEC_BUILD_JOB_SERVER_AWARE TRUE) |
| @@ -20,7 +21,7 @@ set(ABL_CSEC ${CANN_3RD_LIB_PATH}/libc_sec) | |||
| 20 | 21 | ||
| 21 | add_library(c_sec_headers INTERFACE) | 22 | add_library(c_sec_headers INTERFACE) |
| 22 | if (EXISTS "${ABL_CSEC}" AND IS_DIRECTORY "${ABL_CSEC}") | 23 | if (EXISTS "${ABL_CSEC}" AND IS_DIRECTORY "${ABL_CSEC}") |
| 23 | - message(STATUS "libc_sec detected") | 24 | + message(STATUS "[ThirdParty][csec] libc_sec detected") |
| 24 | add_subdirectory(${ABL_CSEC} ${CMAKE_BINARY_DIR}/libc_sec) | 25 | add_subdirectory(${ABL_CSEC} ${CMAKE_BINARY_DIR}/libc_sec) |
| 25 | target_compile_options(static_c_sec PRIVATE -fstack-protector-strong) | 26 | target_compile_options(static_c_sec PRIVATE -fstack-protector-strong) |
| 26 | target_link_options(static_c_sec PRIVATE -Wl,-z,now) | 27 | target_link_options(static_c_sec PRIVATE -Wl,-z,now) |
| @@ -31,60 +32,75 @@ if (EXISTS "${ABL_CSEC}" AND IS_DIRECTORY "${ABL_CSEC}") | |||
| 31 | set(LIBC_SEC_HEADER ${ABL_CSEC}/include) | 32 | set(LIBC_SEC_HEADER ${ABL_CSEC}/include) |
| 32 | add_library(c_sec ALIAS shared_c_sec) | 33 | add_library(c_sec ALIAS shared_c_sec) |
| 33 | add_library(c_sec_static ALIAS static_c_sec) | 34 | add_library(c_sec_static ALIAS static_c_sec) |
| 34 | - if(PRODUCT_SIDE STREQUAL "host") | ||
| 35 | - install(TARGETS static_c_sec DESTINATION ${CMAKE_SYSTEM_PROCESSOR}-linux/lib64 COMPONENT npu-runtime) | ||
| 36 | - else() | ||
| 37 | - install(TARGETS shared_c_sec DESTINATION ${DEVICE_LIBRARY_PATH} COMPONENT npu-runtime) | ||
| 38 | - endif() | ||
| 39 | else() | 35 | else() |
| 40 | - set(LOCAL_SRC_DIR "${CANN_3RD_LIB_PATH}/libboundscheck-v1.1.16") | 36 | + # ========================================================================================================== |
| 41 | - if(EXISTS "${CANN_3RD_LIB_PATH}/libboundscheck-v1.1.16.tar.gz") | 37 | + # 1. 路径配置:install 到 lib_cache 持久化目录,支持二进制缓存复用 |
| 42 | - set(REQ_URL "${CANN_3RD_LIB_PATH}/libboundscheck-v1.1.16.tar.gz") | 38 | + # ========================================================================================================== |
| 43 | - message(STATUS "[ThirdParty][csec] ${REQ_URL} found.") | 39 | + if(PRODUCT_SIDE STREQUAL "device") |
| 40 | + set(CSEC_INSTALL_PATH ${CANN_3RD_LIB_PATH}/lib_cache/device/csec) | ||
| 41 | + set(CSEC_DOWNLOAD_DIR ${CANN_3RD_LIB_PATH}/pkg/device) | ||
| 44 | else() | 42 | else() |
| 45 | - set(REQ_URL "https://cann-3rd.obs.cn-north-4.myhuaweicloud.com/libboundscheck/libboundscheck-v1.1.16.tar.gz") | 43 | + set(CSEC_INSTALL_PATH ${CANN_3RD_LIB_PATH}/lib_cache/csec) |
| 46 | - message("[ThirdParty][csec] ${REQ_URL} not found, need download.") | 44 | + set(CSEC_DOWNLOAD_DIR ${CANN_3RD_LIB_PATH}/pkg) |
| 47 | endif() | 45 | endif() |
| 48 | - set(CSEC_DOWNLOAD_DIR ${CMAKE_BINARY_DIR}/libc_sec) | ||
| 49 | - set(CSEC_SOURCE_DIR ${CMAKE_BINARY_DIR}/libc_sec/source) | ||
| 50 | - set(CSEC_EXTRA_CFLAGS "-fstack-protector-strong") | ||
| 51 | - set(CSEC_EXTRA_LDFLAGS "-Wl,-z,now -s") | ||
| 52 | 46 | ||
| 53 | - if(EXISTS "${LOCAL_SRC_DIR}" AND IS_DIRECTORY "${LOCAL_SRC_DIR}") | 47 | + # ========================================================================================================== |
| 54 | - message(STATUS "using local csec source: ${LOCAL_SRC_DIR}") | 48 | + # 2. 检测预构建产物(参考 openssl.cmake / gtest_shared.cmake 的缓存复用模式) |
| 55 | - if(NOT EXISTS "${CSEC_SOURCE_DIR}/Makefile") | 49 | + # ========================================================================================================== |
| 56 | - message(STATUS "Copying source to build directory: ${CSEC_SOURCE_DIR}") | 50 | + find_path(CSEC_INCLUDE_DIR |
| 57 | - file(REMOVE_RECURSE "${CSEC_SOURCE_DIR}") | 51 | + NAMES securec.h |
| 58 | - file(MAKE_DIRECTORY "${CSEC_SOURCE_DIR}") | 52 | + PATH_SUFFIXES include |
| 59 | - file(COPY "${LOCAL_SRC_DIR}/" DESTINATION "${CSEC_SOURCE_DIR}") | 53 | + PATHS ${CSEC_INSTALL_PATH} |
| 60 | - endif() | 54 | + NO_DEFAULT_PATH |
| 61 | - ExternalProject_Add(csec_src | 55 | + ) |
| 62 | - SOURCE_DIR ${CSEC_SOURCE_DIR} | 56 | + find_library(CSEC_SHARED_LIB |
| 63 | - CONFIGURE_COMMAND "" | 57 | + NAMES libc_sec.so |
| 64 | - BUILD_IN_SOURCE 1 | 58 | + PATH_SUFFIXES lib lib64 |
| 65 | - BUILD_JOB_SERVER_AWARE ${CSEC_BUILD_JOB_SERVER_AWARE} | 59 | + PATHS ${CSEC_INSTALL_PATH} |
| 66 | - BUILD_COMMAND | 60 | + NO_DEFAULT_PATH |
| 67 | - ${CMAKE_MAKE_PROGRAM} -C <SOURCE_DIR> lib | 61 | + ) |
| 68 | - CC=${CMAKE_C_COMPILER} | 62 | + find_library(CSEC_STATIC_LIB |
| 69 | - AR=${CMAKE_AR} | 63 | + NAMES libc_sec.a |
| 70 | - LINK=${CMAKE_C_COMPILER} | 64 | + PATH_SUFFIXES lib lib64 |
| 71 | - CFLAGS="${CSEC_EXTRA_CFLAGS}" | 65 | + PATHS ${CSEC_INSTALL_PATH} |
| 72 | - LDFLAGS="${CSEC_EXTRA_LDFLAGS}" | 66 | + NO_DEFAULT_PATH |
| 73 | - INSTALL_COMMAND "" | 67 | + ) |
| 74 | - # 禁用更新和下载 | 68 | + |
| 75 | - UPDATE_DISCONNECTED 1 | 69 | + find_package_handle_standard_args(csec |
| 76 | - PATCH_COMMAND ${CMAKE_COMMAND} | 70 | + FOUND_VAR |
| 77 | - -D CSEC_SOURCE_DIR=<SOURCE_DIR> | 71 | + csec_FOUND |
| 78 | - -P ${CMAKE_CURRENT_LIST_DIR}/csec_patch.cmake | 72 | + REQUIRED_VARS |
| 79 | - ) | 73 | + CSEC_INCLUDE_DIR |
| 74 | + CSEC_SHARED_LIB | ||
| 75 | + CSEC_STATIC_LIB | ||
| 76 | + ) | ||
| 77 | + | ||
| 78 | + if(csec_FOUND AND NOT FORCE_REBUILD_CANN_3RD) | ||
| 79 | + message(STATUS "[ThirdParty][csec] use cache: ${CSEC_INSTALL_PATH}") | ||
| 80 | + add_custom_target(csec_build) | ||
| 81 | + set(LIBC_SEC_HEADER ${CSEC_INCLUDE_DIR}) | ||
| 82 | + set(CSEC_SHARED_LIB_PATH ${CSEC_SHARED_LIB}) | ||
| 83 | + set(CSEC_STATIC_LIB_PATH ${CSEC_STATIC_LIB}) | ||
| 80 | else() | 84 | else() |
| 81 | - message(STATUS "download csec from gitcode") | 85 | + # ====================================================================================================== |
| 82 | - ExternalProject_Add(csec_src | 86 | + # 3. 源码获取:本地 tar.gz 优先,否则远程下载 |
| 87 | + # ====================================================================================================== | ||
| 88 | + set(CSEC_EXTRA_CFLAGS "-fstack-protector-strong") | ||
| 89 | + set(CSEC_EXTRA_LDFLAGS "-Wl,-z,now -s") | ||
| 90 | + | ||
| 91 | + if(EXISTS "${CANN_3RD_LIB_PATH}/libboundscheck-v1.1.16.tar.gz") | ||
| 92 | + set(REQ_URL "${CANN_3RD_LIB_PATH}/libboundscheck-v1.1.16.tar.gz") | ||
| 93 | + message(STATUS "[ThirdParty][csec] ${REQ_URL} found.") | ||
| 94 | + else() | ||
| 95 | + set(REQ_URL "https://cann-3rd.obs.cn-north-4.myhuaweicloud.com/libboundscheck/libboundscheck-v1.1.16.tar.gz") | ||
| 96 | + message(STATUS "[ThirdParty][csec] ${REQ_URL} not found, need download.") | ||
| 97 | + endif() | ||
| 98 | + | ||
| 99 | + ExternalProject_Add(csec_build | ||
| 83 | URL ${REQ_URL} | 100 | URL ${REQ_URL} |
| 84 | URL_HASH SHA256=aee8368ef04a42a499edd5bfebce529e7f32dd138bfed383d316e48af4e45d2c | 101 | URL_HASH SHA256=aee8368ef04a42a499edd5bfebce529e7f32dd138bfed383d316e48af4e45d2c |
| 85 | TIMEOUT 300 | 102 | TIMEOUT 300 |
| 86 | DOWNLOAD_DIR ${CSEC_DOWNLOAD_DIR} | 103 | DOWNLOAD_DIR ${CSEC_DOWNLOAD_DIR} |
| 87 | - SOURCE_DIR ${CSEC_SOURCE_DIR} | ||
| 88 | PATCH_COMMAND ${CMAKE_COMMAND} | 104 | PATCH_COMMAND ${CMAKE_COMMAND} |
| 89 | -D CSEC_SOURCE_DIR=<SOURCE_DIR> | 105 | -D CSEC_SOURCE_DIR=<SOURCE_DIR> |
| 90 | -P ${CMAKE_CURRENT_LIST_DIR}/csec_patch.cmake | 106 | -P ${CMAKE_CURRENT_LIST_DIR}/csec_patch.cmake |
| @@ -98,40 +114,36 @@ else() | |||
| 98 | LINK=${CMAKE_C_COMPILER} | 114 | LINK=${CMAKE_C_COMPILER} |
| 99 | CFLAGS="${CSEC_EXTRA_CFLAGS}" | 115 | CFLAGS="${CSEC_EXTRA_CFLAGS}" |
| 100 | LDFLAGS="${CSEC_EXTRA_LDFLAGS}" | 116 | LDFLAGS="${CSEC_EXTRA_LDFLAGS}" |
| 101 | - INSTALL_COMMAND "" | 117 | + INSTALL_COMMAND ${CMAKE_COMMAND} -E make_directory ${CSEC_INSTALL_PATH}/lib |
| 118 | + COMMAND ${CMAKE_COMMAND} -E copy <SOURCE_DIR>/lib/libc_sec.so ${CSEC_INSTALL_PATH}/lib/libc_sec.so | ||
| 119 | + COMMAND ${CMAKE_COMMAND} -E copy <SOURCE_DIR>/lib/libc_sec.a ${CSEC_INSTALL_PATH}/lib/libc_sec.a | ||
| 120 | + COMMAND ${CMAKE_COMMAND} -E copy_directory <SOURCE_DIR>/include ${CSEC_INSTALL_PATH}/include | ||
| 102 | ) | 121 | ) |
| 122 | + | ||
| 123 | + set(LIBC_SEC_HEADER ${CSEC_INSTALL_PATH}/include) | ||
| 124 | + set(CSEC_SHARED_LIB_PATH ${CSEC_INSTALL_PATH}/lib/libc_sec.so) | ||
| 125 | + set(CSEC_STATIC_LIB_PATH ${CSEC_INSTALL_PATH}/lib/libc_sec.a) | ||
| 126 | + if(NOT EXISTS "${LIBC_SEC_HEADER}") | ||
| 127 | + file(MAKE_DIRECTORY ${LIBC_SEC_HEADER}) | ||
| 128 | + endif() | ||
| 103 | endif() | 129 | endif() |
| 130 | + | ||
| 104 | add_library(shared_c_sec SHARED IMPORTED GLOBAL) | 131 | add_library(shared_c_sec SHARED IMPORTED GLOBAL) |
| 105 | set_property(TARGET shared_c_sec PROPERTY | 132 | set_property(TARGET shared_c_sec PROPERTY |
| 106 | - IMPORTED_LOCATION ${CSEC_SOURCE_DIR}/lib/libc_sec.so | 133 | + IMPORTED_LOCATION ${CSEC_SHARED_LIB_PATH} |
| 107 | ) | 134 | ) |
| 108 | 135 | ||
| 109 | add_library(static_c_sec STATIC IMPORTED GLOBAL) | 136 | add_library(static_c_sec STATIC IMPORTED GLOBAL) |
| 110 | set_property(TARGET static_c_sec PROPERTY | 137 | set_property(TARGET static_c_sec PROPERTY |
| 111 | - IMPORTED_LOCATION ${CSEC_SOURCE_DIR}/lib/libc_sec.a | 138 | + IMPORTED_LOCATION ${CSEC_STATIC_LIB_PATH} |
| 112 | ) | 139 | ) |
| 113 | 140 | ||
| 114 | - add_dependencies(shared_c_sec csec_src) | 141 | + add_dependencies(shared_c_sec csec_build) |
| 115 | - add_dependencies(static_c_sec csec_src) | 142 | + add_dependencies(static_c_sec csec_build) |
| 116 | - add_dependencies(c_sec_headers csec_src) | 143 | + add_dependencies(c_sec_headers csec_build) |
| 117 | 144 | ||
| 118 | add_library(c_sec ALIAS shared_c_sec) | 145 | add_library(c_sec ALIAS shared_c_sec) |
| 119 | add_library(c_sec_static ALIAS static_c_sec) | 146 | add_library(c_sec_static ALIAS static_c_sec) |
| 120 | - if(PRODUCT_SIDE STREQUAL "device") | ||
| 121 | - install(FILES | ||
| 122 | - $<TARGET_FILE:shared_c_sec> | ||
| 123 | - DESTINATION ${DEVICE_LIBRARY_PATH} COMPONENT npu-runtime | ||
| 124 | - ) | ||
| 125 | - else() | ||
| 126 | - install(FILES | ||
| 127 | - $<TARGET_FILE:shared_c_sec> $<TARGET_FILE:static_c_sec> | ||
| 128 | - DESTINATION ${CMAKE_SYSTEM_PROCESSOR}-linux/lib64 COMPONENT npu-runtime | ||
| 129 | - ) | ||
| 130 | - endif() | ||
| 131 | - set(LIBC_SEC_HEADER ${CSEC_SOURCE_DIR}/include) | ||
| 132 | - if(NOT EXISTS "${LIBC_SEC_HEADER}") | ||
| 133 | - file(MAKE_DIRECTORY ${LIBC_SEC_HEADER}) | ||
| 134 | - endif() | ||
| 135 | endif() | 147 | endif() |
| 136 | 148 | ||
| 137 | target_include_directories(c_sec_headers INTERFACE | 149 | target_include_directories(c_sec_headers INTERFACE |