Support.cmake 47 KB

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