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

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