1
0

Support.cmake 42 KB

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