Support.cmake 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071
  1. # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. # file Copyright.txt or https://cmake.org/licensing for details.
  3. #
  4. # This file is a "template" file used by various FindPython modules.
  5. #
  6. cmake_policy (VERSION 3.7)
  7. #
  8. # Initial configuration
  9. #
  10. if (NOT DEFINED _PYTHON_PREFIX)
  11. message (FATAL_ERROR "FindPython: INTERNAL ERROR")
  12. endif()
  13. if (NOT DEFINED _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
  14. message (FATAL_ERROR "FindPython: INTERNAL ERROR")
  15. endif()
  16. if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL 3)
  17. set(_${_PYTHON_PREFIX}_VERSIONS 3.8 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0)
  18. elseif (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL 2)
  19. set(_${_PYTHON_PREFIX}_VERSIONS 2.7 2.6 2.5 2.4 2.3 2.2 2.1 2.0)
  20. else()
  21. message (FATAL_ERROR "FindPython: INTERNAL ERROR")
  22. endif()
  23. #
  24. # helper commands
  25. #
  26. macro (_PYTHON_DISPLAY_FAILURE _PYTHON_MSG)
  27. if (${_PYTHON_PREFIX}_FIND_REQUIRED)
  28. message (FATAL_ERROR "${_PYTHON_MSG}")
  29. else()
  30. if (NOT ${_PYTHON_PREFIX}_FIND_QUIETLY)
  31. message(STATUS "${_PYTHON_MSG}")
  32. endif ()
  33. endif()
  34. set (${_PYTHON_PREFIX}_FOUND FALSE)
  35. string (TOUPPER "${_PYTHON_PREFIX}" _${_PYTHON_PREFIX}_UPPER_PREFIX)
  36. set (${_PYTHON_UPPER_PREFIX}_FOUND FALSE)
  37. return()
  38. endmacro()
  39. macro (_PYTHON_FIND_FRAMEWORKS)
  40. set (${_PYTHON_PREFIX}_FRAMEWORKS)
  41. if (APPLE)
  42. set (_pff_frameworks ${CMAKE_FRAMEWORK_PATH}
  43. $ENV{CMAKE_FRAMEWORK_PATH}
  44. ~/Library/Frameworks
  45. /usr/local/Frameworks
  46. ${CMAKE_SYSTEM_FRAMEWORK_PATH})
  47. list (REMOVE_DUPLICATES _pff_frameworks)
  48. foreach (_pff_framework IN LISTS _pff_frameworks)
  49. if (EXISTS ${_pff_framework}/Python.framework)
  50. list (APPEND ${_PYTHON_PREFIX}_FRAMEWORKS ${_pff_framework}/Python.framework)
  51. endif()
  52. endforeach()
  53. unset (_pff_frameworks)
  54. unset (_pff_framework)
  55. endif()
  56. endmacro()
  57. function (_PYTHON_GET_FRAMEWORKS _PYTHON_PGF_FRAMEWORK_PATHS _PYTHON_VERSION)
  58. set (_PYTHON_FRAMEWORK_PATHS)
  59. foreach (_PYTHON_FRAMEWORK IN LISTS ${_PYTHON_PREFIX}_FRAMEWORKS)
  60. list (APPEND _PYTHON_FRAMEWORK_PATHS
  61. "${_PYTHON_FRAMEWORK}/Versions/${_PYTHON_VERSION}")
  62. endforeach()
  63. set (${_PYTHON_PGF_FRAMEWORK_PATHS} ${_PYTHON_FRAMEWORK_PATHS} PARENT_SCOPE)
  64. endfunction()
  65. function (_PYTHON_VALIDATE_INTERPRETER)
  66. if (NOT ${_PYTHON_PREFIX}_EXECUTABLE)
  67. return()
  68. endif()
  69. if (ARGC EQUAL 1)
  70. set (expected_version ${ARGV0})
  71. else()
  72. unset (expected_version)
  73. endif()
  74. get_filename_component (python_name "${${_PYTHON_PREFIX}_EXECUTABLE}" NAME)
  75. if (expected_version AND NOT python_name STREQUAL "python${expected_version}${CMAKE_EXECUTABLE_SUFFIX}")
  76. # executable found must have a specific version
  77. execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
  78. "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:2]]))"
  79. RESULT_VARIABLE result
  80. OUTPUT_VARIABLE version
  81. ERROR_QUIET
  82. OUTPUT_STRIP_TRAILING_WHITESPACE)
  83. if (result OR NOT version EQUAL expected_version)
  84. # interpreter not usable or has wrong major version
  85. set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE)
  86. return()
  87. endif()
  88. else()
  89. if (python_name STREQUAL "python${CMAKE_EXECUTABLE_SUFFIX}")
  90. # executable found do not have version in name
  91. # ensure major version is OK
  92. execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
  93. "import sys; sys.stdout.write(str(sys.version_info[0]))"
  94. RESULT_VARIABLE result
  95. OUTPUT_VARIABLE version
  96. ERROR_QUIET
  97. OUTPUT_STRIP_TRAILING_WHITESPACE)
  98. if (result OR NOT version EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
  99. # interpreter not usable or has wrong major version
  100. set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE)
  101. return()
  102. endif()
  103. endif()
  104. endif()
  105. if (CMAKE_SIZEOF_VOID_P AND "Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
  106. AND NOT CMAKE_CROSSCOMPILING)
  107. # In this case, interpreter must have same architecture as environment
  108. execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
  109. "import sys, struct; sys.stdout.write(str(struct.calcsize(\"P\")))"
  110. RESULT_VARIABLE result
  111. OUTPUT_VARIABLE size
  112. ERROR_QUIET
  113. OUTPUT_STRIP_TRAILING_WHITESPACE)
  114. if (result OR NOT size EQUAL CMAKE_SIZEOF_VOID_P)
  115. # interpreter not usable or has wrong architecture
  116. set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE)
  117. return()
  118. endif()
  119. endif()
  120. endfunction()
  121. function (_PYTHON_FIND_RUNTIME_LIBRARY _PYTHON_LIB)
  122. string (REPLACE "_RUNTIME" "" _PYTHON_LIB "${_PYTHON_LIB}")
  123. # look at runtime part on systems supporting it
  124. if (CMAKE_SYSTEM_NAME STREQUAL "Windows" OR
  125. (CMAKE_SYSTEM_NAME MATCHES "MSYS|CYGWIN"
  126. AND ${_PYTHON_LIB} MATCHES "${CMAKE_IMPORT_LIBRARY_SUFFIX}$"))
  127. set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX})
  128. # MSYS has a special syntax for runtime libraries
  129. if (CMAKE_SYSTEM_NAME MATCHES "MSYS")
  130. list (APPEND CMAKE_FIND_LIBRARY_PREFIXES "msys-")
  131. endif()
  132. find_library (${ARGV})
  133. endif()
  134. endfunction()
  135. function (_PYTHON_SET_LIBRARY_DIRS _PYTHON_SLD_RESULT)
  136. unset (_PYTHON_DIRS)
  137. set (_PYTHON_LIBS ${ARGV})
  138. list (REMOVE_AT _PYTHON_LIBS 0)
  139. foreach (_PYTHON_LIB IN LISTS _PYTHON_LIBS)
  140. if (${_PYTHON_LIB})
  141. get_filename_component (_PYTHON_DIR "${${_PYTHON_LIB}}" DIRECTORY)
  142. list (APPEND _PYTHON_DIRS "${_PYTHON_DIR}")
  143. endif()
  144. endforeach()
  145. if (_PYTHON_DIRS)
  146. list (REMOVE_DUPLICATES _PYTHON_DIRS)
  147. endif()
  148. set (${_PYTHON_SLD_RESULT} ${_PYTHON_DIRS} PARENT_SCOPE)
  149. endfunction()
  150. # If major version is specified, it must be the same as internal major version
  151. if (DEFINED ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR
  152. AND NOT ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
  153. _python_display_failure ("Could NOT find ${_PYTHON_PREFIX}: Wrong major version specified is \"${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}\", but expected major version is \"${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}\"")
  154. endif()
  155. # handle components
  156. if (NOT ${_PYTHON_PREFIX}_FIND_COMPONENTS)
  157. set (${_PYTHON_PREFIX}_FIND_COMPONENTS Interpreter)
  158. set (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter TRUE)
  159. endif()
  160. foreach (_${_PYTHON_PREFIX}_COMPONENT IN LISTS ${_PYTHON_PREFIX}_FIND_COMPONENTS)
  161. set (${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_FOUND FALSE)
  162. endforeach()
  163. unset (_${_PYTHON_PREFIX}_FIND_VERSIONS)
  164. # Set versions to search
  165. ## default: search any version
  166. set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSIONS})
  167. if (${_PYTHON_PREFIX}_FIND_VERSION_COUNT GREATER 1)
  168. if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
  169. set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}.${${_PYTHON_PREFIX}_FIND_VERSION_MINOR})
  170. else()
  171. unset (_${_PYTHON_PREFIX}_FIND_VERSIONS)
  172. # add all compatible versions
  173. foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_VERSIONS)
  174. if (_${_PYTHON_PREFIX}_VERSION VERSION_GREATER_EQUAL ${_PYTHON_PREFIX}_FIND_VERSION)
  175. list (APPEND _${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSION})
  176. endif()
  177. endforeach()
  178. endif()
  179. endif()
  180. # Anaconda distribution: define which architectures can be used
  181. if (CMAKE_SIZEOF_VOID_P)
  182. # In this case, search only for 64bit or 32bit
  183. math (EXPR _${_PYTHON_PREFIX}_ARCH "${CMAKE_SIZEOF_VOID_P} * 8")
  184. set (_${_PYTHON_PREFIX}_ARCH2 ${_${_PYTHON_PREFIX}_ARCH})
  185. else()
  186. # architecture unknown, search for both 64bit and 32bit
  187. set (_${_PYTHON_PREFIX}_ARCH 64)
  188. set (_${_PYTHON_PREFIX}_ARCH2 32)
  189. endif()
  190. # IronPython support
  191. if (CMAKE_SIZEOF_VOID_P)
  192. # In this case, search only for 64bit or 32bit
  193. math (EXPR _${_PYTHON_PREFIX}_ARCH "${CMAKE_SIZEOF_VOID_P} * 8")
  194. set (_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES ipy${_${_PYTHON_PREFIX}_ARCH} ipy)
  195. else()
  196. # architecture unknown, search for natural interpreter
  197. set (_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES ipy)
  198. endif()
  199. # Apple frameworks handling
  200. _python_find_frameworks ()
  201. # Save CMAKE_FIND_APPBUNDLE
  202. if (DEFINED CMAKE_FIND_APPBUNDLE)
  203. set (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE ${CMAKE_FIND_APPBUNDLE})
  204. else()
  205. unset (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE)
  206. endif()
  207. # To avoid app bundle lookup
  208. set (CMAKE_FIND_APPBUNDLE "NEVER")
  209. # Save CMAKE_FIND_FRAMEWORK
  210. if (DEFINED CMAKE_FIND_FRAMEWORK)
  211. set (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
  212. if (CMAKE_FIND_FRAMEWORK STREQUAL "ONLY")
  213. message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: CMAKE_FIND_FRAMEWORK: 'ONLY' value is not supported. 'FIRST' will be used instead.")
  214. set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK "FIRST")
  215. else()
  216. set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
  217. endif()
  218. else()
  219. unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
  220. set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK "FIRST")
  221. endif()
  222. # To avoid framework lookup
  223. set (CMAKE_FIND_FRAMEWORK "NEVER")
  224. unset (_${_PYTHON_PREFIX}_REQUIRED_VARS)
  225. unset (_${_PYTHON_PREFIX}_CACHED_VARS)
  226. # first step, search for the interpreter
  227. if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
  228. if (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter)
  229. list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_EXECUTABLE)
  230. list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_EXECUTABLE)
  231. endif()
  232. set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
  233. # look-up for various versions and locations
  234. foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
  235. string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION})
  236. _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION})
  237. # Apple frameworks handling
  238. if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
  239. find_program (${_PYTHON_PREFIX}_EXECUTABLE
  240. NAMES python${_${_PYTHON_PREFIX}_VERSION}
  241. python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
  242. NAMES_PER_DIR
  243. PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
  244. PATH_SUFFIXES bin
  245. NO_CMAKE_PATH
  246. NO_CMAKE_ENVIRONMENT_PATH
  247. NO_SYSTEM_ENVIRONMENT_PATH
  248. NO_CMAKE_SYSTEM_PATH)
  249. endif()
  250. # try using HINTS
  251. find_program (${_PYTHON_PREFIX}_EXECUTABLE
  252. NAMES python${_${_PYTHON_PREFIX}_VERSION}
  253. python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
  254. NAMES_PER_DIR
  255. HINTS ${_${_PYTHON_PREFIX}_HINTS}
  256. PATH_SUFFIXES bin
  257. NO_SYSTEM_ENVIRONMENT_PATH
  258. NO_CMAKE_SYSTEM_PATH)
  259. # try using registry
  260. if (WIN32)
  261. find_program (${_PYTHON_PREFIX}_EXECUTABLE
  262. NAMES python${_${_PYTHON_PREFIX}_VERSION}
  263. python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
  264. python
  265. ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
  266. NAMES_PER_DIR
  267. HINTS ${_${_PYTHON_PREFIX}_HINTS}
  268. PATHS [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  269. [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  270. [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
  271. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  272. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  273. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
  274. [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  275. PATH_SUFFIXES bin
  276. NO_SYSTEM_ENVIRONMENT_PATH
  277. NO_CMAKE_SYSTEM_PATH)
  278. endif()
  279. # try in standard paths
  280. find_program (${_PYTHON_PREFIX}_EXECUTABLE
  281. NAMES python${_${_PYTHON_PREFIX}_VERSION}
  282. NAMES_PER_DIR)
  283. # Apple frameworks handling
  284. if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
  285. find_program (${_PYTHON_PREFIX}_EXECUTABLE
  286. NAMES python${_${_PYTHON_PREFIX}_VERSION}
  287. python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
  288. NAMES_PER_DIR
  289. PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
  290. PATH_SUFFIXES bin
  291. NO_DEFAULT_PATH)
  292. endif()
  293. _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION})
  294. if (${_PYTHON_PREFIX}_EXECUTABLE)
  295. break()
  296. endif()
  297. endforeach()
  298. # try more generic names. NAMES_PER_DIR is not specified on purpose to have a
  299. # chance to find expected version.
  300. # For example, typical systems have 'python' for version 2.* and 'python3'
  301. # for version 3.*. So looking for names per dir will find, potentially,
  302. # systematically 'python' (i.e. version 2) even if version 3 is searched.
  303. if (NOT ${_PYTHON_PREFIX}_EXECUTABLE)
  304. find_program (${_PYTHON_PREFIX}_EXECUTABLE
  305. NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
  306. python
  307. ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
  308. HINTS ${_${_PYTHON_PREFIX}_HINTS}
  309. PATH_SUFFIXES bin)
  310. _python_validate_interpreter ()
  311. endif()
  312. # retrieve exact version of executable found
  313. if (${_PYTHON_PREFIX}_EXECUTABLE)
  314. execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
  315. "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))"
  316. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  317. OUTPUT_VARIABLE ${_PYTHON_PREFIX}_VERSION
  318. ERROR_QUIET
  319. OUTPUT_STRIP_TRAILING_WHITESPACE)
  320. if (NOT _${_PYTHON_PREFIX}_RESULT)
  321. string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${${_PYTHON_PREFIX}_VERSION}")
  322. list (GET _${_PYTHON_PREFIX}_VERSIONS 0 ${_PYTHON_PREFIX}_VERSION_MAJOR)
  323. list (GET _${_PYTHON_PREFIX}_VERSIONS 1 ${_PYTHON_PREFIX}_VERSION_MINOR)
  324. list (GET _${_PYTHON_PREFIX}_VERSIONS 2 ${_PYTHON_PREFIX}_VERSION_PATCH)
  325. else()
  326. # Interpreter is not usable
  327. set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE)
  328. unset (${_PYTHON_PREFIX}_VERSION)
  329. endif()
  330. endif()
  331. if (${_PYTHON_PREFIX}_EXECUTABLE
  332. AND ${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
  333. set (${_PYTHON_PREFIX}_Interpreter_FOUND TRUE)
  334. # Use interpreter version for future searches to ensure consistency
  335. set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
  336. endif()
  337. if (${_PYTHON_PREFIX}_Interpreter_FOUND)
  338. # retrieve interpreter identity
  339. execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -V
  340. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  341. OUTPUT_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID
  342. ERROR_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID)
  343. if (NOT _${_PYTHON_PREFIX}_RESULT)
  344. if (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Anaconda")
  345. set (${_PYTHON_PREFIX}_INTERPRETER_ID "Anaconda")
  346. elseif (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Enthought")
  347. set (${_PYTHON_PREFIX}_INTERPRETER_ID "Canopy")
  348. else()
  349. string (REGEX REPLACE "^([^ ]+).*" "\\1" ${_PYTHON_PREFIX}_INTERPRETER_ID "${${_PYTHON_PREFIX}_INTERPRETER_ID}")
  350. if (${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "Python")
  351. # try to get a more precise ID
  352. execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; print(sys.copyright)"
  353. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  354. OUTPUT_VARIABLE ${_PYTHON_PREFIX}_COPYRIGHT
  355. ERROR_QUIET)
  356. if (${_PYTHON_PREFIX}_COPYRIGHT MATCHES "ActiveState")
  357. set (${_PYTHON_PREFIX}_INTERPRETER_ID "ActivePython")
  358. endif()
  359. endif()
  360. endif()
  361. else()
  362. set (${_PYTHON_PREFIX}_INTERPRETER_ID Python)
  363. endif()
  364. else()
  365. unset (${_PYTHON_PREFIX}_INTERPRETER_ID)
  366. endif()
  367. # retrieve various package installation directories
  368. execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; from distutils import sysconfig;sys.stdout.write(';'.join([sysconfig.get_python_lib(plat_specific=False,standard_lib=True),sysconfig.get_python_lib(plat_specific=True,standard_lib=True),sysconfig.get_python_lib(plat_specific=False,standard_lib=False),sysconfig.get_python_lib(plat_specific=True,standard_lib=False)]))"
  369. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  370. OUTPUT_VARIABLE _${_PYTHON_PREFIX}_LIBPATHS
  371. ERROR_QUIET)
  372. if (NOT _${_PYTHON_PREFIX}_RESULT)
  373. list (GET _${_PYTHON_PREFIX}_LIBPATHS 0 ${_PYTHON_PREFIX}_STDLIB)
  374. list (GET _${_PYTHON_PREFIX}_LIBPATHS 1 ${_PYTHON_PREFIX}_STDARCH)
  375. list (GET _${_PYTHON_PREFIX}_LIBPATHS 2 ${_PYTHON_PREFIX}_SITELIB)
  376. list (GET _${_PYTHON_PREFIX}_LIBPATHS 3 ${_PYTHON_PREFIX}_SITEARCH)
  377. else()
  378. unset (${_PYTHON_PREFIX}_STDLIB)
  379. unset (${_PYTHON_PREFIX}_STDARCH)
  380. unset (${_PYTHON_PREFIX}_SITELIB)
  381. unset (${_PYTHON_PREFIX}_SITEARCH)
  382. endif()
  383. mark_as_advanced (${_PYTHON_PREFIX}_EXECUTABLE)
  384. endif()
  385. # second step, search for compiler (IronPython)
  386. if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
  387. if (${_PYTHON_PREFIX}_FIND_REQUIRED_Compiler)
  388. list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_COMPILER)
  389. list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_COMPILER)
  390. endif()
  391. # IronPython specific artifacts
  392. # If IronPython interpreter is found, use its path
  393. unset (_${_PYTHON_PREFIX}_IRON_ROOT)
  394. if (${_PYTHON_PREFIX}_Interpreter_FOUND AND ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython")
  395. get_filename_component (_${_PYTHON_PREFIX}_IRON_ROOT "${${_PYTHON_PREFIX}_EXECUTABLE}" DIRECTORY)
  396. endif()
  397. # try using root dir and registry
  398. foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
  399. find_program (${_PYTHON_PREFIX}_COMPILER
  400. NAMES ipyc
  401. HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
  402. PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  403. NO_SYSTEM_ENVIRONMENT_PATH
  404. NO_CMAKE_SYSTEM_PATH)
  405. if (${_PYTHON_PREFIX}_COMPILER)
  406. break()
  407. endif()
  408. endforeach()
  409. # try in standard paths
  410. find_program (${_PYTHON_PREFIX}_COMPILER
  411. NAMES ipyc)
  412. if (${_PYTHON_PREFIX}_COMPILER)
  413. # retrieve python environment version from compiler
  414. set (_${_PYTHON_PREFIX}_VERSION_DIR "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir")
  415. file (WRITE "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))\n")
  416. execute_process (COMMAND "${${_PYTHON_PREFIX}_COMPILER}" /target:exe /embed "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py"
  417. WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}"
  418. OUTPUT_QUIET
  419. ERROR_QUIET)
  420. execute_process (COMMAND "${_${_PYTHON_PREFIX}_VERSION_DIR}/version"
  421. WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}"
  422. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  423. OUTPUT_VARIABLE _${_PYTHON_PREFIX}_VERSION
  424. ERROR_QUIET)
  425. if (NOT _${_PYTHON_PREFIX}_RESULT)
  426. string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${_${_PYTHON_PREFIX}_VERSION}")
  427. list (GET _${_PYTHON_PREFIX}_VERSIONS 0 _${_PYTHON_PREFIX}_VERSION_MAJOR)
  428. list (GET _${_PYTHON_PREFIX}_VERSIONS 1 _${_PYTHON_PREFIX}_VERSION_MINOR)
  429. list (GET _${_PYTHON_PREFIX}_VERSIONS 2 _${_PYTHON_PREFIX}_VERSION_PATCH)
  430. if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND)
  431. # set public version information
  432. set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION})
  433. set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR})
  434. set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR})
  435. set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH})
  436. endif()
  437. else()
  438. # compiler not usable
  439. set (${_PYTHON_PREFIX}_COMPILER ${_PYTHON_PREFIX}_COMPILER-NOTFOUND CACHE INTERNAL "" FORCE)
  440. endif()
  441. file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}")
  442. endif()
  443. if (${_PYTHON_PREFIX}_COMPILER)
  444. if (${_PYTHON_PREFIX}_Interpreter_FOUND)
  445. # Compiler must be compatible with interpreter
  446. if (${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR} VERSION_EQUAL ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
  447. set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE)
  448. endif()
  449. elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
  450. set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE)
  451. # Use compiler version for future searches to ensure consistency
  452. set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
  453. endif()
  454. endif()
  455. if (${_PYTHON_PREFIX}_Compiler_FOUND)
  456. set (${_PYTHON_PREFIX}_COMPILER_ID IronPython)
  457. else()
  458. unset (${_PYTHON_PREFIX}_COMPILER_ID)
  459. endif()
  460. mark_as_advanced (${_PYTHON_PREFIX}_COMPILER)
  461. endif()
  462. # third step, search for the development artifacts
  463. ## Development environment is not compatible with IronPython interpreter
  464. if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
  465. AND NOT ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython")
  466. if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development)
  467. list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_LIBRARY
  468. ${_PYTHON_PREFIX}_INCLUDE_DIR)
  469. list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_LIBRARY
  470. ${_PYTHON_PREFIX}_LIBRARY_RELEASE
  471. ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
  472. ${_PYTHON_PREFIX}_LIBRARY_DEBUG
  473. ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
  474. ${_PYTHON_PREFIX}_INCLUDE_DIR)
  475. endif()
  476. # Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES
  477. unset (_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES)
  478. if (DEFINED ${_PYTHON_PREFIX}_USE_STATIC_LIBS AND NOT WIN32)
  479. set(_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
  480. if(${_PYTHON_PREFIX}_USE_STATIC_LIBS)
  481. set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
  482. else()
  483. list (REMOVE_ITEM CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
  484. endif()
  485. else()
  486. endif()
  487. # if python interpreter is found, use its location and version to ensure consistency
  488. # between interpreter and development environment
  489. unset (_${_PYTHON_PREFIX}_PREFIX)
  490. if (${_PYTHON_PREFIX}_Interpreter_FOUND)
  491. execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
  492. "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.PREFIX)"
  493. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  494. OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PREFIX
  495. ERROR_QUIET
  496. OUTPUT_STRIP_TRAILING_WHITESPACE)
  497. if (_${_PYTHON_PREFIX}_RESULT)
  498. unset (_${_PYTHON_PREFIX}_PREFIX)
  499. endif()
  500. endif()
  501. set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}" "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
  502. foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
  503. string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION})
  504. # try to use pythonX.Y-config tool
  505. set (_${_PYTHON_PREFIX}_CONFIG_NAMES)
  506. if (DEFINED CMAKE_LIBRARY_ARCHITECTURE)
  507. set (_${_PYTHON_PREFIX}_CONFIG_NAMES "${CMAKE_LIBRARY_ARCHITECTURE}-python${_${_PYTHON_PREFIX}_VERSION}-config")
  508. endif()
  509. list (APPEND _${_PYTHON_PREFIX}_CONFIG_NAMES "python${_${_PYTHON_PREFIX}_VERSION}-config")
  510. find_program (_${_PYTHON_PREFIX}_CONFIG
  511. NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
  512. NAMES_PER_DIR
  513. HINTS ${_${_PYTHON_PREFIX}_HINTS}
  514. PATH_SUFFIXES bin)
  515. unset (_${_PYTHON_PREFIX}_CONFIG_NAMES)
  516. if (NOT _${_PYTHON_PREFIX}_CONFIG)
  517. continue()
  518. endif()
  519. # retrieve root install directory
  520. execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --prefix
  521. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  522. OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PREFIX
  523. ERROR_QUIET
  524. OUTPUT_STRIP_TRAILING_WHITESPACE)
  525. if (_${_PYTHON_PREFIX}_RESULT)
  526. # python-config is not usable
  527. unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
  528. continue()
  529. endif()
  530. set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}" "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
  531. # retrieve library
  532. execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --ldflags
  533. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  534. OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS
  535. ERROR_QUIET
  536. OUTPUT_STRIP_TRAILING_WHITESPACE)
  537. if (NOT _${_PYTHON_PREFIX}_RESULT)
  538. # retrieve library directory
  539. string (REGEX MATCHALL "-L[^ ]+" _${_PYTHON_PREFIX}_LIB_DIRS "${_${_PYTHON_PREFIX}_FLAGS}")
  540. string (REPLACE "-L" "" _${_PYTHON_PREFIX}_LIB_DIRS "${_${_PYTHON_PREFIX}_LIB_DIRS}")
  541. list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_LIB_DIRS)
  542. # retrieve library name
  543. string (REGEX MATCHALL "-lpython[^ ]+" _${_PYTHON_PREFIX}_LIB_NAMES "${_${_PYTHON_PREFIX}_FLAGS}")
  544. string (REPLACE "-l" "" _${_PYTHON_PREFIX}_LIB_NAMES "${_${_PYTHON_PREFIX}_LIB_NAMES}")
  545. list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_LIB_NAMES)
  546. find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
  547. NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
  548. NAMES_PER_DIR
  549. HINTS ${_${_PYTHON_PREFIX}_HINTS} ${_${_PYTHON_PREFIX}_LIB_DIRS}
  550. PATH_SUFFIXES lib
  551. NO_SYSTEM_ENVIRONMENT_PATH
  552. NO_CMAKE_SYSTEM_PATH)
  553. # retrieve runtime library
  554. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE)
  555. get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
  556. _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
  557. NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
  558. NAMES_PER_DIR
  559. HINTS ${_${_PYTHON_PREFIX}_PATH} ${_${_PYTHON_PREFIX}_HINTS}
  560. PATH_SUFFIXES bin
  561. NO_SYSTEM_ENVIRONMENT_PATH
  562. NO_CMAKE_SYSTEM_PATH)
  563. endif()
  564. endif()
  565. # retrieve include directory
  566. execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --includes
  567. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  568. OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS
  569. ERROR_QUIET
  570. OUTPUT_STRIP_TRAILING_WHITESPACE)
  571. if (NOT _${_PYTHON_PREFIX}_RESULT)
  572. # retrieve include directory
  573. string (REGEX MATCHALL "-I[^ ]+" _${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_FLAGS}")
  574. string (REPLACE "-I" "" _${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_INCLUDE_DIRS}")
  575. list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_INCLUDE_DIRS)
  576. find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
  577. NAMES Python.h
  578. HINTS ${_${_PYTHON_PREFIX}_INCLUDE_DIRS}
  579. NO_SYSTEM_ENVIRONMENT_PATH
  580. NO_CMAKE_SYSTEM_PATH)
  581. endif()
  582. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_INCLUDE_DIR)
  583. break()
  584. endif()
  585. endforeach()
  586. # Rely on HINTS and standard paths if config tool failed to locate artifacts
  587. if (NOT (${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) OR NOT ${_PYTHON_PREFIX}_INCLUDE_DIR)
  588. foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
  589. string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION})
  590. _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION})
  591. if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
  592. find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
  593. NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
  594. python${_${_PYTHON_PREFIX}_VERSION}mu
  595. python${_${_PYTHON_PREFIX}_VERSION}m
  596. python${_${_PYTHON_PREFIX}_VERSION}u
  597. python${_${_PYTHON_PREFIX}_VERSION}
  598. NAMES_PER_DIR
  599. PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
  600. PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs
  601. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu
  602. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m
  603. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u
  604. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}
  605. lib/python${_${_PYTHON_PREFIX}_VERSION}/config
  606. NO_CMAKE_PATH
  607. NO_CMAKE_ENVIRONMENT_PATH
  608. NO_SYSTEM_ENVIRONMENT_PATH
  609. NO_CMAKE_SYSTEM_PATH)
  610. endif()
  611. # search first in known locations
  612. find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
  613. NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
  614. python${_${_PYTHON_PREFIX}_VERSION}mu
  615. python${_${_PYTHON_PREFIX}_VERSION}m
  616. python${_${_PYTHON_PREFIX}_VERSION}u
  617. python${_${_PYTHON_PREFIX}_VERSION}
  618. NAMES_PER_DIR
  619. HINTS ${_${_PYTHON_PREFIX}_HINTS}
  620. PATHS [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  621. [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  622. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  623. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  624. PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs
  625. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu
  626. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m
  627. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u
  628. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}
  629. lib/python${_${_PYTHON_PREFIX}_VERSION}/config
  630. NO_SYSTEM_ENVIRONMENT_PATH
  631. NO_CMAKE_SYSTEM_PATH)
  632. if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
  633. set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
  634. else()
  635. unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
  636. endif()
  637. # search in all default paths
  638. find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
  639. NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
  640. python${_${_PYTHON_PREFIX}_VERSION}mu
  641. python${_${_PYTHON_PREFIX}_VERSION}m
  642. python${_${_PYTHON_PREFIX}_VERSION}u
  643. python${_${_PYTHON_PREFIX}_VERSION}
  644. NAMES_PER_DIR
  645. PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
  646. PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs
  647. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu
  648. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m
  649. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u
  650. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}
  651. lib/python${_${_PYTHON_PREFIX}_VERSION}/config)
  652. # retrieve runtime library
  653. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE)
  654. get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
  655. _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
  656. NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
  657. python${_${_PYTHON_PREFIX}_VERSION}mu
  658. python${_${_PYTHON_PREFIX}_VERSION}m
  659. python${_${_PYTHON_PREFIX}_VERSION}u
  660. python${_${_PYTHON_PREFIX}_VERSION}
  661. NAMES_PER_DIR
  662. HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS}
  663. PATHS [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  664. [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  665. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  666. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  667. PATH_SUFFIXES bin)
  668. endif()
  669. if (WIN32)
  670. # search for debug library
  671. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE)
  672. # use library location as a hint
  673. get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
  674. find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG
  675. NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d
  676. NAMES_PER_DIR
  677. HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS}
  678. NO_DEFAULT_PATH)
  679. else()
  680. # search first in known locations
  681. find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG
  682. NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d
  683. NAMES_PER_DIR
  684. HINTS ${_${_PYTHON_PREFIX}_HINTS}
  685. PATHS [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  686. [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  687. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  688. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  689. PATH_SUFFIXES lib libs
  690. NO_SYSTEM_ENVIRONMENT_PATH
  691. NO_CMAKE_SYSTEM_PATH)
  692. # search in all default paths
  693. find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG
  694. NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d
  695. NAMES_PER_DIR
  696. PATH_SUFFIXES lib libs)
  697. endif()
  698. if (${_PYTHON_PREFIX}_LIBRARY_DEBUG)
  699. get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}" DIRECTORY)
  700. _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
  701. NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d
  702. NAMES_PER_DIR
  703. HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS}
  704. PATHS [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  705. [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  706. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  707. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  708. PATH_SUFFIXES bin)
  709. endif()
  710. endif()
  711. # Don't search for include dir until library location is known
  712. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
  713. unset (_${_PYTHON_PREFIX}_INCLUDE_HINTS)
  714. foreach (_${_PYTHON_PREFIX}_LIB IN ITEMS ${_PYTHON_PREFIX}_LIBRARY_RELEASE ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
  715. if (${_${_PYTHON_PREFIX}_LIB})
  716. # Use the library's install prefix as a hint
  717. if (${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+/Frameworks/Python.framework/Versions/[0-9.]+)")
  718. list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
  719. elseif (${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+)/lib(64|32)?/python[0-9.]+/config")
  720. list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
  721. elseif (DEFINED CMAKE_LIBRARY_ARCHITECTURE AND ${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+)/lib/${CMAKE_LIBRARY_ARCHITECTURE}")
  722. list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
  723. else()
  724. # assume library is in a directory under root
  725. get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${${_${_PYTHON_PREFIX}_LIB}}" DIRECTORY)
  726. get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${_${_PYTHON_PREFIX}_PREFIX}" DIRECTORY)
  727. list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${_${_PYTHON_PREFIX}_PREFIX}")
  728. endif()
  729. endif()
  730. endforeach()
  731. list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_INCLUDE_HINTS)
  732. if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
  733. find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
  734. NAMES Python.h
  735. HINTS ${_${_PYTHON_PREFIX}_HINTS}
  736. PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
  737. PATH_SUFFIXES include/python${_${_PYTHON_PREFIX}_VERSION}mu
  738. include/python${_${_PYTHON_PREFIX}_VERSION}m
  739. include/python${_${_PYTHON_PREFIX}_VERSION}u
  740. include/python${_${_PYTHON_PREFIX}_VERSION}
  741. include
  742. NO_CMAKE_PATH
  743. NO_CMAKE_ENVIRONMENT_PATH
  744. NO_SYSTEM_ENVIRONMENT_PATH
  745. NO_CMAKE_SYSTEM_PATH)
  746. endif()
  747. if (NOT _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
  748. unset (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
  749. endif()
  750. find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
  751. NAMES Python.h
  752. HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
  753. PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
  754. [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  755. [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  756. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  757. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  758. PATH_SUFFIXES include/python${_${_PYTHON_PREFIX}_VERSION}mu
  759. include/python${_${_PYTHON_PREFIX}_VERSION}m
  760. include/python${_${_PYTHON_PREFIX}_VERSION}u
  761. include/python${_${_PYTHON_PREFIX}_VERSION}
  762. include
  763. NO_SYSTEM_ENVIRONMENT_PATH
  764. NO_CMAKE_SYSTEM_PATH)
  765. endif()
  766. if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) AND ${_PYTHON_PREFIX}_INCLUDE_DIR)
  767. break()
  768. endif()
  769. endforeach()
  770. # search header file in standard locations
  771. find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
  772. NAMES Python.h)
  773. endif()
  774. if (${_PYTHON_PREFIX}_INCLUDE_DIR)
  775. # retrieve version from header file
  776. file (STRINGS "${${_PYTHON_PREFIX}_INCLUDE_DIR}/patchlevel.h" _${_PYTHON_PREFIX}_VERSION
  777. REGEX "^#define[ \t]+PY_VERSION[ \t]+\"[^\"]+\"")
  778. string (REGEX REPLACE "^#define[ \t]+PY_VERSION[ \t]+\"([^\"]+)\".*" "\\1"
  779. _${_PYTHON_PREFIX}_VERSION "${_${_PYTHON_PREFIX}_VERSION}")
  780. string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${_${_PYTHON_PREFIX}_VERSION}")
  781. list (GET _${_PYTHON_PREFIX}_VERSIONS 0 _${_PYTHON_PREFIX}_VERSION_MAJOR)
  782. list (GET _${_PYTHON_PREFIX}_VERSIONS 1 _${_PYTHON_PREFIX}_VERSION_MINOR)
  783. list (GET _${_PYTHON_PREFIX}_VERSIONS 2 _${_PYTHON_PREFIX}_VERSION_PATCH)
  784. if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT ${_PYTHON_PREFIX}_Compiler_FOUND)
  785. # set public version information
  786. set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION})
  787. set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR})
  788. set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR})
  789. set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH})
  790. endif()
  791. endif()
  792. # define public variables
  793. include (${CMAKE_CURRENT_LIST_DIR}/../SelectLibraryConfigurations.cmake)
  794. select_library_configurations (${_PYTHON_PREFIX})
  795. if (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
  796. set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
  797. elseif (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
  798. set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
  799. else()
  800. set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "$${_PYTHON_PREFIX}_RUNTIME_LIBRARY-NOTFOUND")
  801. endif()
  802. _python_set_library_dirs (${_PYTHON_PREFIX}_LIBRARY_DIRS
  803. ${_PYTHON_PREFIX}_LIBRARY_RELEASE ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
  804. if (UNIX)
  805. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$"
  806. OR ${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$")
  807. set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS ${${_PYTHON_PREFIX}_LIBRARY_DIRS})
  808. endif()
  809. else()
  810. _python_set_library_dirs (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS
  811. ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
  812. endif()
  813. set (${_PYTHON_PREFIX}_INCLUDE_DIRS "${${_PYTHON_PREFIX}_INCLUDE_DIR}")
  814. mark_as_advanced (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
  815. ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
  816. ${_PYTHON_PREFIX}_INCLUDE_DIR)
  817. if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
  818. AND ${_PYTHON_PREFIX}_INCLUDE_DIR)
  819. if (${_PYTHON_PREFIX}_Interpreter_FOUND OR ${_PYTHON_PREFIX}_Compiler_FOUND)
  820. # development environment must be compatible with interpreter/compiler
  821. if (${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR} VERSION_EQUAL ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
  822. set (${_PYTHON_PREFIX}_Development_FOUND TRUE)
  823. endif()
  824. elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
  825. set (${_PYTHON_PREFIX}_Development_FOUND TRUE)
  826. endif()
  827. endif()
  828. # Restore the original find library ordering
  829. if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES)
  830. set (CMAKE_FIND_LIBRARY_SUFFIXES ${_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES})
  831. endif()
  832. endif()
  833. # final validation
  834. if (${_PYTHON_PREFIX}_VERSION_MAJOR AND
  835. NOT ${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
  836. _python_display_failure ("Could NOT find ${_PYTHON_PREFIX}: Found unsuitable major version \"${${_PYTHON_PREFIX}_VERSION_MAJOR}\", but required major version is exact version \"${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}\"")
  837. endif()
  838. include (${CMAKE_CURRENT_LIST_DIR}/../FindPackageHandleStandardArgs.cmake)
  839. find_package_handle_standard_args (${_PYTHON_PREFIX}
  840. REQUIRED_VARS ${_${_PYTHON_PREFIX}_REQUIRED_VARS}
  841. VERSION_VAR ${_PYTHON_PREFIX}_VERSION
  842. HANDLE_COMPONENTS)
  843. # Create imported targets and helper functions
  844. if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
  845. AND ${_PYTHON_PREFIX}_Interpreter_FOUND
  846. AND NOT TARGET ${_PYTHON_PREFIX}::Interpreter)
  847. add_executable (${_PYTHON_PREFIX}::Interpreter IMPORTED)
  848. set_property (TARGET ${_PYTHON_PREFIX}::Interpreter
  849. PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_EXECUTABLE}")
  850. endif()
  851. if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
  852. AND ${_PYTHON_PREFIX}_Compiler_FOUND
  853. AND NOT TARGET ${_PYTHON_PREFIX}::Compiler)
  854. add_executable (${_PYTHON_PREFIX}::Compiler IMPORTED)
  855. set_property (TARGET ${_PYTHON_PREFIX}::Compiler
  856. PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_COMPILER}")
  857. endif()
  858. if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
  859. AND ${_PYTHON_PREFIX}_Development_FOUND AND NOT TARGET ${_PYTHON_PREFIX}::Python)
  860. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$"
  861. OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$"
  862. OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
  863. set (_${_PYTHON_PREFIX}_LIBRARY_TYPE SHARED)
  864. else()
  865. set (_${_PYTHON_PREFIX}_LIBRARY_TYPE STATIC)
  866. endif()
  867. add_library (${_PYTHON_PREFIX}::Python ${_${_PYTHON_PREFIX}_LIBRARY_TYPE} IMPORTED)
  868. set_property (TARGET ${_PYTHON_PREFIX}::Python
  869. PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_INCLUDE_DIR}")
  870. if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
  871. OR (${_PYTHON_PREFIX}_LIBRARY_DEBUG AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG))
  872. # System manage shared libraries in two parts: import and runtime
  873. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
  874. set_property (TARGET ${_PYTHON_PREFIX}::Python PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG)
  875. set_target_properties (${_PYTHON_PREFIX}::Python
  876. PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
  877. IMPORTED_IMPLIB_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}"
  878. IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
  879. set_target_properties (${_PYTHON_PREFIX}::Python
  880. PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
  881. IMPORTED_IMPLIB_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}"
  882. IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
  883. else()
  884. set_target_properties (${_PYTHON_PREFIX}::Python
  885. PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C"
  886. IMPORTED_IMPLIB "${${_PYTHON_PREFIX}_LIBRARY}"
  887. IMPORTED_LOCATION "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY}")
  888. endif()
  889. else()
  890. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
  891. set_property (TARGET ${_PYTHON_PREFIX}::Python PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG)
  892. set_target_properties (${_PYTHON_PREFIX}::Python
  893. PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
  894. IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
  895. set_target_properties (${_PYTHON_PREFIX}::Python
  896. PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
  897. IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}")
  898. else()
  899. set_target_properties (${_PYTHON_PREFIX}::Python
  900. PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C"
  901. IMPORTED_LOCATION "${${_PYTHON_PREFIX}_LIBRARY}")
  902. endif()
  903. endif()
  904. if (_${_PYTHON_PREFIX}_CONFIG AND _${_PYTHON_PREFIX}_LIBRARY_TYPE STREQUAL "STATIC")
  905. # extend link information with dependent libraries
  906. execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --ldflags
  907. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  908. OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS
  909. ERROR_QUIET
  910. OUTPUT_STRIP_TRAILING_WHITESPACE)
  911. if (NOT _${_PYTHON_PREFIX}_RESULT)
  912. string (REGEX MATCHALL "-[Ll][^ ]+" _${_PYTHON_PREFIX}_LINK_LIBRARIES "${_${_PYTHON_PREFIX}_FLAGS}")
  913. # remove elements relative to python library itself
  914. list (FILTER _${_PYTHON_PREFIX}_LINK_LIBRARIES EXCLUDE REGEX "-lpython")
  915. foreach (_${_PYTHON_PREFIX}_DIR IN LISTS ${_PYTHON_PREFIX}_LIBRARY_DIRS)
  916. list (FILTER _${_PYTHON_PREFIX}_LINK_LIBRARIES EXCLUDE REGEX "-L${${_PYTHON_PREFIX}_DIR}")
  917. endforeach()
  918. set_property (TARGET ${_PYTHON_PREFIX}::Python
  919. PROPERTY INTERFACE_LINK_LIBRARIES ${_${_PYTHON_PREFIX}_LINK_LIBRARIES})
  920. endif()
  921. endif()
  922. #
  923. # PYTHON_ADD_LIBRARY (<name> [STATIC|SHARED|MODULE] src1 src2 ... srcN)
  924. # It is used to build modules for python.
  925. #
  926. function (__${_PYTHON_PREFIX}_ADD_LIBRARY prefix name)
  927. cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY
  928. "STATIC;SHARED;MODULE" "" "")
  929. unset (type)
  930. if (NOT (PYTHON_ADD_LIBRARY_STATIC
  931. OR PYTHON_ADD_LIBRARY_SHARED
  932. OR PYTHON_ADD_LIBRARY_MODULE))
  933. set (type MODULE)
  934. endif()
  935. add_library (${name} ${type} ${ARGN})
  936. target_link_libraries (${name} PRIVATE ${prefix}::Python)
  937. # customize library name to follow module name rules
  938. get_property (type TARGET ${name} PROPERTY TYPE)
  939. if (type STREQUAL "MODULE_LIBRARY")
  940. set_property (TARGET ${name} PROPERTY PREFIX "")
  941. if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
  942. set_property (TARGET ${name} PROPERTY SUFFIX ".pyd")
  943. endif()
  944. endif()
  945. endfunction()
  946. endif()
  947. # final clean-up
  948. # Restore CMAKE_FIND_APPBUNDLE
  949. if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE)
  950. set (CMAKE_FIND_APPBUNDLE ${_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE})
  951. unset (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE)
  952. else()
  953. unset (CMAKE_FIND_APPBUNDLE)
  954. endif()
  955. # Restore CMAKE_FIND_FRAMEWORK
  956. if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
  957. set (CMAKE_FIND_FRAMEWORK ${_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK})
  958. unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
  959. else()
  960. unset (CMAKE_FIND_FRAMEWORK)
  961. endif()
  962. unset (_${_PYTHON_PREFIX}_CONFIG CACHE)