1#=============================================================================== 2# @brief cmake sdk build 3# Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED. 4#=============================================================================== 5 6# copy file or dir to the dest path in sdk 7function(install_dest_sdk src sdk_dest partern) 8 if (NOT DEFINED SDK_OUTPUT_PATH) 9 return() 10 endif() 11 string(REPLACE "*" "all" _partern ${partern}) 12 string(REPLACE "/" "_" _name ${src}_${_partern}) 13 string(REPLACE "@" "_" _name ${_name}) 14 if(TARGET COPY${_name}) 15 return() 16 endif() 17 string(REPLACE "${ROOT_DIR}" "${SDK_OUTPUT_PATH}" dest ${sdk_dest}) 18 add_custom_target(COPY${_name} ALL 19 COMMENT "--Installing ${src} => ${dest}" 20 COMMAND ${Python3_EXECUTABLE} ${BUILD_UTILS} copy "${src}" "${dest}" ".srcrelease" '${partern}' 21 ) 22 add_dependencies(COPY${_name} ${TARGET_NAME}) 23endfunction() 24 25# copy file or dir to it's sdk path 26function(install_sdk src partern) 27 if (NOT DEFINED SDK_OUTPUT_PATH) 28 return() 29 endif() 30 string(REPLACE "/" "_" _name ${src}) 31 string(REPLACE "@" "_" _name ${_name}) 32 if(TARGET COPY${_name}) 33 return() 34 endif() 35 string(REPLACE "${ROOT_DIR}" "${SDK_OUTPUT_PATH}" dest ${src}) 36 add_custom_target(COPY${_name} ALL 37 COMMENT "--Installing ${src} => ${dest}" 38 COMMAND ${Python3_EXECUTABLE} ${BUILD_UTILS} copy "${src}" "${dest}" ".srcrelease" '${partern}' 39 ) 40 add_dependencies(COPY${_name} ${TARGET_NAME}) 41endfunction() 42 43function(install_sdk_local src partern) 44 45 string(REPLACE "/" "_" _name ${src}) 46 string(REPLACE "@" "_" _name ${_name}) 47 if (TARGET COPY${_name}_local) 48 return() 49 endif () 50 set(dest ${src}) 51 get_filename_component(FILE_NAME ${src} NAME) 52 add_custom_target(COPY${_name}_local ALL 53 COMMENT "--Installing ${src} => ${dest}" 54 COMMAND ${Python3_EXECUTABLE} ${BUILD_UTILS} copy "${FILE_NAME}" "${dest}" ".srcrelease" '${partern}' 55 ) 56 add_dependencies(COPY${_name}_local ${TARGET_NAME}) 57 58endfunction() 59 60function(install_sdk_local_dest src dest partern) 61 62 string(REPLACE "/" "_" _name ${src}) 63 string(REPLACE "@" "_" _name ${_name}) 64 if (TARGET COPY${_name}_local) 65 return() 66 endif () 67 get_filename_component(FILE_NAME ${src} NAME) 68 add_custom_target(COPY${_name}_local ALL 69 COMMENT "--Installing ${src} => ${dest}" 70 COMMAND ${Python3_EXECUTABLE} ${BUILD_UTILS} copy "${src}" "${dest}" ".srcrelease" '${partern}' 71 ) 72 add_dependencies(COPY${_name}_local ${TARGET_NAME}) 73 74endfunction() 75 76function(install_sdk_by_sh src partern) 77 if (NOT DEFINED SDK_OUTPUT_PATH) 78 return() 79 endif() 80 return_if_not_build() 81 string(REPLACE "*" "all" _partern ${partern}) 82 string(REPLACE "/" "_" _name ${src}_${_partern}) 83 string(REPLACE "@" "_" _name ${_name}) 84 if(TARGET COPY${_name}) 85 return() 86 endif() 87 string(REPLACE "${ROOT_DIR}" "${SDK_OUTPUT_PATH}" dest ${src}) 88 add_custom_target(COPY${_name} ALL 89 COMMENT "--Installing ${src} => ${dest}" 90 COMMAND mkdir -p "${dest}" 91 COMMAND cp -rf "${src}/${partern}" "${dest}" || : 92 ) 93 add_dependencies(COPY${_name} ${TARGET_NAME}) 94endfunction() 95 96macro(install_lib_gen) 97 if (DEFINED SDK_OUTPUT_PATH AND DEFINED LIB_GEN_NAME AND ${COMPONENT_NAME} IN_LIST SDK_LIBGEN_COMPONENTS) 98 set(LIB_OUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/${LIB_GEN_NAME}) 99 string(REPLACE "${ROOT_DIR}" "${SDK_OUTPUT_PATH}" LIB_OUT_PATH ${LIB_OUT_PATH}) 100 endif() 101endmacro() 102 103macro(export_component_info) 104file(WRITE ${PROJECT_BINARY_DIR}/component_info/${COMPONENT_NAME} "SOURCES: ${SOURCES}\n") 105file(APPEND ${PROJECT_BINARY_DIR}/component_info/${COMPONENT_NAME} "HEADER: ${PRIVATE_HEADER}\n") 106file(APPEND ${PROJECT_BINARY_DIR}/component_info/${COMPONENT_NAME} "DEFINES: ${PRIVATE_DEFINES}\n") 107file(APPEND ${PROJECT_BINARY_DIR}/component_info/${COMPONENT_NAME} "COMPONENT_FLAGS: ${COMPONENT_FLAGS}\n") 108endmacro() 109 110macro(export_public_info) 111file(WRITE ${PROJECT_BINARY_DIR}/component_info/PUBLIC "PUBLIC_HEADER: ${ALL_PUBLIC_HEADER}\n") 112file(APPEND ${PROJECT_BINARY_DIR}/component_info/PUBLIC "PUBLIC_DEFINES: ${ALL_PUBLIC_DEFINES}\n") 113endmacro() 114 115macro(add_tooltrain) 116set(TOOLCHAIN_FILE ${PROJECT_BINARY_DIR}/toolchains/${TARGET_NAME}.json) 117file(WRITE ${TOOLCHAIN_FILE} 118"{ 119 \"CC\": \"${CMAKE_C_COMPILER}\", 120 \"CXX\": \"${CMAKE_CXX_COMPILER}\", 121 \"AS\": \"${CMAKE_ASM_COMPILER}\", 122 \"LD\": \"${CMAKE_LINKER}\", 123 \"AR\": \"${CMAKE_AR}\", 124 \"RANLIB\": \"${CMAKE_RANLIB}\", 125 \"STRIP\": \"${CMAKE_STRIP}\", 126 \"NM\": \"${CMAKE_NM}\", 127 \"OBJCOPY\": \"${CMAKE_OBJCOPY}\", 128 \"READELF\": \"${CMAKE_READELF}\", 129 \"OBJDUMP\": \"${CMAKE_OBJDUMP}\" 130}") 131endmacro(add_tooltrain) 132 133macro(sdk_export_component type) 134if (DEFINED SDK_OUTPUT_PATH) 135 set(COMPONENT_INFO ${PROJECT_BINARY_DIR}/component_info/info.json) 136 if(${type} STREQUAL "start") 137 set(START_SYMBOL "" CACHE INTERNAL "" FORCE) 138 file(WRITE ${COMPONENT_INFO} "{\n") 139 file(APPEND ${COMPONENT_INFO} 140 "\"COMPONENTS\":{") 141 elseif(${type} STREQUAL "end") 142 set(PUBLIC_INCLUDES) 143 foreach(pub_header ${ALL_PUBLIC_HEADER}) 144 get_filename_component(header ${pub_header} ABSOLUTE) 145 if (NOT ${header} IN_LIST PUBLIC_INCLUDES) 146 set(PUBLIC_INCLUDES ${PUBLIC_INCLUDES} ${header}) 147 endif() 148 endforeach() 149 list(REMOVE_DUPLICATES ALL_PUBLIC_DEFINES) 150 list(REMOVE_DUPLICATES ALL_PUBLIC_CCFLAGS) 151 list(REMOVE_DUPLICATES LOG_DEF_LIST) 152 set(STD_LIB_DIR ${LIB_GCC} ${LIB_C} ${LIB_CXX}) 153 file(APPEND ${COMPONENT_INFO} "},") 154 file(APPEND ${COMPONENT_INFO} "\"PUBLIC_INCLUDES\": \"${PUBLIC_INCLUDES}\",\n") 155 file(APPEND ${COMPONENT_INFO} "\"PUBLIC_DEFINES\": \"${ALL_PUBLIC_DEFINES}\",\n") 156 file(APPEND ${COMPONENT_INFO} "\"PUBLIC_CCFLAGS\": \"${ALL_PUBLIC_CCFLAGS}\",\n") 157 file(APPEND ${COMPONENT_INFO} "\"BIN_NAME\": \"${BIN_NAME}\",\n") 158 file(APPEND ${COMPONENT_INFO} "\"LINKFLAGS\": \"${LINKFLAGS}\",\n") 159 file(APPEND ${COMPONENT_INFO} "\"STD_LIB_DIR\": \"${STD_LIB_DIR}\",\n") 160 file(APPEND ${COMPONENT_INFO} "\"STD_LIBS\": \"${STD_LIBS}\",\n") 161 file(APPEND ${COMPONENT_INFO} "\"ARCH_FAMILY\": \"${ARCH_FAMILY}\",\n") 162 file(APPEND ${COMPONENT_INFO} "\"LINK_SCRIPT\": \"${LINK_SCRIPT}\",\n") 163 file(APPEND ${COMPONENT_INFO} "\"KERNEL\": \"${OS}\",\n") 164 file(APPEND ${COMPONENT_INFO} "\"LOS_ROOT\": \"${LOS_ROOT}\",\n") 165 file(APPEND ${COMPONENT_INFO} "\"LOS_PUB_CCFLAGS\": \"${LOS_PUB_CCFLAGS}\",\n") 166 file(APPEND ${COMPONENT_INFO} "\"LOG_DEF_LIST\": \"${LOG_DEF_LIST}\"\n") 167 file(APPEND ${COMPONENT_INFO} "}") 168 elseif(${type} STREQUAL "third_party") 169 if(DEFINED LIB_DIR) 170 set(LINK_LIB_DIR ${LIB_DIR}) 171 else() 172 set(LINK_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}) 173 endif() 174 file(APPEND ${COMPONENT_INFO} 175 "${START_SYMBOL} 176 \"${COMPONENT_NAME}\":{ 177 \"SOURCES\": \"${SOURCES}\", 178 \"THIRD_PARTY\": \"true\", 179 \"WHOLE_LINK\": \"${WHOLE_ARCHIV}\", 180 \"COMPONENT_CUSTOM_INCLUDE\": \"${COMPONENT_CUSTOM_INCLUDE}\", 181 \"LIB_DIR\":\"${LINK_LIB_DIR}\", 182 \"COMPONENT_CUSTOM_CCFLAGS\":\"${COMPONENT_CUSTOM_CCFLAGS}\", 183 \"COMPONENT_CUSTOM_DEFINES\":\"${COMPONENT_CUSTOM_DEFINES}\", 184 \"LIBS\":\"${LIBS}\" 185 } 186 ") 187 set(START_SYMBOL "," CACHE INTERNAL "" FORCE) 188 else() 189 if(DEFINED LIB_DIR) 190 set(LINK_LIB_DIR ${LIB_DIR}) 191 else() 192 check_if_closed_component(${COMPONENT_NAME}) 193 if (${COMPONENT_IS_CLOSED}) 194 set(LINK_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/${TARGET_COMMAND}) 195 else() 196 set(LINK_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}) 197 endif() 198 endif() 199 200 check_if_closed_component(${COMPONENT_NAME}) 201 if (${COMPONENT_IS_CLOSED}) 202 file(APPEND ${COMPONENT_INFO} 203 "${START_SYMBOL} 204 \"${COMPONENT_NAME}\":{ 205 \"SOURCES\": \"\", 206 \"PRIVATE_INCLUDE\": \"\", 207 \"PRIVATE_DEFINES\": \"\", 208 \"PRIVATE_CCFLAGS\": \"\", 209 \"WHOLE_LINK\": \"${WHOLE_ARCHIV}\", 210 \"LIB_DIR\":\"${LINK_LIB_DIR}\", 211 \"LIBS\":\"${LIBS}\", 212 \"MODULE_NAME\":\"${${COMPONENT_NAME}_MODULE_NAME}\", 213 \"AUTO_DEF\":\"${${COMPONENT_NAME}_AUTO_DEF}\" 214 } 215 ") 216 else() 217 file(APPEND ${COMPONENT_INFO} 218 "${START_SYMBOL} 219 \"${COMPONENT_NAME}\":{ 220 \"SOURCES\": \"${SOURCES}\", 221 \"PRIVATE_INCLUDE\": \"${PRIVATE_HEADER}\", 222 \"PRIVATE_DEFINES\": \"${PRIVATE_DEFINES}\", 223 \"PRIVATE_CCFLAGS\": \"${COMPONENT_CCFLAGS}\", 224 \"WHOLE_LINK\": \"${WHOLE_ARCHIV}\", 225 \"LIB_DIR\":\"${LINK_LIB_DIR}\", 226 \"LIBS\":\"${LIBS}\", 227 \"MODULE_NAME\":\"${${COMPONENT_NAME}_MODULE_NAME}\", 228 \"AUTO_DEF\":\"${${COMPONENT_NAME}_AUTO_DEF}\" 229 } 230 ") 231 endif() 232 set(START_SYMBOL "," CACHE INTERNAL "" FORCE) 233 endif() 234endif() 235endmacro() 236 237function(generate_project_file) 238 if (NOT DEFINED SDK_OUTPUT_PATH) 239 return() 240 endif() 241 set(COMPONENT_INFO ${PROJECT_BINARY_DIR}/component_info/info.json) 242 add_tooltrain() 243 set(CC_JSON "${PROJECT_BINARY_DIR}/compile_commands.json") 244 if("${SDK_PROJECT_FILE_DIR}" STREQUAL "" ) 245 set(SDK_PROJECT_FILE_DIR "${CMAKE_CURRENT_SOURCE_DIR}") 246 endif() 247 string(REPLACE "${PROJECT_SOURCE_DIR}" "${SDK_OUTPUT_PATH}" SDK_CURRENT_DIR ${SDK_PROJECT_FILE_DIR}) 248 string(REPLACE "${PROJECT_SOURCE_DIR}" "${SDK_OUTPUT_PATH}" SDK_CURRENT_COMPILER_DIR ${COMPILER_ROOT}) 249 list(JOIN SDK_TYPE "," SDK_TYPE_LIST) 250 251 add_custom_target(GEN_PROJECT ALL 252 COMMAND ${Python3_EXECUTABLE} ${PRO_GEN} "${SDK_TYPE_LIST}" "${MAIN_COMPONENT}" "${CC_JSON}" "${SDK_CURRENT_DIR}" "${PROJECT_SOURCE_DIR}" "${SDK_OUTPUT_PATH}" "${CHIP},${CORE},${BOARD},${ARCH},${OS},${PKG_TARGET_NAME}" "${TOOLCHAIN_FILE}" "${COMPONENT_INFO}" 253 WORKING_DIRECTORY ${PROJECT_BINARY_DIR} 254 COMMENT "Generating project file..." 255 ) 256 257 add_dependencies(GEN_PROJECT "${TARGET_NAME}") 258 if(NOT EXISTS ${SDK_CURRENT_COMPILER_DIR}) 259 get_filename_component(SDK_CURRENT_COMPILER_DIR_ABS "${SDK_CURRENT_COMPILER_DIR}/.." ABSOLUTE) 260 add_custom_target(GEN_COMPILER_LN ALL 261 WORKING_DIRECTORY ${PROJECT_BINARY_DIR} 262 COMMAND mkdir -p ${SDK_CURRENT_COMPILER_DIR_ABS} 263 COMMAND ln -s ${COMPILER_ROOT} ${SDK_CURRENT_COMPILER_DIR} 264 ) 265 if(DEFINED COMPILER_ROOT_WIN AND EXISTS ${COMPILER_ROOT_WIN}) 266 add_custom_target(GEN_COMPILER_WIN_LN ALL 267 WORKING_DIRECTORY ${PROJECT_BINARY_DIR} 268 COMMAND ln -s ${COMPILER_ROOT_WIN} ${SDK_CURRENT_COMPILER_DIR_ABS} 269 DEPENDS GEN_COMPILER_LN 270 ) 271 endif() 272 273 endif() 274endfunction(generate_project_file) 275