Support.cmake 46 KB

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