You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

utils.cmake 18 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. include(FetchContent) # 下载第三方库
  2. set(FETCHCONTENT_QUIET OFF)
  3. function(mindspore_add_submodule_obj des_submodule_objs sub_dir submodule_name_obj)
  4. add_subdirectory(${sub_dir})
  5. if(NOT TARGET ${submodule_name_obj})
  6. message(FATAL_ERROR "Can not find submodule '${submodule_name_obj}'. in ${CMAKE_CURRENT_LIST_FILE}")
  7. endif()
  8. if("$<TARGET_OBJECTS:${submodule_name_obj}>" IN_LIST ${des_submodule_objs})
  9. message(FATAL_ERROR "submodule '${submodule_name_obj}' added more than once. in ${CMAKE_CURRENT_LIST_FILE}")
  10. endif()
  11. set(${des_submodule_objs} ${${des_submodule_objs}} $<TARGET_OBJECTS:${submodule_name_obj}> PARENT_SCOPE)
  12. endfunction()
  13. if (DEFINED ENV{MSLIBS_CACHE_PATH})
  14. set(_MS_LIB_CACHE $ENV{MSLIBS_CACHE_PATH})
  15. else()
  16. set(_MS_LIB_CACHE ${CMAKE_BINARY_DIR}/.mslib)
  17. endif ()
  18. message("MS LIBS CACHE PATH: ${_MS_LIB_CACHE}")
  19. if (NOT EXISTS ${_MS_LIB_CACHE})
  20. file(MAKE_DIRECTORY ${_MS_LIB_CACHE})
  21. endif ()
  22. if (DEFINED ENV{MSLIBS_SERVER}) # export MSLIBS_SERVER=49.4.0.74
  23. set(LOCAL_LIBS_SERVER $ENV{MSLIBS_SERVER})
  24. message("LOCAL_LIBS_SERVER: ${LOCAL_LIBS_SERVER}")
  25. endif ()
  26. include(ProcessorCount) # 确定处理器/核的数量并将值保存在${var}中
  27. ProcessorCount(N)
  28. if (JOBS)
  29. set(THNUM ${JOBS})
  30. else()
  31. set(JOBS 8)
  32. if (${JOBS} GREATER ${N})
  33. set(THNUM ${N})
  34. else()
  35. set(THNUM ${JOBS})
  36. endif()
  37. endif ()
  38. message("set make thread num: ${THNUM}")
  39. if(LOCAL_LIBS_SERVER)
  40. if (NOT ENV{no_proxy})
  41. set(ENV{no_proxy} "${LOCAL_LIBS_SERVER}")
  42. else()
  43. string(FIND $ENV{no_proxy} ${LOCAL_LIBS_SERVER} IP_POS)
  44. if (${IP_POS} EQUAL -1)
  45. set(ENV{no_proxy} "$ENV{no_proxy},${LOCAL_LIBS_SERVER}")
  46. endif ()
  47. endif ()
  48. endif()
  49. function(__download_pkg pkg_name pkg_url pkg_md5)
  50. if(LOCAL_LIBS_SERVER)
  51. get_filename_component(_URL_FILE_NAME ${pkg_url} NAME)
  52. set(pkg_url "http://${LOCAL_LIBS_SERVER}:8081/libs/${pkg_name}/${_URL_FILE_NAME}" ${pkg_url})
  53. endif()
  54. FetchContent_Declare( # 获取项目。可以是一个URL也可以是一个Git仓库。
  55. ${pkg_name}
  56. URL ${pkg_url}
  57. URL_HASH MD5=${pkg_md5}
  58. )
  59. FetchContent_GetProperties(${pkg_name}) # 获取我们需要的变量MyName_*。
  60. message("download: ${${pkg_name}_SOURCE_DIR} , ${pkg_name} , ${pkg_url}")
  61. if(NOT ${pkg_name}_POPULATED)
  62. FetchContent_Populate(${pkg_name}) # 将信息记录在可以随时查询的全局属性中
  63. set(${pkg_name}_SOURCE_DIR ${${pkg_name}_SOURCE_DIR} PARENT_SCOPE)
  64. endif()
  65. endfunction()
  66. function(__download_pkg_with_git pkg_name pkg_url pkg_git_commit pkg_md5)
  67. if(LOCAL_LIBS_SERVER)
  68. set(pkg_url "http://${LOCAL_LIBS_SERVER}:8081/libs/${pkg_name}/${pkg_git_commit}")
  69. FetchContent_Declare(
  70. ${pkg_name}
  71. URL ${pkg_url}
  72. URL_HASH MD5=${pkg_md5}
  73. )
  74. else()
  75. FetchContent_Declare(
  76. ${pkg_name}
  77. GIT_REPOSITORY ${pkg_url}
  78. GIT_TAG ${pkg_git_commit})
  79. endif()
  80. FetchContent_GetProperties(${pkg_name})
  81. message("download: ${${pkg_name}_SOURCE_DIR} , ${pkg_name} , ${pkg_url}")
  82. if(NOT ${pkg_name}_POPULATED)
  83. FetchContent_Populate(${pkg_name})
  84. set(${pkg_name}_SOURCE_DIR ${${pkg_name}_SOURCE_DIR} PARENT_SCOPE)
  85. endif()
  86. endfunction()
  87. function(__find_pkg_then_add_target pkg_name pkg_exe lib_path)
  88. unset(${pkg_name}_LIBS)
  89. message("_FIND:${${pkg_name}_BASE_DIR}")
  90. if(pkg_exe)
  91. # find_program:该命令用于查找程序。<VAR>创建名为的缓存条目以存储此命令的结果。
  92. # 如果找到程序,则结果存储在变量中,除非清除变量,否则将不会重复搜索。如果什么也没找到,结果将是<VAR>-NOTFOUND。
  93. find_program(${pkg_exe}_EXE ${pkg_exe} PATHS ${${pkg_name}_BASE_DIR}/bin NO_DEFAULT_PATH)
  94. if(NOT ${pkg_exe}_EXE)
  95. return()
  96. endif()
  97. # add_executable: 使用给定的源文件,为工程引入一个可执行文件。
  98. # IMPORTED:一个导入的可执行目标引用了一个位于工程之外的可执行文件。
  99. add_executable(${pkg_name}::${pkg_exe} IMPORTED GLOBAL)
  100. set_target_properties(${pkg_name}::${pkg_exe} PROPERTIES
  101. IMPORTED_LOCATION ${${pkg_exe}_EXE}
  102. )
  103. message("found ${${pkg_exe}_EXE}")
  104. endif()
  105. foreach(_LIB_NAME ${ARGN})
  106. set(_LIB_SEARCH_NAME ${_LIB_NAME})
  107. set(_LIB_TYPE SHARED)
  108. if (${pkg_name}_USE_STATIC_LIBS)
  109. set(_LIB_SEARCH_NAME "${CMAKE_STATIC_LIBRARY_PREFIX}${_LIB_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}")
  110. set(_LIB_TYPE STATIC)
  111. endif ()
  112. set(${_LIB_NAME}_LIB ${_LIB_NAME}_LIB-NOTFOUND)
  113. find_library(${_LIB_NAME}_LIB ${_LIB_SEARCH_NAME} PATHS ${${pkg_name}_BASE_DIR}/${lib_path} NO_DEFAULT_PATH)
  114. if (NOT ${_LIB_NAME}_LIB AND BUILD_LITE AND PLATFORM_ARM)
  115. set(${_LIB_NAME}_LIB "${${pkg_name}_BASE_DIR}/${lib_path}/lib${_LIB_SEARCH_NAME}.so")
  116. endif(NOT ${_LIB_NAME}_LIB AND BUILD_LITE AND PLATFORM_ARM)
  117. if(NOT ${_LIB_NAME}_LIB)
  118. return()
  119. endif()
  120. add_library(${pkg_name}::${_LIB_NAME} ${_LIB_TYPE} IMPORTED GLOBAL)
  121. if (WIN32 AND ${_LIB_TYPE} STREQUAL "SHARED")
  122. set_target_properties(${pkg_name}::${_LIB_NAME} PROPERTIES IMPORTED_IMPLIB_RELEASE ${${_LIB_NAME}_LIB})
  123. else()
  124. set_target_properties(${pkg_name}::${_LIB_NAME} PROPERTIES IMPORTED_LOCATION ${${_LIB_NAME}_LIB})
  125. endif()
  126. if (EXISTS ${${pkg_name}_BASE_DIR}/include)
  127. set_target_properties(${pkg_name}::${_LIB_NAME} PROPERTIES
  128. INTERFACE_INCLUDE_DIRECTORIES "${${pkg_name}_BASE_DIR}/include")
  129. endif ()
  130. list(APPEND ${pkg_name}_LIBS ${pkg_name}::${_LIB_NAME})
  131. message("found ${${_LIB_NAME}_LIB}")
  132. STRING( REGEX REPLACE "(.+)/(.+)" "\\1" LIBPATH ${${_LIB_NAME}_LIB})
  133. set(${pkg_name}_LIBPATH ${LIBPATH} CACHE STRING INTERNAL)
  134. endforeach(_LIB_NAME)
  135. set(${pkg_name}_LIBS ${${pkg_name}_LIBS} PARENT_SCOPE)
  136. endfunction()
  137. function(__exec_cmd)
  138. set(options )
  139. set(oneValueArgs WORKING_DIRECTORY)
  140. set(multiValueArgs COMMAND)
  141. cmake_parse_arguments(EXEC "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
  142. execute_process(COMMAND ${EXEC_COMMAND}
  143. WORKING_DIRECTORY ${EXEC_WORKING_DIRECTORY}
  144. RESULT_VARIABLE RESULT)
  145. if(NOT RESULT EQUAL "0")
  146. message(FATAL_ERROR "error! when ${EXEC_COMMAND} in ${EXEC_WORKING_DIRECTORY}")
  147. endif()
  148. endfunction()
  149. function(__check_patches pkg_patches)
  150. # check patches
  151. if (PKG_PATCHES)
  152. file(TOUCH ${_MS_LIB_CACHE}/${pkg_name}_patch.md5)
  153. file(READ ${_MS_LIB_CACHE}/${pkg_name}_patch.md5 ${pkg_name}_PATCHES_MD5)
  154. message("patches md5:${${pkg_name}_PATCHES_MD5}")
  155. set(${pkg_name}_PATCHES_NEW_MD5 )
  156. foreach(_PATCH ${PKG_PATCHES})
  157. file(MD5 ${_PATCH} _PF_MD5)
  158. set(${pkg_name}_PATCHES_NEW_MD5 "${${pkg_name}_PATCHES_NEW_MD5},${_PF_MD5}")
  159. endforeach(_PATCH)
  160. if (NOT ${pkg_name}_PATCHES_MD5 STREQUAL ${pkg_name}_PATCHES_NEW_MD5)
  161. set(${pkg_name}_PATCHES ${PKG_PATCHES})
  162. file(REMOVE_RECURSE "${_MS_LIB_CACHE}/${pkg_name}-subbuild")
  163. file(WRITE ${_MS_LIB_CACHE}/${pkg_name}_patch.md5 ${${pkg_name}_PATCHES_NEW_MD5})
  164. message("patches changed : ${${pkg_name}_PATCHES_NEW_MD5}")
  165. endif ()
  166. endif ()
  167. endfunction()
  168. set(MS_FIND_NO_DEFAULT_PATH NO_CMAKE_PATH NO_CMAKE_ENVIRONMENT_PATH NO_SYSTEM_ENVIRONMENT_PATH
  169. NO_CMAKE_BUILDS_PATH NO_CMAKE_PACKAGE_REGISTRY NO_CMAKE_SYSTEM_PATH
  170. NO_CMAKE_SYSTEM_PACKAGE_REGISTRY)
  171. set(MS_FIND_NO_DEFAULT_PATH ${MS_FIND_NO_DEFAULT_PATH} PARENT_SCOPE)
  172. function(mindspore_add_pkg pkg_name )
  173. message("---------add pkg: " ${pkg_name} "---------")
  174. set(options )
  175. set(oneValueArgs URL MD5 GIT_REPOSITORY GIT_TAG VER EXE DIR HEAD_ONLY CMAKE_PATH RELEASE LIB_PATH CUSTOM_CMAKE)
  176. set(multiValueArgs CMAKE_OPTION LIBS PRE_CONFIGURE_COMMAND CONFIGURE_COMMAND BUILD_OPTION INSTALL_INCS INSTALL_LIBS PATCHES SUBMODULES SOURCEMODULES ONLY_MAKE ONLY_MAKE_INCS ONLY_MAKE_LIBS)
  177. cmake_parse_arguments(PKG "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN} )
  178. if (NOT PKG_LIB_PATH)
  179. set(PKG_LIB_PATH lib)
  180. endif ()
  181. if(NOT PKG_EXE)
  182. set(PKG_EXE 0)
  183. endif()
  184. set(__FIND_PKG_NAME ${pkg_name})
  185. string(TOLOWER ${pkg_name} pkg_name)
  186. message("pkg name:${__FIND_PKG_NAME},${pkg_name}")
  187. set(${pkg_name}_PATCHES_HASH )
  188. foreach(_PATCH ${PKG_PATCHES})
  189. file(MD5 ${_PATCH} _PF_MD5)
  190. set(${pkg_name}_PATCHES_HASH "${${pkg_name}_PATCHES_HASH},${_PF_MD5}")
  191. endforeach(_PATCH)
  192. # check options
  193. set(${pkg_name}_CONFIG_TXT
  194. "${CMAKE_CXX_COMPILER_VERSION}-${CMAKE_C_COMPILER_VERSION}
  195. ${ARGN} - ${${pkg_name}_USE_STATIC_LIBS}- ${${pkg_name}_PATCHES_HASH}
  196. ${${pkg_name}_CXXFLAGS}--${${pkg_name}_CFLAGS}--${${pkg_name}_LDFLAGS}")
  197. string(REPLACE ";" "-" ${pkg_name}_CONFIG_TXT ${${pkg_name}_CONFIG_TXT})
  198. string(MD5 ${pkg_name}_CONFIG_HASH ${${pkg_name}_CONFIG_TXT})
  199. message("${pkg_name} config hash: ${${pkg_name}_CONFIG_HASH}")
  200. set(${pkg_name}_BASE_DIR ${_MS_LIB_CACHE}/${pkg_name}_${${pkg_name}_CONFIG_HASH})
  201. set(${pkg_name}_DIRPATH ${${pkg_name}_BASE_DIR} CACHE STRING INTERNAL)
  202. if(EXISTS ${${pkg_name}_BASE_DIR}/options.txt AND PKG_HEAD_ONLY)
  203. set(${pkg_name}_INC ${${pkg_name}_BASE_DIR}/${PKG_HEAD_ONLY} PARENT_SCOPE)
  204. add_library(${pkg_name} INTERFACE)
  205. target_include_directories(${pkg_name} INTERFACE ${${pkg_name}_INC})
  206. if (${PKG_RELEASE})
  207. __find_pkg_then_add_target(${pkg_name} ${PKG_EXE} ${PKG_LIB_PATH} ${PKG_LIBS})
  208. endif ()
  209. return()
  210. endif ()
  211. set(${__FIND_PKG_NAME}_ROOT ${${pkg_name}_BASE_DIR})
  212. set(${__FIND_PKG_NAME}_ROOT ${${pkg_name}_BASE_DIR} PARENT_SCOPE)
  213. if (PKG_LIBS)
  214. __find_pkg_then_add_target(${pkg_name} ${PKG_EXE} ${PKG_LIB_PATH} ${PKG_LIBS})
  215. if(${pkg_name}_LIBS)
  216. set(${pkg_name}_INC ${${pkg_name}_BASE_DIR}/include PARENT_SCOPE)
  217. message("Found libs: ${${pkg_name}_LIBS}")
  218. return()
  219. endif()
  220. elseif(NOT PKG_HEAD_ONLY)
  221. find_package(${__FIND_PKG_NAME} ${PKG_VER} ${MS_FIND_NO_DEFAULT_PATH})
  222. if (${__FIND_PKG_NAME}_FOUND)
  223. set(${pkg_name}_INC ${${pkg_name}_BASE_DIR}/include PARENT_SCOPE)
  224. message("Found pkg: ${__FIND_PKG_NAME}")
  225. return()
  226. endif ()
  227. endif ()
  228. if (NOT PKG_DIR)
  229. if (PKG_GIT_REPOSITORY)
  230. __download_pkg_with_git(${pkg_name} ${PKG_GIT_REPOSITORY} ${PKG_GIT_TAG} ${PKG_MD5})
  231. else()
  232. __download_pkg(${pkg_name} ${PKG_URL} ${PKG_MD5})
  233. endif()
  234. foreach(_SUBMODULE_FILE ${PKG_SUBMODULES})
  235. STRING( REGEX REPLACE "(.+)_(.+)" "\\1" _SUBMODEPATH ${_SUBMODULE_FILE})
  236. STRING( REGEX REPLACE "(.+)/(.+)" "\\2" _SUBMODENAME ${_SUBMODEPATH})
  237. file(GLOB ${pkg_name}_INSTALL_SUBMODULE ${_SUBMODULE_FILE}/*)
  238. file(COPY ${${pkg_name}_INSTALL_SUBMODULE} DESTINATION ${${pkg_name}_SOURCE_DIR}/3rdparty/${_SUBMODENAME})
  239. endforeach (_SUBMODULE_FILE)
  240. else()
  241. set(${pkg_name}_SOURCE_DIR ${PKG_DIR})
  242. endif ()
  243. file(WRITE ${${pkg_name}_BASE_DIR}/options.txt ${${pkg_name}_CONFIG_TXT})
  244. message("${pkg_name}_SOURCE_DIR : ${${pkg_name}_SOURCE_DIR}")
  245. foreach(_PATCH_FILE ${PKG_PATCHES})
  246. get_filename_component(_PATCH_FILE_NAME ${_PATCH_FILE} NAME)
  247. set(_LF_PATCH_FILE ${CMAKE_BINARY_DIR}/_ms_patch/${_PATCH_FILE_NAME})
  248. configure_file(${_PATCH_FILE} ${_LF_PATCH_FILE} NEWLINE_STYLE LF @ONLY)
  249. message("patching ${${pkg_name}_SOURCE_DIR} -p1 < ${_LF_PATCH_FILE}")
  250. execute_process(COMMAND ${Patch_EXECUTABLE} -p1 INPUT_FILE ${_LF_PATCH_FILE}
  251. WORKING_DIRECTORY ${${pkg_name}_SOURCE_DIR}
  252. RESULT_VARIABLE Result)
  253. if(NOT Result EQUAL "0")
  254. message(FATAL_ERROR "Failed patch: ${_LF_PATCH_FILE}")
  255. endif()
  256. endforeach(_PATCH_FILE)
  257. foreach(_SOURCE_DIR ${PKG_SOURCEMODULES})
  258. file(GLOB ${pkg_name}_INSTALL_SOURCE ${${pkg_name}_SOURCE_DIR}/${_SOURCE_DIR}/*)
  259. file(COPY ${${pkg_name}_INSTALL_SOURCE} DESTINATION ${${pkg_name}_BASE_DIR}/${_SOURCE_DIR}/)
  260. endforeach (_SUBMODULE_FILE)
  261. file(LOCK ${${pkg_name}_BASE_DIR} DIRECTORY GUARD FUNCTION RESULT_VARIABLE ${pkg_name}_LOCK_RET TIMEOUT 600)
  262. if(NOT ${pkg_name}_LOCK_RET EQUAL "0")
  263. message(FATAL_ERROR "error! when try lock ${${pkg_name}_BASE_DIR} : ${${pkg_name}_LOCK_RET}")
  264. endif()
  265. if (PKG_CUSTOM_CMAKE)
  266. file(GLOB ${pkg_name}_cmake ${PKG_CUSTOM_CMAKE}/CMakeLists.txt)
  267. file(COPY ${${pkg_name}_cmake} DESTINATION ${${pkg_name}_SOURCE_DIR})
  268. endif ()
  269. if(${pkg_name}_SOURCE_DIR)
  270. if (PKG_HEAD_ONLY)
  271. file(GLOB ${pkg_name}_SOURCE_SUBDIRS ${${pkg_name}_SOURCE_DIR}/*)
  272. file(COPY ${${pkg_name}_SOURCE_SUBDIRS} DESTINATION ${${pkg_name}_BASE_DIR})
  273. set(${pkg_name}_INC ${${pkg_name}_BASE_DIR}/${PKG_HEAD_ONLY} PARENT_SCOPE)
  274. if (NOT PKG_RELEASE)
  275. add_library(${pkg_name} INTERFACE)
  276. target_include_directories(${pkg_name} INTERFACE ${${pkg_name}_INC})
  277. endif ()
  278. elseif (PKG_ONLY_MAKE)
  279. __exec_cmd(COMMAND ${CMAKE_MAKE_PROGRAM} ${${pkg_name}_CXXFLAGS} -j${THNUM}
  280. WORKING_DIRECTORY ${${pkg_name}_SOURCE_DIR})
  281. set(PKG_INSTALL_INCS ${PKG_ONLY_MAKE_INCS})
  282. set(PKG_INSTALL_LIBS ${PKG_ONLY_MAKE_LIBS})
  283. file(GLOB ${pkg_name}_INSTALL_INCS ${${pkg_name}_SOURCE_DIR}/${PKG_INSTALL_INCS})
  284. file(GLOB ${pkg_name}_INSTALL_LIBS ${${pkg_name}_SOURCE_DIR}/${PKG_INSTALL_LIBS})
  285. file(COPY ${${pkg_name}_INSTALL_INCS} DESTINATION ${${pkg_name}_BASE_DIR}/include)
  286. file(COPY ${${pkg_name}_INSTALL_LIBS} DESTINATION ${${pkg_name}_BASE_DIR}/lib)
  287. elseif (PKG_CMAKE_OPTION)
  288. # in cmake
  289. file(MAKE_DIRECTORY ${${pkg_name}_SOURCE_DIR}/_build)
  290. if (${pkg_name}_CFLAGS)
  291. set(${pkg_name}_CMAKE_CFLAGS "-DCMAKE_C_FLAGS=${${pkg_name}_CFLAGS}")
  292. endif ()
  293. if (${pkg_name}_CXXFLAGS)
  294. set(${pkg_name}_CMAKE_CXXFLAGS "-DCMAKE_CXX_FLAGS=${${pkg_name}_CXXFLAGS}")
  295. endif ()
  296. if (${pkg_name}_LDFLAGS)
  297. if (${pkg_name}_USE_STATIC_LIBS)
  298. #set(${pkg_name}_CMAKE_LDFLAGS "-DCMAKE_STATIC_LINKER_FLAGS=${${pkg_name}_LDFLAGS}")
  299. else()
  300. set(${pkg_name}_CMAKE_LDFLAGS "-DCMAKE_SHARED_LINKER_FLAGS=${${pkg_name}_LDFLAGS}")
  301. endif ()
  302. endif ()
  303. __exec_cmd(COMMAND ${CMAKE_COMMAND} ${PKG_CMAKE_OPTION} -G ${CMAKE_GENERATOR}
  304. ${${pkg_name}_CMAKE_CFLAGS} ${${pkg_name}_CMAKE_CXXFLAGS} ${${pkg_name}_CMAKE_LDFLAGS}
  305. -DCMAKE_INSTALL_PREFIX=${${pkg_name}_BASE_DIR} ${${pkg_name}_SOURCE_DIR}/${PKG_CMAKE_PATH}
  306. WORKING_DIRECTORY ${${pkg_name}_SOURCE_DIR}/_build)
  307. __exec_cmd(COMMAND ${CMAKE_COMMAND} --build . --target install -- -j${THNUM}
  308. WORKING_DIRECTORY ${${pkg_name}_SOURCE_DIR}/_build)
  309. else()
  310. if (${pkg_name}_CFLAGS)
  311. set(${pkg_name}_MAKE_CFLAGS "CFLAGS=${${pkg_name}_CFLAGS}")
  312. endif ()
  313. if (${pkg_name}_CXXFLAGS)
  314. set(${pkg_name}_MAKE_CXXFLAGS "CXXFLAGS=${${pkg_name}_CXXFLAGS}")
  315. endif ()
  316. if (${pkg_name}_LDFLAGS)
  317. set(${pkg_name}_MAKE_LDFLAGS "LDFLAGS=${${pkg_name}_LDFLAGS}")
  318. endif ()
  319. # in configure && make
  320. if (PKG_PRE_CONFIGURE_COMMAND)
  321. __exec_cmd(COMMAND ${PKG_PRE_CONFIGURE_COMMAND}
  322. WORKING_DIRECTORY ${${pkg_name}_SOURCE_DIR})
  323. endif ()
  324. if (PKG_CONFIGURE_COMMAND)
  325. __exec_cmd(COMMAND ${PKG_CONFIGURE_COMMAND}
  326. ${${pkg_name}_MAKE_CFLAGS} ${${pkg_name}_MAKE_CXXFLAGS} ${${pkg_name}_MAKE_LDFLAGS}
  327. --prefix=${${pkg_name}_BASE_DIR}
  328. WORKING_DIRECTORY ${${pkg_name}_SOURCE_DIR})
  329. endif ()
  330. set(${pkg_name}_BUILD_OPTION ${PKG_BUILD_OPTION})
  331. if (NOT PKG_CONFIGURE_COMMAND)
  332. set(${pkg_name}_BUILD_OPTION ${${pkg_name}_BUILD_OPTION}
  333. ${${pkg_name}_MAKE_CFLAGS} ${${pkg_name}_MAKE_CXXFLAGS} ${${pkg_name}_MAKE_LDFLAGS})
  334. endif ()
  335. # build
  336. __exec_cmd(COMMAND ${CMAKE_MAKE_PROGRAM} ${${pkg_name}_BUILD_OPTION} -j${THNUM}
  337. WORKING_DIRECTORY ${${pkg_name}_SOURCE_DIR})
  338. if (PKG_INSTALL_INCS OR PKG_INSTALL_LIBS)
  339. file(GLOB ${pkg_name}_INSTALL_INCS ${${pkg_name}_SOURCE_DIR}/${PKG_INSTALL_INCS})
  340. file(GLOB ${pkg_name}_INSTALL_LIBS ${${pkg_name}_SOURCE_DIR}/${PKG_INSTALL_LIBS})
  341. file(COPY ${${pkg_name}_INSTALL_INCS} DESTINATION ${${pkg_name}_BASE_DIR}/include)
  342. file(COPY ${${pkg_name}_INSTALL_LIBS} DESTINATION ${${pkg_name}_BASE_DIR}/lib)
  343. else()
  344. __exec_cmd(COMMAND ${CMAKE_MAKE_PROGRAM} install WORKING_DIRECTORY ${${pkg_name}_SOURCE_DIR})
  345. endif ()
  346. endif ()
  347. endif()
  348. if (PKG_LIBS)
  349. __find_pkg_then_add_target(${pkg_name} ${PKG_EXE} ${PKG_LIB_PATH} ${PKG_LIBS})
  350. set(${pkg_name}_INC ${${pkg_name}_BASE_DIR}/include PARENT_SCOPE)
  351. if(NOT ${pkg_name}_LIBS)
  352. message(FATAL_ERROR "Can not find pkg: ${pkg_name}")
  353. endif()
  354. else()
  355. find_package(${__FIND_PKG_NAME} ${PKG_VER} QUIET ${MS_FIND_NO_DEFAULT_PATH})
  356. if (${__FIND_PKG_NAME}_FOUND)
  357. set(${pkg_name}_INC ${${pkg_name}_BASE_DIR}/include PARENT_SCOPE)
  358. message("Found pkg: ${${__FIND_PKG_NAME}_LIBRARIES}")
  359. return()
  360. endif ()
  361. endif ()
  362. endfunction()

A lightweight and high-performance service module that helps MindSpore developers efficiently deploy online inference services in the production environment.