奥特QT DDS 插件库
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

1027 行
40KB

  1. # The MIT License (MIT)
  2. # Copyright (c) 2018 JFrog
  3. # Permission is hereby granted, free of charge, to any person obtaining a copy
  4. # of this software and associated documentation files (the "Software"), to deal
  5. # in the Software without restriction, including without limitation the rights
  6. # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  7. # copies of the Software, and to permit persons to whom the Software is
  8. # furnished to do so, subject to the following conditions:
  9. # The above copyright notice and this permission notice shall be included in all
  10. # copies or substantial portions of the Software.
  11. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  12. # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  13. # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  14. # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  15. # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  16. # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  17. # SOFTWARE.
  18. # This file comes from: https://github.com/conan-io/cmake-conan. Please refer
  19. # to this repository for issues and documentation.
  20. # Its purpose is to wrap and launch Conan C/C++ Package Manager when cmake is called.
  21. # It will take CMake current settings (os, compiler, compiler version, architecture)
  22. # and translate them to conan settings for installing and retrieving dependencies.
  23. # It is intended to facilitate developers building projects that have conan dependencies,
  24. # but it is only necessary on the end-user side. It is not necessary to create conan
  25. # packages, in fact it shouldn't be use for that. Check the project documentation.
  26. # version: 0.18.1
  27. include(CMakeParseArguments)
  28. function(_get_msvc_ide_version result)
  29. set(${result} "" PARENT_SCOPE)
  30. if(NOT MSVC_VERSION VERSION_LESS 1400 AND MSVC_VERSION VERSION_LESS 1500)
  31. set(${result} 8 PARENT_SCOPE)
  32. elseif(NOT MSVC_VERSION VERSION_LESS 1500 AND MSVC_VERSION VERSION_LESS 1600)
  33. set(${result} 9 PARENT_SCOPE)
  34. elseif(NOT MSVC_VERSION VERSION_LESS 1600 AND MSVC_VERSION VERSION_LESS 1700)
  35. set(${result} 10 PARENT_SCOPE)
  36. elseif(NOT MSVC_VERSION VERSION_LESS 1700 AND MSVC_VERSION VERSION_LESS 1800)
  37. set(${result} 11 PARENT_SCOPE)
  38. elseif(NOT MSVC_VERSION VERSION_LESS 1800 AND MSVC_VERSION VERSION_LESS 1900)
  39. set(${result} 12 PARENT_SCOPE)
  40. elseif(NOT MSVC_VERSION VERSION_LESS 1900 AND MSVC_VERSION VERSION_LESS 1910)
  41. set(${result} 14 PARENT_SCOPE)
  42. elseif(NOT MSVC_VERSION VERSION_LESS 1910 AND MSVC_VERSION VERSION_LESS 1920)
  43. set(${result} 15 PARENT_SCOPE)
  44. elseif(NOT MSVC_VERSION VERSION_LESS 1920 AND MSVC_VERSION VERSION_LESS 1930)
  45. set(${result} 16 PARENT_SCOPE)
  46. elseif(NOT MSVC_VERSION VERSION_LESS 1930 AND MSVC_VERSION VERSION_LESS 1950)
  47. set(${result} 17 PARENT_SCOPE)
  48. else()
  49. message(FATAL_ERROR "Conan: Unknown MSVC compiler version [${MSVC_VERSION}]")
  50. endif()
  51. endfunction()
  52. macro(_conan_detect_build_type)
  53. conan_parse_arguments(${ARGV})
  54. if(ARGUMENTS_BUILD_TYPE)
  55. set(_CONAN_SETTING_BUILD_TYPE ${ARGUMENTS_BUILD_TYPE})
  56. elseif(CMAKE_BUILD_TYPE)
  57. set(_CONAN_SETTING_BUILD_TYPE ${CMAKE_BUILD_TYPE})
  58. else()
  59. message(FATAL_ERROR "Please specify in command line CMAKE_BUILD_TYPE (-DCMAKE_BUILD_TYPE=Release)")
  60. endif()
  61. string(TOUPPER ${_CONAN_SETTING_BUILD_TYPE} _CONAN_SETTING_BUILD_TYPE_UPPER)
  62. if (_CONAN_SETTING_BUILD_TYPE_UPPER STREQUAL "DEBUG")
  63. set(_CONAN_SETTING_BUILD_TYPE "Debug")
  64. elseif(_CONAN_SETTING_BUILD_TYPE_UPPER STREQUAL "RELEASE")
  65. set(_CONAN_SETTING_BUILD_TYPE "Release")
  66. elseif(_CONAN_SETTING_BUILD_TYPE_UPPER STREQUAL "RELWITHDEBINFO")
  67. set(_CONAN_SETTING_BUILD_TYPE "RelWithDebInfo")
  68. elseif(_CONAN_SETTING_BUILD_TYPE_UPPER STREQUAL "MINSIZEREL")
  69. set(_CONAN_SETTING_BUILD_TYPE "MinSizeRel")
  70. endif()
  71. endmacro()
  72. macro(_conan_check_system_name)
  73. #handle -s os setting
  74. if(CMAKE_SYSTEM_NAME AND NOT CMAKE_SYSTEM_NAME STREQUAL "Generic")
  75. #use default conan os setting if CMAKE_SYSTEM_NAME is not defined
  76. set(CONAN_SYSTEM_NAME ${CMAKE_SYSTEM_NAME})
  77. if(${CMAKE_SYSTEM_NAME} STREQUAL "Darwin")
  78. set(CONAN_SYSTEM_NAME Macos)
  79. endif()
  80. if(${CMAKE_SYSTEM_NAME} STREQUAL "QNX")
  81. set(CONAN_SYSTEM_NAME Neutrino)
  82. endif()
  83. set(CONAN_SUPPORTED_PLATFORMS Windows Linux Macos Android iOS FreeBSD WindowsStore WindowsCE watchOS tvOS FreeBSD SunOS AIX Arduino Emscripten Neutrino)
  84. list (FIND CONAN_SUPPORTED_PLATFORMS "${CONAN_SYSTEM_NAME}" _index)
  85. if (${_index} GREATER -1)
  86. #check if the cmake system is a conan supported one
  87. set(_CONAN_SETTING_OS ${CONAN_SYSTEM_NAME})
  88. else()
  89. message(FATAL_ERROR "cmake system ${CONAN_SYSTEM_NAME} is not supported by conan. Use one of ${CONAN_SUPPORTED_PLATFORMS}")
  90. endif()
  91. endif()
  92. endmacro()
  93. macro(_conan_check_language)
  94. get_property(_languages GLOBAL PROPERTY ENABLED_LANGUAGES)
  95. if (";${_languages};" MATCHES ";CXX;")
  96. set(LANGUAGE CXX)
  97. set(USING_CXX 1)
  98. elseif (";${_languages};" MATCHES ";C;")
  99. set(LANGUAGE C)
  100. set(USING_CXX 0)
  101. else ()
  102. message(FATAL_ERROR "Conan: Neither C or C++ was detected as a language for the project. Unabled to detect compiler version.")
  103. endif()
  104. endmacro()
  105. macro(_conan_detect_compiler)
  106. conan_parse_arguments(${ARGV})
  107. if(ARGUMENTS_ARCH)
  108. set(_CONAN_SETTING_ARCH ${ARGUMENTS_ARCH})
  109. endif()
  110. if(USING_CXX)
  111. set(_CONAN_SETTING_COMPILER_CPPSTD ${CMAKE_CXX_STANDARD})
  112. endif()
  113. if (${CMAKE_${LANGUAGE}_COMPILER_ID} STREQUAL GNU)
  114. # using GCC
  115. # TODO: Handle other params
  116. string(REPLACE "." ";" VERSION_LIST ${CMAKE_${LANGUAGE}_COMPILER_VERSION})
  117. list(GET VERSION_LIST 0 MAJOR)
  118. list(GET VERSION_LIST 1 MINOR)
  119. set(COMPILER_VERSION ${MAJOR}.${MINOR})
  120. if(${MAJOR} GREATER 4)
  121. set(COMPILER_VERSION ${MAJOR})
  122. endif()
  123. set(_CONAN_SETTING_COMPILER gcc)
  124. set(_CONAN_SETTING_COMPILER_VERSION ${COMPILER_VERSION})
  125. if (USING_CXX)
  126. conan_cmake_detect_unix_libcxx(_LIBCXX)
  127. set(_CONAN_SETTING_COMPILER_LIBCXX ${_LIBCXX})
  128. endif ()
  129. elseif (${CMAKE_${LANGUAGE}_COMPILER_ID} STREQUAL Intel)
  130. string(REPLACE "." ";" VERSION_LIST ${CMAKE_${LANGUAGE}_COMPILER_VERSION})
  131. list(GET VERSION_LIST 0 MAJOR)
  132. list(GET VERSION_LIST 1 MINOR)
  133. set(COMPILER_VERSION ${MAJOR}.${MINOR})
  134. set(_CONAN_SETTING_COMPILER intel)
  135. set(_CONAN_SETTING_COMPILER_VERSION ${COMPILER_VERSION})
  136. if (USING_CXX)
  137. conan_cmake_detect_unix_libcxx(_LIBCXX)
  138. set(_CONAN_SETTING_COMPILER_LIBCXX ${_LIBCXX})
  139. endif ()
  140. elseif (${CMAKE_${LANGUAGE}_COMPILER_ID} STREQUAL AppleClang)
  141. # using AppleClang
  142. string(REPLACE "." ";" VERSION_LIST ${CMAKE_${LANGUAGE}_COMPILER_VERSION})
  143. list(GET VERSION_LIST 0 MAJOR)
  144. list(GET VERSION_LIST 1 MINOR)
  145. set(_CONAN_SETTING_COMPILER apple-clang)
  146. set(_CONAN_SETTING_COMPILER_VERSION ${MAJOR}.${MINOR})
  147. if (USING_CXX)
  148. conan_cmake_detect_unix_libcxx(_LIBCXX)
  149. set(_CONAN_SETTING_COMPILER_LIBCXX ${_LIBCXX})
  150. endif ()
  151. elseif (${CMAKE_${LANGUAGE}_COMPILER_ID} STREQUAL Clang
  152. AND NOT "${CMAKE_${LANGUAGE}_COMPILER_FRONTEND_VARIANT}" STREQUAL "MSVC"
  153. AND NOT "${CMAKE_${LANGUAGE}_SIMULATE_ID}" STREQUAL "MSVC")
  154. string(REPLACE "." ";" VERSION_LIST ${CMAKE_${LANGUAGE}_COMPILER_VERSION})
  155. list(GET VERSION_LIST 0 MAJOR)
  156. list(GET VERSION_LIST 1 MINOR)
  157. set(_CONAN_SETTING_COMPILER clang)
  158. set(_CONAN_SETTING_COMPILER_VERSION ${MAJOR}.${MINOR})
  159. if(APPLE)
  160. cmake_policy(GET CMP0025 APPLE_CLANG_POLICY)
  161. if(NOT APPLE_CLANG_POLICY STREQUAL NEW)
  162. message(STATUS "Conan: APPLE and Clang detected. Assuming apple-clang compiler. Set CMP0025 to avoid it")
  163. set(_CONAN_SETTING_COMPILER apple-clang)
  164. endif()
  165. endif()
  166. if(${_CONAN_SETTING_COMPILER} STREQUAL clang AND ${MAJOR} GREATER 7)
  167. set(_CONAN_SETTING_COMPILER_VERSION ${MAJOR})
  168. endif()
  169. if (USING_CXX)
  170. conan_cmake_detect_unix_libcxx(_LIBCXX)
  171. set(_CONAN_SETTING_COMPILER_LIBCXX ${_LIBCXX})
  172. endif ()
  173. elseif(${CMAKE_${LANGUAGE}_COMPILER_ID} STREQUAL MSVC
  174. OR (${CMAKE_${LANGUAGE}_COMPILER_ID} STREQUAL Clang
  175. AND "${CMAKE_${LANGUAGE}_COMPILER_FRONTEND_VARIANT}" STREQUAL "MSVC"
  176. AND "${CMAKE_${LANGUAGE}_SIMULATE_ID}" STREQUAL "MSVC"))
  177. set(_VISUAL "Visual Studio")
  178. _get_msvc_ide_version(_VISUAL_VERSION)
  179. if("${_VISUAL_VERSION}" STREQUAL "")
  180. message(FATAL_ERROR "Conan: Visual Studio not recognized")
  181. else()
  182. set(_CONAN_SETTING_COMPILER ${_VISUAL})
  183. set(_CONAN_SETTING_COMPILER_VERSION ${_VISUAL_VERSION})
  184. endif()
  185. if(NOT _CONAN_SETTING_ARCH)
  186. if (MSVC_${LANGUAGE}_ARCHITECTURE_ID MATCHES "64")
  187. set(_CONAN_SETTING_ARCH x86_64)
  188. elseif (MSVC_${LANGUAGE}_ARCHITECTURE_ID MATCHES "^ARM")
  189. message(STATUS "Conan: Using default ARM architecture from MSVC")
  190. set(_CONAN_SETTING_ARCH armv6)
  191. elseif (MSVC_${LANGUAGE}_ARCHITECTURE_ID MATCHES "86")
  192. set(_CONAN_SETTING_ARCH x86)
  193. else ()
  194. message(FATAL_ERROR "Conan: Unknown MSVC architecture [${MSVC_${LANGUAGE}_ARCHITECTURE_ID}]")
  195. endif()
  196. endif()
  197. conan_cmake_detect_vs_runtime(_vs_runtime ${ARGV})
  198. message(STATUS "Conan: Detected VS runtime: ${_vs_runtime}")
  199. set(_CONAN_SETTING_COMPILER_RUNTIME ${_vs_runtime})
  200. if (CMAKE_GENERATOR_TOOLSET)
  201. set(_CONAN_SETTING_COMPILER_TOOLSET ${CMAKE_VS_PLATFORM_TOOLSET})
  202. elseif(CMAKE_VS_PLATFORM_TOOLSET AND (CMAKE_GENERATOR STREQUAL "Ninja"))
  203. set(_CONAN_SETTING_COMPILER_TOOLSET ${CMAKE_VS_PLATFORM_TOOLSET})
  204. endif()
  205. else()
  206. message(FATAL_ERROR "Conan: compiler setup not recognized")
  207. endif()
  208. endmacro()
  209. function(conan_cmake_settings result)
  210. #message(STATUS "COMPILER " ${CMAKE_CXX_COMPILER})
  211. #message(STATUS "COMPILER " ${CMAKE_CXX_COMPILER_ID})
  212. #message(STATUS "VERSION " ${CMAKE_CXX_COMPILER_VERSION})
  213. #message(STATUS "FLAGS " ${CMAKE_LANG_FLAGS})
  214. #message(STATUS "LIB ARCH " ${CMAKE_CXX_LIBRARY_ARCHITECTURE})
  215. #message(STATUS "BUILD TYPE " ${CMAKE_BUILD_TYPE})
  216. #message(STATUS "GENERATOR " ${CMAKE_GENERATOR})
  217. #message(STATUS "GENERATOR WIN64 " ${CMAKE_CL_64})
  218. message(STATUS "Conan: Automatic detection of conan settings from cmake")
  219. conan_parse_arguments(${ARGV})
  220. _conan_detect_build_type(${ARGV})
  221. _conan_check_system_name()
  222. _conan_check_language()
  223. _conan_detect_compiler(${ARGV})
  224. # If profile is defined it is used
  225. if(CMAKE_BUILD_TYPE STREQUAL "Debug" AND ARGUMENTS_DEBUG_PROFILE)
  226. set(_APPLIED_PROFILES ${ARGUMENTS_DEBUG_PROFILE})
  227. elseif(CMAKE_BUILD_TYPE STREQUAL "Release" AND ARGUMENTS_RELEASE_PROFILE)
  228. set(_APPLIED_PROFILES ${ARGUMENTS_RELEASE_PROFILE})
  229. elseif(CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo" AND ARGUMENTS_RELWITHDEBINFO_PROFILE)
  230. set(_APPLIED_PROFILES ${ARGUMENTS_RELWITHDEBINFO_PROFILE})
  231. elseif(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel" AND ARGUMENTS_MINSIZEREL_PROFILE)
  232. set(_APPLIED_PROFILES ${ARGUMENTS_MINSIZEREL_PROFILE})
  233. elseif(ARGUMENTS_PROFILE)
  234. set(_APPLIED_PROFILES ${ARGUMENTS_PROFILE})
  235. endif()
  236. foreach(ARG ${_APPLIED_PROFILES})
  237. set(_SETTINGS ${_SETTINGS} -pr=${ARG})
  238. endforeach()
  239. foreach(ARG ${ARGUMENTS_PROFILE_BUILD})
  240. conan_check(VERSION 1.24.0 REQUIRED DETECT_QUIET)
  241. set(_SETTINGS ${_SETTINGS} -pr:b=${ARG})
  242. endforeach()
  243. if(NOT _SETTINGS OR ARGUMENTS_PROFILE_AUTO STREQUAL "ALL")
  244. set(ARGUMENTS_PROFILE_AUTO arch build_type compiler compiler.version
  245. compiler.runtime compiler.libcxx compiler.toolset)
  246. endif()
  247. # remove any manually specified settings from the autodetected settings
  248. foreach(ARG ${ARGUMENTS_SETTINGS})
  249. string(REGEX MATCH "[^=]*" MANUAL_SETTING "${ARG}")
  250. message(STATUS "Conan: ${MANUAL_SETTING} was added as an argument. Not using the autodetected one.")
  251. list(REMOVE_ITEM ARGUMENTS_PROFILE_AUTO "${MANUAL_SETTING}")
  252. endforeach()
  253. # Automatic from CMake
  254. foreach(ARG ${ARGUMENTS_PROFILE_AUTO})
  255. string(TOUPPER ${ARG} _arg_name)
  256. string(REPLACE "." "_" _arg_name ${_arg_name})
  257. if(_CONAN_SETTING_${_arg_name})
  258. set(_SETTINGS ${_SETTINGS} -s ${ARG}=${_CONAN_SETTING_${_arg_name}})
  259. endif()
  260. endforeach()
  261. foreach(ARG ${ARGUMENTS_SETTINGS})
  262. set(_SETTINGS ${_SETTINGS} -s ${ARG})
  263. endforeach()
  264. message(STATUS "Conan: Settings= ${_SETTINGS}")
  265. set(${result} ${_SETTINGS} PARENT_SCOPE)
  266. endfunction()
  267. function(conan_cmake_detect_unix_libcxx result)
  268. # Take into account any -stdlib in compile options
  269. get_directory_property(compile_options DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMPILE_OPTIONS)
  270. string(GENEX_STRIP "${compile_options}" compile_options)
  271. # Take into account any _GLIBCXX_USE_CXX11_ABI in compile definitions
  272. get_directory_property(defines DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} COMPILE_DEFINITIONS)
  273. string(GENEX_STRIP "${defines}" defines)
  274. foreach(define ${defines})
  275. if(define MATCHES "_GLIBCXX_USE_CXX11_ABI")
  276. if(define MATCHES "^-D")
  277. set(compile_options ${compile_options} "${define}")
  278. else()
  279. set(compile_options ${compile_options} "-D${define}")
  280. endif()
  281. endif()
  282. endforeach()
  283. # add additional compiler options ala cmRulePlaceholderExpander::ExpandRuleVariable
  284. set(EXPAND_CXX_COMPILER ${CMAKE_CXX_COMPILER})
  285. if(CMAKE_CXX_COMPILER_ARG1)
  286. # CMake splits CXX="foo bar baz" into CMAKE_CXX_COMPILER="foo", CMAKE_CXX_COMPILER_ARG1="bar baz"
  287. # without this, ccache, winegcc, or other wrappers might lose all their arguments
  288. separate_arguments(SPLIT_CXX_COMPILER_ARG1 NATIVE_COMMAND ${CMAKE_CXX_COMPILER_ARG1})
  289. list(APPEND EXPAND_CXX_COMPILER ${SPLIT_CXX_COMPILER_ARG1})
  290. endif()
  291. if(CMAKE_CXX_COMPILE_OPTIONS_TARGET AND CMAKE_CXX_COMPILER_TARGET)
  292. # without --target= we may be calling the wrong underlying GCC
  293. list(APPEND EXPAND_CXX_COMPILER "${CMAKE_CXX_COMPILE_OPTIONS_TARGET}${CMAKE_CXX_COMPILER_TARGET}")
  294. endif()
  295. if(CMAKE_CXX_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN AND CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN)
  296. list(APPEND EXPAND_CXX_COMPILER "${CMAKE_CXX_COMPILE_OPTIONS_EXTERNAL_TOOLCHAIN}${CMAKE_CXX_COMPILER_EXTERNAL_TOOLCHAIN}")
  297. endif()
  298. if(CMAKE_CXX_COMPILE_OPTIONS_SYSROOT)
  299. # without --sysroot= we may find the wrong #include <string>
  300. if(CMAKE_SYSROOT_COMPILE)
  301. list(APPEND EXPAND_CXX_COMPILER "${CMAKE_CXX_COMPILE_OPTIONS_SYSROOT}${CMAKE_SYSROOT_COMPILE}")
  302. elseif(CMAKE_SYSROOT)
  303. list(APPEND EXPAND_CXX_COMPILER "${CMAKE_CXX_COMPILE_OPTIONS_SYSROOT}${CMAKE_SYSROOT}")
  304. endif()
  305. endif()
  306. separate_arguments(SPLIT_CXX_FLAGS NATIVE_COMMAND ${CMAKE_CXX_FLAGS})
  307. if(CMAKE_OSX_SYSROOT)
  308. set(xcode_sysroot_option "--sysroot=${CMAKE_OSX_SYSROOT}")
  309. endif()
  310. execute_process(
  311. COMMAND ${CMAKE_COMMAND} -E echo "#include <string>"
  312. COMMAND ${EXPAND_CXX_COMPILER} ${SPLIT_CXX_FLAGS} -x c++ ${xcode_sysroot_option} ${compile_options} -E -dM -
  313. OUTPUT_VARIABLE string_defines
  314. )
  315. if(string_defines MATCHES "#define __GLIBCXX__")
  316. # Allow -D_GLIBCXX_USE_CXX11_ABI=ON/OFF as argument to cmake
  317. if(DEFINED _GLIBCXX_USE_CXX11_ABI)
  318. if(_GLIBCXX_USE_CXX11_ABI)
  319. set(${result} libstdc++11 PARENT_SCOPE)
  320. return()
  321. else()
  322. set(${result} libstdc++ PARENT_SCOPE)
  323. return()
  324. endif()
  325. endif()
  326. if(string_defines MATCHES "#define _GLIBCXX_USE_CXX11_ABI 1\n")
  327. set(${result} libstdc++11 PARENT_SCOPE)
  328. else()
  329. # Either the compiler is missing the define because it is old, and so
  330. # it can't use the new abi, or the compiler was configured to use the
  331. # old abi by the user or distro (e.g. devtoolset on RHEL/CentOS)
  332. set(${result} libstdc++ PARENT_SCOPE)
  333. endif()
  334. else()
  335. set(${result} libc++ PARENT_SCOPE)
  336. endif()
  337. endfunction()
  338. function(conan_cmake_detect_vs_runtime result)
  339. conan_parse_arguments(${ARGV})
  340. if(ARGUMENTS_BUILD_TYPE)
  341. set(build_type "${ARGUMENTS_BUILD_TYPE}")
  342. elseif(CMAKE_BUILD_TYPE)
  343. set(build_type "${CMAKE_BUILD_TYPE}")
  344. else()
  345. message(FATAL_ERROR "Please specify in command line CMAKE_BUILD_TYPE (-DCMAKE_BUILD_TYPE=Release)")
  346. endif()
  347. if(build_type)
  348. string(TOUPPER "${build_type}" build_type)
  349. endif()
  350. set(variables CMAKE_CXX_FLAGS_${build_type} CMAKE_C_FLAGS_${build_type} CMAKE_CXX_FLAGS CMAKE_C_FLAGS)
  351. foreach(variable ${variables})
  352. if(NOT "${${variable}}" STREQUAL "")
  353. string(REPLACE " " ";" flags "${${variable}}")
  354. foreach (flag ${flags})
  355. if("${flag}" STREQUAL "/MD" OR "${flag}" STREQUAL "/MDd" OR "${flag}" STREQUAL "/MT" OR "${flag}" STREQUAL "/MTd")
  356. string(SUBSTRING "${flag}" 1 -1 runtime)
  357. set(${result} "${runtime}" PARENT_SCOPE)
  358. return()
  359. endif()
  360. endforeach()
  361. endif()
  362. endforeach()
  363. if("${build_type}" STREQUAL "DEBUG")
  364. set(${result} "MDd" PARENT_SCOPE)
  365. else()
  366. set(${result} "MD" PARENT_SCOPE)
  367. endif()
  368. endfunction()
  369. function(_collect_settings result)
  370. set(ARGUMENTS_PROFILE_AUTO arch build_type compiler compiler.version
  371. compiler.runtime compiler.libcxx compiler.toolset
  372. compiler.cppstd)
  373. foreach(ARG ${ARGUMENTS_PROFILE_AUTO})
  374. string(TOUPPER ${ARG} _arg_name)
  375. string(REPLACE "." "_" _arg_name ${_arg_name})
  376. if(_CONAN_SETTING_${_arg_name})
  377. set(detected_setings ${detected_setings} ${ARG}=${_CONAN_SETTING_${_arg_name}})
  378. endif()
  379. endforeach()
  380. set(${result} ${detected_setings} PARENT_SCOPE)
  381. endfunction()
  382. function(conan_cmake_autodetect detected_settings)
  383. _conan_detect_build_type(${ARGV})
  384. _conan_check_system_name()
  385. _conan_check_language()
  386. _conan_detect_compiler(${ARGV})
  387. _collect_settings(collected_settings)
  388. set(${detected_settings} ${collected_settings} PARENT_SCOPE)
  389. endfunction()
  390. macro(conan_parse_arguments)
  391. set(options BASIC_SETUP CMAKE_TARGETS UPDATE KEEP_RPATHS NO_LOAD NO_OUTPUT_DIRS OUTPUT_QUIET NO_IMPORTS SKIP_STD)
  392. set(oneValueArgs CONANFILE ARCH BUILD_TYPE INSTALL_FOLDER OUTPUT_FOLDER CONAN_COMMAND)
  393. set(multiValueArgs DEBUG_PROFILE RELEASE_PROFILE RELWITHDEBINFO_PROFILE MINSIZEREL_PROFILE
  394. PROFILE REQUIRES OPTIONS IMPORTS SETTINGS BUILD ENV GENERATORS PROFILE_AUTO
  395. INSTALL_ARGS CONFIGURATION_TYPES PROFILE_BUILD BUILD_REQUIRES)
  396. cmake_parse_arguments(ARGUMENTS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  397. endmacro()
  398. function(old_conan_cmake_install)
  399. # Calls "conan install"
  400. # Argument BUILD is equivalant to --build={missing, PkgName,...} or
  401. # --build when argument is 'BUILD all' (which builds all packages from source)
  402. # Argument CONAN_COMMAND, to specify the conan path, e.g. in case of running from source
  403. # cmake does not identify conan as command, even if it is +x and it is in the path
  404. conan_parse_arguments(${ARGV})
  405. if(CONAN_CMAKE_MULTI)
  406. set(ARGUMENTS_GENERATORS ${ARGUMENTS_GENERATORS} cmake_multi)
  407. else()
  408. set(ARGUMENTS_GENERATORS ${ARGUMENTS_GENERATORS} cmake)
  409. endif()
  410. set(CONAN_BUILD_POLICY "")
  411. foreach(ARG ${ARGUMENTS_BUILD})
  412. if(${ARG} STREQUAL "all")
  413. set(CONAN_BUILD_POLICY ${CONAN_BUILD_POLICY} --build)
  414. break()
  415. else()
  416. set(CONAN_BUILD_POLICY ${CONAN_BUILD_POLICY} --build=${ARG})
  417. endif()
  418. endforeach()
  419. if(ARGUMENTS_CONAN_COMMAND)
  420. set(CONAN_CMD ${ARGUMENTS_CONAN_COMMAND})
  421. else()
  422. conan_check(REQUIRED)
  423. endif()
  424. set(CONAN_OPTIONS "")
  425. if(ARGUMENTS_CONANFILE)
  426. if(IS_ABSOLUTE ${ARGUMENTS_CONANFILE})
  427. set(CONANFILE ${ARGUMENTS_CONANFILE})
  428. else()
  429. set(CONANFILE ${CMAKE_CURRENT_SOURCE_DIR}/${ARGUMENTS_CONANFILE})
  430. endif()
  431. else()
  432. set(CONANFILE ".")
  433. endif()
  434. foreach(ARG ${ARGUMENTS_OPTIONS})
  435. set(CONAN_OPTIONS ${CONAN_OPTIONS} -o=${ARG})
  436. endforeach()
  437. if(ARGUMENTS_UPDATE)
  438. set(CONAN_INSTALL_UPDATE --update)
  439. endif()
  440. if(ARGUMENTS_NO_IMPORTS)
  441. set(CONAN_INSTALL_NO_IMPORTS --no-imports)
  442. endif()
  443. set(CONAN_INSTALL_FOLDER "")
  444. if(ARGUMENTS_INSTALL_FOLDER)
  445. set(CONAN_INSTALL_FOLDER -if=${ARGUMENTS_INSTALL_FOLDER})
  446. endif()
  447. set(CONAN_OUTPUT_FOLDER "")
  448. if(ARGUMENTS_OUTPUT_FOLDER)
  449. set(CONAN_OUTPUT_FOLDER -of=${ARGUMENTS_OUTPUT_FOLDER})
  450. endif()
  451. foreach(ARG ${ARGUMENTS_GENERATORS})
  452. set(CONAN_GENERATORS ${CONAN_GENERATORS} -g=${ARG})
  453. endforeach()
  454. foreach(ARG ${ARGUMENTS_ENV})
  455. set(CONAN_ENV_VARS ${CONAN_ENV_VARS} -e=${ARG})
  456. endforeach()
  457. set(conan_args install ${CONANFILE} ${settings} ${CONAN_ENV_VARS} ${CONAN_GENERATORS} ${CONAN_BUILD_POLICY} ${CONAN_INSTALL_UPDATE} ${CONAN_INSTALL_NO_IMPORTS} ${CONAN_OPTIONS} ${CONAN_INSTALL_FOLDER} ${ARGUMENTS_INSTALL_ARGS})
  458. string (REPLACE ";" " " _conan_args "${conan_args}")
  459. message(STATUS "Conan executing: ${CONAN_CMD} ${_conan_args}")
  460. if(ARGUMENTS_OUTPUT_QUIET)
  461. execute_process(COMMAND ${CONAN_CMD} ${conan_args}
  462. RESULT_VARIABLE return_code
  463. OUTPUT_VARIABLE conan_output
  464. ERROR_VARIABLE conan_output
  465. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
  466. else()
  467. execute_process(COMMAND ${CONAN_CMD} ${conan_args}
  468. RESULT_VARIABLE return_code
  469. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
  470. endif()
  471. if(NOT "${return_code}" STREQUAL "0")
  472. message(FATAL_ERROR "Conan install failed='${return_code}'")
  473. endif()
  474. endfunction()
  475. function(conan_cmake_install)
  476. if(DEFINED CONAN_COMMAND)
  477. set(CONAN_CMD ${CONAN_COMMAND})
  478. else()
  479. conan_check(REQUIRED)
  480. endif()
  481. set(installOptions UPDATE NO_IMPORTS OUTPUT_QUIET ERROR_QUIET)
  482. set(installOneValueArgs PATH_OR_REFERENCE REFERENCE REMOTE LOCKFILE LOCKFILE_OUT LOCKFILE_NODE_ID INSTALL_FOLDER OUTPUT_FOLDER)
  483. set(installMultiValueArgs GENERATOR BUILD ENV ENV_HOST ENV_BUILD OPTIONS_HOST OPTIONS OPTIONS_BUILD PROFILE
  484. PROFILE_HOST PROFILE_BUILD SETTINGS SETTINGS_HOST SETTINGS_BUILD)
  485. cmake_parse_arguments(ARGS "${installOptions}" "${installOneValueArgs}" "${installMultiValueArgs}" ${ARGN})
  486. foreach(arg ${installOptions})
  487. if(ARGS_${arg})
  488. set(${arg} ${${arg}} ${ARGS_${arg}})
  489. endif()
  490. endforeach()
  491. foreach(arg ${installOneValueArgs})
  492. if(DEFINED ARGS_${arg})
  493. if("${arg}" STREQUAL "REMOTE")
  494. set(flag "--remote")
  495. elseif("${arg}" STREQUAL "LOCKFILE")
  496. set(flag "--lockfile")
  497. elseif("${arg}" STREQUAL "LOCKFILE_OUT")
  498. set(flag "--lockfile-out")
  499. elseif("${arg}" STREQUAL "LOCKFILE_NODE_ID")
  500. set(flag "--lockfile-node-id")
  501. elseif("${arg}" STREQUAL "INSTALL_FOLDER")
  502. set(flag "--install-folder")
  503. elseif("${arg}" STREQUAL "OUTPUT_FOLDER")
  504. set(flag "--output-folder")
  505. endif()
  506. set(${arg} ${${arg}} ${flag} ${ARGS_${arg}})
  507. endif()
  508. endforeach()
  509. foreach(arg ${installMultiValueArgs})
  510. if(DEFINED ARGS_${arg})
  511. if("${arg}" STREQUAL "GENERATOR")
  512. set(flag "--generator")
  513. elseif("${arg}" STREQUAL "BUILD")
  514. set(flag "--build")
  515. elseif("${arg}" STREQUAL "ENV")
  516. set(flag "--env")
  517. elseif("${arg}" STREQUAL "ENV_HOST")
  518. set(flag "--env:host")
  519. elseif("${arg}" STREQUAL "ENV_BUILD")
  520. set(flag "--env:build")
  521. elseif("${arg}" STREQUAL "OPTIONS")
  522. set(flag "--options")
  523. elseif("${arg}" STREQUAL "OPTIONS_HOST")
  524. set(flag "--options:host")
  525. elseif("${arg}" STREQUAL "OPTIONS_BUILD")
  526. set(flag "--options:build")
  527. elseif("${arg}" STREQUAL "PROFILE")
  528. set(flag "--profile")
  529. elseif("${arg}" STREQUAL "PROFILE_HOST")
  530. set(flag "--profile:host")
  531. elseif("${arg}" STREQUAL "PROFILE_BUILD")
  532. set(flag "--profile:build")
  533. elseif("${arg}" STREQUAL "SETTINGS")
  534. set(flag "--settings")
  535. elseif("${arg}" STREQUAL "SETTINGS_HOST")
  536. set(flag "--settings:host")
  537. elseif("${arg}" STREQUAL "SETTINGS_BUILD")
  538. set(flag "--settings:build")
  539. endif()
  540. list(LENGTH ARGS_${arg} numargs)
  541. foreach(item ${ARGS_${arg}})
  542. if(${item} STREQUAL "all" AND ${arg} STREQUAL "BUILD")
  543. set(${arg} "--build")
  544. break()
  545. endif()
  546. set(${arg} ${${arg}} ${flag} ${item})
  547. endforeach()
  548. endif()
  549. endforeach()
  550. if(DEFINED UPDATE)
  551. set(UPDATE --update)
  552. endif()
  553. if(DEFINED NO_IMPORTS)
  554. set(NO_IMPORTS --no-imports)
  555. endif()
  556. set(install_args install ${PATH_OR_REFERENCE} ${REFERENCE} ${UPDATE} ${NO_IMPORTS} ${REMOTE} ${LOCKFILE} ${LOCKFILE_OUT} ${LOCKFILE_NODE_ID} ${INSTALL_FOLDER} ${OUTPUT_FOLDER}
  557. ${GENERATOR} ${BUILD} ${ENV} ${ENV_HOST} ${ENV_BUILD} ${OPTIONS} ${OPTIONS_HOST} ${OPTIONS_BUILD}
  558. ${PROFILE} ${PROFILE_HOST} ${PROFILE_BUILD} ${SETTINGS} ${SETTINGS_HOST} ${SETTINGS_BUILD})
  559. string(REPLACE ";" " " _install_args "${install_args}")
  560. message(STATUS "Conan executing: ${CONAN_CMD} ${_install_args}")
  561. if(ARGS_OUTPUT_QUIET)
  562. set(OUTPUT_OPT OUTPUT_QUIET)
  563. endif()
  564. if(ARGS_ERROR_QUIET)
  565. set(ERROR_OPT ERROR_QUIET)
  566. endif()
  567. execute_process(COMMAND ${CONAN_CMD} ${install_args}
  568. RESULT_VARIABLE return_code
  569. ${OUTPUT_OPT}
  570. ${ERROR_OPT}
  571. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
  572. if(NOT "${return_code}" STREQUAL "0")
  573. if (ARGS_ERROR_QUIET)
  574. message(WARNING "Conan install failed='${return_code}'")
  575. else()
  576. message(FATAL_ERROR "Conan install failed='${return_code}'")
  577. endif()
  578. endif()
  579. endfunction()
  580. function(conan_cmake_lock_create)
  581. if(DEFINED CONAN_COMMAND)
  582. set(CONAN_CMD ${CONAN_COMMAND})
  583. else()
  584. conan_check(REQUIRED)
  585. endif()
  586. set(lockCreateOptions UPDATE BASE OUTPUT_QUIET ERROR_QUIET)
  587. set(lockCreateOneValueArgs PATH REFERENCE REMOTE LOCKFILE LOCKFILE_OUT)
  588. set(lockCreateMultiValueArgs BUILD ENV ENV_HOST ENV_BUILD OPTIONS_HOST OPTIONS OPTIONS_BUILD PROFILE
  589. PROFILE_HOST PROFILE_BUILD SETTINGS SETTINGS_HOST SETTINGS_BUILD)
  590. cmake_parse_arguments(ARGS "${lockCreateOptions}" "${lockCreateOneValueArgs}" "${lockCreateMultiValueArgs}" ${ARGN})
  591. foreach(arg ${lockCreateOptions})
  592. if(ARGS_${arg})
  593. set(${arg} ${${arg}} ${ARGS_${arg}})
  594. endif()
  595. endforeach()
  596. foreach(arg ${lockCreateOneValueArgs})
  597. if(DEFINED ARGS_${arg})
  598. if("${arg}" STREQUAL "REMOTE")
  599. set(flag "--remote")
  600. elseif("${arg}" STREQUAL "LOCKFILE")
  601. set(flag "--lockfile")
  602. elseif("${arg}" STREQUAL "LOCKFILE_OUT")
  603. set(flag "--lockfile-out")
  604. endif()
  605. set(${arg} ${${arg}} ${flag} ${ARGS_${arg}})
  606. endif()
  607. endforeach()
  608. foreach(arg ${lockCreateMultiValueArgs})
  609. if(DEFINED ARGS_${arg})
  610. if("${arg}" STREQUAL "BUILD")
  611. set(flag "--build")
  612. elseif("${arg}" STREQUAL "ENV")
  613. set(flag "--env")
  614. elseif("${arg}" STREQUAL "ENV_HOST")
  615. set(flag "--env:host")
  616. elseif("${arg}" STREQUAL "ENV_BUILD")
  617. set(flag "--env:build")
  618. elseif("${arg}" STREQUAL "OPTIONS")
  619. set(flag "--options")
  620. elseif("${arg}" STREQUAL "OPTIONS_HOST")
  621. set(flag "--options:host")
  622. elseif("${arg}" STREQUAL "OPTIONS_BUILD")
  623. set(flag "--options:build")
  624. elseif("${arg}" STREQUAL "PROFILE")
  625. set(flag "--profile")
  626. elseif("${arg}" STREQUAL "PROFILE_HOST")
  627. set(flag "--profile:host")
  628. elseif("${arg}" STREQUAL "PROFILE_BUILD")
  629. set(flag "--profile:build")
  630. elseif("${arg}" STREQUAL "SETTINGS")
  631. set(flag "--settings")
  632. elseif("${arg}" STREQUAL "SETTINGS_HOST")
  633. set(flag "--settings:host")
  634. elseif("${arg}" STREQUAL "SETTINGS_BUILD")
  635. set(flag "--settings:build")
  636. endif()
  637. list(LENGTH ARGS_${arg} numargs)
  638. foreach(item ${ARGS_${arg}})
  639. if(${item} STREQUAL "all" AND ${arg} STREQUAL "BUILD")
  640. set(${arg} "--build")
  641. break()
  642. endif()
  643. set(${arg} ${${arg}} ${flag} ${item})
  644. endforeach()
  645. endif()
  646. endforeach()
  647. if(DEFINED UPDATE)
  648. set(UPDATE --update)
  649. endif()
  650. if(DEFINED BASE)
  651. set(BASE --base)
  652. endif()
  653. set(lock_create_Args lock create ${PATH} ${REFERENCE} ${UPDATE} ${BASE} ${REMOTE} ${LOCKFILE} ${LOCKFILE_OUT} ${LOCKFILE_NODE_ID} ${INSTALL_FOLDER}
  654. ${GENERATOR} ${BUILD} ${ENV} ${ENV_HOST} ${ENV_BUILD} ${OPTIONS} ${OPTIONS_HOST} ${OPTIONS_BUILD}
  655. ${PROFILE} ${PROFILE_HOST} ${PROFILE_BUILD} ${SETTINGS} ${SETTINGS_HOST} ${SETTINGS_BUILD})
  656. string(REPLACE ";" " " _lock_create_Args "${lock_create_Args}")
  657. message(STATUS "Conan executing: ${CONAN_CMD} ${_lock_create_Args}")
  658. if(ARGS_OUTPUT_QUIET)
  659. set(OUTPUT_OPT OUTPUT_QUIET)
  660. endif()
  661. if(ARGS_ERROR_QUIET)
  662. set(ERROR_OPT ERROR_QUIET)
  663. endif()
  664. execute_process(COMMAND ${CONAN_CMD} ${lock_create_Args}
  665. RESULT_VARIABLE return_code
  666. ${OUTPUT_OPT}
  667. ${ERROR_OPT}
  668. WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
  669. if(NOT "${return_code}" STREQUAL "0")
  670. if (ARGS_ERROR_QUIET)
  671. message(WARNING "Conan lock create failed='${return_code}'")
  672. else()
  673. message(FATAL_ERROR "Conan lock create failed='${return_code}'")
  674. endif()
  675. endif()
  676. endfunction()
  677. function(conan_cmake_setup_conanfile)
  678. conan_parse_arguments(${ARGV})
  679. if(ARGUMENTS_CONANFILE)
  680. get_filename_component(_CONANFILE_NAME ${ARGUMENTS_CONANFILE} NAME)
  681. # configure_file will make sure cmake re-runs when conanfile is updated
  682. configure_file(${ARGUMENTS_CONANFILE} ${CMAKE_CURRENT_BINARY_DIR}/${_CONANFILE_NAME}.junk COPYONLY)
  683. file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/${_CONANFILE_NAME}.junk)
  684. else()
  685. conan_cmake_generate_conanfile(ON ${ARGV})
  686. endif()
  687. endfunction()
  688. function(conan_cmake_configure)
  689. conan_cmake_generate_conanfile(OFF ${ARGV})
  690. endfunction()
  691. # Generate, writing in disk a conanfile.txt with the requires, options, and imports
  692. # specified as arguments
  693. # This will be considered as temporary file, generated in CMAKE_CURRENT_BINARY_DIR)
  694. function(conan_cmake_generate_conanfile DEFAULT_GENERATOR)
  695. conan_parse_arguments(${ARGV})
  696. set(_FN "${CMAKE_CURRENT_BINARY_DIR}/conanfile.txt")
  697. file(WRITE ${_FN} "")
  698. if(DEFINED ARGUMENTS_REQUIRES)
  699. file(APPEND ${_FN} "[requires]\n")
  700. foreach(REQUIRE ${ARGUMENTS_REQUIRES})
  701. file(APPEND ${_FN} ${REQUIRE} "\n")
  702. endforeach()
  703. endif()
  704. if (DEFAULT_GENERATOR OR DEFINED ARGUMENTS_GENERATORS)
  705. file(APPEND ${_FN} "[generators]\n")
  706. if (DEFAULT_GENERATOR)
  707. file(APPEND ${_FN} "cmake\n")
  708. endif()
  709. if (DEFINED ARGUMENTS_GENERATORS)
  710. foreach(GENERATOR ${ARGUMENTS_GENERATORS})
  711. file(APPEND ${_FN} ${GENERATOR} "\n")
  712. endforeach()
  713. endif()
  714. endif()
  715. if(DEFINED ARGUMENTS_BUILD_REQUIRES)
  716. file(APPEND ${_FN} "[build_requires]\n")
  717. foreach(BUILD_REQUIRE ${ARGUMENTS_BUILD_REQUIRES})
  718. file(APPEND ${_FN} ${BUILD_REQUIRE} "\n")
  719. endforeach()
  720. endif()
  721. if(DEFINED ARGUMENTS_IMPORTS)
  722. file(APPEND ${_FN} "[imports]\n")
  723. foreach(IMPORTS ${ARGUMENTS_IMPORTS})
  724. file(APPEND ${_FN} ${IMPORTS} "\n")
  725. endforeach()
  726. endif()
  727. if(DEFINED ARGUMENTS_OPTIONS)
  728. file(APPEND ${_FN} "[options]\n")
  729. foreach(OPTION ${ARGUMENTS_OPTIONS})
  730. file(APPEND ${_FN} ${OPTION} "\n")
  731. endforeach()
  732. endif()
  733. endfunction()
  734. macro(conan_load_buildinfo)
  735. if(CONAN_CMAKE_MULTI)
  736. set(_CONANBUILDINFO conanbuildinfo_multi.cmake)
  737. else()
  738. set(_CONANBUILDINFO conanbuildinfo.cmake)
  739. endif()
  740. if(ARGUMENTS_INSTALL_FOLDER)
  741. set(_CONANBUILDINFOFOLDER ${ARGUMENTS_INSTALL_FOLDER})
  742. else()
  743. set(_CONANBUILDINFOFOLDER ${CMAKE_CURRENT_BINARY_DIR})
  744. endif()
  745. # Checks for the existence of conanbuildinfo.cmake, and loads it
  746. # important that it is macro, so variables defined at parent scope
  747. if(EXISTS "${_CONANBUILDINFOFOLDER}/${_CONANBUILDINFO}")
  748. message(STATUS "Conan: Loading ${_CONANBUILDINFO}")
  749. include(${_CONANBUILDINFOFOLDER}/${_CONANBUILDINFO})
  750. else()
  751. message(FATAL_ERROR "${_CONANBUILDINFO} doesn't exist in ${CMAKE_CURRENT_BINARY_DIR}")
  752. endif()
  753. endmacro()
  754. macro(conan_cmake_run)
  755. conan_parse_arguments(${ARGV})
  756. if(ARGUMENTS_CONFIGURATION_TYPES AND NOT CMAKE_CONFIGURATION_TYPES)
  757. message(WARNING "CONFIGURATION_TYPES should only be specified for multi-configuration generators")
  758. elseif(ARGUMENTS_CONFIGURATION_TYPES AND ARGUMENTS_BUILD_TYPE)
  759. message(WARNING "CONFIGURATION_TYPES and BUILD_TYPE arguments should not be defined at the same time.")
  760. endif()
  761. if(CMAKE_CONFIGURATION_TYPES AND NOT CMAKE_BUILD_TYPE AND NOT CONAN_EXPORTED
  762. AND NOT ARGUMENTS_BUILD_TYPE)
  763. set(CONAN_CMAKE_MULTI ON)
  764. if (NOT ARGUMENTS_CONFIGURATION_TYPES)
  765. set(ARGUMENTS_CONFIGURATION_TYPES "Release;Debug")
  766. endif()
  767. message(STATUS "Conan: Using cmake-multi generator")
  768. else()
  769. set(CONAN_CMAKE_MULTI OFF)
  770. endif()
  771. if(NOT CONAN_EXPORTED)
  772. conan_cmake_setup_conanfile(${ARGV})
  773. if(CONAN_CMAKE_MULTI)
  774. foreach(CMAKE_BUILD_TYPE ${ARGUMENTS_CONFIGURATION_TYPES})
  775. set(ENV{CONAN_IMPORT_PATH} ${CMAKE_BUILD_TYPE})
  776. conan_cmake_settings(settings ${ARGV})
  777. old_conan_cmake_install(SETTINGS ${settings} ${ARGV})
  778. endforeach()
  779. set(CMAKE_BUILD_TYPE)
  780. else()
  781. conan_cmake_settings(settings ${ARGV})
  782. old_conan_cmake_install(SETTINGS ${settings} ${ARGV})
  783. endif()
  784. endif()
  785. if (NOT ARGUMENTS_NO_LOAD)
  786. conan_load_buildinfo()
  787. endif()
  788. if(ARGUMENTS_BASIC_SETUP)
  789. foreach(_option CMAKE_TARGETS KEEP_RPATHS NO_OUTPUT_DIRS SKIP_STD)
  790. if(ARGUMENTS_${_option})
  791. if(${_option} STREQUAL "CMAKE_TARGETS")
  792. list(APPEND _setup_options "TARGETS")
  793. else()
  794. list(APPEND _setup_options ${_option})
  795. endif()
  796. endif()
  797. endforeach()
  798. conan_basic_setup(${_setup_options})
  799. endif()
  800. endmacro()
  801. macro(conan_check)
  802. # Checks conan availability in PATH
  803. # Arguments REQUIRED, DETECT_QUIET and VERSION are optional
  804. # Example usage:
  805. # conan_check(VERSION 1.0.0 REQUIRED)
  806. set(options REQUIRED DETECT_QUIET)
  807. set(oneValueArgs VERSION)
  808. cmake_parse_arguments(CONAN "${options}" "${oneValueArgs}" "" ${ARGN})
  809. if(NOT CONAN_DETECT_QUIET)
  810. message(STATUS "Conan: checking conan executable")
  811. endif()
  812. find_program(CONAN_CMD conan)
  813. if(NOT CONAN_CMD AND CONAN_REQUIRED)
  814. message(FATAL_ERROR "Conan executable not found! Please install conan.")
  815. endif()
  816. if(NOT CONAN_DETECT_QUIET)
  817. message(STATUS "Conan: Found program ${CONAN_CMD}")
  818. endif()
  819. execute_process(COMMAND ${CONAN_CMD} --version
  820. RESULT_VARIABLE return_code
  821. OUTPUT_VARIABLE CONAN_VERSION_OUTPUT
  822. ERROR_VARIABLE CONAN_VERSION_OUTPUT)
  823. if(NOT "${return_code}" STREQUAL "0")
  824. message(FATAL_ERROR "Conan --version failed='${return_code}'")
  825. endif()
  826. if(NOT CONAN_DETECT_QUIET)
  827. string(STRIP "${CONAN_VERSION_OUTPUT}" _CONAN_VERSION_OUTPUT)
  828. message(STATUS "Conan: Version found ${_CONAN_VERSION_OUTPUT}")
  829. endif()
  830. if(DEFINED CONAN_VERSION)
  831. string(REGEX MATCH ".*Conan version ([0-9]+\\.[0-9]+\\.[0-9]+)" FOO
  832. "${CONAN_VERSION_OUTPUT}")
  833. if(${CMAKE_MATCH_1} VERSION_LESS ${CONAN_VERSION})
  834. message(FATAL_ERROR "Conan outdated. Installed: ${CMAKE_MATCH_1}, \
  835. required: ${CONAN_VERSION}. Consider updating via 'pip \
  836. install conan==${CONAN_VERSION}'.")
  837. endif()
  838. endif()
  839. endmacro()
  840. function(conan_add_remote)
  841. # Adds a remote
  842. # Arguments URL and NAME are required, INDEX, COMMAND and VERIFY_SSL are optional
  843. # Example usage:
  844. # conan_add_remote(NAME bincrafters INDEX 1
  845. # URL https://api.bintray.com/conan/bincrafters/public-conan
  846. # VERIFY_SSL True)
  847. set(oneValueArgs URL NAME INDEX COMMAND VERIFY_SSL)
  848. cmake_parse_arguments(CONAN "" "${oneValueArgs}" "" ${ARGN})
  849. if(DEFINED CONAN_INDEX)
  850. set(CONAN_INDEX_ARG "-i ${CONAN_INDEX}")
  851. endif()
  852. if(DEFINED CONAN_COMMAND)
  853. set(CONAN_CMD ${CONAN_COMMAND})
  854. else()
  855. conan_check(REQUIRED DETECT_QUIET)
  856. endif()
  857. set(CONAN_VERIFY_SSL_ARG "True")
  858. if(DEFINED CONAN_VERIFY_SSL)
  859. set(CONAN_VERIFY_SSL_ARG ${CONAN_VERIFY_SSL})
  860. endif()
  861. message(STATUS "Conan: Adding ${CONAN_NAME} remote repository (${CONAN_URL}) verify ssl (${CONAN_VERIFY_SSL_ARG})")
  862. execute_process(COMMAND ${CONAN_CMD} remote add ${CONAN_NAME} ${CONAN_INDEX_ARG} -f ${CONAN_URL} ${CONAN_VERIFY_SSL_ARG}
  863. RESULT_VARIABLE return_code)
  864. if(NOT "${return_code}" STREQUAL "0")
  865. message(FATAL_ERROR "Conan remote failed='${return_code}'")
  866. endif()
  867. endfunction()
  868. macro(conan_config_install)
  869. # install a full configuration from a local or remote zip file
  870. # Argument ITEM is required, arguments TYPE, SOURCE, TARGET and VERIFY_SSL are optional
  871. # Example usage:
  872. # conan_config_install(ITEM https://github.com/conan-io/cmake-conan.git
  873. # TYPE git SOURCE source-folder TARGET target-folder VERIFY_SSL false)
  874. set(oneValueArgs ITEM TYPE SOURCE TARGET VERIFY_SSL)
  875. set(multiValueArgs ARGS)
  876. cmake_parse_arguments(CONAN "" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})
  877. if(DEFINED CONAN_COMMAND)
  878. set(CONAN_CMD ${CONAN_COMMAND})
  879. else()
  880. conan_check(REQUIRED)
  881. endif()
  882. if(DEFINED CONAN_VERIFY_SSL)
  883. set(CONAN_VERIFY_SSL_ARG "--verify-ssl=${CONAN_VERIFY_SSL}")
  884. endif()
  885. if(DEFINED CONAN_TYPE)
  886. set(CONAN_TYPE_ARG "--type=${CONAN_TYPE}")
  887. endif()
  888. if(DEFINED CONAN_ARGS)
  889. set(CONAN_ARGS_ARGS "--args=\"${CONAN_ARGS}\"")
  890. endif()
  891. if(DEFINED CONAN_SOURCE)
  892. set(CONAN_SOURCE_ARGS "--source-folder=${CONAN_SOURCE}")
  893. endif()
  894. if(DEFINED CONAN_TARGET)
  895. set(CONAN_TARGET_ARGS "--target-folder=${CONAN_TARGET}")
  896. endif()
  897. set (CONAN_CONFIG_INSTALL_ARGS ${CONAN_VERIFY_SSL_ARG}
  898. ${CONAN_TYPE_ARG}
  899. ${CONAN_ARGS_ARGS}
  900. ${CONAN_SOURCE_ARGS}
  901. ${CONAN_TARGET_ARGS})
  902. message(STATUS "Conan: Installing config from ${CONAN_ITEM}")
  903. execute_process(COMMAND ${CONAN_CMD} config install ${CONAN_ITEM} ${CONAN_CONFIG_INSTALL_ARGS}
  904. RESULT_VARIABLE return_code)
  905. if(NOT "${return_code}" STREQUAL "0")
  906. message(FATAL_ERROR "Conan config failed='${return_code}'")
  907. endif()
  908. endmacro()