1#=============================================================================== 2# @brief cmake component build 3# Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED. 4#=============================================================================== 5macro(get_obj_path output obj_root) 6 set(ret) 7 foreach(src ${REGD_SOURCES}) 8 # filter full path 9 string(REPLACE "${CMAKE_CURRENT_SOURCE_DIR}/" "" relpath ${src}) 10 # make suffix to be .o 11 list(APPEND ret ${obj_root}/${relpath}.o) 12 endforeach() 13 set(${output} ${ret}) 14endmacro() 15 16macro(register_component) 17 set(${COMPONENT_NAME}_MODULE_NAME ${MODULE_NAME} CACHE INTERNAL "" FORCE) 18 set(${COMPONENT_NAME}_AUTO_DEF ${AUTO_DEF_FILE_ID} CACHE INTERNAL "" FORCE) 19 set(${COMPONENT_NAME}_SOURCES ${SOURCES} CACHE INTERNAL "" FORCE) 20endmacro(register_component) 21 22macro(component_on_rom) 23 if(${COMPONENT_NAME} IN_LIST RAM_COMPONENT) 24 set(COMPONENT_ON_ROM false) 25 elseif(${COMPONENT_NAME} IN_LIST ROM_COMPONENT) 26 set(COMPONENT_ON_ROM true) 27 else() 28 unset(COMPONENT_ON_ROM) 29 endif() 30endmacro() 31 32macro(need_whole_archiv) 33 set(WHOLE_ARCHIV false) 34 if (COMPONENT_ON_ROM STREQUAL true) 35 set(WHOLE_ARCHIV true) 36 endif() 37 if(DEFINED WHOLE_LINK AND WHOLE_LINK STREQUAL true) 38 set(WHOLE_ARCHIV true) 39 endif() 40 unset(WHOLE_LINK) 41endmacro() 42 43macro(replace_lib_output_path) 44 install_lib_gen() 45 if(DEFINED LIB) 46 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIB}) 47 endif() 48 if(DEFINED LIB_OUT_PATH) 49 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${LIB_OUT_PATH}) 50 endif() 51 if(DEFINED CMAKE_ARCHIVE_OUTPUT_DIRECTORY AND ${BUILD_ROM_CALLBACK} AND ${COMPONENT_ON_ROM}) 52 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_ARCHIVE_OUTPUT_DIRECTORY}-prerom) 53 endif() 54endmacro() 55 56macro(build_library) 57 set(lib_type STATIC) 58 if(DEFINED BUILD_AS_OBJ AND BUILD_AS_OBJ STREQUAL true) 59 set(lib_type OBJECT) 60 endif() 61 62 list(GET SOURCES 0 SOURCES0) 63 get_filename_component(SOURCES0 "${SOURCES0}" ABSOLUTE) 64 if(EXISTS ${SOURCES0}) 65 replace_lib_output_path() 66 add_library(${COMPONENT_NAME} 67 ${lib_type} 68 "${SOURCES}" 69 ) 70 71 target_compile_definitions(${COMPONENT_NAME} 72 PRIVATE 73 ${DEFINES} 74 ${PRIVATE_DEFINES} 75 ${PUBLIC_DEFINES} 76 ) 77 78 target_include_directories(${COMPONENT_NAME} 79 PRIVATE 80 ${PRIVATE_HEADER} 81 ${PUBLIC_HEADER} 82 $<$<COMPILE_LANGUAGE:CXX>:${CXX_HEADERS}> 83 ) 84 85 target_compile_options(${COMPONENT_NAME} 86 PRIVATE 87 ${COMPILE_CCFLAGS} 88 $<$<BOOL:${USE_KCONFIG}>:-include${PROJECT_BINARY_DIR}/mconfig.h> 89 ) 90 91 set(LINK_LIB_${COMPONENT_NAME} ${COMPONENT_NAME}) 92 register_component() 93 target_link_libraries(${COMPONENT_NAME} PRIVATE ${TARGETS_INTERFACES}) 94 else() 95 if(DEFINED LIB) 96 else() 97 message(STATUS "${SOURCES0} is not found, finding lib${COMPONENT_NAME}.a in ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND}") 98 find_library(LINK_LIB_${COMPONENT_NAME} "lib${COMPONENT_NAME}.a" ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND}) 99 if(NOT LINK_LIB_${COMPONENT_NAME}) 100 message(FATAL_ERROR "${SOURCES0} is not found && lib${COMPONENT_NAME}.a not find") 101 endif() 102 install_sdk(${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND}/lib${COMPONENT_NAME}.a "*") 103 endif() 104 105 endif() 106 107 if(WHOLE_ARCHIV STREQUAL false) 108 # treat as a non-rom component 109 target_link_libraries(${TARGET_NAME} 110 PRIVATE 111 ${LINK_LIB_${COMPONENT_NAME}} 112 ) 113 else() 114 # one on rom. 115 target_link_libraries(${TARGET_NAME} 116 PRIVATE 117 -Wl,--whole-archive ${LINK_LIB_${COMPONENT_NAME}} -Wl,--no-whole-archive 118 ) 119 endif() 120endmacro() 121 122macro(link_libs) 123 if(DEFINED LIBS) 124 if(WHOLE_ARCHIV STREQUAL false) 125 target_link_libraries(${TARGET_NAME} 126 PRIVATE 127 ${LIBS} 128 ) 129 else() 130 target_link_libraries(${TARGET_NAME} 131 PRIVATE 132 -Wl,--whole-archive ${LIBS} -Wl,--no-whole-archive 133 ) 134 endif() 135 endif() 136endmacro(link_libs) 137 138macro(main_component) 139 if(DEFINED MAIN_COMPONENT AND MAIN_COMPONENT STREQUAL true) 140 set(SDK_PROJECT_FILE_DIR "${CMAKE_CURRENT_SOURCE_DIR}" CACHE INTERNAL "" FORCE) 141 set(MAIN_COMPONENT "${COMPONENT_NAME}" CACHE INTERNAL "" FORCE) 142 endif() 143endmacro() 144 145macro(add_to_logdef) 146 if(DEFINED LOG_DEF) 147 set(LOG_DEF_LIST "${LOG_DEF_LIST}" "${LOG_DEF}" CACHE INTERNAL "" FORCE) 148 endif() 149endmacro(add_to_logdef) 150 151macro(install_file) 152 if (DEFINED SDK_OUTPUT_PATH) 153 check_if_closed_component(${COMPONENT_NAME}) 154 if (${COMPONENT_IS_CLOSED}) 155 if (TARGET ${COMPONENT_NAME}) 156 get_property(LIB_PATH TARGET ${COMPONENT_NAME} PROPERTY BINARY_DIR) 157 endif() 158 159 if(DEFINED LIB) 160 install_sdk(${LIB}/ "*") 161 elseif(DEFINED LIB_OUT_PATH) 162 install_dest_sdk(${LIB_OUT_PATH}/lib${COMPONENT_NAME}.a ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND}/lib${COMPONENT_NAME}.a "*.a") 163 elseif(LIB_PATH) 164 install_dest_sdk(${LIB_PATH}/lib${COMPONENT_NAME}.a ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND}/lib${COMPONENT_NAME}.a "*.a") 165 endif() 166 else() 167 foreach(src ${SOURCES}) 168 install_sdk(${src} "*") 169 endforeach() 170 foreach(header ${PRIVATE_HEADER} ${PUBLIC_HEADER}) 171 install_sdk(${header} "*.h") 172 endforeach() 173 endif() 174 175 foreach(lib ${LIBS}) 176 install_sdk(${lib} "*") 177 endforeach() 178 endif() 179endmacro(install_file) 180 181macro(define_this_module_and_file_id) 182 foreach(filename ${SOURCES}) 183 if(filename STREQUAL "") 184 continue() 185 endif() 186 if(${AUTO_DEF_FILE_ID}) 187 string(STRIP ${filename} filename) 188 get_filename_component(barename ${filename} NAME) 189 string(REPLACE "." "_" barename ${barename}) 190 string(TOUPPER ${barename} barename) 191 string(STRIP ${barename} barename) 192 set_property( 193 SOURCE ${filename} 194 APPEND 195 PROPERTY COMPILE_DEFINITIONS 196 THIS_FILE_ID=${barename}) 197 endif() 198 199 if(${AUTO_DEF_MODULE_ID}) 200 set(prefix "LOG_") 201 set(suffix "MODULE") 202 string(TOUPPER ${MODULE_NAME} mod_name) 203 string(JOIN ${mod_name} mod_name ${prefix} ${suffix}) 204 set_property( 205 SOURCE ${filename} 206 APPEND 207 PROPERTY COMPILE_DEFINITIONS 208 THIS_MOD_ID=${mod_name}) 209 endif() 210 endforeach() 211endmacro(define_this_module_and_file_id) 212 213macro(unset_var) 214 UNSET(COMPONENT_NAME) 215 UNSET(SOURCES) 216 UNSET(PRIVATE_HEADER) 217 UNSET(PUBLIC_HEADER) 218 UNSET(PRIVATE_DEFINES) 219 UNSET(PUBLIC_DEFINES) 220 UNSET(COMPONENT_CCFLAGS) 221 UNSET(COMPONENT_PUBLIC_CCFLAGS) 222 UNSET(BUILD_AS_OBJ) 223 UNSET(LOG_DEF) 224 UNSET(WHOLE_LINK) 225 UNSET(LINK_LIB_${COMPONENT_NAME}) 226 UNSET(LIB_OUT_PATH) 227 UNSET(LIB_DIR) 228 UNSET(LIBS) 229 UNSET(LIB) 230 UNSET(REWRITE_CCFLAGS) 231 UNSET(COMPONENT_IS_CLOSED) 232endmacro(unset_var) 233 234 235macro(build_component) 236 # check this component whether on the rom. 237 # set(one_value ONROM) 238 # set(multi_value SOURCES PRIVATE_HEADER PUBLIC_HEADER PRIVATE_DEFINES PUBLIC_DEFINES CCFLAGS) 239 # cmake_parse_arguments(REGD "${option}" "${one_value}" "${multi_value}" ${ARGN}) 240 component_on_rom() 241 if(DEFINED ROM_SYM_PATH AND COMPONENT_ON_ROM) 242 add_library(${COMPONENT_NAME}_interface INTERFACE) 243 target_include_directories(${COMPONENT_NAME}_interface INTERFACE ${PUBLIC_HEADER}) 244 target_compile_definitions(${COMPONENT_NAME}_interface INTERFACE ${PUBLIC_DEFINES}) 245 list(GET SOURCES 0 SOURCES0) 246 get_filename_component(SOURCES0 "${SOURCES0}" ABSOLUTE) 247 if(EXISTS ${SOURCES0}) 248 register_component() 249 endif() 250 elseif(DEFINED COMPONENT_ON_ROM) 251 need_whole_archiv() 252 if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/private) 253 set(PRIVATE_HEADER ${PRIVATE_HEADER} ${CMAKE_CURRENT_SOURCE_DIR}/private) 254 endif() 255 if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/public) 256 set(PUBLIC_HEADER ${PUBLIC_HEADER} ${CMAKE_CURRENT_SOURCE_DIR}/public) 257 endif() 258 if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/include) 259 set(PUBLIC_HEADER ${PUBLIC_HEADER} ${CMAKE_CURRENT_SOURCE_DIR}/include) 260 endif() 261 if(COMPONENT_ON_ROM STREQUAL false) 262 if(REWRITE_CCFLAGS STREQUAL true) 263 set(COMPILE_CCFLAGS ${COMPONENT_CCFLAGS}) 264 else() 265 # treat as a non-rom component 266 set(COMPILE_CCFLAGS ${CCFLAGS} ${COMPONENT_CCFLAGS}) 267 endif() 268 else() 269 # one on rom. 270 271 set(COMPILE_CCFLAGS ${ROM_CCFLAGS}) 272 endif() 273 274 check_if_closed_component(${COMPONENT_NAME}) 275 if (RELEASE OR ${COMPONENT_IS_CLOSED}) 276 list(REMOVE_ITEM COMPILE_CCFLAGS "-g") 277 endif() 278 279 add_library(${COMPONENT_NAME}_interface INTERFACE) 280 target_include_directories(${COMPONENT_NAME}_interface INTERFACE ${PUBLIC_HEADER}) 281 target_compile_definitions(${COMPONENT_NAME}_interface INTERFACE ${PUBLIC_DEFINES}) 282 target_compile_options(${COMPONENT_NAME}_interface INTERFACE ${COMPONENT_PUBLIC_CCFLAGS}) 283 set(TARGETS_INTERFACES ${RAM_COMPONENT} ${ROM_COMPONENT}) 284 list(TRANSFORM TARGETS_INTERFACES APPEND "_interface") 285 286 list(LENGTH PUBLIC_HEADER PUBLIC_HEADER_NUM) 287 if(NOT ${PUBLIC_HEADER_NUM} EQUAL 0) 288 set(ALL_PUBLIC_HEADER "${ALL_PUBLIC_HEADER}" "${PUBLIC_HEADER}" CACHE INTERNAL "" FORCE) 289 endif() 290 291 if(DEFINED LOG_CUSTOM_ENABLE) 292 if(${LOG_CUSTOM_ENABLE} STREQUAL True) 293 if(NOT ${PUBLIC_HEADER_NUM} EQUAL 0) 294 set(ALL_HEADER_DIRS "${ALL_HEADER_DIRS}" "${PUBLIC_HEADER}" CACHE INTERNAL "" FORCE) 295 endif() 296 297 list(LENGTH PRIVATE_HEADER PRIVATE_HEADER_NUM) 298 if(NOT ${PRIVATE_HEADER_NUM} EQUAL 0) 299 set(ALL_HEADER_DIRS "${ALL_HEADER_DIRS}" "${PRIVATE_HEADER}" CACHE INTERNAL "" FORCE) 300 endif() 301 302 list(LENGTH PUBLIC_DEFINES PUBLIC_DEFINES_NUM) 303 if(NOT ${PUBLIC_DEFINES_NUM} EQUAL 0) 304 set(ALL_DEFINES "${ALL_DEFINES}" "${PUBLIC_DEFINES}" CACHE INTERNAL "" FORCE) 305 endif() 306 307 list(LENGTH PRIVATE_DEFINES PRIVATE_DEFINES_NUM) 308 if(NOT ${PRIVATE_DEFINES_NUM} EQUAL 0) 309 set(ALL_DEFINES "${ALL_DEFINES}" "${PRIVATE_DEFINES}" CACHE INTERNAL "" FORCE) 310 endif() 311 312 list(LENGTH DEFINES DEFINES_NUM) 313 if(NOT ${DEFINES_NUM} EQUAL 0) 314 set(ALL_DEFINES "${ALL_DEFINES}" "${DEFINES}" CACHE INTERNAL "" FORCE) 315 endif() 316 endif() 317 endif() 318 319 set(ALL_PUBLIC_DEFINES "${ALL_PUBLIC_DEFINES}" "${PUBLIC_DEFINES}" CACHE INTERNAL "" FORCE) 320 set(ALL_PUBLIC_CCFLAGS "${ALL_PUBLIC_CCFLAGS}" "${COMPONENT_PUBLIC_CCFLAGS}" CACHE INTERNAL "" FORCE) 321 link_libs() 322 list(LENGTH SOURCES SOURCES_NUM) 323 if(NOT ${SOURCES_NUM} EQUAL 0) 324 build_library() 325 endif() 326 if(${BUILD_ROM_CALLBACK} AND ${COMPONENT_ON_ROM}) 327 reg_rom_callback() 328 endif() 329 define_this_module_and_file_id() 330 sdk_export_component("component") 331 install_file() 332 add_to_logdef() 333 main_component() 334 endif() 335 unset_var() 336endmacro() 337