1 # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
5 # This file is a "template" file used by various FindPython modules.
9 # Initial configuration
13 # numbers and boolean constants
14 cmake_policy (SET CMP0012 NEW)
16 cmake_policy (SET CMP0057 NEW)
17 # registry view behavior
18 cmake_policy (SET CMP0134 NEW)
20 if (NOT DEFINED _PYTHON_PREFIX)
21 message (FATAL_ERROR "FindPython: INTERNAL ERROR")
23 if (NOT DEFINED _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
24 message (FATAL_ERROR "FindPython: INTERNAL ERROR")
26 if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL "3")
27 set(_${_PYTHON_PREFIX}_VERSIONS 3.12 3.11 3.10 3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0)
28 elseif (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL "2")
29 set(_${_PYTHON_PREFIX}_VERSIONS 2.7 2.6 2.5 2.4 2.3 2.2 2.1 2.0)
31 message (FATAL_ERROR "FindPython: INTERNAL ERROR")
34 get_property(_${_PYTHON_PREFIX}_CMAKE_ROLE GLOBAL PROPERTY CMAKE_ROLE)
36 include (${CMAKE_CURRENT_LIST_DIR}/../FindPackageHandleStandardArgs.cmake)
41 macro (_PYTHON_DISPLAY_FAILURE _PYTHON_MSG)
42 if (${_PYTHON_PREFIX}_FIND_REQUIRED)
43 message (FATAL_ERROR "${_PYTHON_MSG}")
45 if (NOT ${_PYTHON_PREFIX}_FIND_QUIETLY)
46 message(STATUS "${_PYTHON_MSG}")
50 set (${_PYTHON_PREFIX}_FOUND FALSE)
51 string (TOUPPER "${_PYTHON_PREFIX}" _${_PYTHON_PREFIX}_UPPER_PREFIX)
52 set (${_PYTHON_UPPER_PREFIX}_FOUND FALSE)
56 function (_PYTHON_MARK_AS_INTERNAL)
57 foreach (var IN LISTS ARGV)
58 if (DEFINED CACHE{${var}})
59 set_property (CACHE ${var} PROPERTY TYPE INTERNAL)
65 macro (_PYTHON_SELECT_LIBRARY_CONFIGURATIONS _PYTHON_BASENAME)
66 if(NOT DEFINED ${_PYTHON_BASENAME}_LIBRARY_RELEASE)
67 set(${_PYTHON_BASENAME}_LIBRARY_RELEASE "${_PYTHON_BASENAME}_LIBRARY_RELEASE-NOTFOUND")
69 if(NOT DEFINED ${_PYTHON_BASENAME}_LIBRARY_DEBUG)
70 set(${_PYTHON_BASENAME}_LIBRARY_DEBUG "${_PYTHON_BASENAME}_LIBRARY_DEBUG-NOTFOUND")
73 get_property(_PYTHON_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
74 if (${_PYTHON_BASENAME}_LIBRARY_DEBUG AND ${_PYTHON_BASENAME}_LIBRARY_RELEASE AND
75 NOT ${_PYTHON_BASENAME}_LIBRARY_DEBUG STREQUAL ${_PYTHON_BASENAME}_LIBRARY_RELEASE AND
76 (_PYTHON_isMultiConfig OR CMAKE_BUILD_TYPE))
77 # if the generator is multi-config or if CMAKE_BUILD_TYPE is set for
78 # single-config generators, set optimized and debug libraries
79 set (${_PYTHON_BASENAME}_LIBRARIES "")
80 foreach (_PYTHON_libname IN LISTS ${_PYTHON_BASENAME}_LIBRARY_RELEASE)
81 list( APPEND ${_PYTHON_BASENAME}_LIBRARIES optimized "${_PYTHON_libname}")
83 foreach (_PYTHON_libname IN LISTS ${_PYTHON_BASENAME}_LIBRARY_DEBUG)
84 list( APPEND ${_PYTHON_BASENAME}_LIBRARIES debug "${_PYTHON_libname}")
86 elseif (${_PYTHON_BASENAME}_LIBRARY_RELEASE)
87 set (${_PYTHON_BASENAME}_LIBRARIES "${${_PYTHON_BASENAME}_LIBRARY_RELEASE}")
88 elseif (${_PYTHON_BASENAME}_LIBRARY_DEBUG)
89 set (${_PYTHON_BASENAME}_LIBRARIES "${${_PYTHON_BASENAME}_LIBRARY_DEBUG}")
91 set (${_PYTHON_BASENAME}_LIBRARIES "${_PYTHON_BASENAME}_LIBRARY-NOTFOUND")
96 macro (_PYTHON_FIND_FRAMEWORKS)
97 if (CMAKE_HOST_APPLE OR APPLE)
98 file(TO_CMAKE_PATH "$ENV{CMAKE_FRAMEWORK_PATH}" _pff_CMAKE_FRAMEWORK_PATH)
99 set (_pff_frameworks ${CMAKE_FRAMEWORK_PATH}
100 ${_pff_CMAKE_FRAMEWORK_PATH}
102 /usr/local/Frameworks
103 /opt/homebrew/Frameworks
104 ${CMAKE_SYSTEM_FRAMEWORK_PATH})
105 list (REMOVE_DUPLICATES _pff_frameworks)
106 foreach (_pff_implementation IN LISTS _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
107 unset (_${_PYTHON_PREFIX}_${_pff_implementation}_FRAMEWORKS)
108 if (_pff_implementation STREQUAL "CPython")
109 foreach (_pff_framework IN LISTS _pff_frameworks)
110 if (EXISTS ${_pff_framework}/Python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}.framework)
111 list (APPEND _${_PYTHON_PREFIX}_${_pff_implementation}_FRAMEWORKS ${_pff_framework}/Python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}.framework)
113 if (EXISTS ${_pff_framework}/Python.framework)
114 list (APPEND _${_PYTHON_PREFIX}_${_pff_implementation}_FRAMEWORKS ${_pff_framework}/Python.framework)
117 elseif (_pff_implementation STREQUAL "IronPython")
118 foreach (_pff_framework IN LISTS _pff_frameworks)
119 if (EXISTS ${_pff_framework}/IronPython.framework)
120 list (APPEND _${_PYTHON_PREFIX}_${_pff_implementation}_FRAMEWORKS ${_pff_framework}/IronPython.framework)
125 unset (_pff_implementation)
126 unset (_pff_frameworks)
127 unset (_pff_framework)
131 function (_PYTHON_GET_FRAMEWORKS _PYTHON_PGF_FRAMEWORK_PATHS)
132 cmake_parse_arguments (PARSE_ARGV 1 _PGF "" "" "IMPLEMENTATIONS;VERSION")
134 if (NOT _PGF_IMPLEMENTATIONS)
135 set (_PGF_IMPLEMENTATIONS ${_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS})
138 set (framework_paths)
140 foreach (implementation IN LISTS _PGF_IMPLEMENTATIONS)
141 if (implementation STREQUAL "CPython")
142 foreach (version IN LISTS _PGF_VERSION)
143 foreach (framework IN LISTS _${_PYTHON_PREFIX}_${implementation}_FRAMEWORKS)
144 if (EXISTS "${framework}/Versions/${version}")
145 list (APPEND framework_paths "${framework}/Versions/${version}")
149 elseif (implementation STREQUAL "IronPython")
150 foreach (version IN LISTS _PGF_VERSION)
151 foreach (framework IN LISTS _${_PYTHON_PREFIX}_${implementation}_FRAMEWORKS)
152 # pick-up all available versions
153 file (GLOB versions LIST_DIRECTORIES true RELATIVE "${framework}/Versions/"
154 "${framework}/Versions/${version}*")
155 list (SORT versions ORDER DESCENDING)
156 list (TRANSFORM versions PREPEND "${framework}/Versions/")
157 list (APPEND framework_paths ${versions})
163 set (${_PYTHON_PGF_FRAMEWORK_PATHS} ${framework_paths} PARENT_SCOPE)
166 function (_PYTHON_GET_REGISTRIES _PYTHON_PGR_REGISTRY_PATHS)
167 cmake_parse_arguments (PARSE_ARGV 1 _PGR "" "" "IMPLEMENTATIONS;VERSION")
169 if (NOT _PGR_IMPLEMENTATIONS)
170 set (_PGR_IMPLEMENTATIONS ${_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS})
175 foreach (implementation IN LISTS _PGR_IMPLEMENTATIONS)
176 if (implementation STREQUAL "CPython")
177 foreach (version IN LISTS _PGR_VERSION)
178 string (REPLACE "." "" version_no_dots ${version})
179 list (APPEND registries
180 [HKEY_CURRENT_USER/SOFTWARE/Python/PythonCore/${version}-${_${_PYTHON_PREFIX}_ARCH}/InstallPath]
181 [HKEY_CURRENT_USER/SOFTWARE/Python/PythonCore/${version}-${_${_PYTHON_PREFIX}_ARCH2}/InstallPath])
182 if (version VERSION_GREATER_EQUAL "3.5")
183 # cmake_host_system_information is not usable in bootstrap
184 get_filename_component (arch "[HKEY_CURRENT_USER\\Software\\Python\\PythonCore\\${version};SysArchitecture]" NAME)
185 if (arch MATCHES "(${_${_PYTHON_PREFIX}_ARCH}|${_${_PYTHON_PREFIX}_ARCH2})bit")
186 list (APPEND registries
187 [HKEY_CURRENT_USER/SOFTWARE/Python/PythonCore/${version}/InstallPath])
190 list (APPEND registries
191 [HKEY_CURRENT_USER/SOFTWARE/Python/PythonCore/${version}/InstallPath])
193 list (APPEND registries
194 [HKEY_CURRENT_USER/SOFTWARE/Python/ContinuumAnalytics/Anaconda${version_no_dots}-${_${_PYTHON_PREFIX}_ARCH}/InstallPath]
195 [HKEY_CURRENT_USER/SOFTWARE/Python/ContinuumAnalytics/Anaconda${version_no_dots}-${_${_PYTHON_PREFIX}_ARCH2}/InstallPath]
196 [HKEY_LOCAL_MACHINE/SOFTWARE/Python/PythonCore/${version}-${_${_PYTHON_PREFIX}_ARCH}/InstallPath]
197 [HKEY_LOCAL_MACHINE/SOFTWARE/Python/PythonCore/${version}-${_${_PYTHON_PREFIX}_ARCH2}/InstallPath]
198 [HKEY_LOCAL_MACHINE/SOFTWARE/Python/PythonCore/${version}/InstallPath]
199 [HKEY_LOCAL_MACHINE/SOFTWARE/Python/ContinuumAnalytics/Anaconda${version_no_dots}-${_${_PYTHON_PREFIX}_ARCH}/InstallPath]
200 [HKEY_LOCAL_MACHINE/SOFTWARE/Python/ContinuumAnalytics/Anaconda${version_no_dots}-${_${_PYTHON_PREFIX}_ARCH2}/InstallPath])
202 elseif (implementation STREQUAL "IronPython")
203 foreach (version IN LISTS _PGR_VERSION)
204 list (APPEND registries [HKEY_LOCAL_MACHINE/SOFTWARE/IronPython/${version}/InstallPath])
209 set (${_PYTHON_PGR_REGISTRY_PATHS} "${registries}" PARENT_SCOPE)
213 function (_PYTHON_GET_ABIFLAGS _PGABIFLAGS)
215 list (GET _${_PYTHON_PREFIX}_FIND_ABI 0 pydebug)
216 list (GET _${_PYTHON_PREFIX}_FIND_ABI 1 pymalloc)
217 list (GET _${_PYTHON_PREFIX}_FIND_ABI 2 unicode)
219 if (pymalloc STREQUAL "ANY" AND unicode STREQUAL "ANY")
220 set (abiflags "mu" "m" "u" "")
221 elseif (pymalloc STREQUAL "ANY" AND unicode STREQUAL "ON")
222 set (abiflags "mu" "u")
223 elseif (pymalloc STREQUAL "ANY" AND unicode STREQUAL "OFF")
224 set (abiflags "m" "")
225 elseif (pymalloc STREQUAL "ON" AND unicode STREQUAL "ANY")
226 set (abiflags "mu" "m")
227 elseif (pymalloc STREQUAL "ON" AND unicode STREQUAL "ON")
229 elseif (pymalloc STREQUAL "ON" AND unicode STREQUAL "OFF")
231 elseif (pymalloc STREQUAL "ON" AND unicode STREQUAL "ANY")
232 set (abiflags "u" "")
233 elseif (pymalloc STREQUAL "OFF" AND unicode STREQUAL "ON")
237 if (pydebug STREQUAL "ON")
239 list (TRANSFORM abiflags PREPEND "d")
243 elseif (pydebug STREQUAL "ANY")
245 set (flags "${abiflags}")
246 list (TRANSFORM flags PREPEND "d")
247 list (APPEND abiflags "${flags}")
249 set (abiflags "" "d")
253 set (${_PGABIFLAGS} "${abiflags}" PARENT_SCOPE)
256 function (_PYTHON_GET_PATH_SUFFIXES _PYTHON_PGPS_PATH_SUFFIXES)
257 cmake_parse_arguments (PARSE_ARGV 1 _PGPS "INTERPRETER;COMPILER;LIBRARY;INCLUDE" "" "IMPLEMENTATIONS;VERSION")
259 if (NOT _PGPS_IMPLEMENTATIONS)
260 set (_PGPS_IMPLEMENTATIONS ${_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS})
263 if (DEFINED _${_PYTHON_PREFIX}_ABIFLAGS)
264 set (abi "${_${_PYTHON_PREFIX}_ABIFLAGS}")
266 set (abi "mu" "m" "u" "")
271 foreach (implementation IN LISTS _PGPS_IMPLEMENTATIONS)
272 if (implementation STREQUAL "CPython")
273 if (_PGPS_INTERPRETER)
274 list (APPEND path_suffixes bin Scripts)
276 foreach (version IN LISTS _PGPS_VERSION)
278 if (CMAKE_LIBRARY_ARCHITECTURE)
279 list (APPEND path_suffixes lib/${CMAKE_LIBRARY_ARCHITECTURE})
281 list (APPEND path_suffixes lib libs)
283 if (CMAKE_LIBRARY_ARCHITECTURE)
284 set (suffixes "${abi}")
286 list (TRANSFORM suffixes PREPEND "lib/python${version}/config-${version}")
287 list (TRANSFORM suffixes APPEND "-${CMAKE_LIBRARY_ARCHITECTURE}")
289 set (suffixes "lib/python${version}/config-${version}-${CMAKE_LIBRARY_ARCHITECTURE}")
291 list (APPEND path_suffixes ${suffixes})
293 set (suffixes "${abi}")
295 list (TRANSFORM suffixes PREPEND "lib/python${version}/config-${version}")
297 set (suffixes "lib/python${version}/config-${version}")
299 list (APPEND path_suffixes ${suffixes})
300 elseif (_PGPS_INCLUDE)
301 set (suffixes "${abi}")
303 list (TRANSFORM suffixes PREPEND "include/python${version}")
305 set (suffixes "include/python${version}")
307 list (APPEND path_suffixes ${suffixes} include)
311 elseif (implementation STREQUAL "IronPython")
312 if (_PGPS_INTERPRETER OR _PGPS_COMPILER)
313 foreach (version IN LISTS _PGPS_VERSION)
314 list (APPEND path_suffixes "share/ironpython${version}")
316 list (APPEND path_suffixes ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES})
318 elseif (implementation STREQUAL "PyPy")
319 if (_PGPS_INTERPRETER)
320 list (APPEND path_suffixes ${_${_PYTHON_PREFIX}_PYPY_EXECUTABLE_PATH_SUFFIXES})
321 elseif (_PGPS_LIBRARY)
322 list (APPEND path_suffixes ${_${_PYTHON_PREFIX}_PYPY_LIBRARY_PATH_SUFFIXES})
323 elseif (_PGPS_INCLUDE)
324 foreach (version IN LISTS _PGPS_VERSION)
325 list (APPEND path_suffixes lib/pypy${version}/include pypy${version}/include)
327 list (APPEND path_suffixes ${_${_PYTHON_PREFIX}_PYPY_INCLUDE_PATH_SUFFIXES})
331 list (REMOVE_DUPLICATES path_suffixes)
333 set (${_PYTHON_PGPS_PATH_SUFFIXES} ${path_suffixes} PARENT_SCOPE)
336 function (_PYTHON_GET_NAMES _PYTHON_PGN_NAMES)
337 cmake_parse_arguments (PARSE_ARGV 1 _PGN "POSIX;INTERPRETER;COMPILER;CONFIG;LIBRARY;WIN32;DEBUG" "" "IMPLEMENTATIONS;VERSION")
339 if (NOT _PGN_IMPLEMENTATIONS)
340 set (_PGN_IMPLEMENTATIONS ${_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS})
345 foreach (implementation IN LISTS _PGN_IMPLEMENTATIONS)
346 if (implementation STREQUAL "CPython")
347 if (_PGN_INTERPRETER AND _${_PYTHON_PREFIX}_FIND_UNVERSIONED_NAMES STREQUAL "FIRST")
348 list (APPEND names python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} python)
350 foreach (version IN LISTS _PGN_VERSION)
352 string (REPLACE "." "" version_no_dots ${version})
354 set (name python${version_no_dots})
356 string (APPEND name "_d")
359 list (APPEND names "${name}")
363 if (DEFINED _${_PYTHON_PREFIX}_ABIFLAGS)
364 set (abi "${_${_PYTHON_PREFIX}_ABIFLAGS}")
366 if (_PGN_INTERPRETER OR _PGN_CONFIG)
369 set (abi "mu" "m" "u" "")
374 if (_PGN_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
375 set (abinames "${abi}")
376 list (TRANSFORM abinames PREPEND "${CMAKE_LIBRARY_ARCHITECTURE}-python${version}")
377 list (TRANSFORM abinames APPEND "-config")
378 list (APPEND names ${abinames})
380 set (abinames "${abi}")
381 list (TRANSFORM abinames PREPEND "python${version}")
383 list (TRANSFORM abinames APPEND "-config")
385 list (APPEND names ${abinames})
388 if (_PGN_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
389 set (abinames "${CMAKE_LIBRARY_ARCHITECTURE}-python${version}")
391 list (APPEND abinames "python${version}")
393 list (TRANSFORM abinames APPEND "-config")
395 list (APPEND names ${abinames})
399 if (_PGN_INTERPRETER AND _${_PYTHON_PREFIX}_FIND_UNVERSIONED_NAMES STREQUAL "LAST")
400 list (APPEND names python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} python)
402 elseif (implementation STREQUAL "IronPython")
403 if (_PGN_INTERPRETER)
404 if (NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
405 # Do not use wrapper script on Linux because it is buggy: -c interpreter option cannot be used
406 foreach (version IN LISTS _PGN_VERSION)
407 list (APPEND names "ipy${version}")
410 list (APPEND names ${_${_PYTHON_PREFIX}_IRON_PYTHON_INTERPRETER_NAMES})
411 elseif (_PGN_COMPILER)
412 list (APPEND names ${_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_NAMES})
414 elseif (implementation STREQUAL "PyPy")
415 if (_PGN_INTERPRETER)
416 list (APPEND names ${_${_PYTHON_PREFIX}_PYPY_NAMES})
417 elseif (_PGN_LIBRARY)
419 foreach (version IN LISTS _PGN_VERSION)
420 string (REPLACE "." "" version_no_dots ${version})
421 set (name "python${version_no_dots}")
423 string (APPEND name "_d")
425 list (APPEND names "${name}")
430 foreach(version IN LISTS _PGN_VERSION)
431 list (APPEND names "pypy${version}-c")
435 list (APPEND names ${_${_PYTHON_PREFIX}_PYPY_LIB_NAMES})
440 set (${_PYTHON_PGN_NAMES} ${names} PARENT_SCOPE)
443 function (_PYTHON_GET_CONFIG_VAR _PYTHON_PGCV_VALUE NAME)
444 unset (${_PYTHON_PGCV_VALUE} PARENT_SCOPE)
446 if (NOT NAME MATCHES "^(PREFIX|ABIFLAGS|CONFIGDIR|INCLUDES|LIBS|SOABI)$")
450 if (_${_PYTHON_PREFIX}_CONFIG)
451 if (NAME STREQUAL "SOABI")
452 set (config_flag "--extension-suffix")
454 set (config_flag "--${NAME}")
456 string (TOLOWER "${config_flag}" config_flag)
457 execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" ${config_flag}
458 RESULT_VARIABLE _result
459 OUTPUT_VARIABLE _values
461 OUTPUT_STRIP_TRAILING_WHITESPACE)
465 if (NAME STREQUAL "INCLUDES")
467 string (REGEX MATCHALL "(-I|-iwithsysroot)[ ]*[^ ]+" _values "${_values}")
468 string (REGEX REPLACE "(-I|-iwithsysroot)[ ]*" "" _values "${_values}")
469 list (REMOVE_DUPLICATES _values)
470 elseif (NAME STREQUAL "SOABI")
471 # clean-up: remove prefix character and suffix
472 if (_values MATCHES "^(\\.${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.so|\\.pyd)$")
475 string (REGEX REPLACE "^[.-](.+)(${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.(so|pyd))$" "\\1" _values "${_values}")
481 if (_${_PYTHON_PREFIX}_EXECUTABLE AND NOT CMAKE_CROSSCOMPILING)
482 if (NAME STREQUAL "PREFIX")
483 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys\ntry:\n from distutils import sysconfig\n sys.stdout.write(';'.join([sysconfig.PREFIX,sysconfig.EXEC_PREFIX,sysconfig.BASE_EXEC_PREFIX]))\nexcept Exception:\n import sysconfig\n sys.stdout.write(';'.join([sysconfig.get_config_var('base') or '', sysconfig.get_config_var('installed_base') or '']))"
484 RESULT_VARIABLE _result
485 OUTPUT_VARIABLE _values
487 OUTPUT_STRIP_TRAILING_WHITESPACE)
491 list (REMOVE_DUPLICATES _values)
493 elseif (NAME STREQUAL "INCLUDES")
497 set (_scheme "posix_prefix")
499 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
500 "import sys\ntry:\n from distutils import sysconfig\n sys.stdout.write(';'.join([sysconfig.get_python_inc(plat_specific=True),sysconfig.get_python_inc(plat_specific=False)]))\nexcept Exception:\n import sysconfig\n sys.stdout.write(';'.join([sysconfig.get_path('platinclude'),sysconfig.get_path('platinclude','${_scheme}'),sysconfig.get_path('include'),sysconfig.get_path('include','${_scheme}')]))"
501 RESULT_VARIABLE _result
502 OUTPUT_VARIABLE _values
504 OUTPUT_STRIP_TRAILING_WHITESPACE)
508 list (REMOVE_DUPLICATES _values)
510 elseif (NAME STREQUAL "SOABI")
511 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
512 "import sys\ntry:\n from distutils import sysconfig\n sys.stdout.write(';'.join([sysconfig.get_config_var('SOABI') or '',sysconfig.get_config_var('EXT_SUFFIX') or '',sysconfig.get_config_var('SO') or '']))\nexcept Exception:\n import sysconfig;sys.stdout.write(';'.join([sysconfig.get_config_var('SOABI') or '',sysconfig.get_config_var('EXT_SUFFIX') or '',sysconfig.get_config_var('SO') or '']))"
513 RESULT_VARIABLE _result
514 OUTPUT_VARIABLE _soabi
516 OUTPUT_STRIP_TRAILING_WHITESPACE)
520 foreach (_item IN LISTS _soabi)
522 set (_values "${_item}")
527 # clean-up: remove prefix character and suffix
528 if (_values MATCHES "^(\\.${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.so|\\.pyd)$")
531 string (REGEX REPLACE "^[.-](.+)(${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.(so|pyd))$" "\\1" _values "${_values}")
536 set (config_flag "${NAME}")
537 if (NAME STREQUAL "CONFIGDIR")
538 set (config_flag "LIBPL")
540 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
541 "import sys\ntry:\n from distutils import sysconfig\n sys.stdout.write(sysconfig.get_config_var('${config_flag}'))\nexcept Exception:\n import sysconfig\n sys.stdout.write(sysconfig.get_config_var('${config_flag}'))"
542 RESULT_VARIABLE _result
543 OUTPUT_VARIABLE _values
545 OUTPUT_STRIP_TRAILING_WHITESPACE)
552 if (NAME STREQUAL "ABIFLAGS" OR NAME STREQUAL "SOABI")
553 set (${_PYTHON_PGCV_VALUE} "${_values}" PARENT_SCOPE)
557 if (NOT _values OR _values STREQUAL "None")
561 if (NAME STREQUAL "LIBS")
563 string (REGEX MATCHALL "-(l|framework)[ ]*[^ ]+" _values "${_values}")
564 # remove elements relative to python library itself
565 list (FILTER _values EXCLUDE REGEX "-lpython")
566 list (REMOVE_DUPLICATES _values)
569 if (WIN32 AND NAME MATCHES "^(PREFIX|CONFIGDIR|INCLUDES)$")
570 file (TO_CMAKE_PATH "${_values}" _values)
573 set (${_PYTHON_PGCV_VALUE} "${_values}" PARENT_SCOPE)
576 function (_PYTHON_GET_VERSION)
577 cmake_parse_arguments (PARSE_ARGV 0 _PGV "LIBRARY;INCLUDE" "PREFIX" "")
579 unset (${_PGV_PREFIX}VERSION PARENT_SCOPE)
580 unset (${_PGV_PREFIX}VERSION_MAJOR PARENT_SCOPE)
581 unset (${_PGV_PREFIX}VERSION_MINOR PARENT_SCOPE)
582 unset (${_PGV_PREFIX}VERSION_PATCH PARENT_SCOPE)
583 unset (${_PGV_PREFIX}ABI PARENT_SCOPE)
586 # retrieve version and abi from library name
587 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
588 get_filename_component (library_name "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" NAME)
589 # extract version from library name
590 if (library_name MATCHES "python([23])([0-9]+)")
591 set (${_PGV_PREFIX}VERSION_MAJOR "${CMAKE_MATCH_1}" PARENT_SCOPE)
592 set (${_PGV_PREFIX}VERSION_MINOR "${CMAKE_MATCH_2}" PARENT_SCOPE)
593 set (${_PGV_PREFIX}VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}" PARENT_SCOPE)
594 set (${_PGV_PREFIX}ABI "" PARENT_SCOPE)
595 elseif (library_name MATCHES "python([23])\\.([0-9]+)([dmu]*)")
596 set (${_PGV_PREFIX}VERSION_MAJOR "${CMAKE_MATCH_1}" PARENT_SCOPE)
597 set (${_PGV_PREFIX}VERSION_MINOR "${CMAKE_MATCH_2}" PARENT_SCOPE)
598 set (${_PGV_PREFIX}VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}" PARENT_SCOPE)
599 set (${_PGV_PREFIX}ABI "${CMAKE_MATCH_3}" PARENT_SCOPE)
600 elseif (library_name MATCHES "pypy([23])\\.([0-9]+)-c")
601 set (${_PGV_PREFIX}VERSION_MAJOR "${CMAKE_MATCH_1}" PARENT_SCOPE)
602 set (${_PGV_PREFIX}VERSION_MINOR "${CMAKE_MATCH_2}" PARENT_SCOPE)
603 set (${_PGV_PREFIX}VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}" PARENT_SCOPE)
604 set (${_PGV_PREFIX}ABI "" PARENT_SCOPE)
605 elseif (library_name MATCHES "pypy(3)?-c")
606 set (version "${CMAKE_MATCH_1}")
607 # try to pick-up a more precise version from the path
608 get_filename_component (library_dir "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
609 if (library_dir MATCHES "/pypy([23])\\.([0-9]+)/")
610 set (${_PGV_PREFIX}VERSION_MAJOR "${CMAKE_MATCH_1}" PARENT_SCOPE)
611 set (${_PGV_PREFIX}VERSION_MINOR "${CMAKE_MATCH_2}" PARENT_SCOPE)
612 set (${_PGV_PREFIX}VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}" PARENT_SCOPE)
613 elseif (version EQUAL "3")
614 set (${_PGV_PREFIX}VERSION_MAJOR "3" PARENT_SCOPE)
615 set (${_PGV_PREFIX}VERSION "3" PARENT_SCOPE)
617 set (${_PGV_PREFIX}VERSION_MAJOR "2" PARENT_SCOPE)
618 set (${_PGV_PREFIX}VERSION "2" PARENT_SCOPE)
620 set (${_PGV_PREFIX}ABI "" PARENT_SCOPE)
624 if (_${_PYTHON_PREFIX}_INCLUDE_DIR)
625 # retrieve version from header file
626 file (STRINGS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}/patchlevel.h" version
627 REGEX "^#define[ \t]+PY_VERSION[ \t]+\"[^\"]+\"")
628 string (REGEX REPLACE "^#define[ \t]+PY_VERSION[ \t]+\"([^\"]+)\".*" "\\1"
629 version "${version}")
630 string (REGEX MATCHALL "[0-9]+" versions "${version}")
631 list (GET versions 0 version_major)
632 list (GET versions 1 version_minor)
633 list (GET versions 2 version_patch)
635 set (${_PGV_PREFIX}VERSION "${version_major}.${version_minor}.${version_patch}" PARENT_SCOPE)
636 set (${_PGV_PREFIX}VERSION_MAJOR ${version_major} PARENT_SCOPE)
637 set (${_PGV_PREFIX}VERSION_MINOR ${version_minor} PARENT_SCOPE)
638 set (${_PGV_PREFIX}VERSION_PATCH ${version_patch} PARENT_SCOPE)
641 if (version_major VERSION_GREATER "2")
642 file (STRINGS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}/pyconfig.h" config REGEX "(Py_DEBUG|WITH_PYMALLOC|Py_UNICODE_SIZE|MS_WIN32)")
644 if (config MATCHES "#[ ]*define[ ]+MS_WIN32")
645 # ABI not used on Windows
649 # pyconfig.h can be a wrapper to a platform specific pyconfig.h
650 # In this case, try to identify ABI from include directory
651 if (_${_PYTHON_PREFIX}_INCLUDE_DIR MATCHES "python${version_major}\\.${version_minor}+([dmu]*)")
652 set (abi "${CMAKE_MATCH_1}")
657 if (config MATCHES "#[ ]*define[ ]+Py_DEBUG[ ]+1")
658 string (APPEND abi "d")
660 if (config MATCHES "#[ ]*define[ ]+WITH_PYMALLOC[ ]+1")
661 string (APPEND abi "m")
663 if (config MATCHES "#[ ]*define[ ]+Py_UNICODE_SIZE[ ]+4")
664 string (APPEND abi "u")
667 set (${_PGV_PREFIX}ABI "${abi}" PARENT_SCOPE)
671 set (${_PGV_PREFIX}ABI "" PARENT_SCOPE)
677 function (_PYTHON_GET_LAUNCHER _PYTHON_PGL_NAME)
678 cmake_parse_arguments (PARSE_ARGV 1 _PGL "INTERPRETER;COMPILER" "" "")
680 unset (${_PYTHON_PGL_NAME} PARENT_SCOPE)
682 if ((_PGL_INTERPRETER AND NOT _${_PYTHON_PREFIX}_EXECUTABLE)
683 OR (_PGL_COMPILER AND NOT _${_PYTHON_PREFIX}_COMPILER))
687 if ("IronPython" IN_LIST _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS
688 AND NOT SYSTEM_NAME MATCHES "Windows|Linux")
689 if (_PGL_INTERPRETER)
690 get_filename_component (name "${_${_PYTHON_PREFIX}_EXECUTABLE}" NAME)
691 get_filename_component (ext "${_${_PYTHON_PREFIX}_EXECUTABLE}" LAST_EXT)
692 if (name IN_LIST _${_PYTHON_PREFIX}_IRON_PYTHON_INTERPRETER_NAMES
693 AND ext STREQUAL ".exe")
694 set (${_PYTHON_PGL_NAME} "${${_PYTHON_PREFIX}_DOTNET_LAUNCHER}" PARENT_SCOPE)
697 get_filename_component (name "${_${_PYTHON_PREFIX}_COMPILER}" NAME)
698 get_filename_component (ext "${_${_PYTHON_PREFIX}_COMPILER}" LAST_EXT)
699 if (name IN_LIST _${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_NAMES
700 AND ext STREQUAL ".exe")
701 set (${_PYTHON_PGL_NAME} "${${_PYTHON_PREFIX}_DOTNET_LAUNCHER}" PARENT_SCOPE)
708 function (_PYTHON_VALIDATE_INTERPRETER)
709 if (NOT _${_PYTHON_PREFIX}_EXECUTABLE)
713 cmake_parse_arguments (PARSE_ARGV 0 _PVI "IN_RANGE;EXACT;CHECK_EXISTS" "VERSION" "")
715 if (_PVI_CHECK_EXISTS AND NOT EXISTS "${_${_PYTHON_PREFIX}_EXECUTABLE}")
716 # interpreter does not exist anymore
717 set_property (CACHE _${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE PROPERTY VALUE "Cannot find the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
718 set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
722 _python_get_launcher (launcher INTERPRETER)
724 # validate ABI compatibility
725 if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI)
726 execute_process (COMMAND ${launcher} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
727 "import sys; sys.stdout.write(sys.abiflags)"
728 RESULT_VARIABLE result
731 OUTPUT_STRIP_TRAILING_WHITESPACE)
733 # assume ABI is not supported
736 if (NOT abi IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
738 set_property (CACHE _${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE PROPERTY VALUE "Wrong ABI for the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
739 set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
744 if (_PVI_IN_RANGE OR _PVI_VERSION)
745 # retrieve full version
746 execute_process (COMMAND ${launcher} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
747 "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))"
748 RESULT_VARIABLE result
749 OUTPUT_VARIABLE version
751 OUTPUT_STRIP_TRAILING_WHITESPACE)
753 # interpreter is not usable
754 set_property (CACHE _${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE PROPERTY VALUE "Cannot use the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
755 set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
760 # check against specified version
761 ## compute number of components for version
762 string (REGEX REPLACE "[^.]" "" dots "${_PVI_VERSION}")
763 ## add one dot because there is one dot less than there are components
764 string (LENGTH "${dots}." count)
768 set (version_regex "^[0-9]+")
770 string (APPEND version_regex "\\.[0-9]+\\.[0-9]+")
771 elseif (count EQUAL 2)
772 string (APPEND version_regex "\\.[0-9]+")
774 # extract needed range
775 string (REGEX MATCH "${version_regex}" version "${version}")
777 if (_PVI_EXACT AND NOT version VERSION_EQUAL _PVI_VERSION)
778 # interpreter has wrong version
779 set_property (CACHE _${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE PROPERTY VALUE "Wrong version for the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
780 set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
783 # check that version is OK
784 string(REGEX REPLACE "^([0-9]+)\\.?.*$" "\\1" major_version "${version}")
785 string(REGEX REPLACE "^([0-9]+)\\.?.*$" "\\1" expected_major_version "${_PVI_VERSION}")
786 if (NOT major_version VERSION_EQUAL expected_major_version
787 OR NOT version VERSION_GREATER_EQUAL _PVI_VERSION)
788 set_property (CACHE _${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE PROPERTY VALUE "Wrong version for the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
789 set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
796 # check if version is in the requested range
797 find_package_check_version ("${version}" in_range HANDLE_VERSION_RANGE)
799 # interpreter has invalid version
800 set_property (CACHE _${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE PROPERTY VALUE "Wrong version for the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
801 set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
806 get_filename_component (python_name "${_${_PYTHON_PREFIX}_EXECUTABLE}" NAME)
807 if (NOT python_name STREQUAL "python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}${CMAKE_EXECUTABLE_SUFFIX}")
808 # executable found do not have version in name
809 # ensure major version is OK
810 execute_process (COMMAND ${launcher} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
811 "import sys; sys.stdout.write(str(sys.version_info[0]))"
812 RESULT_VARIABLE result
813 OUTPUT_VARIABLE version
815 OUTPUT_STRIP_TRAILING_WHITESPACE)
816 if (result OR NOT version EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
817 # interpreter not usable or has wrong major version
819 set_property (CACHE _${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE PROPERTY VALUE "Cannot use the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
821 set_property (CACHE _${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE PROPERTY VALUE "Wrong major version for the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
823 set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
829 if (CMAKE_SIZEOF_VOID_P AND ("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
830 OR "Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
831 AND NOT CMAKE_CROSSCOMPILING)
832 # In this case, interpreter must have same architecture as environment
833 execute_process (COMMAND ${launcher} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
834 "import sys, struct; sys.stdout.write(str(struct.calcsize(\"P\")))"
835 RESULT_VARIABLE result
838 OUTPUT_STRIP_TRAILING_WHITESPACE)
839 if (result OR NOT size EQUAL CMAKE_SIZEOF_VOID_P)
840 # interpreter not usable or has wrong architecture
842 set_property (CACHE _${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE PROPERTY VALUE "Cannot use the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
844 set_property (CACHE _${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE PROPERTY VALUE "Wrong architecture for the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
846 set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
852 function(_python_validate_find_interpreter status interpreter)
853 set(_${_PYTHON_PREFIX}_EXECUTABLE "${interpreter}" CACHE FILEPATH "" FORCE)
854 _python_validate_interpreter (${_${_PYTHON_PREFIX}_VALIDATE_OPTIONS})
855 if (NOT _${_PYTHON_PREFIX}_EXECUTABLE)
856 set (${status} FALSE PARENT_SCOPE)
861 function (_PYTHON_VALIDATE_COMPILER)
862 if (NOT _${_PYTHON_PREFIX}_COMPILER)
866 cmake_parse_arguments (PARSE_ARGV 0 _PVC "IN_RANGE;EXACT;CHECK_EXISTS" "VERSION" "")
868 if (_PVC_CHECK_EXISTS AND NOT EXISTS "${_${_PYTHON_PREFIX}_COMPILER}")
869 # Compiler does not exist anymore
870 set_property (CACHE _${_PYTHON_PREFIX}_Compiler_REASON_FAILURE PROPERTY VALUE "Cannot find the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
871 set_property (CACHE _${_PYTHON_PREFIX}_COMPILER PROPERTY VALUE "${_PYTHON_PREFIX}_COMPILER-NOTFOUND")
875 _python_get_launcher (launcher COMPILER)
877 # retrieve python environment version from compiler
878 set (working_dir "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir")
879 file (WRITE "${working_dir}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))\n")
880 execute_process (COMMAND ${launcher} "${_${_PYTHON_PREFIX}_COMPILER}"
881 ${_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_ARCH_FLAGS}
882 /target:exe /embed "${working_dir}/version.py"
883 WORKING_DIRECTORY "${working_dir}"
886 OUTPUT_STRIP_TRAILING_WHITESPACE)
887 get_filename_component (ir_dir "${_${_PYTHON_PREFIX}_COMPILER}" DIRECTORY)
888 execute_process (COMMAND "${CMAKE_COMMAND}" -E env "MONO_PATH=${ir_dir}"
889 ${${_PYTHON_PREFIX}_DOTNET_LAUNCHER} "${working_dir}/version.exe"
890 WORKING_DIRECTORY "${working_dir}"
891 RESULT_VARIABLE result
892 OUTPUT_VARIABLE version
894 file (REMOVE_RECURSE "${working_dir}")
896 # compiler is not usable
897 set_property (CACHE _${_PYTHON_PREFIX}_Compiler_REASON_FAILURE PROPERTY VALUE "Cannot use the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
898 set_property (CACHE _${_PYTHON_PREFIX}_COMPILER PROPERTY VALUE "${_PYTHON_PREFIX}_COMPILER-NOTFOUND")
902 if (_PVC_VERSION OR _PVC_IN_RANGE)
904 # check against specified version
905 ## compute number of components for version
906 string (REGEX REPLACE "[^.]" "" dots "${_PVC_VERSION}")
907 ## add one dot because there is one dot less than there are components
908 string (LENGTH "${dots}." count)
912 set (version_regex "^[0-9]+")
914 string (APPEND version_regex "\\.[0-9]+\\.[0-9]+")
915 elseif (count EQUAL 2)
916 string (APPEND version_regex "\\.[0-9]+")
918 # extract needed range
919 string (REGEX MATCH "${version_regex}" version "${version}")
921 if (_PVC_EXACT AND NOT version VERSION_EQUAL _PVC_VERSION)
922 # interpreter has wrong version
923 set_property (CACHE _${_PYTHON_PREFIX}_Compiler_REASON_FAILURE PROPERTY VALUE "Wrong version for the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
924 set_property (CACHE _${_PYTHON_PREFIX}_COMPILER PROPERTY VALUE "${_PYTHON_PREFIX}_COMPILER-NOTFOUND")
927 # check that version is OK
928 string(REGEX REPLACE "^([0-9]+)\\.?.*$" "\\1" major_version "${version}")
929 string(REGEX REPLACE "^([0-9]+)\\.?.*$" "\\1" expected_major_version "${_PVC_VERSION}")
930 if (NOT major_version VERSION_EQUAL expected_major_version
931 OR NOT version VERSION_GREATER_EQUAL _PVC_VERSION)
932 set_property (CACHE _${_PYTHON_PREFIX}_Compiler_REASON_FAILURE PROPERTY VALUE "Wrong version for the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
933 set_property (CACHE _${_PYTHON_PREFIX}_COMPILER PROPERTY VALUE "${_PYTHON_PREFIX}_COMPILER-NOTFOUND")
940 # check if version is in the requested range
941 find_package_check_version ("${version}" in_range HANDLE_VERSION_RANGE)
943 # interpreter has invalid version
944 set_property (CACHE _${_PYTHON_PREFIX}_Compiler_REASON_FAILURE PROPERTY VALUE "Wrong version for the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
945 set_property (CACHE _${_PYTHON_PREFIX}_COMPILER PROPERTY VALUE "${_PYTHON_PREFIX}_COMPILER-NOTFOUND")
950 string(REGEX REPLACE "^([0-9]+)\\.?.*$" "\\1" major_version "${version}")
951 if (NOT major_version EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
952 # Compiler has wrong major version
953 set_property (CACHE _${_PYTHON_PREFIX}_Compiler_REASON_FAILURE PROPERTY VALUE "Wrong major version for the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
954 set_property (CACHE _${_PYTHON_PREFIX}_COMPILER PROPERTY VALUE "${_PYTHON_PREFIX}_COMPILER-NOTFOUND")
960 function(_python_validate_find_compiler status compiler)
961 set(_${_PYTHON_PREFIX}_COMPILER "${compiler}" CACHE FILEPATH "" FORCE)
962 _python_validate_compiler (${_${_PYTHON_PREFIX}_VALIDATE_OPTIONS})
963 if (NOT _${_PYTHON_PREFIX}_COMPILER)
964 set (${status} FALSE PARENT_SCOPE)
969 function (_PYTHON_VALIDATE_LIBRARY)
970 if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
971 unset (_${_PYTHON_PREFIX}_LIBRARY_DEBUG)
975 cmake_parse_arguments (PARSE_ARGV 0 _PVL "IN_RANGE;EXACT;CHECK_EXISTS" "VERSION" "")
977 if (_PVL_CHECK_EXISTS AND NOT EXISTS "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
978 # library does not exist anymore
979 set_property (CACHE _${_PYTHON_PREFIX}_Development_REASON_FAILURE PROPERTY VALUE "Cannot find the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"")
980 set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
982 set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_DEBUG PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_DEBUG-NOTFOUND")
984 set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
988 # retrieve version and abi from library name
989 _python_get_version (LIBRARY PREFIX lib_)
991 if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND NOT lib_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
993 set_property (CACHE _${_PYTHON_PREFIX}_Development_REASON_FAILURE PROPERTY VALUE "Wrong ABI for the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"")
994 set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
996 if (_PVL_VERSION OR _PVL_IN_RANGE)
998 # library have only major.minor information
999 string (REGEX MATCH "[0-9](\\.[0-9]+)?" version "${_PVL_VERSION}")
1000 if ((_PVL_EXACT AND NOT lib_VERSION VERSION_EQUAL version) OR (lib_VERSION VERSION_LESS version))
1001 # library has wrong version
1002 set_property (CACHE _${_PYTHON_PREFIX}_Development_REASON_FAILURE PROPERTY VALUE "Wrong version for the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"")
1003 set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
1007 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE AND _PVL_IN_RANGE)
1008 # check if library version is in the requested range
1009 find_package_check_version ("${lib_VERSION}" in_range HANDLE_VERSION_RANGE)
1011 # library has wrong version
1012 set_property (CACHE _${_PYTHON_PREFIX}_Development_REASON_FAILURE PROPERTY VALUE "Wrong version for the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"")
1013 set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
1017 if (NOT lib_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
1018 # library has wrong major version
1019 set_property (CACHE _${_PYTHON_PREFIX}_Development_REASON_FAILURE PROPERTY VALUE "Wrong major version for the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"")
1020 set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
1025 if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
1027 set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_DEBUG PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_DEBUG-NOTFOUND")
1029 unset (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE CACHE)
1030 unset (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG CACHE)
1031 set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
1036 function (_PYTHON_VALIDATE_INCLUDE_DIR)
1037 if (NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
1041 cmake_parse_arguments (PARSE_ARGV 0 _PVID "IN_RANGE;EXACT;CHECK_EXISTS" "VERSION" "")
1043 if (_PVID_CHECK_EXISTS AND NOT EXISTS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}")
1044 # include file does not exist anymore
1045 set_property (CACHE _${_PYTHON_PREFIX}_Development_REASON_FAILURE PROPERTY VALUE "Cannot find the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"")
1046 set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
1050 # retrieve version from header file
1051 _python_get_version (INCLUDE PREFIX inc_)
1053 if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND NOT inc_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
1055 set_property (CACHE _${_PYTHON_PREFIX}_Development_REASON_FAILURE PROPERTY VALUE "Wrong ABI for the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"")
1056 set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
1058 if (_PVID_VERSION OR _PVID_IN_RANGE)
1060 if ((_PVID_EXACT AND NOT inc_VERSION VERSION_EQUAL expected_version) OR (inc_VERSION VERSION_LESS expected_version))
1061 # include dir has wrong version
1062 set_property (CACHE _${_PYTHON_PREFIX}_Development_REASON_FAILURE PROPERTY VALUE "Wrong version for the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"")
1063 set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
1067 if (_${_PYTHON_PREFIX}_INCLUDE_DIR AND PVID_IN_RANGE)
1068 # check if include dir is in the request range
1069 find_package_check_version ("${inc_VERSION}" in_range HANDLE_VERSION_RANGE)
1071 # include dir has wrong version
1072 set_property (CACHE _${_PYTHON_PREFIX}_Development_REASON_FAILURE PROPERTY VALUE "Wrong version for the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"")
1073 set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
1077 if (NOT inc_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
1078 # include dir has wrong major version
1079 set_property (CACHE _${_PYTHON_PREFIX}_Development_REASON_FAILURE PROPERTY VALUE "Wrong major version for the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"")
1080 set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
1087 function (_PYTHON_FIND_RUNTIME_LIBRARY _PYTHON_LIB)
1088 string (REPLACE "_RUNTIME" "" _PYTHON_LIB "${_PYTHON_LIB}")
1089 # look at runtime part on systems supporting it
1090 if (CMAKE_SYSTEM_NAME STREQUAL "Windows" OR
1091 (CMAKE_SYSTEM_NAME MATCHES "MSYS|CYGWIN"
1092 AND ${_PYTHON_LIB} MATCHES "${CMAKE_IMPORT_LIBRARY_SUFFIX}$"))
1093 set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX})
1094 # MSYS has a special syntax for runtime libraries
1095 if (CMAKE_SYSTEM_NAME MATCHES "MSYS")
1096 list (APPEND CMAKE_FIND_LIBRARY_PREFIXES "msys-")
1098 find_library (${ARGV})
1103 function (_PYTHON_SET_LIBRARY_DIRS _PYTHON_SLD_RESULT)
1104 unset (_PYTHON_DIRS)
1105 set (_PYTHON_LIBS ${ARGN})
1106 foreach (_PYTHON_LIB IN LISTS _PYTHON_LIBS)
1108 get_filename_component (_PYTHON_DIR "${${_PYTHON_LIB}}" DIRECTORY)
1109 list (APPEND _PYTHON_DIRS "${_PYTHON_DIR}")
1112 list (REMOVE_DUPLICATES _PYTHON_DIRS)
1113 set (${_PYTHON_SLD_RESULT} ${_PYTHON_DIRS} PARENT_SCOPE)
1117 function (_PYTHON_SET_DEVELOPMENT_MODULE_FOUND module)
1118 if ("Development.${module}" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1119 string(TOUPPER "${module}" id)
1120 set (module_found TRUE)
1122 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS
1123 AND NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
1124 set (module_found FALSE)
1126 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS
1127 AND NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
1128 set (module_found FALSE)
1131 set (${_PYTHON_PREFIX}_Development.${module}_FOUND ${module_found} PARENT_SCOPE)
1136 if (${_PYTHON_PREFIX}_FIND_VERSION_RANGE)
1137 # range must include internal major version
1138 if (${_PYTHON_PREFIX}_FIND_VERSION_MIN_MAJOR VERSION_GREATER _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR
1139 OR ((${_PYTHON_PREFIX}_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE"
1140 AND ${_PYTHON_PREFIX}_FIND_VERSION_MAX VERSION_LESS _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
1141 OR (${_PYTHON_PREFIX}_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE"
1142 AND ${_PYTHON_PREFIX}_FIND_VERSION_MAX VERSION_LESS_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)))
1143 _python_display_failure ("Could NOT find ${_PYTHON_PREFIX}: Wrong version range specified is \"${${_PYTHON_PREFIX}_FIND_VERSION_RANGE}\", but expected version range must include major version \"${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}\"")
1149 if (DEFINED ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR
1150 AND NOT ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
1151 # If major version is specified, it must be the same as internal major version
1152 _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}\"")
1161 if (NOT ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1162 set (${_PYTHON_PREFIX}_FIND_COMPONENTS Interpreter)
1163 set (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter TRUE)
1165 if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1166 list (APPEND ${_PYTHON_PREFIX}_FIND_COMPONENTS "Interpreter" "Development.Module")
1168 if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1169 list (APPEND ${_PYTHON_PREFIX}_FIND_COMPONENTS "Development.Module" "Development.Embed")
1171 list (REMOVE_DUPLICATES ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1172 foreach (_${_PYTHON_PREFIX}_COMPONENT IN ITEMS Interpreter Compiler Development Development.Module Development.Embed NumPy)
1173 set (${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_FOUND FALSE)
1175 if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development)
1176 set (${_PYTHON_PREFIX}_FIND_REQUIRED_Development.Module TRUE)
1177 set (${_PYTHON_PREFIX}_FIND_REQUIRED_Development.Embed TRUE)
1180 unset (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
1181 unset (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS)
1182 unset (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS)
1183 if ("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1184 if (CMAKE_SYSTEM_NAME MATCHES "^(Windows.*|CYGWIN|MSYS)$")
1185 list (APPEND _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS "LIBRARY")
1187 list (APPEND _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS "INCLUDE_DIR")
1189 if ("Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1190 list (APPEND _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS "LIBRARY" "INCLUDE_DIR")
1192 set (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS ${_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS} ${_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS})
1193 list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
1195 # Set versions to search
1196 ## default: search any version
1197 set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSIONS})
1198 unset (_${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
1200 if (${_PYTHON_PREFIX}_FIND_VERSION_RANGE)
1201 unset (_${_PYTHON_PREFIX}_FIND_VERSIONS)
1202 foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_VERSIONS)
1203 if ((${_PYTHON_PREFIX}_FIND_VERSION_RANGE_MIN STREQUAL "INCLUDE"
1204 AND _${_PYTHON_PREFIX}_VERSION VERSION_GREATER_EQUAL ${_PYTHON_PREFIX}_FIND_VERSION_MIN)
1205 AND ((${_PYTHON_PREFIX}_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE"
1206 AND _${_PYTHON_PREFIX}_VERSION VERSION_LESS_EQUAL ${_PYTHON_PREFIX}_FIND_VERSION_MAX)
1207 OR (${_PYTHON_PREFIX}_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE"
1208 AND _${_PYTHON_PREFIX}_VERSION VERSION_LESS ${_PYTHON_PREFIX}_FIND_VERSION_MAX)))
1209 list (APPEND _${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSION})
1213 if (${_PYTHON_PREFIX}_FIND_VERSION_COUNT GREATER 1)
1214 if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
1215 set (_${_PYTHON_PREFIX}_FIND_VERSION_EXACT "EXACT")
1216 set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}.${${_PYTHON_PREFIX}_FIND_VERSION_MINOR})
1218 unset (_${_PYTHON_PREFIX}_FIND_VERSIONS)
1219 # add all compatible versions
1220 foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_VERSIONS)
1221 if (_${_PYTHON_PREFIX}_VERSION VERSION_GREATER_EQUAL "${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}.${${_PYTHON_PREFIX}_FIND_VERSION_MINOR}")
1222 list (APPEND _${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSION})
1229 # Set ABIs to search
1230 ## default: search any ABI
1231 if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR VERSION_LESS "3")
1233 unset (_${_PYTHON_PREFIX}_FIND_ABI)
1234 set (_${_PYTHON_PREFIX}_ABIFLAGS "")
1236 unset (_${_PYTHON_PREFIX}_FIND_ABI)
1237 unset (_${_PYTHON_PREFIX}_ABIFLAGS)
1238 if (DEFINED ${_PYTHON_PREFIX}_FIND_ABI)
1240 string (TOUPPER "${${_PYTHON_PREFIX}_FIND_ABI}" _${_PYTHON_PREFIX}_FIND_ABI)
1241 list (TRANSFORM _${_PYTHON_PREFIX}_FIND_ABI REPLACE "^(TRUE|Y(ES)?|1)$" "ON")
1242 list (TRANSFORM _${_PYTHON_PREFIX}_FIND_ABI REPLACE "^(FALSE|N(O)?|0)$" "OFF")
1243 if (NOT _${_PYTHON_PREFIX}_FIND_ABI MATCHES "^(ON|OFF|ANY);(ON|OFF|ANY);(ON|OFF|ANY)$")
1244 message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${${_PYTHON_PREFIX}_FIND_ABI}: invalid value for '${_PYTHON_PREFIX}_FIND_ABI'. Ignore it")
1245 unset (_${_PYTHON_PREFIX}_FIND_ABI)
1247 _python_get_abiflags (_${_PYTHON_PREFIX}_ABIFLAGS)
1250 unset (${_PYTHON_PREFIX}_SOABI)
1252 # Define lookup strategy
1253 cmake_policy (GET CMP0094 _${_PYTHON_PREFIX}_LOOKUP_POLICY)
1254 if (_${_PYTHON_PREFIX}_LOOKUP_POLICY STREQUAL "NEW")
1255 set (_${_PYTHON_PREFIX}_FIND_STRATEGY "LOCATION")
1257 set (_${_PYTHON_PREFIX}_FIND_STRATEGY "VERSION")
1259 if (DEFINED ${_PYTHON_PREFIX}_FIND_STRATEGY)
1260 if (NOT ${_PYTHON_PREFIX}_FIND_STRATEGY MATCHES "^(VERSION|LOCATION)$")
1261 message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${${_PYTHON_PREFIX}_FIND_STRATEGY}: invalid value for '${_PYTHON_PREFIX}_FIND_STRATEGY'. 'VERSION' or 'LOCATION' expected.")
1262 set (_${_PYTHON_PREFIX}_FIND_STRATEGY "VERSION")
1264 set (_${_PYTHON_PREFIX}_FIND_STRATEGY "${${_PYTHON_PREFIX}_FIND_STRATEGY}")
1268 # Python and Anaconda distributions: define which architectures can be used
1269 unset (_${_PYTHON_PREFIX}_REGISTRY_VIEW)
1270 if (CMAKE_SIZEOF_VOID_P)
1271 math (EXPR _${_PYTHON_PREFIX}_ARCH "${CMAKE_SIZEOF_VOID_P} * 8")
1272 if ("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
1273 OR "Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1274 # In this case, search only for 64bit or 32bit
1275 set (_${_PYTHON_PREFIX}_ARCH2 ${_${_PYTHON_PREFIX}_ARCH})
1276 set (_${_PYTHON_PREFIX}_REGISTRY_VIEW REGISTRY_VIEW ${_${_PYTHON_PREFIX}_ARCH})
1278 if (_${_PYTHON_PREFIX}_ARCH EQUAL "32")
1279 set (_${_PYTHON_PREFIX}_ARCH2 64)
1281 set (_${_PYTHON_PREFIX}_ARCH2 32)
1285 # architecture unknown, search for both 64bit and 32bit
1286 set (_${_PYTHON_PREFIX}_ARCH 64)
1287 set (_${_PYTHON_PREFIX}_ARCH2 32)
1290 # IronPython support
1291 unset (_${_PYTHON_PREFIX}_IRON_PYTHON_INTERPRETER_NAMES)
1292 unset (_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_NAMES)
1293 unset (_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_ARCH_FLAGS)
1294 if (CMAKE_SIZEOF_VOID_P)
1295 if (_${_PYTHON_PREFIX}_ARCH EQUAL "32")
1296 set (_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_ARCH_FLAGS "/platform:x86")
1298 set (_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_ARCH_FLAGS "/platform:x64")
1301 if (NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
1302 # Do not use wrapper script on Linux because it is buggy: -c interpreter option cannot be used
1303 list (APPEND _${_PYTHON_PREFIX}_IRON_PYTHON_INTERPRETER_NAMES "ipy${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}" "ipy64" "ipy32" "ipy")
1304 list (APPEND _${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_NAMES "ipyc")
1306 list (APPEND _${_PYTHON_PREFIX}_IRON_PYTHON_INTERPRETER_NAMES "ipy.exe")
1307 list (APPEND _${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_NAMES "ipyc.exe")
1308 set (_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES net45 net40 bin)
1311 if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL "3")
1312 set (_${_PYTHON_PREFIX}_PYPY_NAMES pypy3)
1313 set (_${_PYTHON_PREFIX}_PYPY_LIB_NAMES pypy3-c)
1315 # special name for runtime part
1316 list (APPEND _${_PYTHON_PREFIX}_PYPY_LIB_NAMES libpypy3-c)
1318 set (_${_PYTHON_PREFIX}_PYPY_INCLUDE_PATH_SUFFIXES lib/pypy3/include pypy3/include)
1320 set (_${_PYTHON_PREFIX}_PYPY_NAMES pypy)
1321 set (_${_PYTHON_PREFIX}_PYPY_LIB_NAMES pypy-c)
1323 # special name for runtime part
1324 list (APPEND _${_PYTHON_PREFIX}_PYPY_LIB_NAMES libpypy-c)
1326 set (_${_PYTHON_PREFIX}_PYPY_INCLUDE_PATH_SUFFIXES lib/pypy/include pypy/include)
1328 list (APPEND _${_PYTHON_PREFIX}_PYPY_INCLUDE_PATH_SUFFIXES libexec/include)
1329 set (_${_PYTHON_PREFIX}_PYPY_EXECUTABLE_PATH_SUFFIXES bin)
1330 set (_${_PYTHON_PREFIX}_PYPY_LIBRARY_PATH_SUFFIXES lib libs bin)
1331 list (APPEND _${_PYTHON_PREFIX}_PYPY_INCLUDE_PATH_SUFFIXES include)
1333 # Python Implementations handling
1334 unset (_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
1335 if (DEFINED ${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
1336 foreach (_${_PYTHON_PREFIX}_IMPLEMENTATION IN LISTS ${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
1337 if (NOT _${_PYTHON_PREFIX}_IMPLEMENTATION MATCHES "^(CPython|IronPython|PyPy)$")
1338 message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${_${_PYTHON_PREFIX}_IMPLEMENTATION}: invalid value for '${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS'. 'CPython', 'IronPython' or 'PyPy' expected. Value will be ignored.")
1340 list (APPEND _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS ${_${_PYTHON_PREFIX}_IMPLEMENTATION})
1345 set (_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS CPython IronPython)
1347 set (_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS CPython)
1351 # compute list of names for header file
1352 unset (_${_PYTHON_PREFIX}_INCLUDE_NAMES)
1353 foreach (_${_PYTHON_PREFIX}_IMPLEMENTATION IN LISTS _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
1354 if (_${_PYTHON_PREFIX}_IMPLEMENTATION STREQUAL "CPython")
1355 list (APPEND _${_PYTHON_PREFIX}_INCLUDE_NAMES "Python.h")
1356 elseif (_${_PYTHON_PREFIX}_IMPLEMENTATION STREQUAL "PyPy")
1357 list (APPEND _${_PYTHON_PREFIX}_INCLUDE_NAMES "PyPy.h" "pypy_decl.h")
1362 # Apple frameworks handling
1363 _python_find_frameworks ()
1365 set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK "FIRST")
1367 if (DEFINED ${_PYTHON_PREFIX}_FIND_FRAMEWORK)
1368 if (NOT ${_PYTHON_PREFIX}_FIND_FRAMEWORK MATCHES "^(FIRST|LAST|NEVER)$")
1369 message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${${_PYTHON_PREFIX}_FIND_FRAMEWORK}: invalid value for '${_PYTHON_PREFIX}_FIND_FRAMEWORK'. 'FIRST', 'LAST' or 'NEVER' expected. 'FIRST' will be used instead.")
1371 set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK ${${_PYTHON_PREFIX}_FIND_FRAMEWORK})
1373 elseif (DEFINED CMAKE_FIND_FRAMEWORK)
1374 if (CMAKE_FIND_FRAMEWORK STREQUAL "ONLY")
1375 message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: CMAKE_FIND_FRAMEWORK: 'ONLY' value is not supported. 'FIRST' will be used instead.")
1376 elseif (NOT CMAKE_FIND_FRAMEWORK MATCHES "^(FIRST|LAST|NEVER)$")
1377 message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${CMAKE_FIND_FRAMEWORK}: invalid value for 'CMAKE_FIND_FRAMEWORK'. 'FIRST', 'LAST' or 'NEVER' expected. 'FIRST' will be used instead.")
1379 set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
1383 # Save CMAKE_FIND_APPBUNDLE
1384 if (DEFINED CMAKE_FIND_APPBUNDLE)
1385 set (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE ${CMAKE_FIND_APPBUNDLE})
1387 unset (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE)
1389 # To avoid app bundle lookup
1390 set (CMAKE_FIND_APPBUNDLE "NEVER")
1392 # Save CMAKE_FIND_FRAMEWORK
1393 if (DEFINED CMAKE_FIND_FRAMEWORK)
1394 set (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
1396 unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
1398 # To avoid framework lookup
1399 set (CMAKE_FIND_FRAMEWORK "NEVER")
1401 # Windows Registry handling
1402 if (DEFINED ${_PYTHON_PREFIX}_FIND_REGISTRY)
1403 if (NOT ${_PYTHON_PREFIX}_FIND_REGISTRY MATCHES "^(FIRST|LAST|NEVER)$")
1404 message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${${_PYTHON_PREFIX}_FIND_REGISTRY}: invalid value for '${_PYTHON_PREFIX}_FIND_REGISTRY'. 'FIRST', 'LAST' or 'NEVER' expected. 'FIRST' will be used instead.")
1405 set (_${_PYTHON_PREFIX}_FIND_REGISTRY "FIRST")
1407 set (_${_PYTHON_PREFIX}_FIND_REGISTRY ${${_PYTHON_PREFIX}_FIND_REGISTRY})
1410 set (_${_PYTHON_PREFIX}_FIND_REGISTRY "FIRST")
1413 # virtual environments recognition
1414 if (DEFINED ENV{VIRTUAL_ENV} OR DEFINED ENV{CONDA_PREFIX})
1415 if (DEFINED ${_PYTHON_PREFIX}_FIND_VIRTUALENV)
1416 if (NOT ${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY|STANDARD)$")
1417 message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${${_PYTHON_PREFIX}_FIND_VIRTUALENV}: invalid value for '${_PYTHON_PREFIX}_FIND_VIRTUALENV'. 'FIRST', 'ONLY' or 'STANDARD' expected. 'FIRST' will be used instead.")
1418 set (_${_PYTHON_PREFIX}_FIND_VIRTUALENV "FIRST")
1420 set (_${_PYTHON_PREFIX}_FIND_VIRTUALENV ${${_PYTHON_PREFIX}_FIND_VIRTUALENV})
1423 set (_${_PYTHON_PREFIX}_FIND_VIRTUALENV FIRST)
1426 set (_${_PYTHON_PREFIX}_FIND_VIRTUALENV STANDARD)
1430 # Python naming handling
1431 if (DEFINED ${_PYTHON_PREFIX}_FIND_UNVERSIONED_NAMES)
1432 if (NOT ${_PYTHON_PREFIX}_FIND_UNVERSIONED_NAMES MATCHES "^(FIRST|LAST|NEVER)$")
1433 message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${_${_PYTHON_PREFIX}_FIND_UNVERSIONED_NAMES}: invalid value for '${_PYTHON_PREFIX}_FIND_UNVERSIONED_NAMES'. 'FIRST', 'LAST' or 'NEVER' expected. 'LAST' will be used instead.")
1434 set (_${_PYTHON_PREFIX}_FIND_UNVERSIONED_NAMES LAST)
1436 set (_${_PYTHON_PREFIX}_FIND_UNVERSIONED_NAMES ${${_PYTHON_PREFIX}_FIND_UNVERSIONED_NAMES})
1439 set (_${_PYTHON_PREFIX}_FIND_UNVERSIONED_NAMES LAST)
1443 # Compute search signature
1444 # This signature will be used to check validity of cached variables on new search
1445 set (_${_PYTHON_PREFIX}_SIGNATURE "${${_PYTHON_PREFIX}_ROOT_DIR}:${_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS}:${_${_PYTHON_PREFIX}_FIND_STRATEGY}:${${_PYTHON_PREFIX}_FIND_VIRTUALENV}${_${_PYTHON_PREFIX}_FIND_UNVERSIONED_NAMES}")
1447 string (APPEND _${_PYTHON_PREFIX}_SIGNATURE ":${${_PYTHON_PREFIX}_USE_STATIC_LIBS}:")
1449 if (CMAKE_HOST_APPLE)
1450 string (APPEND _${_PYTHON_PREFIX}_SIGNATURE ":${_${_PYTHON_PREFIX}_FIND_FRAMEWORK}")
1452 if (CMAKE_HOST_WIN32)
1453 string (APPEND _${_PYTHON_PREFIX}_SIGNATURE ":${_${_PYTHON_PREFIX}_FIND_REGISTRY}")
1456 function (_PYTHON_CHECK_DEVELOPMENT_SIGNATURE module)
1457 if ("Development.${module}" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1458 string (TOUPPER "${module}" id)
1459 set (signature "${_${_PYTHON_PREFIX}_SIGNATURE}:")
1460 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1461 list (APPEND signature "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}:")
1463 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1464 list (APPEND signature "${_${_PYTHON_PREFIX}_INCLUDE_DIR}:")
1466 string (MD5 signature "${signature}")
1467 if (signature STREQUAL _${_PYTHON_PREFIX}_DEVELOPMENT_${id}_SIGNATURE)
1468 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1469 if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
1470 _python_validate_library (VERSION ${${_PYTHON_PREFIX}_FIND_VERSION} EXACT CHECK_EXISTS)
1471 elseif (${_PYTHON_PREFIX}_FIND_VERSION_RANGE)
1472 _python_validate_library (IN_RANGE CHECK_EXISTS)
1473 elseif (DEFINED ${_PYTHON_PREFIX}_FIND_VERSION)
1474 _python_validate_library (VERSION ${${_PYTHON_PREFIX}_FIND_VERSION} CHECK_EXISTS)
1476 _python_validate_library (CHECK_EXISTS)
1479 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1480 if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
1481 _python_validate_include_dir (VERSION ${${_PYTHON_PREFIX}_FIND_VERSION} EXACT CHECK_EXISTS)
1482 elseif (${_PYTHON_PREFIX}_FIND_VERSION_RANGE)
1483 _python_validate_include_dir (IN_RANGE CHECK_EXISTS)
1484 elseif (${_PYTHON_PREFIX}_FIND_VERSION)
1485 _python_validate_include_dir (VERSION ${${_PYTHON_PREFIX}_FIND_VERSION} CHECK_EXISTS)
1487 _python_validate_include_dir (CHECK_EXISTS)
1491 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1492 unset (_${_PYTHON_PREFIX}_LIBRARY_RELEASE CACHE)
1493 unset (_${_PYTHON_PREFIX}_LIBRARY_DEBUG CACHE)
1495 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1496 unset (_${_PYTHON_PREFIX}_INCLUDE_DIR CACHE)
1499 if (("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS
1500 AND NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
1501 OR ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS
1502 AND NOT _${_PYTHON_PREFIX}_INCLUDE_DIR))
1503 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
1504 unset (_${_PYTHON_PREFIX}_DEVELOPMENT_${id}_SIGNATURE CACHE)
1509 function (_PYTHON_COMPUTE_DEVELOPMENT_SIGNATURE module)
1510 string (TOUPPER "${module}" id)
1511 if (${_PYTHON_PREFIX}_Development.${module}_FOUND)
1512 set (signature "${_${_PYTHON_PREFIX}_SIGNATURE}:")
1513 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1514 list (APPEND signature "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}:")
1516 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1517 list (APPEND signature "${_${_PYTHON_PREFIX}_INCLUDE_DIR}:")
1519 string (MD5 signature "${signature}")
1520 set (_${_PYTHON_PREFIX}_DEVELOPMENT_${id}_SIGNATURE "${signature}" CACHE INTERNAL "")
1522 unset (_${_PYTHON_PREFIX}_DEVELOPMENT_${id}_SIGNATURE CACHE)
1527 unset (_${_PYTHON_PREFIX}_REQUIRED_VARS)
1528 unset (_${_PYTHON_PREFIX}_CACHED_VARS)
1529 unset (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE)
1530 set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE CACHE INTERNAL "Interpreter reason failure")
1531 unset (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE)
1532 set (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE CACHE INTERNAL "Compiler reason failure")
1533 unset (_${_PYTHON_PREFIX}_Development_REASON_FAILURE)
1534 set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE CACHE INTERNAL "Development reason failure")
1535 unset (_${_PYTHON_PREFIX}_NumPy_REASON_FAILURE)
1536 set (_${_PYTHON_PREFIX}_NumPy_REASON_FAILURE CACHE INTERNAL "NumPy reason failure")
1540 ## For IronPython on platforms other than Windows, search for the .Net interpreter
1541 if ("IronPython" IN_LIST _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS
1543 find_program (${_PYTHON_PREFIX}_DOTNET_LAUNCHER
1548 # first step, search for the interpreter
1549 if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1550 list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_EXECUTABLE
1551 _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES)
1552 if (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter)
1553 list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_EXECUTABLE)
1556 if (DEFINED ${_PYTHON_PREFIX}_EXECUTABLE
1557 AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_EXECUTABLE}")
1558 if (NOT ${_PYTHON_PREFIX}_EXECUTABLE STREQUAL _${_PYTHON_PREFIX}_EXECUTABLE)
1559 # invalidate cache properties
1560 unset (_${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES CACHE)
1562 set (_${_PYTHON_PREFIX}_EXECUTABLE "${${_PYTHON_PREFIX}_EXECUTABLE}" CACHE INTERNAL "")
1563 elseif (DEFINED _${_PYTHON_PREFIX}_EXECUTABLE)
1564 # compute interpreter signature and check validity of definition
1565 string (MD5 __${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE "${_${_PYTHON_PREFIX}_SIGNATURE}:${_${_PYTHON_PREFIX}_EXECUTABLE}")
1566 if (__${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE STREQUAL _${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE)
1567 # check version validity
1568 if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
1569 _python_validate_interpreter (VERSION ${${_PYTHON_PREFIX}_FIND_VERSION} EXACT CHECK_EXISTS)
1570 elseif (${_PYTHON_PREFIX}_FIND_VERSION_RANGE)
1571 _python_validate_interpreter (IN_RANGE CHECK_EXISTS)
1572 elseif (DEFINED ${_PYTHON_PREFIX}_FIND_VERSION)
1573 _python_validate_interpreter (VERSION ${${_PYTHON_PREFIX}_FIND_VERSION} CHECK_EXISTS)
1575 _python_validate_interpreter (CHECK_EXISTS)
1578 unset (_${_PYTHON_PREFIX}_EXECUTABLE CACHE)
1580 if (NOT _${_PYTHON_PREFIX}_EXECUTABLE)
1581 unset (_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE CACHE)
1582 unset (_${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES CACHE)
1586 if (NOT _${_PYTHON_PREFIX}_EXECUTABLE)
1587 set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
1589 if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
1590 # build all executable names
1591 _python_get_names (_${_PYTHON_PREFIX}_NAMES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} POSIX INTERPRETER)
1592 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} INTERPRETER)
1595 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS})
1597 _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS})
1599 set (_${_PYTHON_PREFIX}_VALIDATE_OPTIONS ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
1600 if (${_PYTHON_PREFIX}_FIND_VERSION_RANGE)
1601 list (APPEND _${_PYTHON_PREFIX}_VALIDATE_OPTIONS IN_RANGE)
1602 elseif (DEFINED ${_PYTHON_PREFIX}_FIND_VERSION)
1603 list (APPEND _${_PYTHON_PREFIX}_VALIDATE_OPTIONS VERSION ${${_PYTHON_PREFIX}_FIND_VERSION})
1607 # Virtual environments handling
1608 if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
1609 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1610 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1612 HINTS ${_${_PYTHON_PREFIX}_HINTS}
1613 PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX
1614 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1616 NO_CMAKE_ENVIRONMENT_PATH
1617 NO_SYSTEM_ENVIRONMENT_PATH
1618 NO_CMAKE_SYSTEM_PATH
1619 VALIDATOR _python_validate_find_interpreter)
1620 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1623 if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV STREQUAL "ONLY")
1628 # Apple frameworks handling
1629 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
1630 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1631 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1633 HINTS ${_${_PYTHON_PREFIX}_HINTS}
1634 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1635 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1637 NO_CMAKE_ENVIRONMENT_PATH
1638 NO_SYSTEM_ENVIRONMENT_PATH
1639 NO_CMAKE_SYSTEM_PATH
1640 VALIDATOR _python_validate_find_interpreter)
1641 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1646 if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
1647 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1648 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1650 HINTS ${_${_PYTHON_PREFIX}_HINTS}
1651 PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1652 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1653 ${_${_PYTHON_PREFIX}_REGISTRY_VIEW}
1654 NO_SYSTEM_ENVIRONMENT_PATH
1655 NO_CMAKE_SYSTEM_PATH
1656 VALIDATOR _python_validate_find_interpreter)
1657 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1663 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1664 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1666 HINTS ${_${_PYTHON_PREFIX}_HINTS}
1667 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1668 NO_SYSTEM_ENVIRONMENT_PATH
1669 NO_CMAKE_SYSTEM_PATH
1670 VALIDATOR _python_validate_find_interpreter)
1671 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1674 # try using standard paths
1675 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1676 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1678 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1679 VALIDATOR _python_validate_find_interpreter)
1680 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1684 # Apple frameworks handling
1685 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
1686 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1687 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1689 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1690 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1692 VALIDATOR _python_validate_find_interpreter)
1693 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1698 if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
1699 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1700 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1702 PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1703 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1704 ${_${_PYTHON_PREFIX}_REGISTRY_VIEW}
1706 VALIDATOR _python_validate_find_interpreter)
1707 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1715 # look-up for various versions and locations
1716 set (_${_PYTHON_PREFIX}_COMMON_VALIDATE_OPTIONS EXACT)
1717 if (${_PYTHON_PREFIX}_FIND_VERSION_RANGE)
1718 list (APPEND _${_PYTHON_PREFIX}_COMMON_VALIDATE_OPTIONS IN_RANGE)
1721 foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
1722 _python_get_names (_${_PYTHON_PREFIX}_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} POSIX INTERPRETER)
1723 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_VERSION} INTERPRETER)
1725 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_VERSION})
1726 _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS VERSION ${_${_PYTHON_PREFIX}_VERSION})
1727 set (_${_PYTHON_PREFIX}_VALIDATE_OPTIONS VERSION ${_${_PYTHON_PREFIX}_VERSION} ${_${_PYTHON_PREFIX}_COMMON_VALIDATE_OPTIONS})
1729 # Virtual environments handling
1730 if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
1731 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1732 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1734 HINTS ${_${_PYTHON_PREFIX}_HINTS}
1735 PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX
1736 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1738 NO_CMAKE_ENVIRONMENT_PATH
1739 NO_SYSTEM_ENVIRONMENT_PATH
1740 NO_CMAKE_SYSTEM_PATH
1741 VALIDATOR _python_validate_find_interpreter)
1742 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1745 if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV STREQUAL "ONLY")
1750 # Apple frameworks handling
1751 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
1752 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1753 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1755 HINTS ${_${_PYTHON_PREFIX}_HINTS}
1756 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1757 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1759 NO_CMAKE_ENVIRONMENT_PATH
1760 NO_SYSTEM_ENVIRONMENT_PATH
1761 NO_CMAKE_SYSTEM_PATH
1762 VALIDATOR _python_validate_find_interpreter)
1766 if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
1767 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1768 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1770 HINTS ${_${_PYTHON_PREFIX}_HINTS}
1771 PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1772 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1773 ${_${_PYTHON_PREFIX}_REGISTRY_VIEW}
1774 NO_SYSTEM_ENVIRONMENT_PATH
1775 NO_CMAKE_SYSTEM_PATH
1776 VALIDATOR _python_validate_find_interpreter)
1779 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1784 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1785 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1787 HINTS ${_${_PYTHON_PREFIX}_HINTS}
1788 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1789 NO_SYSTEM_ENVIRONMENT_PATH
1790 NO_CMAKE_SYSTEM_PATH
1791 VALIDATOR _python_validate_find_interpreter)
1792 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1796 # try using standard paths.
1797 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1798 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1800 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1801 VALIDATOR _python_validate_find_interpreter)
1802 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1806 # Apple frameworks handling
1807 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
1808 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1809 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1811 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1812 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1814 VALIDATOR _python_validate_find_interpreter)
1818 if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
1819 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1820 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1822 PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1823 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1824 ${_${_PYTHON_PREFIX}_REGISTRY_VIEW}
1826 VALIDATOR _python_validate_find_interpreter)
1829 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1834 if (NOT _${_PYTHON_PREFIX}_EXECUTABLE AND
1835 NOT _${_PYTHON_PREFIX}_FIND_VIRTUALENV STREQUAL "ONLY")
1836 # No specific version found. Retry with generic names and standard paths.
1837 _python_get_names (_${_PYTHON_PREFIX}_NAMES POSIX INTERPRETER)
1838 unset (_${_PYTHON_PREFIX}_VALIDATE_OPTIONS)
1839 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1840 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1842 VALIDATOR _python_validate_find_interpreter)
1847 set (${_PYTHON_PREFIX}_EXECUTABLE "${_${_PYTHON_PREFIX}_EXECUTABLE}")
1848 _python_get_launcher (_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER INTERPRETER)
1850 # retrieve exact version of executable found
1851 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1852 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
1853 "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))"
1854 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1855 OUTPUT_VARIABLE ${_PYTHON_PREFIX}_VERSION
1857 OUTPUT_STRIP_TRAILING_WHITESPACE)
1858 if (NOT _${_PYTHON_PREFIX}_RESULT)
1859 set (_${_PYTHON_PREFIX}_EXECUTABLE_USABLE TRUE)
1861 # Interpreter is not usable
1862 set (_${_PYTHON_PREFIX}_EXECUTABLE_USABLE FALSE)
1863 unset (${_PYTHON_PREFIX}_VERSION)
1864 set_property (CACHE _${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE PROPERTY VALUE "Cannot run the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
1868 if (_${_PYTHON_PREFIX}_EXECUTABLE AND _${_PYTHON_PREFIX}_EXECUTABLE_USABLE)
1869 if (_${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES)
1870 set (${_PYTHON_PREFIX}_Interpreter_FOUND TRUE)
1872 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 0 ${_PYTHON_PREFIX}_INTERPRETER_ID)
1874 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 1 ${_PYTHON_PREFIX}_VERSION_MAJOR)
1875 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 2 ${_PYTHON_PREFIX}_VERSION_MINOR)
1876 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 3 ${_PYTHON_PREFIX}_VERSION_PATCH)
1878 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 4 _${_PYTHON_PREFIX}_ARCH)
1879 set (_${_PYTHON_PREFIX}_ARCH2 ${_${_PYTHON_PREFIX}_ARCH})
1881 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 5 _${_PYTHON_PREFIX}_ABIFLAGS)
1882 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 6 ${_PYTHON_PREFIX}_SOABI)
1884 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 7 ${_PYTHON_PREFIX}_STDLIB)
1885 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 8 ${_PYTHON_PREFIX}_STDARCH)
1886 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 9 ${_PYTHON_PREFIX}_SITELIB)
1887 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 10 ${_PYTHON_PREFIX}_SITEARCH)
1889 string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${${_PYTHON_PREFIX}_VERSION}")
1890 list (GET _${_PYTHON_PREFIX}_VERSIONS 0 ${_PYTHON_PREFIX}_VERSION_MAJOR)
1891 list (GET _${_PYTHON_PREFIX}_VERSIONS 1 ${_PYTHON_PREFIX}_VERSION_MINOR)
1892 list (GET _${_PYTHON_PREFIX}_VERSIONS 2 ${_PYTHON_PREFIX}_VERSION_PATCH)
1894 if (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
1895 set (${_PYTHON_PREFIX}_Interpreter_FOUND TRUE)
1897 # Use interpreter version and ABI for future searches to ensure consistency
1898 set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
1899 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETR_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
1900 "import sys; sys.stdout.write(sys.abiflags)"
1901 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1902 OUTPUT_VARIABLE _${_PYTHON_PREFIX}_ABIFLAGS
1904 OUTPUT_STRIP_TRAILING_WHITESPACE)
1905 if (_${_PYTHON_PREFIX}_RESULT)
1906 # assunme ABI is not supported
1907 set (_${_PYTHON_PREFIX}_ABIFLAGS "")
1911 if (${_PYTHON_PREFIX}_Interpreter_FOUND)
1912 unset (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE CACHE)
1914 # compute and save interpreter signature
1915 string (MD5 __${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE "${_${_PYTHON_PREFIX}_SIGNATURE}:${_${_PYTHON_PREFIX}_EXECUTABLE}")
1916 set (_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE "${__${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE}" CACHE INTERNAL "")
1918 if (NOT CMAKE_SIZEOF_VOID_P)
1919 # determine interpreter architecture
1920 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
1921 "import sys; sys.stdout.write(str(sys.maxsize > 2**32))"
1922 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1923 OUTPUT_VARIABLE ${_PYTHON_PREFIX}_IS64BIT
1924 ERROR_VARIABLE ${_PYTHON_PREFIX}_IS64BIT)
1925 if (NOT _${_PYTHON_PREFIX}_RESULT)
1926 if (${_PYTHON_PREFIX}_IS64BIT)
1927 set (_${_PYTHON_PREFIX}_ARCH 64)
1928 set (_${_PYTHON_PREFIX}_ARCH2 64)
1930 set (_${_PYTHON_PREFIX}_ARCH 32)
1931 set (_${_PYTHON_PREFIX}_ARCH2 32)
1936 # retrieve interpreter identity
1937 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -V
1938 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1939 OUTPUT_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID
1940 ERROR_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID)
1941 if (NOT _${_PYTHON_PREFIX}_RESULT)
1942 if (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Anaconda")
1943 set (${_PYTHON_PREFIX}_INTERPRETER_ID "Anaconda")
1944 elseif (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Enthought")
1945 set (${_PYTHON_PREFIX}_INTERPRETER_ID "Canopy")
1946 elseif (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "PyPy ([0-9.]+)")
1947 set (${_PYTHON_PREFIX}_INTERPRETER_ID "PyPy")
1948 set (${_PYTHON_PREFIX}_PyPy_VERSION "${CMAKE_MATCH_1}")
1950 string (REGEX REPLACE "^([^ ]+).*" "\\1" ${_PYTHON_PREFIX}_INTERPRETER_ID "${${_PYTHON_PREFIX}_INTERPRETER_ID}")
1951 if (${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "Python")
1952 # try to get a more precise ID
1953 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
1954 "import sys; sys.stdout.write(sys.copyright)"
1955 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1956 OUTPUT_VARIABLE ${_PYTHON_PREFIX}_COPYRIGHT
1958 if (${_PYTHON_PREFIX}_COPYRIGHT MATCHES "ActiveState")
1959 set (${_PYTHON_PREFIX}_INTERPRETER_ID "ActivePython")
1964 set (${_PYTHON_PREFIX}_INTERPRETER_ID Python)
1967 # retrieve various package installation directories
1968 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
1969 "import sys\ntry:\n from distutils import sysconfig\n 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)]))\nexcept Exception:\n import sysconfig\n sys.stdout.write(';'.join([sysconfig.get_path('stdlib'),sysconfig.get_path('platstdlib'),sysconfig.get_path('purelib'),sysconfig.get_path('platlib')]))"
1970 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1971 OUTPUT_VARIABLE _${_PYTHON_PREFIX}_LIBPATHS
1973 if (NOT _${_PYTHON_PREFIX}_RESULT)
1974 list (GET _${_PYTHON_PREFIX}_LIBPATHS 0 ${_PYTHON_PREFIX}_STDLIB)
1975 list (GET _${_PYTHON_PREFIX}_LIBPATHS 1 ${_PYTHON_PREFIX}_STDARCH)
1976 list (GET _${_PYTHON_PREFIX}_LIBPATHS 2 ${_PYTHON_PREFIX}_SITELIB)
1977 list (GET _${_PYTHON_PREFIX}_LIBPATHS 3 ${_PYTHON_PREFIX}_SITEARCH)
1979 unset (${_PYTHON_PREFIX}_STDLIB)
1980 unset (${_PYTHON_PREFIX}_STDARCH)
1981 unset (${_PYTHON_PREFIX}_SITELIB)
1982 unset (${_PYTHON_PREFIX}_SITEARCH)
1985 _python_get_config_var (${_PYTHON_PREFIX}_SOABI SOABI)
1987 # store properties in the cache to speed-up future searches
1988 set (_${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES
1989 "${${_PYTHON_PREFIX}_INTERPRETER_ID};${${_PYTHON_PREFIX}_VERSION_MAJOR};${${_PYTHON_PREFIX}_VERSION_MINOR};${${_PYTHON_PREFIX}_VERSION_PATCH};${_${_PYTHON_PREFIX}_ARCH};${_${_PYTHON_PREFIX}_ABIFLAGS};${${_PYTHON_PREFIX}_SOABI};${${_PYTHON_PREFIX}_STDLIB};${${_PYTHON_PREFIX}_STDARCH};${${_PYTHON_PREFIX}_SITELIB};${${_PYTHON_PREFIX}_SITEARCH}" CACHE INTERNAL "${_PYTHON_PREFIX} Properties")
1991 unset (_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE CACHE)
1992 unset (${_PYTHON_PREFIX}_INTERPRETER_ID)
1997 if (${_PYTHON_PREFIX}_ARTIFACTS_INTERACTIVE)
1998 set (${_PYTHON_PREFIX}_EXECUTABLE "${_${_PYTHON_PREFIX}_EXECUTABLE}" CACHE FILEPATH "${_PYTHON_PREFIX} Interpreter")
2001 _python_mark_as_internal (_${_PYTHON_PREFIX}_EXECUTABLE
2002 _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES
2003 _${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE)
2007 # second step, search for compiler (IronPython)
2008 if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
2009 list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_COMPILER)
2010 if (${_PYTHON_PREFIX}_FIND_REQUIRED_Compiler)
2011 list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_COMPILER)
2014 if (NOT "IronPython" IN_LIST _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
2015 unset (_${_PYTHON_PREFIX}_COMPILER CACHE)
2016 unset (_${_PYTHON_PREFIX}_COMPILER_SIGNATURE CACHE)
2017 elseif (DEFINED ${_PYTHON_PREFIX}_COMPILER
2018 AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_COMPILER}")
2019 set (_${_PYTHON_PREFIX}_COMPILER "${${_PYTHON_PREFIX}_COMPILER}" CACHE INTERNAL "")
2020 elseif (DEFINED _${_PYTHON_PREFIX}_COMPILER)
2021 # compute compiler signature and check validity of definition
2022 string (MD5 __${_PYTHON_PREFIX}_COMPILER_SIGNATURE "${_${_PYTHON_PREFIX}_SIGNATURE}:${_${_PYTHON_PREFIX}_COMPILER}")
2023 if (__${_PYTHON_PREFIX}_COMPILER_SIGNATURE STREQUAL _${_PYTHON_PREFIX}_COMPILER_SIGNATURE)
2024 # check version validity
2025 if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
2026 _python_validate_compiler (VERSION ${${_PYTHON_PREFIX}_FIND_VERSION} EXACT CHECK_EXISTS)
2027 elseif (${_PYTHON_PREFIX}_FIND_VERSION_RANGE)
2028 _python_validate_compiler (IN_RANGE CHECK_EXISTS)
2029 elseif (DEFINED ${_PYTHON_PREFIX}_FIND_VERSION)
2030 _python_validate_compiler (VERSION ${${_PYTHON_PREFIX}_FIND_VERSION} CHECK_EXISTS)
2032 _python_validate_compiler (CHECK_EXISTS)
2035 unset (_${_PYTHON_PREFIX}_COMPILER CACHE)
2036 unset (_${_PYTHON_PREFIX}_COMPILER_SIGNATURE CACHE)
2040 if ("IronPython" IN_LIST _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS
2041 AND NOT _${_PYTHON_PREFIX}_COMPILER)
2042 # IronPython specific artifacts
2043 # If IronPython interpreter is found, use its path
2044 unset (_${_PYTHON_PREFIX}_IRON_ROOT)
2045 if (${_PYTHON_PREFIX}_Interpreter_FOUND AND ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython")
2046 get_filename_component (_${_PYTHON_PREFIX}_IRON_ROOT "${${_PYTHON_PREFIX}_EXECUTABLE}" DIRECTORY)
2049 if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
2050 _python_get_names (_${_PYTHON_PREFIX}_COMPILER_NAMES
2051 IMPLEMENTATIONS IronPython
2052 VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS}
2055 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES
2056 IMPLEMENTATIONS IronPython
2057 VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS}
2060 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS
2061 IMPLEMENTATIONS IronPython
2062 VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS})
2063 _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS
2064 IMPLEMENTATIONS IronPython
2065 VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS})
2067 set (_${_PYTHON_PREFIX}_VALIDATE_OPTIONS ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
2068 if (${_PYTHON_PREFIX}_FIND_VERSION_RANGE)
2069 list (APPEND _${_PYTHON_PREFIX}_VALIDATE_OPTIONS IN_RANGE)
2070 elseif (DEFINED ${_PYTHON_PREFIX}_FIND_VERSION)
2071 list (APPEND _${_PYTHON_PREFIX}_VALIDATE_OPTIONS VERSION ${${_PYTHON_PREFIX}_FIND_VERSION})
2075 # Apple frameworks handling
2076 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
2077 find_program (_${_PYTHON_PREFIX}_COMPILER
2078 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
2080 HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
2081 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2082 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2084 NO_CMAKE_ENVIRONMENT_PATH
2085 NO_SYSTEM_ENVIRONMENT_PATH
2086 NO_CMAKE_SYSTEM_PATH
2087 VALIDATOR _python_validate_find_compiler)
2088 if (_${_PYTHON_PREFIX}_COMPILER)
2093 if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
2094 find_program (_${_PYTHON_PREFIX}_COMPILER
2095 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
2097 HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
2098 PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
2099 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2100 ${_${_PYTHON_PREFIX}_REGISTRY_VIEW}
2101 NO_SYSTEM_ENVIRONMENT_PATH
2102 NO_CMAKE_SYSTEM_PATH
2103 VALIDATOR _python_validate_find_compiler)
2104 if (_${_PYTHON_PREFIX}_COMPILER)
2110 find_program (_${_PYTHON_PREFIX}_COMPILER
2111 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
2113 HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
2114 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2115 NO_SYSTEM_ENVIRONMENT_PATH
2116 NO_CMAKE_SYSTEM_PATH
2117 VALIDATOR _python_validate_find_compiler)
2118 if (_${_PYTHON_PREFIX}_COMPILER)
2122 # try using standard paths
2123 find_program (_${_PYTHON_PREFIX}_COMPILER
2124 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
2126 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2127 VALIDATOR _python_validate_find_compiler)
2128 if (_${_PYTHON_PREFIX}_COMPILER)
2132 # Apple frameworks handling
2133 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
2134 find_program (_${_PYTHON_PREFIX}_COMPILER
2135 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
2137 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2138 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2140 VALIDATOR _python_validate_find_compiler)
2141 if (_${_PYTHON_PREFIX}_COMPILER)
2147 if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
2148 find_program (_${_PYTHON_PREFIX}_COMPILER
2149 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
2151 PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
2152 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2153 ${_${_PYTHON_PREFIX}_REGISTRY_VIEW}
2155 VALIDATOR _python_validate_find_compiler)
2156 if (_${_PYTHON_PREFIX}_COMPILER)
2164 # try using root dir and registry
2165 set (_${_PYTHON_PREFIX}_COMMON_VALIDATE_OPTIONS EXACT)
2166 if (${_PYTHON_PREFIX}_FIND_VERSION_RANGE)
2167 list (APPEND _${_PYTHON_PREFIX}_COMMON_VALIDATE_OPTIONS IN_RANGE)
2170 foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
2171 _python_get_names (_${_PYTHON_PREFIX}_COMPILER_NAMES
2172 IMPLEMENTATIONS IronPython
2173 VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS}
2176 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES
2177 IMPLEMENTATIONS IronPython
2178 VERSION ${_${_PYTHON_PREFIX}_FIND_VERSION}
2181 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS
2182 IMPLEMENTATIONS IronPython
2183 VERSION ${_${_PYTHON_PREFIX}_VERSION})
2184 _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS
2185 IMPLEMENTATIONS IronPython
2186 VERSION ${_${_PYTHON_PREFIX}_VERSION})
2188 set (_${_PYTHON_PREFIX}_VALIDATE_OPTIONS VERSION ${_${_PYTHON_PREFIX}_VERSION} ${_${_PYTHON_PREFIX}_COMMON_VALIDATE_OPTIONS})
2190 # Apple frameworks handling
2191 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
2192 find_program (_${_PYTHON_PREFIX}_COMPILER
2193 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
2195 HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
2196 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2197 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2199 NO_CMAKE_ENVIRONMENT_PATH
2200 NO_SYSTEM_ENVIRONMENT_PATH
2201 NO_CMAKE_SYSTEM_PATH
2202 VALIDATOR _python_validate_find_compiler)
2203 if (_${_PYTHON_PREFIX}_COMPILER)
2208 if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
2209 find_program (_${_PYTHON_PREFIX}_COMPILER
2210 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
2212 HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
2213 PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
2214 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2215 ${_${_PYTHON_PREFIX}_REGISTRY_VIEW}
2216 NO_SYSTEM_ENVIRONMENT_PATH
2217 NO_CMAKE_SYSTEM_PATH
2218 VALIDATOR _python_validate_find_compiler)
2219 if (_${_PYTHON_PREFIX}_COMPILER)
2225 find_program (_${_PYTHON_PREFIX}_COMPILER
2226 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
2228 HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
2229 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2230 NO_SYSTEM_ENVIRONMENT_PATH
2231 NO_CMAKE_SYSTEM_PATH
2232 VALIDATOR _python_validate_find_compiler)
2233 if (_${_PYTHON_PREFIX}_COMPILER)
2237 # Apple frameworks handling
2238 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
2239 find_program (_${_PYTHON_PREFIX}_COMPILER
2240 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
2242 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2243 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2245 VALIDATOR _python_validate_find_compiler)
2246 if (_${_PYTHON_PREFIX}_COMPILER)
2251 if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
2252 find_program (_${_PYTHON_PREFIX}_COMPILER
2253 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
2255 PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
2256 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2257 ${_${_PYTHON_PREFIX}_REGISTRY_VIEW}
2259 VALIDATOR _python_validate_find_compiler)
2260 if (_${_PYTHON_PREFIX}_COMPILER)
2266 # no specific version found, re-try in standard paths
2267 _python_get_names (_${_PYTHON_PREFIX}_COMPILER_NAMES
2268 IMPLEMENTATIONS IronPython
2269 VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS}
2271 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES
2272 IMPLEMENTATIONS IronPython
2273 VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS}
2275 unset (_${_PYTHON_PREFIX}_VALIDATE_OPTIONS)
2276 find_program (_${_PYTHON_PREFIX}_COMPILER
2277 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
2279 HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
2280 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2281 VALIDATOR _python_validate_find_compiler)
2285 set (${_PYTHON_PREFIX}_COMPILER "${_${_PYTHON_PREFIX}_COMPILER}")
2287 if (_${_PYTHON_PREFIX}_COMPILER)
2288 # retrieve python environment version from compiler
2289 _python_get_launcher (_${_PYTHON_PREFIX}_COMPILER_LAUNCHER COMPILER)
2290 set (_${_PYTHON_PREFIX}_VERSION_DIR "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir")
2291 file (WRITE "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))\n")
2292 execute_process (COMMAND ${_${_PYTHON_PREFIX}_COMPILER_LAUNCHER} "${_${_PYTHON_PREFIX}_COMPILER}"
2293 ${_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_ARCH_FLAGS}
2294 /target:exe /embed "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py"
2295 WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}"
2298 get_filename_component (_${_PYTHON_PREFIX}_IR_DIR "${_${_PYTHON_PREFIX}_COMPILER}" DIRECTORY)
2299 execute_process (COMMAND "${CMAKE_COMMAND}" -E env "MONO_PATH=${_${_PYTHON_PREFIX}_IR_DIR}"
2300 ${${_PYTHON_PREFIX}_DOTNET_LAUNCHER} "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.exe"
2301 WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}"
2302 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2303 OUTPUT_VARIABLE _${_PYTHON_PREFIX}_VERSION
2305 if (NOT _${_PYTHON_PREFIX}_RESULT)
2306 set (_${_PYTHON_PREFIX}_COMPILER_USABLE TRUE)
2307 string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${_${_PYTHON_PREFIX}_VERSION}")
2308 list (GET _${_PYTHON_PREFIX}_VERSIONS 0 _${_PYTHON_PREFIX}_VERSION_MAJOR)
2309 list (GET _${_PYTHON_PREFIX}_VERSIONS 1 _${_PYTHON_PREFIX}_VERSION_MINOR)
2310 list (GET _${_PYTHON_PREFIX}_VERSIONS 2 _${_PYTHON_PREFIX}_VERSION_PATCH)
2312 if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND)
2313 # set public version information
2314 set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION})
2315 set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR})
2316 set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR})
2317 set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH})
2320 # compiler not usable
2321 set (_${_PYTHON_PREFIX}_COMPILER_USABLE FALSE)
2322 set_property (CACHE _${_PYTHON_PREFIX}_Compiler_REASON_FAILURE PROPERTY VALUE "Cannot run the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
2324 file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}")
2327 if (_${_PYTHON_PREFIX}_COMPILER AND _${_PYTHON_PREFIX}_COMPILER_USABLE)
2328 if (${_PYTHON_PREFIX}_Interpreter_FOUND)
2329 # Compiler must be compatible with interpreter
2330 if ("${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR}" VERSION_EQUAL "${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}")
2331 set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE)
2333 elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
2334 set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE)
2335 # Use compiler version for future searches to ensure consistency
2336 set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
2340 if (${_PYTHON_PREFIX}_Compiler_FOUND)
2341 unset (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE CACHE)
2343 # compute and save compiler signature
2344 string (MD5 __${_PYTHON_PREFIX}_COMPILER_SIGNATURE "${_${_PYTHON_PREFIX}_SIGNATURE}:${_${_PYTHON_PREFIX}_COMPILER}")
2345 set (_${_PYTHON_PREFIX}_COMPILER_SIGNATURE "${__${_PYTHON_PREFIX}_COMPILER_SIGNATURE}" CACHE INTERNAL "")
2347 set (${_PYTHON_PREFIX}_COMPILER_ID IronPython)
2349 unset (_${_PYTHON_PREFIX}_COMPILER_SIGNATURE CACHE)
2350 unset (${_PYTHON_PREFIX}_COMPILER_ID)
2353 if (${_PYTHON_PREFIX}_ARTIFACTS_INTERACTIVE)
2354 set (${_PYTHON_PREFIX}_COMPILER "${_${_PYTHON_PREFIX}_COMPILER}" CACHE FILEPATH "${_PYTHON_PREFIX} Compiler")
2357 _python_mark_as_internal (_${_PYTHON_PREFIX}_COMPILER
2358 _${_PYTHON_PREFIX}_COMPILER_SIGNATURE)
2361 # third step, search for the development artifacts
2362 if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development.Module)
2363 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS)
2364 list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_LIBRARIES)
2366 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS)
2367 list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_INCLUDE_DIRS)
2370 if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development.Embed)
2371 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS)
2372 list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_LIBRARIES)
2374 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS)
2375 list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_INCLUDE_DIRS)
2378 list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_REQUIRED_VARS)
2379 ## Development environment is not compatible with IronPython interpreter
2380 if (("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
2381 OR "Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
2382 AND ((${_PYTHON_PREFIX}_Interpreter_FOUND
2383 AND NOT ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython")
2384 OR NOT ${_PYTHON_PREFIX}_Interpreter_FOUND))
2385 if (${_PYTHON_PREFIX}_Interpreter_FOUND)
2386 # reduce possible implementations to the interpreter one
2387 if (${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "PyPy")
2388 set (_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS "PyPy")
2390 set (_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS "CPython")
2393 list (REMOVE_ITEM _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS "IronPython")
2395 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
2396 list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_LIBRARY_RELEASE
2397 _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
2398 _${_PYTHON_PREFIX}_LIBRARY_DEBUG
2399 _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
2401 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
2402 list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_INCLUDE_DIR)
2405 _python_check_development_signature (Module)
2406 _python_check_development_signature (Embed)
2408 if (DEFINED ${_PYTHON_PREFIX}_LIBRARY
2409 AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_LIBRARY}")
2410 set (_${_PYTHON_PREFIX}_LIBRARY_RELEASE "${${_PYTHON_PREFIX}_LIBRARY}" CACHE INTERNAL "")
2411 unset (_${_PYTHON_PREFIX}_LIBRARY_DEBUG CACHE)
2412 unset (_${_PYTHON_PREFIX}_INCLUDE_DIR CACHE)
2414 if (DEFINED ${_PYTHON_PREFIX}_INCLUDE_DIR
2415 AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_INCLUDE_DIR}")
2416 set (_${_PYTHON_PREFIX}_INCLUDE_DIR "${${_PYTHON_PREFIX}_INCLUDE_DIR}" CACHE INTERNAL "")
2419 # Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES
2420 unset (_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES)
2421 if (DEFINED ${_PYTHON_PREFIX}_USE_STATIC_LIBS AND NOT WIN32)
2422 set(_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
2423 if(${_PYTHON_PREFIX}_USE_STATIC_LIBS)
2424 set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
2426 list (REMOVE_ITEM CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
2430 if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE OR NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
2431 # if python interpreter is found, use it to look-up for artifacts
2432 # to ensure consistency between interpreter and development environments.
2433 # If not, try to locate a compatible config tool
2434 if ((NOT ${_PYTHON_PREFIX}_Interpreter_FOUND OR CMAKE_CROSSCOMPILING)
2435 AND "CPython" IN_LIST _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
2436 set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
2437 unset (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS)
2438 if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
2439 set (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX)
2442 if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
2443 _python_get_names (_${_PYTHON_PREFIX}_CONFIG_NAMES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} POSIX CONFIG)
2445 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS})
2447 # Apple frameworks handling
2448 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
2449 find_program (_${_PYTHON_PREFIX}_CONFIG
2450 NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
2452 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2453 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2454 ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2457 NO_CMAKE_ENVIRONMENT_PATH
2458 NO_SYSTEM_ENVIRONMENT_PATH
2459 NO_CMAKE_SYSTEM_PATH)
2462 find_program (_${_PYTHON_PREFIX}_CONFIG
2463 NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
2465 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2466 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2469 # Apple frameworks handling
2470 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
2471 find_program (_${_PYTHON_PREFIX}_CONFIG
2472 NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
2474 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2479 if (_${_PYTHON_PREFIX}_CONFIG)
2480 execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --help
2481 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2482 OUTPUT_VARIABLE __${_PYTHON_PREFIX}_HELP
2484 OUTPUT_STRIP_TRAILING_WHITESPACE)
2485 if (_${_PYTHON_PREFIX}_RESULT)
2486 # assume config tool is not usable
2487 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2491 if (_${_PYTHON_PREFIX}_CONFIG)
2492 execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --abiflags
2493 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2494 OUTPUT_VARIABLE __${_PYTHON_PREFIX}_ABIFLAGS
2496 OUTPUT_STRIP_TRAILING_WHITESPACE)
2497 if (_${_PYTHON_PREFIX}_RESULT)
2498 # assume ABI is not supported
2499 set (__${_PYTHON_PREFIX}_ABIFLAGS "")
2501 if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND NOT __${_PYTHON_PREFIX}_ABIFLAGS IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
2503 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2507 if (_${_PYTHON_PREFIX}_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
2508 # check that config tool match library architecture
2509 execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --configdir
2510 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2511 OUTPUT_VARIABLE _${_PYTHON_PREFIX}_CONFIGDIR
2513 OUTPUT_STRIP_TRAILING_WHITESPACE)
2514 if (_${_PYTHON_PREFIX}_RESULT)
2515 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2517 string(FIND "${_${_PYTHON_PREFIX}_CONFIGDIR}" "${CMAKE_LIBRARY_ARCHITECTURE}" _${_PYTHON_PREFIX}_RESULT)
2518 if (_${_PYTHON_PREFIX}_RESULT EQUAL -1)
2519 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2524 foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
2525 # try to use pythonX.Y-config tool
2526 _python_get_names (_${_PYTHON_PREFIX}_CONFIG_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} POSIX CONFIG)
2529 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_VERSION})
2531 # Apple frameworks handling
2532 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
2533 find_program (_${_PYTHON_PREFIX}_CONFIG
2534 NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
2536 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2537 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2538 ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2541 NO_CMAKE_ENVIRONMENT_PATH
2542 NO_SYSTEM_ENVIRONMENT_PATH
2543 NO_CMAKE_SYSTEM_PATH)
2546 find_program (_${_PYTHON_PREFIX}_CONFIG
2547 NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
2549 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2550 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2553 # Apple frameworks handling
2554 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
2555 find_program (_${_PYTHON_PREFIX}_CONFIG
2556 NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
2558 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2563 unset (_${_PYTHON_PREFIX}_CONFIG_NAMES)
2565 if (_${_PYTHON_PREFIX}_CONFIG)
2566 execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --help
2567 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2568 OUTPUT_VARIABLE __${_PYTHON_PREFIX}_HELP
2570 OUTPUT_STRIP_TRAILING_WHITESPACE)
2571 if (_${_PYTHON_PREFIX}_RESULT)
2572 # assume config tool is not usable
2573 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2577 if (NOT _${_PYTHON_PREFIX}_CONFIG)
2581 execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --abiflags
2582 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2583 OUTPUT_VARIABLE __${_PYTHON_PREFIX}_ABIFLAGS
2585 OUTPUT_STRIP_TRAILING_WHITESPACE)
2586 if (_${_PYTHON_PREFIX}_RESULT)
2587 # assume ABI is not supported
2588 set (__${_PYTHON_PREFIX}_ABIFLAGS "")
2590 if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND NOT __${_PYTHON_PREFIX}_ABIFLAGS IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
2592 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2596 if (_${_PYTHON_PREFIX}_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
2597 # check that config tool match library architecture
2598 execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --configdir
2599 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2600 OUTPUT_VARIABLE _${_PYTHON_PREFIX}_CONFIGDIR
2602 OUTPUT_STRIP_TRAILING_WHITESPACE)
2603 if (_${_PYTHON_PREFIX}_RESULT)
2604 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2607 string (FIND "${_${_PYTHON_PREFIX}_CONFIGDIR}" "${CMAKE_LIBRARY_ARCHITECTURE}" _${_PYTHON_PREFIX}_RESULT)
2608 if (_${_PYTHON_PREFIX}_RESULT EQUAL -1)
2609 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2614 if (_${_PYTHON_PREFIX}_CONFIG)
2622 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
2623 if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2624 if ((${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT CMAKE_CROSSCOMPILING) OR _${_PYTHON_PREFIX}_CONFIG)
2625 # retrieve root install directory
2626 _python_get_config_var (_${_PYTHON_PREFIX}_PREFIX PREFIX)
2628 # enforce current ABI
2629 _python_get_config_var (_${_PYTHON_PREFIX}_ABIFLAGS ABIFLAGS)
2631 set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}")
2634 ## compute some paths and artifact names
2635 if (_${_PYTHON_PREFIX}_CONFIG)
2636 string (REGEX REPLACE "^.+python([0-9.]+)[a-z]*-config" "\\1" _${_PYTHON_PREFIX}_VERSION "${_${_PYTHON_PREFIX}_CONFIG}")
2638 set (_${_PYTHON_PREFIX}_VERSION "${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}")
2640 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_VERSION} LIBRARY)
2641 _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 POSIX LIBRARY)
2643 _python_get_config_var (_${_PYTHON_PREFIX}_CONFIGDIR CONFIGDIR)
2644 list (APPEND _${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_CONFIGDIR}")
2646 list (APPEND _${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
2648 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2649 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2651 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2652 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2653 NO_SYSTEM_ENVIRONMENT_PATH
2654 NO_CMAKE_SYSTEM_PATH)
2657 # Rely on HINTS and standard paths if interpreter or config tool failed to locate artifacts
2658 if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2659 set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
2661 unset (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS)
2662 if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
2663 set (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX)
2666 if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
2668 _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} WIN32 POSIX LIBRARY)
2669 _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} WIN32 DEBUG)
2671 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} LIBRARY)
2674 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_LIB_FIND_VERSIONS})
2676 _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} )
2678 if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
2679 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2680 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2682 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2683 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2684 ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2685 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2687 NO_CMAKE_ENVIRONMENT_PATH
2688 NO_SYSTEM_ENVIRONMENT_PATH
2689 NO_CMAKE_SYSTEM_PATH)
2692 if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
2693 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2694 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2696 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2697 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2698 ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
2699 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2700 NO_SYSTEM_ENVIRONMENT_PATH
2701 NO_CMAKE_SYSTEM_PATH)
2704 # search in HINTS locations
2705 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2706 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2708 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2709 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2710 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2711 NO_SYSTEM_ENVIRONMENT_PATH
2712 NO_CMAKE_SYSTEM_PATH)
2714 if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
2715 set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
2717 unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
2720 if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
2721 set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
2723 unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
2726 # search in all default paths
2727 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2728 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2730 PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2731 ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
2732 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
2734 foreach (_${_PYTHON_PREFIX}_LIB_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
2735 _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 POSIX LIBRARY)
2736 _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 DEBUG)
2738 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION})
2739 _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION})
2741 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} LIBRARY)
2743 if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
2744 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2745 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2747 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2748 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2749 ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2750 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2752 NO_CMAKE_ENVIRONMENT_PATH
2753 NO_SYSTEM_ENVIRONMENT_PATH
2754 NO_CMAKE_SYSTEM_PATH)
2757 if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
2758 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2759 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2761 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2762 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2763 ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
2764 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2765 NO_SYSTEM_ENVIRONMENT_PATH
2766 NO_CMAKE_SYSTEM_PATH)
2769 # search in HINTS locations
2770 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2771 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2773 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2774 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2775 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2776 NO_SYSTEM_ENVIRONMENT_PATH
2777 NO_CMAKE_SYSTEM_PATH)
2779 if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
2780 set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
2782 unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
2785 if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
2786 set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
2788 unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
2791 # search in all default paths
2792 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2793 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2795 PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2796 ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
2797 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
2799 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2807 # finalize library version information
2808 _python_get_version (LIBRARY PREFIX _${_PYTHON_PREFIX}_)
2809 if (_${_PYTHON_PREFIX}_VERSION EQUAL "${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}")
2810 # not able to extract full version from library name
2811 if (${_PYTHON_PREFIX}_Interpreter_FOUND)
2812 # update from interpreter
2813 set (_${_PYTHON_PREFIX}_VERSION ${${_PYTHON_PREFIX}_VERSION})
2814 set (_${_PYTHON_PREFIX}_VERSION_MAJOR ${${_PYTHON_PREFIX}_VERSION_MAJOR})
2815 set (_${_PYTHON_PREFIX}_VERSION_MINOR ${${_PYTHON_PREFIX}_VERSION_MINOR})
2816 set (_${_PYTHON_PREFIX}_VERSION_PATCH ${${_PYTHON_PREFIX}_VERSION_PATCH})
2820 set (${_PYTHON_PREFIX}_LIBRARY_RELEASE "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
2822 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE AND NOT EXISTS "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
2823 set_property (CACHE _${_PYTHON_PREFIX}_Development_REASON_FAILURE PROPERTY VALUE "Cannot find the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"")
2824 set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
2827 set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
2829 if (WIN32 AND _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2830 # search for debug library
2831 # use release library location as a hint
2832 _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 DEBUG)
2833 get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
2834 find_library (_${_PYTHON_PREFIX}_LIBRARY_DEBUG
2835 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
2837 HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS}
2839 # second try including CMAKE variables to catch-up non conventional layouts
2840 find_library (_${_PYTHON_PREFIX}_LIBRARY_DEBUG
2841 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
2843 NO_SYSTEM_ENVIRONMENT_PATH
2844 NO_CMAKE_SYSTEM_PATH)
2847 # retrieve runtime libraries
2848 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2849 _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 POSIX LIBRARY)
2850 get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
2851 get_filename_component (_${_PYTHON_PREFIX}_PATH2 "${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
2852 _python_find_runtime_library (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
2853 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2855 HINTS "${_${_PYTHON_PREFIX}_PATH}"
2856 "${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS}
2859 if (_${_PYTHON_PREFIX}_LIBRARY_DEBUG)
2860 _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 DEBUG)
2861 get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_DEBUG}" DIRECTORY)
2862 get_filename_component (_${_PYTHON_PREFIX}_PATH2 "${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
2863 _python_find_runtime_library (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
2864 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
2866 HINTS "${_${_PYTHON_PREFIX}_PATH}"
2867 "${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS}
2872 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
2873 while (NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
2874 set (_${_PYTHON_PREFIX}_LIBRARY_REQUIRED TRUE)
2875 foreach (_${_PYTHON_PREFIX}_COMPONENT IN ITEMS Module Embed)
2876 string (TOUPPER "${_${_PYTHON_PREFIX}_COMPONENT}" _${_PYTHON_PREFIX}_ID)
2877 if ("Development.${_${_PYTHON_PREFIX}_COMPONENT}" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
2878 AND NOT "LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${_${_PYTHON_PREFIX}_ID}_ARTIFACTS)
2879 set (_${_PYTHON_PREFIX}_LIBRARY_REQUIRED FALSE)
2882 if (_${_PYTHON_PREFIX}_LIBRARY_REQUIRED
2883 AND NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2884 # Don't search for include dir if no library was founded
2888 if ((${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT CMAKE_CROSSCOMPILING) OR _${_PYTHON_PREFIX}_CONFIG)
2889 _python_get_config_var (_${_PYTHON_PREFIX}_INCLUDE_DIRS INCLUDES)
2891 find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
2892 NAMES ${_${_PYTHON_PREFIX}_INCLUDE_NAMES}
2893 HINTS ${_${_PYTHON_PREFIX}_INCLUDE_DIRS}
2894 NO_SYSTEM_ENVIRONMENT_PATH
2895 NO_CMAKE_SYSTEM_PATH)
2898 # Rely on HINTS and standard paths if interpreter or config tool failed to locate artifacts
2899 if (NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
2900 unset (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS)
2901 if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
2902 set (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX)
2904 unset (_${_PYTHON_PREFIX}_INCLUDE_HINTS)
2906 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS
2907 AND _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2908 # Use the library's install prefix as a hint
2909 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "^(.+/Frameworks/Python.framework/Versions/[0-9.]+)")
2910 list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
2911 elseif (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "^(.+)/lib(64|32)?/python[0-9.]+/config")
2912 list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
2913 elseif (DEFINED CMAKE_LIBRARY_ARCHITECTURE AND ${_${_PYTHON_PREFIX}_LIBRARY_RELEASE} MATCHES "^(.+)/lib/${CMAKE_LIBRARY_ARCHITECTURE}")
2914 list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
2916 # assume library is in a directory under root
2917 get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
2918 get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${_${_PYTHON_PREFIX}_PREFIX}" DIRECTORY)
2919 list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${_${_PYTHON_PREFIX}_PREFIX}")
2923 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_VERSION})
2924 _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS VERSION ${_${_PYTHON_PREFIX}_VERSION})
2925 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_VERSION} INCLUDE)
2927 if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
2928 find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
2929 NAMES ${_${_PYTHON_PREFIX}_INCLUDE_NAMES}
2930 HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
2931 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2932 ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2933 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2935 NO_CMAKE_ENVIRONMENT_PATH
2936 NO_SYSTEM_ENVIRONMENT_PATH
2937 NO_CMAKE_SYSTEM_PATH)
2940 if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
2941 find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
2942 NAMES ${_${_PYTHON_PREFIX}_INCLUDE_NAMES}
2943 HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
2944 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2945 ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
2946 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2947 NO_SYSTEM_ENVIRONMENT_PATH
2948 NO_CMAKE_SYSTEM_PATH)
2951 if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
2952 set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
2954 unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
2957 if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
2958 set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
2960 unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
2963 find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
2964 NAMES ${_${_PYTHON_PREFIX}_INCLUDE_NAMES}
2965 HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
2966 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2967 ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2968 ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
2969 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2970 NO_SYSTEM_ENVIRONMENT_PATH
2971 NO_CMAKE_SYSTEM_PATH)
2974 # search header file in standard locations
2975 find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
2976 NAMES ${_${_PYTHON_PREFIX}_INCLUDE_NAMES})
2981 set (${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}")
2983 if (_${_PYTHON_PREFIX}_INCLUDE_DIR AND NOT EXISTS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}")
2984 set_property (CACHE _${_PYTHON_PREFIX}_Development_REASON_FAILURE PROPERTY VALUE "Cannot find the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"")
2985 set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
2988 if (_${_PYTHON_PREFIX}_INCLUDE_DIR)
2989 # retrieve version from header file
2990 _python_get_version (INCLUDE PREFIX _${_PYTHON_PREFIX}_INC_)
2991 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS
2992 AND _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2993 if ("${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_INC_VERSION_MINOR}"
2994 VERSION_EQUAL _${_PYTHON_PREFIX}_VERSION)
2996 set (_${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_INC_VERSION})
2997 set (_${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_INC_VERSION_PATCH})
2998 elseif (_${_PYTHON_PREFIX}_VERSION VERSION_EQUAL _${_PYTHON_PREFIX}_INC_VERSION_MAJOR)
2999 # library specify only major version, use include file for full version information
3000 set (_${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_INC_VERSION})
3001 set (_${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_INC_VERSION_MINOR})
3002 set (_${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_INC_VERSION_PATCH})
3005 set (_${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_INC_VERSION})
3006 set (_${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR})
3007 set (_${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_INC_VERSION_MINOR})
3008 set (_${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_INC_VERSION_PATCH})
3013 if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT ${_PYTHON_PREFIX}_Compiler_FOUND)
3014 # set public version information
3015 set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION})
3016 set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR})
3017 set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR})
3018 set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH})
3021 # define public variables
3022 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
3023 set (${_PYTHON_PREFIX}_LIBRARY_DEBUG "${_${_PYTHON_PREFIX}_LIBRARY_DEBUG}")
3024 _python_select_library_configurations (${_PYTHON_PREFIX})
3026 set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
3027 set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
3029 if (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
3030 set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
3031 elseif (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
3032 set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
3034 set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${_PYTHON_PREFIX}_RUNTIME_LIBRARY-NOTFOUND")
3037 _python_set_library_dirs (${_PYTHON_PREFIX}_LIBRARY_DIRS
3038 _${_PYTHON_PREFIX}_LIBRARY_RELEASE
3039 _${_PYTHON_PREFIX}_LIBRARY_DEBUG)
3041 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$")
3042 set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS ${${_PYTHON_PREFIX}_LIBRARY_DIRS})
3045 _python_set_library_dirs (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS
3046 _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
3047 _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
3051 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE OR _${_PYTHON_PREFIX}_INCLUDE_DIR)
3052 if (${_PYTHON_PREFIX}_Interpreter_FOUND OR ${_PYTHON_PREFIX}_Compiler_FOUND)
3053 # development environment must be compatible with interpreter/compiler
3054 if ("${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR}" VERSION_EQUAL "${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}"
3055 AND "${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_INC_VERSION_MINOR}" VERSION_EQUAL "${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR}")
3056 _python_set_development_module_found (Module)
3057 _python_set_development_module_found (Embed)
3059 elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR
3060 AND "${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_INC_VERSION_MINOR}" VERSION_EQUAL "${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR}")
3061 _python_set_development_module_found (Module)
3062 _python_set_development_module_found (Embed)
3064 if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND
3065 (NOT _${_PYTHON_PREFIX}_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS
3066 OR NOT _${_PYTHON_PREFIX}_INC_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS))
3067 set (${_PYTHON_PREFIX}_Development.Module_FOUND FALSE)
3068 set (${_PYTHON_PREFIX}_Development.Embed_FOUND FALSE)
3072 if (( ${_PYTHON_PREFIX}_Development.Module_FOUND
3073 AND ${_PYTHON_PREFIX}_Development.Embed_FOUND)
3074 OR (NOT "Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
3075 AND ${_PYTHON_PREFIX}_Development.Embed_FOUND)
3076 OR (NOT "Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
3077 AND ${_PYTHON_PREFIX}_Development.Module_FOUND))
3078 unset (_${_PYTHON_PREFIX}_Development_REASON_FAILURE CACHE)
3081 if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
3082 AND ${_PYTHON_PREFIX}_Development.Module_FOUND
3083 AND ${_PYTHON_PREFIX}_Development.Embed_FOUND)
3084 set (${_PYTHON_PREFIX}_Development_FOUND TRUE)
3087 if ((${_PYTHON_PREFIX}_Development.Module_FOUND
3088 OR ${_PYTHON_PREFIX}_Development.Embed_FOUND)
3089 AND EXISTS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}/PyPy.h")
3090 # retrieve PyPy version
3091 file (STRINGS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}/patchlevel.h" ${_PYTHON_PREFIX}_PyPy_VERSION
3092 REGEX "^#define[ \t]+PYPY_VERSION[ \t]+\"[^\"]+\"")
3093 string (REGEX REPLACE "^#define[ \t]+PYPY_VERSION[ \t]+\"([^\"]+)\".*" "\\1"
3094 ${_PYTHON_PREFIX}_PyPy_VERSION "${${_PYTHON_PREFIX}_PyPy_VERSION}")
3097 unset(${_PYTHON_PREFIX}_LINK_OPTIONS)
3098 if (${_PYTHON_PREFIX}_Development.Embed_FOUND AND APPLE
3099 AND ${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$")
3100 # rpath must be specified if python is part of a framework
3101 unset(_${_PYTHON_PREFIX}_is_prefix)
3102 foreach (_${_PYTHON_PREFIX}_implementation IN LISTS _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
3103 foreach (_${_PYTHON_PREFIX}_framework IN LISTS _${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_implementation}_FRAMEWORKS)
3104 cmake_path (IS_PREFIX _${_PYTHON_PREFIX}_framework "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}" _${_PYTHON_PREFIX}_is_prefix)
3105 if (_${_PYTHON_PREFIX}_is_prefix)
3106 cmake_path (GET _${_PYTHON_PREFIX}_framework PARENT_PATH _${_PYTHON_PREFIX}_framework)
3107 set (${_PYTHON_PREFIX}_LINK_OPTIONS "LINKER:-rpath,${_${_PYTHON_PREFIX}_framework}")
3111 if (_${_PYTHON_PREFIX}_is_prefix)
3115 unset(_${_PYTHON_PREFIX}_implementation)
3116 unset(_${_PYTHON_PREFIX}_framework)
3117 unset(_${_PYTHON_PREFIX}_is_prefix)
3120 if (NOT DEFINED ${_PYTHON_PREFIX}_SOABI)
3121 _python_get_config_var (${_PYTHON_PREFIX}_SOABI SOABI)
3124 _python_compute_development_signature (Module)
3125 _python_compute_development_signature (Embed)
3127 # Restore the original find library ordering
3128 if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES)
3129 set (CMAKE_FIND_LIBRARY_SUFFIXES ${_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES})
3132 if (${_PYTHON_PREFIX}_ARTIFACTS_INTERACTIVE)
3133 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
3134 set (${_PYTHON_PREFIX}_LIBRARY "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" CACHE FILEPATH "${_PYTHON_PREFIX} Library")
3136 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
3137 set (${_PYTHON_PREFIX}_INCLUDE_DIR "${_${_PYTHON_PREFIX}_INCLUDE_DIR}" CACHE FILEPATH "${_PYTHON_PREFIX} Include Directory")
3141 _python_mark_as_internal (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
3142 _${_PYTHON_PREFIX}_LIBRARY_DEBUG
3143 _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
3144 _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
3145 _${_PYTHON_PREFIX}_INCLUDE_DIR
3146 _${_PYTHON_PREFIX}_CONFIG
3147 _${_PYTHON_PREFIX}_DEVELOPMENT_MODULE_SIGNATURE
3148 _${_PYTHON_PREFIX}_DEVELOPMENT_EMBED_SIGNATURE)
3151 if (${_PYTHON_PREFIX}_FIND_REQUIRED_NumPy)
3152 list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_NumPy_INCLUDE_DIRS)
3154 if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS AND ${_PYTHON_PREFIX}_Interpreter_FOUND)
3155 list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
3157 if (DEFINED ${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR
3158 AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
3159 set (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR "${${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}" CACHE INTERNAL "")
3160 elseif (DEFINED _${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
3161 # compute numpy signature. Depends on interpreter and development signatures
3162 string (MD5 __${_PYTHON_PREFIX}_NUMPY_SIGNATURE "${_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE}:${_${_PYTHON_PREFIX}_DEVELOPMENT_MODULE_SIGNATURE}:${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
3163 if (NOT __${_PYTHON_PREFIX}_NUMPY_SIGNATURE STREQUAL _${_PYTHON_PREFIX}_NUMPY_SIGNATURE
3164 OR NOT EXISTS "${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
3165 unset (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR CACHE)
3166 unset (_${_PYTHON_PREFIX}_NUMPY_SIGNATURE CACHE)
3170 if (NOT _${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
3171 execute_process(COMMAND ${${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
3172 "import sys\ntry: import numpy; sys.stdout.write(numpy.get_include())\nexcept:pass\n"
3173 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
3174 OUTPUT_VARIABLE _${_PYTHON_PREFIX}_NumPy_PATH
3176 OUTPUT_STRIP_TRAILING_WHITESPACE)
3178 if (NOT _${_PYTHON_PREFIX}_RESULT)
3179 find_path (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR
3180 NAMES "numpy/arrayobject.h" "numpy/numpyconfig.h"
3181 HINTS "${_${_PYTHON_PREFIX}_NumPy_PATH}"
3186 set (${_PYTHON_PREFIX}_NumPy_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
3188 if(_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR AND NOT EXISTS "${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
3189 set_property (CACHE _${_PYTHON_PREFIX}_NumPy_REASON_FAILURE PROPERTY VALUE "Cannot find the directory \"${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}\"")
3190 set_property (CACHE _${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR-NOTFOUND")
3193 if (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
3194 execute_process (COMMAND ${${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
3195 "import sys\ntry: import numpy; sys.stdout.write(numpy.__version__)\nexcept:pass\n"
3196 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
3197 OUTPUT_VARIABLE _${_PYTHON_PREFIX}_NumPy_VERSION)
3198 if (NOT _${_PYTHON_PREFIX}_RESULT)
3199 set (${_PYTHON_PREFIX}_NumPy_VERSION "${_${_PYTHON_PREFIX}_NumPy_VERSION}")
3201 unset (${_PYTHON_PREFIX}_NumPy_VERSION)
3204 # final step: set NumPy founded only if Development.Module component is founded as well
3205 set(${_PYTHON_PREFIX}_NumPy_FOUND ${${_PYTHON_PREFIX}_Development.Module_FOUND})
3207 set (${_PYTHON_PREFIX}_NumPy_FOUND FALSE)
3210 if (${_PYTHON_PREFIX}_NumPy_FOUND)
3211 unset (_${_PYTHON_PREFIX}_NumPy_REASON_FAILURE CACHE)
3213 # compute and save numpy signature
3214 string (MD5 __${_PYTHON_PREFIX}_NUMPY_SIGNATURE "${_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE}:${_${_PYTHON_PREFIX}_DEVELOPMENT_MODULE_SIGNATURE}:${${_PYTHON_PREFIX}_NumPyINCLUDE_DIR}")
3215 set (_${_PYTHON_PREFIX}_NUMPY_SIGNATURE "${__${_PYTHON_PREFIX}_NUMPY_SIGNATURE}" CACHE INTERNAL "")
3217 unset (_${_PYTHON_PREFIX}_NUMPY_SIGNATURE CACHE)
3220 if (${_PYTHON_PREFIX}_ARTIFACTS_INTERACTIVE)
3221 set (${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR "${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}" CACHE FILEPATH "${_PYTHON_PREFIX} NumPy Include Directory")
3224 _python_mark_as_internal (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR
3225 _${_PYTHON_PREFIX}_NUMPY_SIGNATURE)
3229 if (${_PYTHON_PREFIX}_VERSION_MAJOR AND
3230 NOT ${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
3231 _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}\"")
3237 unset (_${_PYTHON_PREFIX}_REASON_FAILURE)
3238 foreach (_${_PYTHON_PREFIX}_COMPONENT IN ITEMS Interpreter Compiler Development NumPy)
3239 if (_${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_REASON_FAILURE)
3240 string (APPEND _${_PYTHON_PREFIX}_REASON_FAILURE "\n ${_${_PYTHON_PREFIX}_COMPONENT}: ${_${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_REASON_FAILURE}")
3241 unset (_${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_REASON_FAILURE CACHE)
3245 find_package_handle_standard_args (${_PYTHON_PREFIX}
3246 REQUIRED_VARS ${_${_PYTHON_PREFIX}_REQUIRED_VARS}
3247 VERSION_VAR ${_PYTHON_PREFIX}_VERSION
3248 HANDLE_VERSION_RANGE
3250 REASON_FAILURE_MESSAGE "${_${_PYTHON_PREFIX}_REASON_FAILURE}")
3252 # Create imported targets and helper functions
3253 if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT")
3254 if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
3255 AND ${_PYTHON_PREFIX}_Interpreter_FOUND
3256 AND NOT TARGET ${_PYTHON_PREFIX}::Interpreter)
3257 add_executable (${_PYTHON_PREFIX}::Interpreter IMPORTED)
3258 set_property (TARGET ${_PYTHON_PREFIX}::Interpreter
3259 PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_EXECUTABLE}")
3262 if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
3263 AND ${_PYTHON_PREFIX}_Compiler_FOUND
3264 AND NOT TARGET ${_PYTHON_PREFIX}::Compiler)
3265 add_executable (${_PYTHON_PREFIX}::Compiler IMPORTED)
3266 set_property (TARGET ${_PYTHON_PREFIX}::Compiler
3267 PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_COMPILER}")
3270 if (("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
3271 AND ${_PYTHON_PREFIX}_Development.Module_FOUND)
3272 OR ("Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
3273 AND ${_PYTHON_PREFIX}_Development.Embed_FOUND))
3275 macro (__PYTHON_IMPORT_LIBRARY __name)
3276 if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$"
3277 OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
3278 set (_${_PYTHON_PREFIX}_LIBRARY_TYPE SHARED)
3280 set (_${_PYTHON_PREFIX}_LIBRARY_TYPE STATIC)
3283 if (NOT TARGET ${__name})
3284 add_library (${__name} ${_${_PYTHON_PREFIX}_LIBRARY_TYPE} IMPORTED)
3287 set_property (TARGET ${__name}
3288 PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_INCLUDE_DIRS}")
3290 if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
3291 # System manage shared libraries in two parts: import and runtime
3292 if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
3293 set_property (TARGET ${__name} PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG)
3294 set_target_properties (${__name}
3295 PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
3296 IMPORTED_IMPLIB_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}"
3297 IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
3298 set_target_properties (${__name}
3299 PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
3300 IMPORTED_IMPLIB_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}"
3301 IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
3303 set_target_properties (${__name}
3304 PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C"
3305 IMPORTED_IMPLIB "${${_PYTHON_PREFIX}_LIBRARIES}"
3306 IMPORTED_LOCATION "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
3309 if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
3310 set_property (TARGET ${__name} PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG)
3311 set_target_properties (${__name}
3312 PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
3313 IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
3314 set_target_properties (${__name}
3315 PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
3316 IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}")
3318 set_target_properties (${__name}
3319 PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C"
3320 IMPORTED_LOCATION "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
3324 if (_${_PYTHON_PREFIX}_LIBRARY_TYPE STREQUAL "STATIC")
3325 # extend link information with dependent libraries
3326 _python_get_config_var (_${_PYTHON_PREFIX}_LINK_LIBRARIES LIBS)
3327 if (_${_PYTHON_PREFIX}_LINK_LIBRARIES)
3328 set_property (TARGET ${__name}
3329 PROPERTY INTERFACE_LINK_LIBRARIES ${_${_PYTHON_PREFIX}_LINK_LIBRARIES})
3333 if (${_PYTHON_PREFIX}_LINK_OPTIONS
3334 AND _${_PYTHON_PREFIX}_LIBRARY_TYPE STREQUAL "SHARED")
3335 set_property (TARGET ${__name} PROPERTY INTERFACE_LINK_OPTIONS "${${_PYTHON_PREFIX}_LINK_OPTIONS}")
3339 if (${_PYTHON_PREFIX}_Development.Embed_FOUND)
3340 __python_import_library (${_PYTHON_PREFIX}::Python)
3343 if (${_PYTHON_PREFIX}_Development.Module_FOUND)
3344 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS)
3345 # On Windows/CYGWIN/MSYS, Python::Module is the same as Python::Python
3346 # but ALIAS cannot be used because the imported library is not GLOBAL.
3347 __python_import_library (${_PYTHON_PREFIX}::Module)
3349 if (NOT TARGET ${_PYTHON_PREFIX}::Module)
3350 add_library (${_PYTHON_PREFIX}::Module INTERFACE IMPORTED)
3352 set_property (TARGET ${_PYTHON_PREFIX}::Module
3353 PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_INCLUDE_DIRS}")
3355 # When available, enforce shared library generation with undefined symbols
3357 set_property (TARGET ${_PYTHON_PREFIX}::Module
3358 PROPERTY INTERFACE_LINK_OPTIONS "LINKER:-undefined,dynamic_lookup")
3360 if (CMAKE_SYSTEM_NAME STREQUAL "SunOS")
3361 set_property (TARGET ${_PYTHON_PREFIX}::Module
3362 PROPERTY INTERFACE_LINK_OPTIONS "LINKER:-z,nodefs")
3364 if (CMAKE_SYSTEM_NAME STREQUAL "AIX")
3365 set_property (TARGET ${_PYTHON_PREFIX}::Module
3366 PROPERTY INTERFACE_LINK_OPTIONS "LINKER:-b,erok")
3372 # PYTHON_ADD_LIBRARY (<name> [STATIC|SHARED|MODULE] src1 src2 ... srcN)
3373 # It is used to build modules for python.
3375 function (__${_PYTHON_PREFIX}_ADD_LIBRARY prefix name)
3376 cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY "STATIC;SHARED;MODULE;WITH_SOABI" "" "")
3378 if (PYTHON_ADD_LIBRARY_STATIC)
3380 elseif (PYTHON_ADD_LIBRARY_SHARED)
3386 if (type STREQUAL "MODULE" AND NOT TARGET ${prefix}::Module)
3387 message (SEND_ERROR "${prefix}_ADD_LIBRARY: dependent target '${prefix}::Module' is not defined.\n Did you miss to request COMPONENT 'Development.Module'?")
3390 if (NOT type STREQUAL "MODULE" AND NOT TARGET ${prefix}::Python)
3391 message (SEND_ERROR "${prefix}_ADD_LIBRARY: dependent target '${prefix}::Python' is not defined.\n Did you miss to request COMPONENT 'Development.Embed'?")
3395 add_library (${name} ${type} ${PYTHON_ADD_LIBRARY_UNPARSED_ARGUMENTS})
3397 get_property (type TARGET ${name} PROPERTY TYPE)
3399 if (type STREQUAL "MODULE_LIBRARY")
3400 target_link_libraries (${name} PRIVATE ${prefix}::Module)
3401 # customize library name to follow module name rules
3402 set_property (TARGET ${name} PROPERTY PREFIX "")
3403 if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
3404 set_property (TARGET ${name} PROPERTY SUFFIX ".pyd")
3407 if (PYTHON_ADD_LIBRARY_WITH_SOABI AND ${prefix}_SOABI)
3408 get_property (suffix TARGET ${name} PROPERTY SUFFIX)
3410 set (suffix "${CMAKE_SHARED_MODULE_SUFFIX}")
3412 set_property (TARGET ${name} PROPERTY SUFFIX ".${${prefix}_SOABI}${suffix}")
3415 if (PYTHON_ADD_LIBRARY_WITH_SOABI)
3416 message (AUTHOR_WARNING "Find${prefix}: Option `WITH_SOABI` is only supported for `MODULE` library type.")
3418 target_link_libraries (${name} PRIVATE ${prefix}::Python)
3423 if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS AND ${_PYTHON_PREFIX}_NumPy_FOUND
3424 AND NOT TARGET ${_PYTHON_PREFIX}::NumPy AND TARGET ${_PYTHON_PREFIX}::Module)
3425 add_library (${_PYTHON_PREFIX}::NumPy INTERFACE IMPORTED)
3426 set_property (TARGET ${_PYTHON_PREFIX}::NumPy
3427 PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_NumPy_INCLUDE_DIRS}")
3428 target_link_libraries (${_PYTHON_PREFIX}::NumPy INTERFACE ${_PYTHON_PREFIX}::Module)
3434 # Restore CMAKE_FIND_APPBUNDLE
3435 if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE)
3436 set (CMAKE_FIND_APPBUNDLE ${_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE})
3437 unset (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE)
3439 unset (CMAKE_FIND_APPBUNDLE)
3441 # Restore CMAKE_FIND_FRAMEWORK
3442 if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
3443 set (CMAKE_FIND_FRAMEWORK ${_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK})
3444 unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
3446 unset (CMAKE_FIND_FRAMEWORK)