Support.cmake 46 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925
  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. _python_validate_interpreter ()
  215. if (${_PYTHON_PREFIX}_EXECUTABLE)
  216. break()
  217. endif()
  218. endforeach()
  219. # try more generic names
  220. if (NOT ${_PYTHON_PREFIX}_EXECUTABLE)
  221. find_program (${_PYTHON_PREFIX}_EXECUTABLE
  222. NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} python
  223. ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
  224. HINTS ${_${_PYTHON_PREFIX}_HINTS}
  225. PATH_SUFFIXES bin)
  226. _python_validate_interpreter ()
  227. endif()
  228. # retrieve exact version of executable found
  229. if (${_PYTHON_PREFIX}_EXECUTABLE)
  230. execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
  231. "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))"
  232. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  233. OUTPUT_VARIABLE ${_PYTHON_PREFIX}_VERSION
  234. ERROR_QUIET
  235. OUTPUT_STRIP_TRAILING_WHITESPACE)
  236. if (NOT _${_PYTHON_PREFIX}_RESULT)
  237. string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${${_PYTHON_PREFIX}_VERSION}")
  238. list (GET _${_PYTHON_PREFIX}_VERSIONS 0 ${_PYTHON_PREFIX}_VERSION_MAJOR)
  239. list (GET _${_PYTHON_PREFIX}_VERSIONS 1 ${_PYTHON_PREFIX}_VERSION_MINOR)
  240. list (GET _${_PYTHON_PREFIX}_VERSIONS 2 ${_PYTHON_PREFIX}_VERSION_PATCH)
  241. else()
  242. # Interpreter is not usable
  243. set (${_PYTHON_PREFIX}_EXECUTABLE ${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND CACHE INTERNAL "" FORCE)
  244. unset (${_PYTHON_PREFIX}_VERSION)
  245. endif()
  246. endif()
  247. if (${_PYTHON_PREFIX}_EXECUTABLE
  248. AND ${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
  249. set (${_PYTHON_PREFIX}_Interpreter_FOUND TRUE)
  250. # Use interpreter version for future searches to ensure consistency
  251. set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
  252. endif()
  253. if (${_PYTHON_PREFIX}_Interpreter_FOUND)
  254. # retrieve interpreter identity
  255. execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -V
  256. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  257. OUTPUT_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID
  258. ERROR_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID)
  259. if (NOT _${_PYTHON_PREFIX}_RESULT)
  260. if (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Anaconda")
  261. set (${_PYTHON_PREFIX}_INTERPRETER_ID "Anaconda")
  262. elseif (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Enthought")
  263. set (${_PYTHON_PREFIX}_INTERPRETER_ID "Canopy")
  264. else()
  265. string (REGEX REPLACE "^([^ ]+).*" "\\1" ${_PYTHON_PREFIX}_INTERPRETER_ID "${${_PYTHON_PREFIX}_INTERPRETER_ID}")
  266. if (${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "Python")
  267. # try to get a more precise ID
  268. execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; print(sys.copyright)"
  269. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  270. OUTPUT_VARIABLE ${_PYTHON_PREFIX}_COPYRIGHT
  271. ERROR_QUIET)
  272. if (${_PYTHON_PREFIX}_COPYRIGHT MATCHES "ActiveState")
  273. set (${_PYTHON_PREFIX}_INTERPRETER_ID "ActivePython")
  274. endif()
  275. endif()
  276. endif()
  277. else()
  278. set (${_PYTHON_PREFIX}_INTERPRETER_ID Python)
  279. endif()
  280. else()
  281. unset (${_PYTHON_PREFIX}_INTERPRETER_ID)
  282. endif()
  283. # retrieve various package installation directories
  284. 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)]))"
  285. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  286. OUTPUT_VARIABLE _${_PYTHON_PREFIX}_LIBPATHS
  287. ERROR_QUIET)
  288. if (NOT _${_PYTHON_PREFIX}_RESULT)
  289. list (GET _${_PYTHON_PREFIX}_LIBPATHS 0 ${_PYTHON_PREFIX}_STDLIB)
  290. list (GET _${_PYTHON_PREFIX}_LIBPATHS 1 ${_PYTHON_PREFIX}_STDARCH)
  291. list (GET _${_PYTHON_PREFIX}_LIBPATHS 2 ${_PYTHON_PREFIX}_SITELIB)
  292. list (GET _${_PYTHON_PREFIX}_LIBPATHS 3 ${_PYTHON_PREFIX}_SITEARCH)
  293. else()
  294. unset (${_PYTHON_PREFIX}_STDLIB)
  295. unset (${_PYTHON_PREFIX}_STDARCH)
  296. unset (${_PYTHON_PREFIX}_SITELIB)
  297. unset (${_PYTHON_PREFIX}_SITEARCH)
  298. endif()
  299. mark_as_advanced (${_PYTHON_PREFIX}_EXECUTABLE)
  300. endif()
  301. # second step, search for compiler (IronPython)
  302. if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
  303. if (${_PYTHON_PREFIX}_FIND_REQUIRED_Compiler)
  304. list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_COMPILER)
  305. list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_COMPILER)
  306. endif()
  307. # IronPython specific artifacts
  308. # If IronPython interpreter is found, use its path
  309. unset (_${_PYTHON_PREFIX}_IRON_ROOT)
  310. if (${_PYTHON_PREFIX}_Interpreter_FOUND AND ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython")
  311. get_filename_component (_${_PYTHON_PREFIX}_IRON_ROOT "${${_PYTHON_PREFIX}_EXECUTABLE}" DIRECTORY)
  312. endif()
  313. # try using root dir and registry
  314. foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
  315. find_program (${_PYTHON_PREFIX}_COMPILER
  316. NAMES ipyc
  317. HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
  318. PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  319. NO_SYSTEM_ENVIRONMENT_PATH
  320. NO_CMAKE_SYSTEM_PATH)
  321. if (${_PYTHON_PREFIX}_COMPILER)
  322. break()
  323. endif()
  324. endforeach()
  325. # try in standard paths
  326. find_program (${_PYTHON_PREFIX}_COMPILER
  327. NAMES ipyc)
  328. if (${_PYTHON_PREFIX}_COMPILER)
  329. # retrieve python environment version from compiler
  330. set (_${_PYTHON_PREFIX}_VERSION_DIR "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir")
  331. file (WRITE "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))\n")
  332. execute_process (COMMAND "${${_PYTHON_PREFIX}_COMPILER}" /target:exe /embed "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py"
  333. WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}"
  334. OUTPUT_QUIET
  335. ERROR_QUIET)
  336. execute_process (COMMAND "${_${_PYTHON_PREFIX}_VERSION_DIR}/version"
  337. WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}"
  338. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  339. OUTPUT_VARIABLE _${_PYTHON_PREFIX}_VERSION
  340. ERROR_QUIET)
  341. if (NOT _${_PYTHON_PREFIX}_RESULT)
  342. string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${_${_PYTHON_PREFIX}_VERSION}")
  343. list (GET _${_PYTHON_PREFIX}_VERSIONS 0 _${_PYTHON_PREFIX}_VERSION_MAJOR)
  344. list (GET _${_PYTHON_PREFIX}_VERSIONS 1 _${_PYTHON_PREFIX}_VERSION_MINOR)
  345. list (GET _${_PYTHON_PREFIX}_VERSIONS 2 _${_PYTHON_PREFIX}_VERSION_PATCH)
  346. if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND)
  347. # set public version information
  348. set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION})
  349. set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR})
  350. set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR})
  351. set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH})
  352. endif()
  353. else()
  354. # compiler not usable
  355. set (${_PYTHON_PREFIX}_COMPILER ${_PYTHON_PREFIX}_COMPILER-NOTFOUND CACHE INTERNAL "" FORCE)
  356. endif()
  357. file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}")
  358. endif()
  359. if (${_PYTHON_PREFIX}_COMPILER)
  360. if (${_PYTHON_PREFIX}_Interpreter_FOUND)
  361. # Compiler must be compatible with interpreter
  362. if (${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR} VERSION_EQUAL ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
  363. set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE)
  364. endif()
  365. elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
  366. set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE)
  367. # Use compiler version for future searches to ensure consistency
  368. set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
  369. endif()
  370. endif()
  371. if (${_PYTHON_PREFIX}_Compiler_FOUND)
  372. set (${_PYTHON_PREFIX}_COMPILER_ID IronPython)
  373. else()
  374. unset (${_PYTHON_PREFIX}_COMPILER_ID)
  375. endif()
  376. mark_as_advanced (${_PYTHON_PREFIX}_COMPILER)
  377. endif()
  378. # third step, search for the development artifacts
  379. ## Development environment is not compatible with IronPython interpreter
  380. if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
  381. AND NOT ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython")
  382. if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development)
  383. list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_LIBRARY
  384. ${_PYTHON_PREFIX}_INCLUDE_DIR)
  385. list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS ${_PYTHON_PREFIX}_LIBRARY
  386. ${_PYTHON_PREFIX}_LIBRARY_RELEASE
  387. ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
  388. ${_PYTHON_PREFIX}_LIBRARY_DEBUG
  389. ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
  390. ${_PYTHON_PREFIX}_INCLUDE_DIR)
  391. endif()
  392. # Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES
  393. unset (_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES)
  394. if (DEFINED ${_PYTHON_PREFIX}_USE_STATIC_LIBS AND NOT WIN32)
  395. set(_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
  396. if(${_PYTHON_PREFIX}_USE_STATIC_LIBS)
  397. set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
  398. else()
  399. list (REMOVE_ITEM CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
  400. endif()
  401. else()
  402. endif()
  403. # if python interpreter is found, use its location and version to ensure consistency
  404. # between interpreter and development environment
  405. unset (_${_PYTHON_PREFIX}_PREFIX)
  406. if (${_PYTHON_PREFIX}_Interpreter_FOUND)
  407. execute_process (COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
  408. "import sys; from distutils import sysconfig; sys.stdout.write(sysconfig.PREFIX)"
  409. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  410. OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PREFIX
  411. ERROR_QUIET
  412. OUTPUT_STRIP_TRAILING_WHITESPACE)
  413. if (_${_PYTHON_PREFIX}_RESULT)
  414. unset (_${_PYTHON_PREFIX}_PREFIX)
  415. endif()
  416. endif()
  417. set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}" "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
  418. foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
  419. string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION})
  420. # try to use pythonX.Y-config tool
  421. set (_${_PYTHON_PREFIX}_CONFIG_NAMES)
  422. if (DEFINED CMAKE_LIBRARY_ARCHITECTURE)
  423. set (_${_PYTHON_PREFIX}_CONFIG_NAMES "${CMAKE_LIBRARY_ARCHITECTURE}-python${_${_PYTHON_PREFIX}_VERSION}-config")
  424. endif()
  425. list (APPEND _${_PYTHON_PREFIX}_CONFIG_NAMES "python${_${_PYTHON_PREFIX}_VERSION}-config")
  426. find_program (_${_PYTHON_PREFIX}_CONFIG
  427. NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
  428. HINTS ${_${_PYTHON_PREFIX}_HINTS}
  429. PATH_SUFFIXES bin)
  430. unset (_${_PYTHON_PREFIX}_CONFIG_NAMES)
  431. if (NOT _${_PYTHON_PREFIX}_CONFIG)
  432. continue()
  433. endif()
  434. # retrieve root install directory
  435. execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --prefix
  436. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  437. OUTPUT_VARIABLE _${_PYTHON_PREFIX}_PREFIX
  438. ERROR_QUIET
  439. OUTPUT_STRIP_TRAILING_WHITESPACE)
  440. if (_${_PYTHON_PREFIX}_RESULT)
  441. # python-config is not usable
  442. unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
  443. continue()
  444. endif()
  445. set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}" "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
  446. # retrieve library
  447. execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --ldflags
  448. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  449. OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS
  450. ERROR_QUIET
  451. OUTPUT_STRIP_TRAILING_WHITESPACE)
  452. if (NOT _${_PYTHON_PREFIX}_RESULT)
  453. # retrieve library directory
  454. string (REGEX MATCHALL "-L[^ ]+" _${_PYTHON_PREFIX}_LIB_DIRS "${_${_PYTHON_PREFIX}_FLAGS}")
  455. string (REPLACE "-L" "" _${_PYTHON_PREFIX}_LIB_DIRS "${_${_PYTHON_PREFIX}_LIB_DIRS}")
  456. list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_LIB_DIRS)
  457. # retrieve library name
  458. string (REGEX MATCHALL "-lpython[^ ]+" _${_PYTHON_PREFIX}_LIB_NAMES "${_${_PYTHON_PREFIX}_FLAGS}")
  459. string (REPLACE "-l" "" _${_PYTHON_PREFIX}_LIB_NAMES "${_${_PYTHON_PREFIX}_LIB_NAMES}")
  460. list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_LIB_NAMES)
  461. find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
  462. NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
  463. NAMES_PER_DIR
  464. HINTS ${_${_PYTHON_PREFIX}_HINTS} ${_${_PYTHON_PREFIX}_LIB_DIRS}
  465. PATH_SUFFIXES lib
  466. NO_SYSTEM_ENVIRONMENT_PATH
  467. NO_CMAKE_SYSTEM_PATH)
  468. # retrieve runtime library
  469. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE)
  470. get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
  471. _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
  472. NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
  473. NAMES_PER_DIR
  474. HINTS ${_${_PYTHON_PREFIX}_PATH} ${_${_PYTHON_PREFIX}_HINTS}
  475. PATH_SUFFIXES bin
  476. NO_SYSTEM_ENVIRONMENT_PATH
  477. NO_CMAKE_SYSTEM_PATH)
  478. endif()
  479. endif()
  480. # retrieve include directory
  481. execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --includes
  482. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  483. OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS
  484. ERROR_QUIET
  485. OUTPUT_STRIP_TRAILING_WHITESPACE)
  486. if (NOT _${_PYTHON_PREFIX}_RESULT)
  487. # retrieve include directory
  488. string (REGEX MATCHALL "-I[^ ]+" _${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_FLAGS}")
  489. string (REPLACE "-I" "" _${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_INCLUDE_DIRS}")
  490. list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_INCLUDE_DIRS)
  491. find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
  492. NAMES Python.h
  493. HINTS ${_${_PYTHON_PREFIX}_INCLUDE_DIRS}
  494. NO_SYSTEM_ENVIRONMENT_PATH
  495. NO_CMAKE_SYSTEM_PATH)
  496. endif()
  497. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_INCLUDE_DIR)
  498. break()
  499. endif()
  500. endforeach()
  501. # Rely on HINTS and standard paths if config tool failed to locate artifacts
  502. if (NOT (${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) OR NOT ${_PYTHON_PREFIX}_INCLUDE_DIR)
  503. foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
  504. string (REPLACE "." "" _${_PYTHON_PREFIX}_VERSION_NO_DOTS ${_${_PYTHON_PREFIX}_VERSION})
  505. _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION})
  506. # search first in known locations
  507. find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
  508. NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
  509. python${_${_PYTHON_PREFIX}_VERSION}mu
  510. python${_${_PYTHON_PREFIX}_VERSION}m
  511. python${_${_PYTHON_PREFIX}_VERSION}u
  512. python${_${_PYTHON_PREFIX}_VERSION}
  513. NAMES_PER_DIR
  514. HINTS ${_${_PYTHON_PREFIX}_HINTS}
  515. PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
  516. [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  517. [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  518. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  519. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  520. PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs
  521. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu
  522. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m
  523. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u
  524. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}
  525. lib/python${_${_PYTHON_PREFIX}_VERSION}/config
  526. NO_SYSTEM_ENVIRONMENT_PATH
  527. NO_CMAKE_SYSTEM_PATH)
  528. # search in all default paths
  529. find_library (${_PYTHON_PREFIX}_LIBRARY_RELEASE
  530. NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
  531. python${_${_PYTHON_PREFIX}_VERSION}mu
  532. python${_${_PYTHON_PREFIX}_VERSION}m
  533. python${_${_PYTHON_PREFIX}_VERSION}u
  534. python${_${_PYTHON_PREFIX}_VERSION}
  535. NAMES_PER_DIR
  536. PATH_SUFFIXES lib/${CMAKE_LIBRARY_ARCHITECTURE} lib libs
  537. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}mu
  538. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}m
  539. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}u
  540. lib/python${_${_PYTHON_PREFIX}_VERSION}/config-${_${_PYTHON_PREFIX}_VERSION}
  541. lib/python${_${_PYTHON_PREFIX}_VERSION}/config)
  542. # retrieve runtime library
  543. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE)
  544. get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
  545. _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
  546. NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}
  547. python${_${_PYTHON_PREFIX}_VERSION}mu
  548. python${_${_PYTHON_PREFIX}_VERSION}m
  549. python${_${_PYTHON_PREFIX}_VERSION}u
  550. python${_${_PYTHON_PREFIX}_VERSION}
  551. NAMES_PER_DIR
  552. HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS}
  553. PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
  554. [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  555. [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  556. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  557. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  558. PATH_SUFFIXES bin)
  559. endif()
  560. if (WIN32)
  561. # search for debug library
  562. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE)
  563. # use library location as a hint
  564. get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
  565. find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG
  566. NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d
  567. NAMES_PER_DIR
  568. HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS}
  569. NO_DEFAULT_PATH)
  570. else()
  571. # search first in known locations
  572. find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG
  573. NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d
  574. NAMES_PER_DIR
  575. HINTS ${_${_PYTHON_PREFIX}_HINTS}
  576. PATHS [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  577. [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  578. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  579. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  580. PATH_SUFFIXES lib libs
  581. NO_SYSTEM_ENVIRONMENT_PATH
  582. NO_CMAKE_SYSTEM_PATH)
  583. # search in all default paths
  584. find_library (${_PYTHON_PREFIX}_LIBRARY_DEBUG
  585. NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d
  586. NAMES_PER_DIR
  587. PATH_SUFFIXES lib libs)
  588. endif()
  589. if (${_PYTHON_PREFIX}_LIBRARY_DEBUG)
  590. get_filename_component (_${_PYTHON_PREFIX}_PATH "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}" DIRECTORY)
  591. _python_find_runtime_library (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
  592. NAMES python${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}_d
  593. NAMES_PER_DIR
  594. HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS}
  595. PATHS [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  596. [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  597. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  598. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  599. PATH_SUFFIXES bin)
  600. endif()
  601. endif()
  602. # Don't search for include dir until library location is known
  603. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
  604. unset (_${_PYTHON_PREFIX}_INCLUDE_HINTS)
  605. foreach (_${_PYTHON_PREFIX}_LIB IN ITEMS ${_PYTHON_PREFIX}_LIBRARY_RELEASE ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
  606. if (${_${_PYTHON_PREFIX}_LIB})
  607. # Use the library's install prefix as a hint
  608. if (${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+/Frameworks/Python.framework/Versions/[0-9.]+)")
  609. list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
  610. elseif (${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+)/lib(64|32)?/python[0-9.]+/config")
  611. list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
  612. elseif (DEFINED CMAKE_LIBRARY_ARCHITECTURE AND ${_${_PYTHON_PREFIX}_LIB} MATCHES "^(.+)/lib/${CMAKE_LIBRARY_ARCHITECTURE}")
  613. list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
  614. else()
  615. # assume library is in a directory under root
  616. get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${${_${_PYTHON_PREFIX}_LIB}}" DIRECTORY)
  617. get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${_${_PYTHON_PREFIX}_PREFIX}" DIRECTORY)
  618. list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${_${_PYTHON_PREFIX}_PREFIX}")
  619. endif()
  620. endif()
  621. endforeach()
  622. list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_INCLUDE_HINTS)
  623. find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
  624. NAMES Python.h
  625. HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
  626. PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
  627. [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  628. [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  629. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
  630. [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_${_PYTHON_PREFIX}_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
  631. PATH_SUFFIXES include/python${_${_PYTHON_PREFIX}_VERSION}mu
  632. include/python${_${_PYTHON_PREFIX}_VERSION}m
  633. include/python${_${_PYTHON_PREFIX}_VERSION}u
  634. include/python${_${_PYTHON_PREFIX}_VERSION}
  635. include
  636. NO_SYSTEM_ENVIRONMENT_PATH
  637. NO_CMAKE_SYSTEM_PATH)
  638. endif()
  639. if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG) AND ${_PYTHON_PREFIX}_INCLUDE_DIR)
  640. break()
  641. endif()
  642. endforeach()
  643. # search header file in standard locations
  644. find_path (${_PYTHON_PREFIX}_INCLUDE_DIR
  645. NAMES Python.h)
  646. endif()
  647. if (${_PYTHON_PREFIX}_INCLUDE_DIR)
  648. # retrieve version from header file
  649. file (STRINGS "${${_PYTHON_PREFIX}_INCLUDE_DIR}/patchlevel.h" _${_PYTHON_PREFIX}_VERSION
  650. REGEX "^#define[ \t]+PY_VERSION[ \t]+\"[^\"]+\"")
  651. string (REGEX REPLACE "^#define[ \t]+PY_VERSION[ \t]+\"([^\"]+)\".*" "\\1"
  652. _${_PYTHON_PREFIX}_VERSION "${_${_PYTHON_PREFIX}_VERSION}")
  653. string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${_${_PYTHON_PREFIX}_VERSION}")
  654. list (GET _${_PYTHON_PREFIX}_VERSIONS 0 _${_PYTHON_PREFIX}_VERSION_MAJOR)
  655. list (GET _${_PYTHON_PREFIX}_VERSIONS 1 _${_PYTHON_PREFIX}_VERSION_MINOR)
  656. list (GET _${_PYTHON_PREFIX}_VERSIONS 2 _${_PYTHON_PREFIX}_VERSION_PATCH)
  657. if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT ${_PYTHON_PREFIX}_Compiler_FOUND)
  658. # set public version information
  659. set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION})
  660. set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR})
  661. set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR})
  662. set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH})
  663. endif()
  664. endif()
  665. # define public variables
  666. include (${CMAKE_CURRENT_LIST_DIR}/../SelectLibraryConfigurations.cmake)
  667. select_library_configurations (${_PYTHON_PREFIX})
  668. if (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
  669. set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
  670. elseif (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
  671. set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
  672. else()
  673. set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "$${_PYTHON_PREFIX}_RUNTIME_LIBRARY-NOTFOUND")
  674. endif()
  675. _python_set_library_dirs (${_PYTHON_PREFIX}_LIBRARY_DIRS
  676. ${_PYTHON_PREFIX}_LIBRARY_RELEASE ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
  677. if (UNIX)
  678. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$"
  679. OR ${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$")
  680. set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS ${${_PYTHON_PREFIX}_LIBRARY_DIRS})
  681. endif()
  682. else()
  683. _python_set_library_dirs (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS
  684. ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
  685. endif()
  686. set (${_PYTHON_PREFIX}_INCLUDE_DIRS "${${_PYTHON_PREFIX}_INCLUDE_DIR}")
  687. mark_as_advanced (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
  688. ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
  689. ${_PYTHON_PREFIX}_INCLUDE_DIR)
  690. if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
  691. AND ${_PYTHON_PREFIX}_INCLUDE_DIR)
  692. if (${_PYTHON_PREFIX}_Interpreter_FOUND OR ${_PYTHON_PREFIX}_Compiler_FOUND)
  693. # development environment must be compatible with interpreter/compiler
  694. if (${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR} VERSION_EQUAL ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
  695. set (${_PYTHON_PREFIX}_Development_FOUND TRUE)
  696. endif()
  697. elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
  698. set (${_PYTHON_PREFIX}_Development_FOUND TRUE)
  699. endif()
  700. endif()
  701. # Restore the original find library ordering
  702. if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES)
  703. set (CMAKE_FIND_LIBRARY_SUFFIXES ${_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES})
  704. endif()
  705. endif()
  706. # final validation
  707. if (${_PYTHON_PREFIX}_VERSION_MAJOR AND
  708. NOT ${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
  709. _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}\"")
  710. endif()
  711. include (${CMAKE_CURRENT_LIST_DIR}/../FindPackageHandleStandardArgs.cmake)
  712. find_package_handle_standard_args (${_PYTHON_PREFIX}
  713. REQUIRED_VARS ${_${_PYTHON_PREFIX}_REQUIRED_VARS}
  714. VERSION_VAR ${_PYTHON_PREFIX}_VERSION
  715. HANDLE_COMPONENTS)
  716. # Create imported targets and helper functions
  717. if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
  718. AND ${_PYTHON_PREFIX}_Interpreter_FOUND
  719. AND NOT TARGET ${_PYTHON_PREFIX}::Interpreter)
  720. add_executable (${_PYTHON_PREFIX}::Interpreter IMPORTED)
  721. set_property (TARGET ${_PYTHON_PREFIX}::Interpreter
  722. PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_EXECUTABLE}")
  723. endif()
  724. if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
  725. AND ${_PYTHON_PREFIX}_Compiler_FOUND
  726. AND NOT TARGET ${_PYTHON_PREFIX}::Compiler)
  727. add_executable (${_PYTHON_PREFIX}::Compiler IMPORTED)
  728. set_property (TARGET ${_PYTHON_PREFIX}::Compiler
  729. PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_COMPILER}")
  730. endif()
  731. if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
  732. AND ${_PYTHON_PREFIX}_Development_FOUND AND NOT TARGET ${_PYTHON_PREFIX}::Python)
  733. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$"
  734. OR ${_PYTHON_PREFIX}_LIBRARY_DEBUG MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$"
  735. OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
  736. set (_${_PYTHON_PREFIX}_LIBRARY_TYPE SHARED)
  737. else()
  738. set (_${_PYTHON_PREFIX}_LIBRARY_TYPE STATIC)
  739. endif()
  740. add_library (${_PYTHON_PREFIX}::Python ${_${_PYTHON_PREFIX}_LIBRARY_TYPE} IMPORTED)
  741. set_property (TARGET ${_PYTHON_PREFIX}::Python
  742. PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_INCLUDE_DIR}")
  743. if ((${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
  744. OR (${_PYTHON_PREFIX}_LIBRARY_DEBUG AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG))
  745. # System manage shared libraries in two parts: import and runtime
  746. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
  747. set_property (TARGET ${_PYTHON_PREFIX}::Python PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG)
  748. set_target_properties (${_PYTHON_PREFIX}::Python
  749. PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
  750. IMPORTED_IMPLIB_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}"
  751. IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
  752. set_target_properties (${_PYTHON_PREFIX}::Python
  753. PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
  754. IMPORTED_IMPLIB_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}"
  755. IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
  756. else()
  757. set_target_properties (${_PYTHON_PREFIX}::Python
  758. PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C"
  759. IMPORTED_IMPLIB "${${_PYTHON_PREFIX}_LIBRARY}"
  760. IMPORTED_LOCATION "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY}")
  761. endif()
  762. else()
  763. if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
  764. set_property (TARGET ${_PYTHON_PREFIX}::Python PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG)
  765. set_target_properties (${_PYTHON_PREFIX}::Python
  766. PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
  767. IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
  768. set_target_properties (${_PYTHON_PREFIX}::Python
  769. PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
  770. IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}")
  771. else()
  772. set_target_properties (${_PYTHON_PREFIX}::Python
  773. PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C"
  774. IMPORTED_LOCATION "${${_PYTHON_PREFIX}_LIBRARY}")
  775. endif()
  776. endif()
  777. if (_${_PYTHON_PREFIX}_CONFIG AND _${_PYTHON_PREFIX}_LIBRARY_TYPE STREQUAL "STATIC")
  778. # extend link information with dependent libraries
  779. execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --ldflags
  780. RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
  781. OUTPUT_VARIABLE _${_PYTHON_PREFIX}_FLAGS
  782. ERROR_QUIET
  783. OUTPUT_STRIP_TRAILING_WHITESPACE)
  784. if (NOT _${_PYTHON_PREFIX}_RESULT)
  785. string (REGEX MATCHALL "-[Ll][^ ]+" _${_PYTHON_PREFIX}_LINK_LIBRARIES "${_${_PYTHON_PREFIX}_FLAGS}")
  786. # remove elements relative to python library itself
  787. list (FILTER _${_PYTHON_PREFIX}_LINK_LIBRARIES EXCLUDE REGEX "-lpython")
  788. foreach (_${_PYTHON_PREFIX}_DIR IN LISTS ${_PYTHON_PREFIX}_LIBRARY_DIRS)
  789. list (FILTER _${_PYTHON_PREFIX}_LINK_LIBRARIES EXCLUDE REGEX "-L${${_PYTHON_PREFIX}_DIR}")
  790. endforeach()
  791. set_property (TARGET ${_PYTHON_PREFIX}::Python
  792. PROPERTY INTERFACE_LINK_LIBRARIES ${_${_PYTHON_PREFIX}_LINK_LIBRARIES})
  793. endif()
  794. endif()
  795. #
  796. # PYTHON_ADD_LIBRARY (<name> [STATIC|SHARED|MODULE] src1 src2 ... srcN)
  797. # It is used to build modules for python.
  798. #
  799. function (__${_PYTHON_PREFIX}_ADD_LIBRARY prefix name)
  800. cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY
  801. "STATIC;SHARED;MODULE" "" "")
  802. unset (type)
  803. if (NOT (PYTHON_ADD_LIBRARY_STATIC
  804. OR PYTHON_ADD_LIBRARY_SHARED
  805. OR PYTHON_ADD_LIBRARY_MODULE))
  806. set (type MODULE)
  807. endif()
  808. add_library (${name} ${type} ${ARGN})
  809. target_link_libraries (${name} PRIVATE ${prefix}::Python)
  810. # customize library name to follow module name rules
  811. get_property (type TARGET ${name} PROPERTY TYPE)
  812. if (type STREQUAL "MODULE_LIBRARY")
  813. set_property (TARGET ${name} PROPERTY PREFIX "")
  814. if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
  815. set_property (TARGET ${name} PROPERTY SUFFIX ".pyd")
  816. endif()
  817. endif()
  818. endfunction()
  819. endif()
  820. # final clean-up
  821. # Restore CMAKE_FIND_FRAMEWORK
  822. if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
  823. set (CMAKE_FIND_FRAMEWORK ${_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK})
  824. unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
  825. else()
  826. unset (CMAKE_FIND_FRAMEWORK)
  827. endif()
  828. unset (_${_PYTHON_PREFIX}_CONFIG CACHE)