Support.cmake 62 KB

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