Merged
csec.cmake引入lib_cache二进制缓存复用,合并重复ExternalProject_Add,统一日志输出 #276
csec.cmake引入lib_cache二进制缓存复用,合并重复ExternalProject_Add,统一日志输出 #276
Merged
zhengfeitengAdd on Aug 12
Total: 1 files changed+79-67
@@ -9,6 +9,7 @@
9# -----------------------------------------------------------------------------------------------------------9# -----------------------------------------------------------------------------------------------------------
10include_guard(GLOBAL)10include_guard(GLOBAL)
11include(ExternalProject)11include(ExternalProject)
12+include(FindPackageHandleStandardArgs)
12 13 
13if(CMAKE_GENERATOR MATCHES "Makefiles")14if(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 
21add_library(c_sec_headers INTERFACE)22add_library(c_sec_headers INTERFACE)
22if (EXISTS "${ABL_CSEC}" AND IS_DIRECTORY "${ABL_CSEC}")23if (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()
39else()35else()
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_src55+ )
62- SOURCE_DIR ${CSEC_SOURCE_DIR}56+ find_library(CSEC_SHARED_LIB
63- CONFIGURE_COMMAND ""57+ NAMES libc_sec.so
64- BUILD_IN_SOURCE 158+ PATH_SUFFIXES lib lib64
65- BUILD_JOB_SERVER_AWARE ${CSEC_BUILD_JOB_SERVER_AWARE}59+ PATHS ${CSEC_INSTALL_PATH}
66- BUILD_COMMAND60+ NO_DEFAULT_PATH
67- ${CMAKE_MAKE_PROGRAM} -C <SOURCE_DIR> lib61+ )
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 169+ 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.cmake72+ 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_src86+ # 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=aee8368ef04a42a499edd5bfebce529e7f32dd138bfed383d316e48af4e45d2c101 URL_HASH SHA256=aee8368ef04a42a499edd5bfebce529e7f32dd138bfed383d316e48af4e45d2c
85 TIMEOUT 300102 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.cmake106 -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 PROPERTY132 set_property(TARGET shared_c_sec PROPERTY
106- IMPORTED_LOCATION ${CSEC_SOURCE_DIR}/lib/libc_sec.so133+ 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 PROPERTY137 set_property(TARGET static_c_sec PROPERTY
111- IMPORTED_LOCATION ${CSEC_SOURCE_DIR}/lib/libc_sec.a138+ 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()
135endif()147endif()
136 148 
137target_include_directories(c_sec_headers INTERFACE149target_include_directories(c_sec_headers INTERFACE