Support.cmake 42 KB

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