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.
8 cmake_policy (GET CMP0094 _${_PYTHON_PREFIX}_LOOKUP_POLICY)
10 cmake_policy (VERSION 3.7)
12 if (_${_PYTHON_PREFIX}_LOOKUP_POLICY)
13 cmake_policy (SET CMP0094 ${_${_PYTHON_PREFIX}_LOOKUP_POLICY})
17 # Initial configuration
19 if (NOT DEFINED _PYTHON_PREFIX)
20 message (FATAL_ERROR "FindPython: INTERNAL ERROR")
22 if (NOT DEFINED _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
23 message (FATAL_ERROR "FindPython: INTERNAL ERROR")
25 if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL "3")
26 set(_${_PYTHON_PREFIX}_VERSIONS 3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0)
27 elseif (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL "2")
28 set(_${_PYTHON_PREFIX}_VERSIONS 2.7 2.6 2.5 2.4 2.3 2.2 2.1 2.0)
30 message (FATAL_ERROR "FindPython: INTERNAL ERROR")
33 get_property(_${_PYTHON_PREFIX}_CMAKE_ROLE GLOBAL PROPERTY CMAKE_ROLE)
39 macro (_PYTHON_DISPLAY_FAILURE _PYTHON_MSG)
40 if (${_PYTHON_PREFIX}_FIND_REQUIRED)
41 message (FATAL_ERROR "${_PYTHON_MSG}")
43 if (NOT ${_PYTHON_PREFIX}_FIND_QUIETLY)
44 message(STATUS "${_PYTHON_MSG}")
48 set (${_PYTHON_PREFIX}_FOUND FALSE)
49 string (TOUPPER "${_PYTHON_PREFIX}" _${_PYTHON_PREFIX}_UPPER_PREFIX)
50 set (${_PYTHON_UPPER_PREFIX}_FOUND FALSE)
55 function (_PYTHON_MARK_AS_INTERNAL)
56 foreach (var IN LISTS ARGV)
57 if (DEFINED CACHE{${var}})
58 set_property (CACHE ${var} PROPERTY TYPE INTERNAL)
64 macro (_PYTHON_SELECT_LIBRARY_CONFIGURATIONS _PYTHON_BASENAME)
65 if(NOT DEFINED ${_PYTHON_BASENAME}_LIBRARY_RELEASE)
66 set(${_PYTHON_BASENAME}_LIBRARY_RELEASE "${_PYTHON_BASENAME}_LIBRARY_RELEASE-NOTFOUND")
68 if(NOT DEFINED ${_PYTHON_BASENAME}_LIBRARY_DEBUG)
69 set(${_PYTHON_BASENAME}_LIBRARY_DEBUG "${_PYTHON_BASENAME}_LIBRARY_DEBUG-NOTFOUND")
72 get_property(_PYTHON_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
73 if (${_PYTHON_BASENAME}_LIBRARY_DEBUG AND ${_PYTHON_BASENAME}_LIBRARY_RELEASE AND
74 NOT ${_PYTHON_BASENAME}_LIBRARY_DEBUG STREQUAL ${_PYTHON_BASENAME}_LIBRARY_RELEASE AND
75 (_PYTHON_isMultiConfig OR CMAKE_BUILD_TYPE))
76 # if the generator is multi-config or if CMAKE_BUILD_TYPE is set for
77 # single-config generators, set optimized and debug libraries
78 set (${_PYTHON_BASENAME}_LIBRARIES "")
79 foreach (_PYTHON_libname IN LISTS ${_PYTHON_BASENAME}_LIBRARY_RELEASE)
80 list( APPEND ${_PYTHON_BASENAME}_LIBRARIES optimized "${_PYTHON_libname}")
82 foreach (_PYTHON_libname IN LISTS ${_PYTHON_BASENAME}_LIBRARY_DEBUG)
83 list( APPEND ${_PYTHON_BASENAME}_LIBRARIES debug "${_PYTHON_libname}")
85 elseif (${_PYTHON_BASENAME}_LIBRARY_RELEASE)
86 set (${_PYTHON_BASENAME}_LIBRARIES "${${_PYTHON_BASENAME}_LIBRARY_RELEASE}")
87 elseif (${_PYTHON_BASENAME}_LIBRARY_DEBUG)
88 set (${_PYTHON_BASENAME}_LIBRARIES "${${_PYTHON_BASENAME}_LIBRARY_DEBUG}")
90 set (${_PYTHON_BASENAME}_LIBRARIES "${_PYTHON_BASENAME}_LIBRARY-NOTFOUND")
95 macro (_PYTHON_FIND_FRAMEWORKS)
96 if (CMAKE_HOST_APPLE OR APPLE)
97 file(TO_CMAKE_PATH "$ENV{CMAKE_FRAMEWORK_PATH}" _pff_CMAKE_FRAMEWORK_PATH)
98 set (_pff_frameworks ${CMAKE_FRAMEWORK_PATH}
99 ${_pff_CMAKE_FRAMEWORK_PATH}
101 /usr/local/Frameworks
102 ${CMAKE_SYSTEM_FRAMEWORK_PATH})
103 list (REMOVE_DUPLICATES _pff_frameworks)
104 foreach (_pff_implementation IN LISTS _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
105 unset (_${_PYTHON_PREFIX}_${_pff_implementation}_FRAMEWORKS)
106 if (_pff_implementation STREQUAL "CPython")
107 foreach (_pff_framework IN LISTS _pff_frameworks)
108 if (EXISTS ${_pff_framework}/Python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}.framework)
109 list (APPEND _${_PYTHON_PREFIX}_${_pff_implementation}_FRAMEWORKS ${_pff_framework}/Python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}.framework)
111 if (EXISTS ${_pff_framework}/Python.framework)
112 list (APPEND _${_PYTHON_PREFIX}_${_pff_implementation}_FRAMEWORKS ${_pff_framework}/Python.framework)
115 elseif (_pff_implementation STREQUAL "IronPython")
116 foreach (_pff_framework IN LISTS _pff_frameworks)
117 if (EXISTS ${_pff_framework}/IronPython.framework)
118 list (APPEND _${_PYTHON_PREFIX}_${_pff_implementation}_FRAMEWORKS ${_pff_framework}/IronPython.framework)
123 unset (_pff_implementation)
124 unset (_pff_frameworks)
125 unset (_pff_framework)
129 function (_PYTHON_GET_FRAMEWORKS _PYTHON_PGF_FRAMEWORK_PATHS)
130 cmake_parse_arguments (PARSE_ARGV 1 _PGF "" "" "IMPLEMENTATIONS;VERSION")
132 if (NOT _PGF_IMPLEMENTATIONS)
133 set (_PGF_IMPLEMENTATIONS ${_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS})
136 set (framework_paths)
138 foreach (implementation IN LISTS _PGF_IMPLEMENTATIONS)
139 if (implementation STREQUAL "CPython")
140 foreach (version IN LISTS _PGF_VERSION)
141 foreach (framework IN LISTS _${_PYTHON_PREFIX}_${implementation}_FRAMEWORKS)
142 if (EXISTS "${framework}/Versions/${version}")
143 list (APPEND framework_paths "${framework}/Versions/${version}")
147 elseif (implementation STREQUAL "IronPython")
148 foreach (version IN LISTS _PGF_VERSION)
149 foreach (framework IN LISTS _${_PYTHON_PREFIX}_${implementation}_FRAMEWORKS)
150 # pick-up all available versions
151 file (GLOB versions LIST_DIRECTORIES true RELATIVE "${framework}/Versions/"
152 "${framework}/Versions/${version}*")
153 list (SORT versions ORDER DESCENDING)
154 list (TRANSFORM versions PREPEND "${framework}/Versions/")
155 list (APPEND framework_paths ${versions})
161 set (${_PYTHON_PGF_FRAMEWORK_PATHS} ${framework_paths} PARENT_SCOPE)
164 function (_PYTHON_GET_REGISTRIES _PYTHON_PGR_REGISTRY_PATHS)
165 cmake_parse_arguments (PARSE_ARGV 1 _PGR "" "" "IMPLEMENTATIONS;VERSION")
167 if (NOT _PGR_IMPLEMENTATIONS)
168 set (_PGR_IMPLEMENTATIONS ${_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS})
173 foreach (implementation IN LISTS _PGR_IMPLEMENTATIONS)
174 if (implementation STREQUAL "CPython")
175 foreach (version IN LISTS _PGR_VERSION)
176 string (REPLACE "." "" version_no_dots ${version})
177 list (APPEND registries
178 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${version}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
179 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${version}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath])
180 if (version VERSION_GREATER_EQUAL "3.5")
181 get_filename_component (arch "[HKEY_CURRENT_USER\\Software\\Python\\PythonCore\\${version};SysArchitecture]" NAME)
182 if (arch MATCHES "(${_${_PYTHON_PREFIX}_ARCH}|${_${_PYTHON_PREFIX}_ARCH2})bit")
183 list (APPEND registries
184 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${version}\\InstallPath])
187 list (APPEND registries
188 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${version}\\InstallPath])
190 list (APPEND registries
191 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${version_no_dots}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
192 [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${version_no_dots}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
193 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${version}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
194 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${version}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
195 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${version}\\InstallPath]
196 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${version_no_dots}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
197 [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${version_no_dots}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath])
199 elseif (implementation STREQUAL "IronPython")
200 foreach (version IN LISTS _PGR_VERSION)
201 list (APPEND registries [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${version}\\InstallPath])
206 set (${_PYTHON_PGR_REGISTRY_PATHS} "${registries}" PARENT_SCOPE)
210 function (_PYTHON_GET_ABIFLAGS _PGABIFLAGS)
212 list (GET _${_PYTHON_PREFIX}_FIND_ABI 0 pydebug)
213 list (GET _${_PYTHON_PREFIX}_FIND_ABI 1 pymalloc)
214 list (GET _${_PYTHON_PREFIX}_FIND_ABI 2 unicode)
216 if (pymalloc STREQUAL "ANY" AND unicode STREQUAL "ANY")
217 set (abiflags "mu" "m" "u" "")
218 elseif (pymalloc STREQUAL "ANY" AND unicode STREQUAL "ON")
219 set (abiflags "mu" "u")
220 elseif (pymalloc STREQUAL "ANY" AND unicode STREQUAL "OFF")
221 set (abiflags "m" "")
222 elseif (pymalloc STREQUAL "ON" AND unicode STREQUAL "ANY")
223 set (abiflags "mu" "m")
224 elseif (pymalloc STREQUAL "ON" AND unicode STREQUAL "ON")
226 elseif (pymalloc STREQUAL "ON" AND unicode STREQUAL "OFF")
228 elseif (pymalloc STREQUAL "ON" AND unicode STREQUAL "ANY")
229 set (abiflags "u" "")
230 elseif (pymalloc STREQUAL "OFF" AND unicode STREQUAL "ON")
234 if (pydebug STREQUAL "ON")
236 list (TRANSFORM abiflags PREPEND "d")
240 elseif (pydebug STREQUAL "ANY")
242 set (flags "${abiflags}")
243 list (TRANSFORM flags PREPEND "d")
244 list (APPEND abiflags "${flags}")
246 set (abiflags "" "d")
250 set (${_PGABIFLAGS} "${abiflags}" PARENT_SCOPE)
253 function (_PYTHON_GET_PATH_SUFFIXES _PYTHON_PGPS_PATH_SUFFIXES)
254 cmake_parse_arguments (PARSE_ARGV 1 _PGPS "INTERPRETER;COMPILER;LIBRARY;INCLUDE" "" "IMPLEMENTATIONS;VERSION")
256 if (NOT _PGPS_IMPLEMENTATIONS)
257 set (_PGPS_IMPLEMENTATIONS ${_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS})
260 if (DEFINED _${_PYTHON_PREFIX}_ABIFLAGS)
261 set (abi "${_${_PYTHON_PREFIX}_ABIFLAGS}")
263 set (abi "mu" "m" "u" "")
268 foreach (implementation IN LISTS _PGPS_IMPLEMENTATIONS)
269 if (implementation STREQUAL "CPython")
270 if (_PGPS_INTERPRETER)
271 list (APPEND path_suffixes bin Scripts)
273 foreach (version IN LISTS _PGPS_VERSION)
275 if (CMAKE_LIBRARY_ARCHITECTURE)
276 list (APPEND path_suffixes lib/${CMAKE_LIBRARY_ARCHITECTURE})
278 list (APPEND path_suffixes lib libs)
280 if (CMAKE_LIBRARY_ARCHITECTURE)
281 set (suffixes "${abi}")
283 list (TRANSFORM suffixes PREPEND "lib/python${_PGPS_VERSION}/config-${_PGPS_VERSION}")
284 list (TRANSFORM suffixes APPEND "-${CMAKE_LIBRARY_ARCHITECTURE}")
286 set (suffixes "lib/python${_PGPS_VERSION}/config-${_PGPS_VERSION}-${CMAKE_LIBRARY_ARCHITECTURE}")
288 list (APPEND path_suffixes ${suffixes})
290 set (suffixes "${abi}")
292 list (TRANSFORM suffixes PREPEND "lib/python${_PGPS_VERSION}/config-${_PGPS_VERSION}")
294 set (suffixes "lib/python${_PGPS_VERSION}/config-${_PGPS_VERSION}")
296 list (APPEND path_suffixes ${suffixes})
297 elseif (_PGPS_INCLUDE)
298 set (suffixes "${abi}")
300 list (TRANSFORM suffixes PREPEND "include/python${_PGPS_VERSION}")
302 set (suffixes "include/python${_PGPS_VERSION}")
304 list (APPEND path_suffixes ${suffixes} include)
308 elseif (implementation STREQUAL "IronPython")
309 if (_PGPS_INTERPRETER OR _PGPS_COMPILER)
310 foreach (version IN LISTS _PGPS_VERSION)
311 list (APPEND path_suffixes "share/ironpython${version}")
313 list (APPEND path_suffixes ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES})
315 elseif (implementation STREQUAL "PyPy")
316 if (_PGPS_INTERPRETER)
317 list (APPEND path_suffixes ${_${_PYTHON_PREFIX}_PYPY_EXECUTABLE_PATH_SUFFIXES})
318 elseif (_PGPS_LIBRARY)
319 list (APPEND path_suffixes ${_${_PYTHON_PREFIX}_PYPY_LIBRARY_PATH_SUFFIXES})
320 elseif (_PGPS_INCLUDE)
321 list (APPEND path_suffixes ${_${_PYTHON_PREFIX}_PYPY_INCLUDE_PATH_SUFFIXES})
325 list (REMOVE_DUPLICATES path_suffixes)
327 set (${_PYTHON_PGPS_PATH_SUFFIXES} ${path_suffixes} PARENT_SCOPE)
330 function (_PYTHON_GET_NAMES _PYTHON_PGN_NAMES)
331 cmake_parse_arguments (PARSE_ARGV 1 _PGN "POSIX;INTERPRETER;COMPILER;CONFIG;LIBRARY;WIN32;DEBUG" "" "IMPLEMENTATIONS;VERSION")
333 if (NOT _PGN_IMPLEMENTATIONS)
334 set (_PGN_IMPLEMENTATIONS ${_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS})
339 foreach (implementation IN LISTS _PGN_IMPLEMENTATIONS)
340 if (implementation STREQUAL "CPython")
341 foreach (version IN LISTS _PGN_VERSION)
343 string (REPLACE "." "" version_no_dots ${version})
345 set (name python${version_no_dots})
347 string (APPEND name "_d")
350 list (APPEND names "${name}")
354 if (DEFINED _${_PYTHON_PREFIX}_ABIFLAGS)
355 set (abi "${_${_PYTHON_PREFIX}_ABIFLAGS}")
357 if (_PGN_INTERPRETER OR _PGN_CONFIG)
360 set (abi "mu" "m" "u" "")
365 if (_PGN_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
366 set (abinames "${abi}")
367 list (TRANSFORM abinames PREPEND "${CMAKE_LIBRARY_ARCHITECTURE}-python${version}")
368 list (TRANSFORM abinames APPEND "-config")
369 list (APPEND names ${abinames})
371 set (abinames "${abi}")
372 list (TRANSFORM abinames PREPEND "python${version}")
374 list (TRANSFORM abinames APPEND "-config")
376 list (APPEND names ${abinames})
379 if (_PGN_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
380 set (abinames "${CMAKE_LIBRARY_ARCHITECTURE}-python${version}")
382 list (APPEND abinames "python${version}")
384 list (TRANSFORM abinames APPEND "-config")
386 list (APPEND names ${abinames})
390 if (_PGN_INTERPRETER)
391 list (APPEND names python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} python)
393 elseif (implementation STREQUAL "IronPython")
394 if (_PGN_INTERPRETER)
395 if (NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
396 # Do not use wrapper script on Linux because it is buggy: -c interpreter option cannot be used
397 foreach (version IN LISTS _PGN_VERSION)
398 list (APPEND names "ipy${version}")
401 list (APPEND names ${_${_PYTHON_PREFIX}_IRON_PYTHON_INTERPRETER_NAMES})
402 elseif (_PGN_COMPILER)
403 list (APPEND names ${_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_NAMES})
405 elseif (implementation STREQUAL "PyPy")
406 if (_PGN_INTERPRETER)
407 list (APPEND names ${_${_PYTHON_PREFIX}_PYPY_NAMES})
408 elseif (_PGN_LIBRARY)
410 foreach (version IN LISTS _PGN_VERSION)
411 string (REPLACE "." "" version_no_dots ${version})
413 set (name "python${version_no_dots}")
415 string (APPEND name "_d")
417 list (APPEND names "${name}")
420 list (APPEND names ${_${_PYTHON_PREFIX}_PYPY_LIB_NAMES})
425 set (${_PYTHON_PGN_NAMES} ${names} PARENT_SCOPE)
428 function (_PYTHON_GET_CONFIG_VAR _PYTHON_PGCV_VALUE NAME)
429 unset (${_PYTHON_PGCV_VALUE} PARENT_SCOPE)
431 if (NOT NAME MATCHES "^(PREFIX|ABIFLAGS|CONFIGDIR|INCLUDES|LIBS|SOABI)$")
435 if (_${_PYTHON_PREFIX}_CONFIG)
436 if (NAME STREQUAL "SOABI")
437 set (config_flag "--extension-suffix")
439 set (config_flag "--${NAME}")
441 string (TOLOWER "${config_flag}" config_flag)
442 execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" ${config_flag}
443 RESULT_VARIABLE _result
444 OUTPUT_VARIABLE _values
446 OUTPUT_STRIP_TRAILING_WHITESPACE)
450 if (NAME STREQUAL "INCLUDES")
452 string (REGEX MATCHALL "(-I|-iwithsysroot)[ ]*[^ ]+" _values "${_values}")
453 string (REGEX REPLACE "(-I|-iwithsysroot)[ ]*" "" _values "${_values}")
454 list (REMOVE_DUPLICATES _values)
455 elseif (NAME STREQUAL "SOABI")
456 # clean-up: remove prefix character and suffix
457 string (REGEX REPLACE "^[.-](.+)(${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.(so|pyd))$" "\\1" _values "${_values}")
462 if (_${_PYTHON_PREFIX}_EXECUTABLE AND NOT CMAKE_CROSSCOMPILING)
463 if (NAME STREQUAL "PREFIX")
464 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 '']))"
465 RESULT_VARIABLE _result
466 OUTPUT_VARIABLE _values
468 OUTPUT_STRIP_TRAILING_WHITESPACE)
472 list (REMOVE_DUPLICATES _values)
474 elseif (NAME STREQUAL "INCLUDES")
478 set (_scheme "posix_prefix")
480 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
481 "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}')]))"
482 RESULT_VARIABLE _result
483 OUTPUT_VARIABLE _values
485 OUTPUT_STRIP_TRAILING_WHITESPACE)
489 list (REMOVE_DUPLICATES _values)
491 elseif (NAME STREQUAL "SOABI")
492 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
493 "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 '']))\nexcept Exception:\n import sysconfig;sys.stdout.write(';'.join([sysconfig.get_config_var('SOABI') or '',sysconfig.get_config_var('EXT_SUFFIX') or '']))"
494 RESULT_VARIABLE _result
495 OUTPUT_VARIABLE _soabi
497 OUTPUT_STRIP_TRAILING_WHITESPACE)
501 foreach (_item IN LISTS _soabi)
503 set (_values "${_item}")
508 # clean-up: remove prefix character and suffix
509 string (REGEX REPLACE "^[.-](.+)(${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.(so|pyd))$" "\\1" _values "${_values}")
513 set (config_flag "${NAME}")
514 if (NAME STREQUAL "CONFIGDIR")
515 set (config_flag "LIBPL")
517 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
518 "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}'))"
519 RESULT_VARIABLE _result
520 OUTPUT_VARIABLE _values
522 OUTPUT_STRIP_TRAILING_WHITESPACE)
529 if (config_flag STREQUAL "ABIFLAGS")
530 set (${_PYTHON_PGCV_VALUE} "${_values}" PARENT_SCOPE)
534 if (NOT _values OR _values STREQUAL "None")
538 if (NAME STREQUAL "LIBS")
540 string (REGEX MATCHALL "-(l|framework)[ ]*[^ ]+" _values "${_values}")
541 # remove elements relative to python library itself
542 list (FILTER _values EXCLUDE REGEX "-lpython")
543 list (REMOVE_DUPLICATES _values)
546 if (WIN32 AND NAME MATCHES "^(PREFIX|CONFIGDIR|INCLUDES)$")
547 file (TO_CMAKE_PATH "${_values}" _values)
550 set (${_PYTHON_PGCV_VALUE} "${_values}" PARENT_SCOPE)
553 function (_PYTHON_GET_VERSION)
554 cmake_parse_arguments (PARSE_ARGV 0 _PGV "LIBRARY;INCLUDE" "PREFIX" "")
556 unset (${_PGV_PREFIX}VERSION PARENT_SCOPE)
557 unset (${_PGV_PREFIX}VERSION_MAJOR PARENT_SCOPE)
558 unset (${_PGV_PREFIX}VERSION_MINOR PARENT_SCOPE)
559 unset (${_PGV_PREFIX}VERSION_PATCH PARENT_SCOPE)
560 unset (${_PGV_PREFIX}ABI PARENT_SCOPE)
563 # retrieve version and abi from library name
564 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
565 # extract version from library name
566 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "python([23])([0-9]+)")
567 set (${_PGV_PREFIX}VERSION_MAJOR "${CMAKE_MATCH_1}" PARENT_SCOPE)
568 set (${_PGV_PREFIX}VERSION_MINOR "${CMAKE_MATCH_2}" PARENT_SCOPE)
569 set (${_PGV_PREFIX}VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}" PARENT_SCOPE)
570 set (${_PGV_PREFIX}ABI "" PARENT_SCOPE)
571 elseif (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "python([23])\\.([0-9]+)([dmu]*)")
572 set (${_PGV_PREFIX}VERSION_MAJOR "${CMAKE_MATCH_1}" PARENT_SCOPE)
573 set (${_PGV_PREFIX}VERSION_MINOR "${CMAKE_MATCH_2}" PARENT_SCOPE)
574 set (${_PGV_PREFIX}VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}" PARENT_SCOPE)
575 set (${_PGV_PREFIX}ABI "${CMAKE_MATCH_3}" PARENT_SCOPE)
576 elseif (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "pypy(3)?")
577 set (version "${CMAKE_MATCH_1}")
578 if (version EQUAL "3")
579 set (${_PGV_PREFIX}VERSION_MAJOR "3" PARENT_SCOPE)
580 set (${_PGV_PREFIX}VERSION "3" PARENT_SCOPE)
582 set (${_PGV_PREFIX}VERSION_MAJOR "2" PARENT_SCOPE)
583 set (${_PGV_PREFIX}VERSION "2" PARENT_SCOPE)
585 set (${_PGV_PREFIX}ABI "" PARENT_SCOPE)
589 if (_${_PYTHON_PREFIX}_INCLUDE_DIR)
590 # retrieve version from header file
591 file (STRINGS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}/patchlevel.h" version
592 REGEX "^#define[ \t]+PY_VERSION[ \t]+\"[^\"]+\"")
593 string (REGEX REPLACE "^#define[ \t]+PY_VERSION[ \t]+\"([^\"]+)\".*" "\\1"
594 version "${version}")
595 string (REGEX MATCHALL "[0-9]+" versions "${version}")
596 list (GET versions 0 version_major)
597 list (GET versions 1 version_minor)
598 list (GET versions 2 version_patch)
600 set (${_PGV_PREFIX}VERSION "${version_major}.${version_minor}.${version_patch}" PARENT_SCOPE)
601 set (${_PGV_PREFIX}VERSION_MAJOR ${version_major} PARENT_SCOPE)
602 set (${_PGV_PREFIX}VERSION_MINOR ${version_minor} PARENT_SCOPE)
603 set (${_PGV_PREFIX}VERSION_PATCH ${version_patch} PARENT_SCOPE)
606 if (version_major VERSION_GREATER "2")
607 file (STRINGS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}/pyconfig.h" config REGEX "(Py_DEBUG|WITH_PYMALLOC|Py_UNICODE_SIZE|MS_WIN32)")
609 if (config MATCHES "#[ ]*define[ ]+MS_WIN32")
610 # ABI not used on Windows
613 if (config MATCHES "#[ ]*define[ ]+Py_DEBUG[ ]+1")
614 string (APPEND abi "d")
616 if (config MATCHES "#[ ]*define[ ]+WITH_PYMALLOC[ ]+1")
617 string (APPEND abi "m")
619 if (config MATCHES "#[ ]*define[ ]+Py_UNICODE_SIZE[ ]+4")
620 string (APPEND abi "u")
622 set (${_PGV_PREFIX}ABI "${abi}" PARENT_SCOPE)
626 set (${_PGV_PREFIX}ABI "" PARENT_SCOPE)
632 function (_PYTHON_GET_LAUNCHER _PYTHON_PGL_NAME)
633 cmake_parse_arguments (PARSE_ARGV 1 _PGL "INTERPRETER;COMPILER" "" "")
635 unset ({_PYTHON_PGL_NAME} PARENT_SCOPE)
637 if ((_PGL_INTERPRETER AND NOT _${_PYTHON_PREFIX}_EXECUTABLE)
638 OR (_PGL_COMPILER AND NOT _${_PYTHON_PREFIX}_COMPILER))
642 if ("IronPython" IN_LIST _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS
643 AND NOT SYSTEM_NAME MATCHES "Windows|Linux")
644 if (_PGL_INTERPRETER)
645 get_filename_component (name "${_${_PYTHON_PREFIX}_EXECUTABLE}" NAME)
646 get_filename_component (ext "${_${_PYTHON_PREFIX}_EXECUTABLE}" LAST_EXT)
647 if (name IN_LIST _${_PYTHON_PREFIX}_IRON_PYTHON_INTERPRETER_NAMES
648 AND ext STREQUAL ".exe")
649 set (${_PYTHON_PGL_NAME} "${${_PYTHON_PREFIX}_DOTNET_LAUNCHER}" PARENT_SCOPE)
652 get_filename_component (name "${_${_PYTHON_PREFIX}_COMPILER}" NAME)
653 get_filename_component (ext "${_${_PYTHON_PREFIX}_COMPILER}" LAST_EXT)
654 if (name IN_LIST _${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_NAMES
655 AND ext STREQUAL ".exe")
656 set (${_PYTHON_PGL_NAME} "${${_PYTHON_PREFIX}_DOTNET_LAUNCHER}" PARENT_SCOPE)
663 function (_PYTHON_VALIDATE_INTERPRETER)
664 if (NOT _${_PYTHON_PREFIX}_EXECUTABLE)
668 cmake_parse_arguments (PARSE_ARGV 0 _PVI "EXACT;CHECK_EXISTS" "" "")
669 if (_PVI_UNPARSED_ARGUMENTS)
670 set (expected_version "${_PVI_UNPARSED_ARGUMENTS}")
672 unset (expected_version)
675 if (_PVI_CHECK_EXISTS AND NOT EXISTS "${_${_PYTHON_PREFIX}_EXECUTABLE}")
676 # interpreter does not exist anymore
677 set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Cannot find the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"" PARENT_SCOPE)
678 set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
682 _python_get_launcher (launcher INTERPRETER)
684 # validate ABI compatibility
685 if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI)
686 execute_process (COMMAND ${launcher} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
687 "import sys; sys.stdout.write(sys.abiflags)"
688 RESULT_VARIABLE result
691 OUTPUT_STRIP_TRAILING_WHITESPACE)
693 # assume ABI is not supported
696 if (NOT abi IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
698 set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Wrong ABI for the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"" PARENT_SCOPE)
699 set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
704 get_filename_component (python_name "${_${_PYTHON_PREFIX}_EXECUTABLE}" NAME)
706 if (expected_version)
707 if (NOT python_name STREQUAL "python${expected_version}${abi}${CMAKE_EXECUTABLE_SUFFIX}")
708 # compute number of components for version
709 string (REGEX REPLACE "[^.]" "" dots "${expected_version}")
710 # add one dot because there is one dot less than there are components
711 string (LENGTH "${dots}." count)
716 # executable found must have a specific version
717 execute_process (COMMAND ${launcher} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
718 "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:${count}]]))"
719 RESULT_VARIABLE result
720 OUTPUT_VARIABLE version
722 OUTPUT_STRIP_TRAILING_WHITESPACE)
724 # interpreter is not usable
725 set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Cannot use the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"" PARENT_SCOPE)
726 set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
728 if (_PVI_EXACT AND NOT version VERSION_EQUAL expected_version)
729 # interpreter has wrong version
730 set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Wrong version for the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"" PARENT_SCOPE)
731 set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
733 # check that version is OK
734 string(REGEX REPLACE "^([0-9]+)\\.?.*$" "\\1" major_version "${version}")
735 string(REGEX REPLACE "^([0-9]+)\\.?.*$" "\\1" expected_major_version "${expected_version}")
736 if (NOT major_version VERSION_EQUAL expected_major_version
737 OR NOT version VERSION_GREATER_EQUAL expected_version)
738 set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Wrong version for the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"" PARENT_SCOPE)
739 set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
743 if (NOT _${_PYTHON_PREFIX}_EXECUTABLE)
748 if (NOT python_name STREQUAL "python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}${CMAKE_EXECUTABLE_SUFFIX}")
749 # executable found do not have version in name
750 # ensure major version is OK
751 execute_process (COMMAND ${launcher} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
752 "import sys; sys.stdout.write(str(sys.version_info[0]))"
753 RESULT_VARIABLE result
754 OUTPUT_VARIABLE version
756 OUTPUT_STRIP_TRAILING_WHITESPACE)
757 if (result OR NOT version EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
758 # interpreter not usable or has wrong major version
760 set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Cannot use the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"" PARENT_SCOPE)
762 set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Wrong major version for the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"" PARENT_SCOPE)
764 set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
770 if (CMAKE_SIZEOF_VOID_P AND ("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
771 OR "Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
772 AND NOT CMAKE_CROSSCOMPILING)
773 # In this case, interpreter must have same architecture as environment
774 execute_process (COMMAND ${launcher} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
775 "import sys, struct; sys.stdout.write(str(struct.calcsize(\"P\")))"
776 RESULT_VARIABLE result
779 OUTPUT_STRIP_TRAILING_WHITESPACE)
780 if (result OR NOT size EQUAL CMAKE_SIZEOF_VOID_P)
781 # interpreter not usable or has wrong architecture
783 set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Cannot use the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"" PARENT_SCOPE)
785 set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Wrong architecture for the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"" PARENT_SCOPE)
787 set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
794 function (_PYTHON_VALIDATE_COMPILER)
795 if (NOT _${_PYTHON_PREFIX}_COMPILER)
799 cmake_parse_arguments (PARSE_ARGV 0 _PVC "EXACT;CHECK_EXISTS" "" "")
800 if (_PVC_UNPARSED_ARGUMENTS)
801 set (major_version FALSE)
802 set (expected_version "${_PVC_UNPARSED_ARGUMENTS}")
804 set (major_version TRUE)
805 set (expected_version "${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}")
806 set (_PVC_EXACT TRUE)
809 if (_PVC_CHECK_EXISTS AND NOT EXISTS "${_${_PYTHON_PREFIX}_COMPILER}")
810 # Compiler does not exist anymore
811 set (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE "Cannot find the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"" PARENT_SCOPE)
812 set_property (CACHE _${_PYTHON_PREFIX}_COMPILER PROPERTY VALUE "${_PYTHON_PREFIX}_COMPILER-NOTFOUND")
816 _python_get_launcher (launcher COMPILER)
818 # retrieve python environment version from compiler
819 set (working_dir "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir")
821 # check only major version
822 file (WRITE "${working_dir}/version.py" "import sys; sys.stdout.write(str(sys.version_info[0]))")
824 # compute number of components for version
825 string (REGEX REPLACE "[^.]" "" dots "${expected_version}")
826 # add one dot because there is one dot less than there are components
827 string (LENGTH "${dots}." count)
831 file (WRITE "${working_dir}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:${count}]]))\n")
833 execute_process (COMMAND ${launcher} "${_${_PYTHON_PREFIX}_COMPILER}"
834 ${_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_ARCH_FLAGS}
835 /target:exe /embed "${working_dir}/version.py"
836 WORKING_DIRECTORY "${working_dir}"
839 OUTPUT_STRIP_TRAILING_WHITESPACE)
840 get_filename_component (ir_dir "${_${_PYTHON_PREFIX}_COMPILER}" DIRECTORY)
841 execute_process (COMMAND "${CMAKE_COMMAND}" -E env "MONO_PATH=${ir_dir}"
842 ${${_PYTHON_PREFIX}_DOTNET_LAUNCHER} "${working_dir}/version.exe"
843 WORKING_DIRECTORY "${working_dir}"
844 RESULT_VARIABLE result
845 OUTPUT_VARIABLE version
847 file (REMOVE_RECURSE "${working_dir}")
849 # compiler is not usable
850 set (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE "Cannot use the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"" PARENT_SCOPE)
851 set_property (CACHE _${_PYTHON_PREFIX}_COMPILER PROPERTY VALUE "${_PYTHON_PREFIX}_COMPILER-NOTFOUND")
852 elseif ((_PVC_EXACT AND NOT version VERSION_EQUAL expected_version)
853 OR NOT version VERSION_GREATER_EQUAL expected_version)
854 # Compiler has wrong version
855 set (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE "Wrong version for the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"" PARENT_SCOPE)
856 set_property (CACHE _${_PYTHON_PREFIX}_COMPILER PROPERTY VALUE "${_PYTHON_PREFIX}_COMPILER-NOTFOUND")
861 function (_PYTHON_VALIDATE_LIBRARY)
862 if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
863 unset (_${_PYTHON_PREFIX}_LIBRARY_DEBUG)
867 cmake_parse_arguments (PARSE_ARGV 0 _PVL "EXACT;CHECK_EXISTS" "" "")
868 if (_PVL_UNPARSED_ARGUMENTS)
869 set (expected_version ${_PVL_UNPARSED_ARGUMENTS})
871 unset (expected_version)
874 if (_PVL_CHECK_EXISTS AND NOT EXISTS "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
875 # library does not exist anymore
876 set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Cannot find the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"" PARENT_SCOPE)
877 set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
879 set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_DEBUG PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_DEBUG-NOTFOUND")
881 set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
885 # retrieve version and abi from library name
886 _python_get_version (LIBRARY PREFIX lib_)
888 if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND NOT lib_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
890 set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Wrong ABI for the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"" PARENT_SCOPE)
891 set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
893 if (expected_version)
894 # library have only major.minor information
895 string (REGEX MATCH "[0-9](\\.[0-9]+)?" version "${expected_version}")
896 if ((_PVL_EXACT AND NOT lib_VERSION VERSION_EQUAL version) OR (lib_VERSION VERSION_LESS version))
897 # library has wrong version
898 set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Wrong version for the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"" PARENT_SCOPE)
899 set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
902 if (NOT lib_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
903 # library has wrong major version
904 set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Wrong major version for the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"" PARENT_SCOPE)
905 set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
910 if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
912 set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_DEBUG PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_DEBUG-NOTFOUND")
914 unset (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE CACHE)
915 unset (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG CACHE)
916 set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
921 function (_PYTHON_VALIDATE_INCLUDE_DIR)
922 if (NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
926 cmake_parse_arguments (PARSE_ARGV 0 _PVID "EXACT;CHECK_EXISTS" "" "")
927 if (_PVID_UNPARSED_ARGUMENTS)
928 set (expected_version ${_PVID_UNPARSED_ARGUMENTS})
930 unset (expected_version)
933 if (_PVID_CHECK_EXISTS AND NOT EXISTS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}")
934 # include file does not exist anymore
935 set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Cannot find the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"" PARENT_SCOPE)
936 set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
940 # retrieve version from header file
941 _python_get_version (INCLUDE PREFIX inc_)
943 if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND NOT inc_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
945 set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Wrong ABI for the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"" PARENT_SCOPE)
946 set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
948 if (expected_version)
949 if ((_PVID_EXACT AND NOT inc_VERSION VERSION_EQUAL expected_version) OR (inc_VERSION VERSION_LESS expected_version))
950 # include dir has wrong version
951 set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Wrong version for the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"" PARENT_SCOPE)
952 set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
955 if (NOT inc_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
956 # include dir has wrong major version
957 set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Wrong major version for the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"" PARENT_SCOPE)
958 set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
965 function (_PYTHON_FIND_RUNTIME_LIBRARY _PYTHON_LIB)
966 string (REPLACE "_RUNTIME" "" _PYTHON_LIB "${_PYTHON_LIB}")
967 # look at runtime part on systems supporting it
968 if (CMAKE_SYSTEM_NAME STREQUAL "Windows" OR
969 (CMAKE_SYSTEM_NAME MATCHES "MSYS|CYGWIN"
970 AND ${_PYTHON_LIB} MATCHES "${CMAKE_IMPORT_LIBRARY_SUFFIX}$"))
971 set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX})
972 # MSYS has a special syntax for runtime libraries
973 if (CMAKE_SYSTEM_NAME MATCHES "MSYS")
974 list (APPEND CMAKE_FIND_LIBRARY_PREFIXES "msys-")
976 find_library (${ARGV})
981 function (_PYTHON_SET_LIBRARY_DIRS _PYTHON_SLD_RESULT)
983 set (_PYTHON_LIBS ${ARGN})
984 foreach (_PYTHON_LIB IN LISTS _PYTHON_LIBS)
986 get_filename_component (_PYTHON_DIR "${${_PYTHON_LIB}}" DIRECTORY)
987 list (APPEND _PYTHON_DIRS "${_PYTHON_DIR}")
990 list (REMOVE_DUPLICATES _PYTHON_DIRS)
991 set (${_PYTHON_SLD_RESULT} ${_PYTHON_DIRS} PARENT_SCOPE)
995 function (_PYTHON_SET_DEVELOPMENT_MODULE_FOUND module)
996 if ("Development.${module}" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
997 string(TOUPPER "${module}" id)
998 set (module_found TRUE)
1000 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS
1001 AND NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
1002 set (module_found FALSE)
1004 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS
1005 AND NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
1006 set (module_found FALSE)
1009 set (${_PYTHON_PREFIX}_Development.${module}_FOUND ${module_found} PARENT_SCOPE)
1014 # If major version is specified, it must be the same as internal major version
1015 if (DEFINED ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR
1016 AND NOT ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
1017 _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}\"")
1022 if (NOT ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1023 set (${_PYTHON_PREFIX}_FIND_COMPONENTS Interpreter)
1024 set (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter TRUE)
1026 if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1027 list (APPEND ${_PYTHON_PREFIX}_FIND_COMPONENTS "Interpreter" "Development.Module")
1029 if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1030 list (APPEND ${_PYTHON_PREFIX}_FIND_COMPONENTS "Development.Module" "Development.Embed")
1032 list (REMOVE_DUPLICATES ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1033 foreach (_${_PYTHON_PREFIX}_COMPONENT IN ITEMS Interpreter Compiler Development Development.Module Development.Embed NumPy)
1034 set (${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_FOUND FALSE)
1036 if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development)
1037 set (${_PYTHON_PREFIX}_FIND_REQUIRED_Development.Module TRUE)
1038 set (${_PYTHON_PREFIX}_FIND_REQUIRED_Development.Embed TRUE)
1041 unset (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
1042 unset (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS)
1043 unset (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS)
1044 if ("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1045 if (CMAKE_SYSTEM_NAME MATCHES "^(Windows.*|CYGWIN|MSYS)$")
1046 list (APPEND _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS "LIBRARY")
1048 list (APPEND _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS "INCLUDE_DIR")
1050 if ("Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1051 list (APPEND _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS "LIBRARY" "INCLUDE_DIR")
1053 set (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS ${_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS} ${_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS})
1054 list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
1056 # Set versions to search
1057 ## default: search any version
1058 set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSIONS})
1059 unset (_${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
1061 if (${_PYTHON_PREFIX}_FIND_VERSION_COUNT)
1062 if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
1063 set (_${_PYTHON_PREFIX}_FIND_VERSION_EXACT "EXACT")
1064 set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}.${${_PYTHON_PREFIX}_FIND_VERSION_MINOR})
1066 unset (_${_PYTHON_PREFIX}_FIND_VERSIONS)
1067 # add all compatible versions
1068 foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_VERSIONS)
1069 if (_${_PYTHON_PREFIX}_VERSION VERSION_GREATER_EQUAL "${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}.${${_PYTHON_PREFIX}_FIND_VERSION_MINOR}")
1070 list (APPEND _${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSION})
1076 # Set ABIs to search
1077 ## default: search any ABI
1078 if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR VERSION_LESS "3")
1080 unset (_${_PYTHON_PREFIX}_FIND_ABI)
1081 set (_${_PYTHON_PREFIX}_ABIFLAGS "")
1083 unset (_${_PYTHON_PREFIX}_FIND_ABI)
1084 unset (_${_PYTHON_PREFIX}_ABIFLAGS)
1085 if (DEFINED ${_PYTHON_PREFIX}_FIND_ABI)
1087 string (TOUPPER "${${_PYTHON_PREFIX}_FIND_ABI}" _${_PYTHON_PREFIX}_FIND_ABI)
1088 list (TRANSFORM _${_PYTHON_PREFIX}_FIND_ABI REPLACE "^(TRUE|Y(ES)?|1)$" "ON")
1089 list (TRANSFORM _${_PYTHON_PREFIX}_FIND_ABI REPLACE "^(FALSE|N(O)?|0)$" "OFF")
1090 if (NOT _${_PYTHON_PREFIX}_FIND_ABI MATCHES "^(ON|OFF|ANY);(ON|OFF|ANY);(ON|OFF|ANY)$")
1091 message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${${_PYTHON_PREFIX}_FIND_ABI}: invalid value for '${_PYTHON_PREFIX}_FIND_ABI'. Ignore it")
1092 unset (_${_PYTHON_PREFIX}_FIND_ABI)
1094 _python_get_abiflags (_${_PYTHON_PREFIX}_ABIFLAGS)
1097 unset (${_PYTHON_PREFIX}_SOABI)
1099 # Define lookup strategy
1100 if (_${_PYTHON_PREFIX}_LOOKUP_POLICY STREQUAL "NEW")
1101 set (_${_PYTHON_PREFIX}_FIND_STRATEGY "LOCATION")
1103 set (_${_PYTHON_PREFIX}_FIND_STRATEGY "VERSION")
1105 if (DEFINED ${_PYTHON_PREFIX}_FIND_STRATEGY)
1106 if (NOT ${_PYTHON_PREFIX}_FIND_STRATEGY MATCHES "^(VERSION|LOCATION)$")
1107 message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${${_PYTHON_PREFIX}_FIND_STRATEGY}: invalid value for '${_PYTHON_PREFIX}_FIND_STRATEGY'. 'VERSION' or 'LOCATION' expected.")
1108 set (_${_PYTHON_PREFIX}_FIND_STRATEGY "VERSION")
1110 set (_${_PYTHON_PREFIX}_FIND_STRATEGY "${${_PYTHON_PREFIX}_FIND_STRATEGY}")
1114 # Python and Anaconda distributions: define which architectures can be used
1115 if (CMAKE_SIZEOF_VOID_P)
1116 # In this case, search only for 64bit or 32bit
1117 math (EXPR _${_PYTHON_PREFIX}_ARCH "${CMAKE_SIZEOF_VOID_P} * 8")
1118 set (_${_PYTHON_PREFIX}_ARCH2 ${_${_PYTHON_PREFIX}_ARCH})
1120 # architecture unknown, search for both 64bit and 32bit
1121 set (_${_PYTHON_PREFIX}_ARCH 64)
1122 set (_${_PYTHON_PREFIX}_ARCH2 32)
1125 # IronPython support
1126 unset (_${_PYTHON_PREFIX}_IRON_PYTHON_INTERPRETER_NAMES)
1127 unset (_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_NAMES)
1128 unset (_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_ARCH_FLAGS)
1129 if (CMAKE_SIZEOF_VOID_P)
1130 if (_${_PYTHON_PREFIX}_ARCH EQUAL "32")
1131 set (_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_ARCH_FLAGS "/platform:x86")
1133 set (_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_ARCH_FLAGS "/platform:x64")
1136 if (NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
1137 # Do not use wrapper script on Linux because it is buggy: -c interpreter option cannot be used
1138 list (APPEND _${_PYTHON_PREFIX}_IRON_PYTHON_INTERPRETER_NAMES "ipy${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}" "ipy64" "ipy32" "ipy")
1139 list (APPEND _${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_NAMES "ipyc")
1141 list (APPEND _${_PYTHON_PREFIX}_IRON_PYTHON_INTERPRETER_NAMES "ipy.exe")
1142 list (APPEND _${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_NAMES "ipyc.exe")
1143 set (_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES net45 net40 bin)
1146 if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL "3")
1147 set (_${_PYTHON_PREFIX}_PYPY_NAMES pypy3)
1148 set (_${_PYTHON_PREFIX}_PYPY_LIB_NAMES pypy3-c)
1150 # special name for runtime part
1151 list (APPEND _${_PYTHON_PREFIX}_PYPY_LIB_NAMES libpypy3-c)
1153 set (_${_PYTHON_PREFIX}_PYPY_INCLUDE_PATH_SUFFIXES lib/pypy3)
1155 set (_${_PYTHON_PREFIX}_PYPY_NAMES pypy)
1156 set (_${_PYTHON_PREFIX}_PYPY_LIB_NAMES pypy-c)
1158 # special name for runtime part
1159 list (APPEND _${_PYTHON_PREFIX}_PYPY_LIB_NAMES libpypy-c)
1161 set (_${_PYTHON_PREFIX}_PYPY_INCLUDE_PATH_SUFFIXES lib/pypy)
1163 set (_${_PYTHON_PREFIX}_PYPY_EXECUTABLE_PATH_SUFFIXES bin)
1164 set (_${_PYTHON_PREFIX}_PYPY_LIBRARY_PATH_SUFFIXES lib libs bin)
1165 list (APPEND _${_PYTHON_PREFIX}_PYPY_INCLUDE_PATH_SUFFIXES include)
1167 # Python Implementations handling
1168 unset (_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
1169 if (DEFINED ${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
1170 foreach (_${_PYTHON_PREFIX}_IMPLEMENTATION IN LISTS ${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
1171 if (NOT _${_PYTHON_PREFIX}_IMPLEMENTATION MATCHES "^(CPython|IronPython|PyPy)$")
1172 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.")
1174 list (APPEND _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS ${_${_PYTHON_PREFIX}_IMPLEMENTATION})
1179 set (_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS CPython IronPython)
1181 set (_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS CPython)
1185 # compute list of names for header file
1186 unset (_${_PYTHON_PREFIX}_INCLUDE_NAMES)
1187 foreach (_${_PYTHON_PREFIX}_IMPLEMENTATION IN LISTS _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
1188 if (_${_PYTHON_PREFIX}_IMPLEMENTATION STREQUAL "CPython")
1189 list (APPEND _${_PYTHON_PREFIX}_INCLUDE_NAMES "Python.h")
1190 elseif (_${_PYTHON_PREFIX}_IMPLEMENTATION STREQUAL "PyPy")
1191 list (APPEND _${_PYTHON_PREFIX}_INCLUDE_NAMES "PyPy.h")
1196 # Apple frameworks handling
1197 _python_find_frameworks ()
1199 set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK "FIRST")
1201 if (DEFINED ${_PYTHON_PREFIX}_FIND_FRAMEWORK)
1202 if (NOT ${_PYTHON_PREFIX}_FIND_FRAMEWORK MATCHES "^(FIRST|LAST|NEVER)$")
1203 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.")
1205 set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK ${${_PYTHON_PREFIX}_FIND_FRAMEWORK})
1207 elseif (DEFINED CMAKE_FIND_FRAMEWORK)
1208 if (CMAKE_FIND_FRAMEWORK STREQUAL "ONLY")
1209 message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: CMAKE_FIND_FRAMEWORK: 'ONLY' value is not supported. 'FIRST' will be used instead.")
1210 elseif (NOT CMAKE_FIND_FRAMEWORK MATCHES "^(FIRST|LAST|NEVER)$")
1211 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.")
1213 set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
1217 # Save CMAKE_FIND_APPBUNDLE
1218 if (DEFINED CMAKE_FIND_APPBUNDLE)
1219 set (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE ${CMAKE_FIND_APPBUNDLE})
1221 unset (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE)
1223 # To avoid app bundle lookup
1224 set (CMAKE_FIND_APPBUNDLE "NEVER")
1226 # Save CMAKE_FIND_FRAMEWORK
1227 if (DEFINED CMAKE_FIND_FRAMEWORK)
1228 set (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
1230 unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
1232 # To avoid framework lookup
1233 set (CMAKE_FIND_FRAMEWORK "NEVER")
1235 # Windows Registry handling
1236 if (DEFINED ${_PYTHON_PREFIX}_FIND_REGISTRY)
1237 if (NOT ${_PYTHON_PREFIX}_FIND_REGISTRY MATCHES "^(FIRST|LAST|NEVER)$")
1238 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.")
1239 set (_${_PYTHON_PREFIX}_FIND_REGISTRY "FIRST")
1241 set (_${_PYTHON_PREFIX}_FIND_REGISTRY ${${_PYTHON_PREFIX}_FIND_REGISTRY})
1244 set (_${_PYTHON_PREFIX}_FIND_REGISTRY "FIRST")
1247 # virtual environments recognition
1248 if (DEFINED ENV{VIRTUAL_ENV} OR DEFINED ENV{CONDA_PREFIX})
1249 if (DEFINED ${_PYTHON_PREFIX}_FIND_VIRTUALENV)
1250 if (NOT ${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY|STANDARD)$")
1251 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.")
1252 set (_${_PYTHON_PREFIX}_FIND_VIRTUALENV "FIRST")
1254 set (_${_PYTHON_PREFIX}_FIND_VIRTUALENV ${${_PYTHON_PREFIX}_FIND_VIRTUALENV})
1257 set (_${_PYTHON_PREFIX}_FIND_VIRTUALENV FIRST)
1260 set (_${_PYTHON_PREFIX}_FIND_VIRTUALENV STANDARD)
1264 # Compute search signature
1265 # This signature will be used to check validity of cached variables on new search
1266 set (_${_PYTHON_PREFIX}_SIGNATURE "${${_PYTHON_PREFIX}_ROOT_DIR}:${_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS}:${_${_PYTHON_PREFIX}_FIND_STRATEGY}:${${_PYTHON_PREFIX}_FIND_VIRTUALENV}")
1268 string (APPEND _${_PYTHON_PREFIX}_SIGNATURE ":${${_PYTHON_PREFIX}_USE_STATIC_LIBS}:")
1270 if (CMAKE_HOST_APPLE)
1271 string (APPEND _${_PYTHON_PREFIX}_SIGNATURE ":${_${_PYTHON_PREFIX}_FIND_FRAMEWORK}")
1273 if (CMAKE_HOST_WIN32)
1274 string (APPEND _${_PYTHON_PREFIX}_SIGNATURE ":${_${_PYTHON_PREFIX}_FIND_REGISTRY}")
1277 function (_PYTHON_CHECK_DEVELOPMENT_SIGNATURE module)
1278 if ("Development.${module}" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1279 string (TOUPPER "${module}" id)
1280 set (signature "${_${_PYTHON_PREFIX}_SIGNATURE}:")
1281 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1282 list (APPEND signature "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}:")
1284 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1285 list (APPEND signature "${_${_PYTHON_PREFIX}_INCLUDE_DIR}:")
1287 string (MD5 signature "${signature}")
1288 if (signature STREQUAL _${_PYTHON_PREFIX}_DEVELOPMENT_${id}_SIGNATURE)
1289 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1290 _python_validate_library (${${_PYTHON_PREFIX}_FIND_VERSION}
1291 ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT}
1294 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1295 _python_validate_include_dir (${${_PYTHON_PREFIX}_FIND_VERSION}
1296 ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT}
1300 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1301 unset (_${_PYTHON_PREFIX}_LIBRARY_RELEASE CACHE)
1302 unset (_${_PYTHON_PREFIX}_LIBRARY_DEBUG CACHE)
1304 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1305 unset (_${_PYTHON_PREFIX}_INCLUDE_DIR CACHE)
1308 if (("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS
1309 AND NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
1310 OR ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS
1311 AND NOT _${_PYTHON_PREFIX}_INCLUDE_DIR))
1312 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
1313 unset (_${_PYTHON_PREFIX}_DEVELOPMENT_${id}_SIGNATURE CACHE)
1318 function (_PYTHON_COMPUTE_DEVELOPMENT_SIGNATURE module)
1319 string (TOUPPER "${module}" id)
1320 if (${_PYTHON_PREFIX}_Development.${module}_FOUND)
1321 set (signature "${_${_PYTHON_PREFIX}_SIGNATURE}:")
1322 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1323 list (APPEND signature "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}:")
1325 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1326 list (APPEND signature "${_${_PYTHON_PREFIX}_INCLUDE_DIR}:")
1328 string (MD5 signature "${signature}")
1329 set (_${_PYTHON_PREFIX}_DEVELOPMENT_${id}_SIGNATURE "${signature}" CACHE INTERNAL "")
1331 unset (_${_PYTHON_PREFIX}_DEVELOPMENT_${id}_SIGNATURE CACHE)
1336 unset (_${_PYTHON_PREFIX}_REQUIRED_VARS)
1337 unset (_${_PYTHON_PREFIX}_CACHED_VARS)
1338 unset (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE)
1339 unset (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE)
1340 unset (_${_PYTHON_PREFIX}_Development_REASON_FAILURE)
1341 unset (_${_PYTHON_PREFIX}_NumPy_REASON_FAILURE)
1345 ## For IronPython on platforms other than Windows, search for the .Net interpreter
1346 if ("IronPython" IN_LIST _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS
1348 find_program (${_PYTHON_PREFIX}_DOTNET_LAUNCHER
1353 # first step, search for the interpreter
1354 if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1355 list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_EXECUTABLE
1356 _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES)
1357 if (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter)
1358 list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_EXECUTABLE)
1361 if (DEFINED ${_PYTHON_PREFIX}_EXECUTABLE
1362 AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_EXECUTABLE}")
1363 if (NOT ${_PYTHON_PREFIX}_EXECUTABLE STREQUAL _${_PYTHON_PREFIX}_EXECUTABLE)
1364 # invalidate cache properties
1365 unset (_${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES CACHE)
1367 set (_${_PYTHON_PREFIX}_EXECUTABLE "${${_PYTHON_PREFIX}_EXECUTABLE}" CACHE INTERNAL "")
1368 elseif (DEFINED _${_PYTHON_PREFIX}_EXECUTABLE)
1369 # compute interpreter signature and check validity of definition
1370 string (MD5 __${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE "${_${_PYTHON_PREFIX}_SIGNATURE}:${_${_PYTHON_PREFIX}_EXECUTABLE}")
1371 if (__${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE STREQUAL _${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE)
1372 # check version validity
1373 if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
1374 _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION} EXACT CHECK_EXISTS)
1376 _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION} CHECK_EXISTS)
1379 unset (_${_PYTHON_PREFIX}_EXECUTABLE CACHE)
1381 if (NOT _${_PYTHON_PREFIX}_EXECUTABLE)
1382 unset (_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE CACHE)
1383 unset (_${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES CACHE)
1387 if (NOT _${_PYTHON_PREFIX}_EXECUTABLE)
1388 set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
1390 if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
1391 # build all executable names
1392 _python_get_names (_${_PYTHON_PREFIX}_NAMES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} POSIX INTERPRETER)
1393 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} INTERPRETER)
1396 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS})
1398 _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS})
1401 # Virtual environments handling
1402 if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
1403 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1404 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1406 HINTS ${_${_PYTHON_PREFIX}_HINTS}
1407 PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX
1408 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1410 NO_CMAKE_ENVIRONMENT_PATH
1411 NO_SYSTEM_ENVIRONMENT_PATH
1412 NO_CMAKE_SYSTEM_PATH)
1414 _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
1415 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1418 if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV STREQUAL "ONLY")
1423 # Apple frameworks handling
1424 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
1425 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1426 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1428 HINTS ${_${_PYTHON_PREFIX}_HINTS}
1429 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1430 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1432 NO_CMAKE_ENVIRONMENT_PATH
1433 NO_SYSTEM_ENVIRONMENT_PATH
1434 NO_CMAKE_SYSTEM_PATH)
1435 _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
1436 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1441 if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
1442 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1443 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1445 HINTS ${_${_PYTHON_PREFIX}_HINTS}
1446 PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1447 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1448 NO_SYSTEM_ENVIRONMENT_PATH
1449 NO_CMAKE_SYSTEM_PATH)
1450 _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
1451 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1457 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1458 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1460 HINTS ${_${_PYTHON_PREFIX}_HINTS}
1461 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1462 NO_SYSTEM_ENVIRONMENT_PATH
1463 NO_CMAKE_SYSTEM_PATH)
1464 _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
1465 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1468 # try using standard paths
1469 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1470 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1472 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
1473 _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
1474 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1478 # Apple frameworks handling
1479 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
1480 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1481 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1483 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1484 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1486 _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
1487 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1492 if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
1493 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1494 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1496 PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1497 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1499 _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
1500 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1508 # look-up for various versions and locations
1509 foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
1510 _python_get_names (_${_PYTHON_PREFIX}_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} POSIX INTERPRETER)
1511 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_VERSION} INTERPRETER)
1513 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_VERSION})
1514 _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS VERSION ${_${_PYTHON_PREFIX}_VERSION})
1516 # Virtual environments handling
1517 if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
1518 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1519 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1521 HINTS ${_${_PYTHON_PREFIX}_HINTS}
1522 PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX
1523 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1525 NO_CMAKE_ENVIRONMENT_PATH
1526 NO_SYSTEM_ENVIRONMENT_PATH
1527 NO_CMAKE_SYSTEM_PATH)
1528 _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
1529 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1532 if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV STREQUAL "ONLY")
1537 # Apple frameworks handling
1538 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
1539 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1540 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1542 HINTS ${_${_PYTHON_PREFIX}_HINTS}
1543 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1544 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1546 NO_CMAKE_ENVIRONMENT_PATH
1547 NO_SYSTEM_ENVIRONMENT_PATH
1548 NO_CMAKE_SYSTEM_PATH)
1552 if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
1553 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1554 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1556 HINTS ${_${_PYTHON_PREFIX}_HINTS}
1557 PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1558 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1559 NO_SYSTEM_ENVIRONMENT_PATH
1560 NO_CMAKE_SYSTEM_PATH)
1563 _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
1564 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1569 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1570 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1572 HINTS ${_${_PYTHON_PREFIX}_HINTS}
1573 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1574 NO_SYSTEM_ENVIRONMENT_PATH
1575 NO_CMAKE_SYSTEM_PATH)
1576 _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
1577 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1580 # try using standard paths.
1581 # NAMES_PER_DIR is not defined on purpose to have a chance to find
1583 # For example, typical systems have 'python' for version 2.* and 'python3'
1584 # for version 3.*. So looking for names per dir will find, potentially,
1585 # systematically 'python' (i.e. version 2) even if version 3 is searched.
1586 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1587 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1588 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
1589 _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
1590 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1594 # Apple frameworks handling
1595 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
1596 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1597 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1599 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1600 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1605 if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
1606 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1607 NAMES ${_${_PYTHON_PREFIX}_NAMES}
1609 PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1610 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1614 _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
1615 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1620 if (NOT _${_PYTHON_PREFIX}_EXECUTABLE AND
1621 NOT _${_PYTHON_PREFIX}_FIND_VIRTUALENV STREQUAL "ONLY")
1622 # No specific version found. Retry with generic names and standard paths.
1623 # NAMES_PER_DIR is not defined on purpose to have a chance to find
1625 # For example, typical systems have 'python' for version 2.* and 'python3'
1626 # for version 3.*. So looking for names per dir will find, potentially,
1627 # systematically 'python' (i.e. version 2) even if version 3 is searched.
1628 _python_get_names (_${_PYTHON_PREFIX}_NAMES POSIX INTERPRETER)
1629 find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1630 NAMES ${_${_PYTHON_PREFIX}_NAMES})
1631 _python_validate_interpreter ()
1636 set (${_PYTHON_PREFIX}_EXECUTABLE "${_${_PYTHON_PREFIX}_EXECUTABLE}")
1637 _python_get_launcher (_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER INTERPRETER)
1639 # retrieve exact version of executable found
1640 if (_${_PYTHON_PREFIX}_EXECUTABLE)
1641 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
1642 "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))"
1643 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1644 OUTPUT_VARIABLE ${_PYTHON_PREFIX}_VERSION
1646 OUTPUT_STRIP_TRAILING_WHITESPACE)
1647 if (NOT _${_PYTHON_PREFIX}_RESULT)
1648 set (_${_PYTHON_PREFIX}_EXECUTABLE_USABLE TRUE)
1650 # Interpreter is not usable
1651 set (_${_PYTHON_PREFIX}_EXECUTABLE_USABLE FALSE)
1652 unset (${_PYTHON_PREFIX}_VERSION)
1653 set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Cannot run the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
1657 if (_${_PYTHON_PREFIX}_EXECUTABLE AND _${_PYTHON_PREFIX}_EXECUTABLE_USABLE)
1658 if (_${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES)
1659 set (${_PYTHON_PREFIX}_Interpreter_FOUND TRUE)
1661 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 0 ${_PYTHON_PREFIX}_INTERPRETER_ID)
1663 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 1 ${_PYTHON_PREFIX}_VERSION_MAJOR)
1664 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 2 ${_PYTHON_PREFIX}_VERSION_MINOR)
1665 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 3 ${_PYTHON_PREFIX}_VERSION_PATCH)
1667 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 4 _${_PYTHON_PREFIX}_ARCH)
1668 set (_${_PYTHON_PREFIX}_ARCH2 ${_${_PYTHON_PREFIX}_ARCH})
1670 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 5 _${_PYTHON_PREFIX}_ABIFLAGS)
1671 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 6 ${_PYTHON_PREFIX}_SOABI)
1673 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 7 ${_PYTHON_PREFIX}_STDLIB)
1674 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 8 ${_PYTHON_PREFIX}_STDARCH)
1675 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 9 ${_PYTHON_PREFIX}_SITELIB)
1676 list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 10 ${_PYTHON_PREFIX}_SITEARCH)
1678 string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${${_PYTHON_PREFIX}_VERSION}")
1679 list (GET _${_PYTHON_PREFIX}_VERSIONS 0 ${_PYTHON_PREFIX}_VERSION_MAJOR)
1680 list (GET _${_PYTHON_PREFIX}_VERSIONS 1 ${_PYTHON_PREFIX}_VERSION_MINOR)
1681 list (GET _${_PYTHON_PREFIX}_VERSIONS 2 ${_PYTHON_PREFIX}_VERSION_PATCH)
1683 if (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
1684 set (${_PYTHON_PREFIX}_Interpreter_FOUND TRUE)
1686 # Use interpreter version and ABI for future searches to ensure consistency
1687 set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
1688 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETR_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
1689 "import sys; sys.stdout.write(sys.abiflags)"
1690 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1691 OUTPUT_VARIABLE _${_PYTHON_PREFIX}_ABIFLAGS
1693 OUTPUT_STRIP_TRAILING_WHITESPACE)
1694 if (_${_PYTHON_PREFIX}_RESULT)
1695 # assunme ABI is not supported
1696 set (_${_PYTHON_PREFIX}_ABIFLAGS "")
1700 if (${_PYTHON_PREFIX}_Interpreter_FOUND)
1701 unset (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE)
1703 # compute and save interpreter signature
1704 string (MD5 __${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE "${_${_PYTHON_PREFIX}_SIGNATURE}:${_${_PYTHON_PREFIX}_EXECUTABLE}")
1705 set (_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE "${__${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE}" CACHE INTERNAL "")
1707 if (NOT CMAKE_SIZEOF_VOID_P)
1708 # determine interpreter architecture
1709 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
1710 "import sys; sys.stdout.write(str(sys.maxsize > 2**32))"
1711 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1712 OUTPUT_VARIABLE ${_PYTHON_PREFIX}_IS64BIT
1713 ERROR_VARIABLE ${_PYTHON_PREFIX}_IS64BIT)
1714 if (NOT _${_PYTHON_PREFIX}_RESULT)
1715 if (${_PYTHON_PREFIX}_IS64BIT)
1716 set (_${_PYTHON_PREFIX}_ARCH 64)
1717 set (_${_PYTHON_PREFIX}_ARCH2 64)
1719 set (_${_PYTHON_PREFIX}_ARCH 32)
1720 set (_${_PYTHON_PREFIX}_ARCH2 32)
1725 # retrieve interpreter identity
1726 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -V
1727 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1728 OUTPUT_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID
1729 ERROR_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID)
1730 if (NOT _${_PYTHON_PREFIX}_RESULT)
1731 if (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Anaconda")
1732 set (${_PYTHON_PREFIX}_INTERPRETER_ID "Anaconda")
1733 elseif (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Enthought")
1734 set (${_PYTHON_PREFIX}_INTERPRETER_ID "Canopy")
1735 elseif (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "PyPy ([0-9.]+)")
1736 set (${_PYTHON_PREFIX}_INTERPRETER_ID "PyPy")
1737 set (${_PYTHON_PREFIX}_PyPy_VERSION "${CMAKE_MATCH_1}")
1739 string (REGEX REPLACE "^([^ ]+).*" "\\1" ${_PYTHON_PREFIX}_INTERPRETER_ID "${${_PYTHON_PREFIX}_INTERPRETER_ID}")
1740 if (${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "Python")
1741 # try to get a more precise ID
1742 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
1743 "import sys; sys.stdout.write(sys.copyright)"
1744 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1745 OUTPUT_VARIABLE ${_PYTHON_PREFIX}_COPYRIGHT
1747 if (${_PYTHON_PREFIX}_COPYRIGHT MATCHES "ActiveState")
1748 set (${_PYTHON_PREFIX}_INTERPRETER_ID "ActivePython")
1753 set (${_PYTHON_PREFIX}_INTERPRETER_ID Python)
1756 # retrieve various package installation directories
1757 execute_process (COMMAND ${_${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
1758 "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')]))"
1759 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1760 OUTPUT_VARIABLE _${_PYTHON_PREFIX}_LIBPATHS
1762 if (NOT _${_PYTHON_PREFIX}_RESULT)
1763 list (GET _${_PYTHON_PREFIX}_LIBPATHS 0 ${_PYTHON_PREFIX}_STDLIB)
1764 list (GET _${_PYTHON_PREFIX}_LIBPATHS 1 ${_PYTHON_PREFIX}_STDARCH)
1765 list (GET _${_PYTHON_PREFIX}_LIBPATHS 2 ${_PYTHON_PREFIX}_SITELIB)
1766 list (GET _${_PYTHON_PREFIX}_LIBPATHS 3 ${_PYTHON_PREFIX}_SITEARCH)
1768 unset (${_PYTHON_PREFIX}_STDLIB)
1769 unset (${_PYTHON_PREFIX}_STDARCH)
1770 unset (${_PYTHON_PREFIX}_SITELIB)
1771 unset (${_PYTHON_PREFIX}_SITEARCH)
1774 if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR VERSION_GREATER_EQUAL "3")
1775 _python_get_config_var (${_PYTHON_PREFIX}_SOABI SOABI)
1778 # store properties in the cache to speed-up future searches
1779 set (_${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES
1780 "${${_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")
1782 unset (_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE CACHE)
1783 unset (${_PYTHON_PREFIX}_INTERPRETER_ID)
1788 if (${_PYTHON_PREFIX}_ARTIFACTS_INTERACTIVE)
1789 set (${_PYTHON_PREFIX}_EXECUTABLE "${_${_PYTHON_PREFIX}_EXECUTABLE}" CACHE FILEPATH "${_PYTHON_PREFIX} Interpreter")
1792 _python_mark_as_internal (_${_PYTHON_PREFIX}_EXECUTABLE
1793 _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES
1794 _${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE)
1798 # second step, search for compiler (IronPython)
1799 if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1800 list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_COMPILER)
1801 if (${_PYTHON_PREFIX}_FIND_REQUIRED_Compiler)
1802 list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_COMPILER)
1805 if (NOT "IronPython" IN_LIST _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
1806 unset (_${_PYTHON_PREFIX}_COMPILER CACHE)
1807 unset (_${_PYTHON_PREFIX}_COMPILER_SIGNATURE CACHE)
1808 elseif (DEFINED ${_PYTHON_PREFIX}_COMPILER
1809 AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_COMPILER}")
1810 set (_${_PYTHON_PREFIX}_COMPILER "${${_PYTHON_PREFIX}_COMPILER}" CACHE INTERNAL "")
1811 elseif (DEFINED _${_PYTHON_PREFIX}_COMPILER)
1812 # compute compiler signature and check validity of definition
1813 string (MD5 __${_PYTHON_PREFIX}_COMPILER_SIGNATURE "${_${_PYTHON_PREFIX}_SIGNATURE}:${_${_PYTHON_PREFIX}_COMPILER}")
1814 if (__${_PYTHON_PREFIX}_COMPILER_SIGNATURE STREQUAL _${_PYTHON_PREFIX}_COMPILER_SIGNATURE)
1815 # check version validity
1816 if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
1817 _python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION} EXACT CHECK_EXISTS)
1819 _python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION} CHECK_EXISTS)
1822 unset (_${_PYTHON_PREFIX}_COMPILER CACHE)
1823 unset (_${_PYTHON_PREFIX}_COMPILER_SIGNATURE CACHE)
1827 if ("IronPython" IN_LIST _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS
1828 AND NOT _${_PYTHON_PREFIX}_COMPILER)
1829 # IronPython specific artifacts
1830 # If IronPython interpreter is found, use its path
1831 unset (_${_PYTHON_PREFIX}_IRON_ROOT)
1832 if (${_PYTHON_PREFIX}_Interpreter_FOUND AND ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython")
1833 get_filename_component (_${_PYTHON_PREFIX}_IRON_ROOT "${${_PYTHON_PREFIX}_EXECUTABLE}" DIRECTORY)
1836 if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
1837 _python_get_names (_${_PYTHON_PREFIX}_COMPILER_NAMES
1838 IMPLEMENTATIONS IronPython
1839 VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS}
1842 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES
1843 IMPLEMENTATIONS IronPython
1844 VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS}
1847 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS
1848 IMPLEMENTATIONS IronPython
1849 VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS})
1850 _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS
1851 IMPLEMENTATIONS IronPython
1852 VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS})
1855 # Apple frameworks handling
1856 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
1857 find_program (_${_PYTHON_PREFIX}_COMPILER
1858 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
1860 HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
1861 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1862 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1864 NO_CMAKE_ENVIRONMENT_PATH
1865 NO_SYSTEM_ENVIRONMENT_PATH
1866 NO_CMAKE_SYSTEM_PATH)
1867 _python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
1868 if (_${_PYTHON_PREFIX}_COMPILER)
1873 if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
1874 find_program (_${_PYTHON_PREFIX}_COMPILER
1875 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
1877 HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
1878 PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1879 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1880 NO_SYSTEM_ENVIRONMENT_PATH
1881 NO_CMAKE_SYSTEM_PATH)
1882 _python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
1883 if (_${_PYTHON_PREFIX}_COMPILER)
1889 find_program (_${_PYTHON_PREFIX}_COMPILER
1890 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
1892 HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
1893 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1894 NO_SYSTEM_ENVIRONMENT_PATH
1895 NO_CMAKE_SYSTEM_PATH)
1896 _python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
1897 if (_${_PYTHON_PREFIX}_COMPILER)
1901 # try using standard paths
1902 find_program (_${_PYTHON_PREFIX}_COMPILER
1903 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
1905 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
1906 _python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
1907 if (_${_PYTHON_PREFIX}_COMPILER)
1911 # Apple frameworks handling
1912 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
1913 find_program (_${_PYTHON_PREFIX}_COMPILER
1914 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
1916 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1917 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1919 _python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION} ${_${_PYTHON_PREFIX}_FIND_VERSION_EXACT})
1920 if (_${_PYTHON_PREFIX}_COMPILER)
1925 if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
1926 find_program (_${_PYTHON_PREFIX}_COMPILER
1927 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
1929 PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1930 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1932 if (_${_PYTHON_PREFIX}_COMPILER)
1940 # try using root dir and registry
1941 foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
1942 _python_get_names (_${_PYTHON_PREFIX}_COMPILER_NAMES
1943 IMPLEMENTATIONS IronPython
1944 VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS}
1947 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES
1948 IMPLEMENTATIONS IronPython
1949 VERSION ${_${_PYTHON_PREFIX}_FIND_VERSION}
1952 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS
1953 IMPLEMENTATIONS IronPython
1954 VERSION ${_${_PYTHON_PREFIX}_VERSION})
1955 _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS
1956 IMPLEMENTATIONS IronPython
1957 VERSION ${_${_PYTHON_PREFIX}_VERSION})
1959 # Apple frameworks handling
1960 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
1961 find_program (_${_PYTHON_PREFIX}_COMPILER
1962 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
1964 HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
1965 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1966 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1968 NO_CMAKE_ENVIRONMENT_PATH
1969 NO_SYSTEM_ENVIRONMENT_PATH
1970 NO_CMAKE_SYSTEM_PATH)
1971 _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION} EXACT)
1972 if (_${_PYTHON_PREFIX}_COMPILER)
1977 if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
1978 find_program (_${_PYTHON_PREFIX}_COMPILER
1979 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
1981 HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
1982 PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1983 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1984 NO_SYSTEM_ENVIRONMENT_PATH
1985 NO_CMAKE_SYSTEM_PATH)
1986 _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION} EXACT)
1987 if (_${_PYTHON_PREFIX}_COMPILER)
1993 find_program (_${_PYTHON_PREFIX}_COMPILER
1994 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
1996 HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
1997 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
1998 NO_SYSTEM_ENVIRONMENT_PATH
1999 NO_CMAKE_SYSTEM_PATH)
2000 _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION} EXACT)
2001 if (_${_PYTHON_PREFIX}_COMPILER)
2005 # Apple frameworks handling
2006 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
2007 find_program (_${_PYTHON_PREFIX}_COMPILER
2008 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
2010 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2011 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2013 _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION} EXACT)
2014 if (_${_PYTHON_PREFIX}_COMPILER)
2019 if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
2020 find_program (_${_PYTHON_PREFIX}_COMPILER
2021 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
2023 PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
2024 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2026 _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION} EXACT)
2027 if (_${_PYTHON_PREFIX}_COMPILER)
2033 # no specific version found, re-try in standard paths
2034 _python_get_names (_${_PYTHON_PREFIX}_COMPILER_NAMES
2035 IMPLEMENTATIONS IronPython
2036 VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS}
2038 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES
2039 IMPLEMENTATIONS IronPython
2040 VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS}
2042 find_program (_${_PYTHON_PREFIX}_COMPILER
2043 NAMES ${_${_PYTHON_PREFIX}_COMPILER_NAMES}
2044 HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
2045 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
2049 set (${_PYTHON_PREFIX}_COMPILER "${_${_PYTHON_PREFIX}_COMPILER}")
2051 if (_${_PYTHON_PREFIX}_COMPILER)
2052 # retrieve python environment version from compiler
2053 _python_get_launcher (_${_PYTHON_PREFIX}_COMPILER_LAUNCHER COMPILER)
2054 set (_${_PYTHON_PREFIX}_VERSION_DIR "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir")
2055 file (WRITE "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))\n")
2056 execute_process (COMMAND ${_${_PYTHON_PREFIX}_COMPILER_LAUNCHER} "${_${_PYTHON_PREFIX}_COMPILER}"
2057 ${_${_PYTHON_PREFIX}_IRON_PYTHON_COMPILER_ARCH_FLAGS}
2058 /target:exe /embed "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py"
2059 WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}"
2062 get_filename_component (_${_PYTHON_PREFIX}_IR_DIR "${_${_PYTHON_PREFIX}_COMPILER}" DIRECTORY)
2063 execute_process (COMMAND "${CMAKE_COMMAND}" -E env "MONO_PATH=${_${_PYTHON_PREFIX}_IR_DIR}"
2064 ${${_PYTHON_PREFIX}_DOTNET_LAUNCHER} "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.exe"
2065 WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}"
2066 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2067 OUTPUT_VARIABLE _${_PYTHON_PREFIX}_VERSION
2069 if (NOT _${_PYTHON_PREFIX}_RESULT)
2070 set (_${_PYTHON_PREFIX}_COMPILER_USABLE TRUE)
2071 string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${_${_PYTHON_PREFIX}_VERSION}")
2072 list (GET _${_PYTHON_PREFIX}_VERSIONS 0 _${_PYTHON_PREFIX}_VERSION_MAJOR)
2073 list (GET _${_PYTHON_PREFIX}_VERSIONS 1 _${_PYTHON_PREFIX}_VERSION_MINOR)
2074 list (GET _${_PYTHON_PREFIX}_VERSIONS 2 _${_PYTHON_PREFIX}_VERSION_PATCH)
2076 if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND)
2077 # set public version information
2078 set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION})
2079 set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR})
2080 set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR})
2081 set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH})
2084 # compiler not usable
2085 set (_${_PYTHON_PREFIX}_COMPILER_USABLE FALSE)
2086 set (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE "Cannot run the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
2088 file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}")
2091 if (_${_PYTHON_PREFIX}_COMPILER AND _${_PYTHON_PREFIX}_COMPILER_USABLE)
2092 if (${_PYTHON_PREFIX}_Interpreter_FOUND)
2093 # Compiler must be compatible with interpreter
2094 if ("${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR}" VERSION_EQUAL "${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}")
2095 set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE)
2097 elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
2098 set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE)
2099 # Use compiler version for future searches to ensure consistency
2100 set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
2104 if (${_PYTHON_PREFIX}_Compiler_FOUND)
2105 unset (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE)
2107 # compute and save compiler signature
2108 string (MD5 __${_PYTHON_PREFIX}_COMPILER_SIGNATURE "${_${_PYTHON_PREFIX}_SIGNATURE}:${_${_PYTHON_PREFIX}_COMPILER}")
2109 set (_${_PYTHON_PREFIX}_COMPILER_SIGNATURE "${__${_PYTHON_PREFIX}_COMPILER_SIGNATURE}" CACHE INTERNAL "")
2111 set (${_PYTHON_PREFIX}_COMPILER_ID IronPython)
2113 unset (_${_PYTHON_PREFIX}_COMPILER_SIGNATURE CACHE)
2114 unset (${_PYTHON_PREFIX}_COMPILER_ID)
2117 if (${_PYTHON_PREFIX}_ARTIFACTS_INTERACTIVE)
2118 set (${_PYTHON_PREFIX}_COMPILER "${_${_PYTHON_PREFIX}_COMPILER}" CACHE FILEPATH "${_PYTHON_PREFIX} Compiler")
2121 _python_mark_as_internal (_${_PYTHON_PREFIX}_COMPILER
2122 _${_PYTHON_PREFIX}_COMPILER_SIGNATURE)
2125 # third step, search for the development artifacts
2126 if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development.Module)
2127 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS)
2128 list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_LIBRARIES)
2130 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS)
2131 list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_INCLUDE_DIRS)
2134 if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development.Embed)
2135 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS)
2136 list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_LIBRARIES)
2138 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS)
2139 list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_INCLUDE_DIRS)
2142 list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_REQUIRED_VARS)
2143 ## Development environment is not compatible with IronPython interpreter
2144 if (("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
2145 OR "Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
2146 AND ((${_PYTHON_PREFIX}_Interpreter_FOUND
2147 AND NOT ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython")
2148 OR NOT ${_PYTHON_PREFIX}_Interpreter_FOUND))
2149 if (${_PYTHON_PREFIX}_Interpreter_FOUND)
2150 # reduce possible implementations to the interpreter one
2151 if (${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "PyPy")
2152 set (_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS "PyPy")
2154 set (_${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS "CPython")
2157 list (REMOVE_ITEM _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS "IronPython")
2159 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
2160 list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_LIBRARY_RELEASE
2161 _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
2162 _${_PYTHON_PREFIX}_LIBRARY_DEBUG
2163 _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
2165 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
2166 list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_INCLUDE_DIR)
2169 _python_check_development_signature (Module)
2170 _python_check_development_signature (Embed)
2172 if (DEFINED ${_PYTHON_PREFIX}_LIBRARY
2173 AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_LIBRARY}")
2174 set (_${_PYTHON_PREFIX}_LIBRARY_RELEASE "${${_PYTHON_PREFIX}_LIBRARY}" CACHE INTERNAL "")
2175 unset (_${_PYTHON_PREFIX}_LIBRARY_DEBUG CACHE)
2176 unset (_${_PYTHON_PREFIX}_INCLUDE_DIR CACHE)
2178 if (DEFINED ${_PYTHON_PREFIX}_INCLUDE_DIR
2179 AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_INCLUDE_DIR}")
2180 set (_${_PYTHON_PREFIX}_INCLUDE_DIR "${${_PYTHON_PREFIX}_INCLUDE_DIR}" CACHE INTERNAL "")
2183 # Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES
2184 unset (_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES)
2185 if (DEFINED ${_PYTHON_PREFIX}_USE_STATIC_LIBS AND NOT WIN32)
2186 set(_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
2187 if(${_PYTHON_PREFIX}_USE_STATIC_LIBS)
2188 set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
2190 list (REMOVE_ITEM CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
2194 if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE OR NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
2195 # if python interpreter is found, use it to look-up for artifacts
2196 # to ensure consistency between interpreter and development environments.
2197 # If not, try to locate a compatible config tool
2198 if ((NOT ${_PYTHON_PREFIX}_Interpreter_FOUND OR CMAKE_CROSSCOMPILING)
2199 AND "CPython" IN_LIST _${_PYTHON_PREFIX}_FIND_IMPLEMENTATIONS)
2200 set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
2201 unset (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS)
2202 if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
2203 set (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX)
2206 if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
2207 _python_get_names (_${_PYTHON_PREFIX}_CONFIG_NAMES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} POSIX CONFIG)
2209 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS})
2211 # Apple frameworks handling
2212 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
2213 find_program (_${_PYTHON_PREFIX}_CONFIG
2214 NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
2216 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2217 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2218 ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2221 NO_CMAKE_ENVIRONMENT_PATH
2222 NO_SYSTEM_ENVIRONMENT_PATH
2223 NO_CMAKE_SYSTEM_PATH)
2226 find_program (_${_PYTHON_PREFIX}_CONFIG
2227 NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
2229 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2230 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2233 # Apple frameworks handling
2234 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
2235 find_program (_${_PYTHON_PREFIX}_CONFIG
2236 NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
2238 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2243 if (_${_PYTHON_PREFIX}_CONFIG)
2244 execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --help
2245 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2246 OUTPUT_VARIABLE __${_PYTHON_PREFIX}_HELP
2248 OUTPUT_STRIP_TRAILING_WHITESPACE)
2249 if (_${_PYTHON_PREFIX}_RESULT)
2250 # assume config tool is not usable
2251 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2255 if (_${_PYTHON_PREFIX}_CONFIG)
2256 execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --abiflags
2257 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2258 OUTPUT_VARIABLE __${_PYTHON_PREFIX}_ABIFLAGS
2260 OUTPUT_STRIP_TRAILING_WHITESPACE)
2261 if (_${_PYTHON_PREFIX}_RESULT)
2262 # assume ABI is not supported
2263 set (__${_PYTHON_PREFIX}_ABIFLAGS "")
2265 if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND NOT __${_PYTHON_PREFIX}_ABIFLAGS IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
2267 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2271 if (_${_PYTHON_PREFIX}_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
2272 # check that config tool match library architecture
2273 execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --configdir
2274 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2275 OUTPUT_VARIABLE _${_PYTHON_PREFIX}_CONFIGDIR
2277 OUTPUT_STRIP_TRAILING_WHITESPACE)
2278 if (_${_PYTHON_PREFIX}_RESULT)
2279 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2281 string(FIND "${_${_PYTHON_PREFIX}_CONFIGDIR}" "${CMAKE_LIBRARY_ARCHITECTURE}" _${_PYTHON_PREFIX}_RESULT)
2282 if (_${_PYTHON_PREFIX}_RESULT EQUAL -1)
2283 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2288 foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
2289 # try to use pythonX.Y-config tool
2290 _python_get_names (_${_PYTHON_PREFIX}_CONFIG_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} POSIX CONFIG)
2293 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_VERSION})
2295 # Apple frameworks handling
2296 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
2297 find_program (_${_PYTHON_PREFIX}_CONFIG
2298 NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
2300 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2301 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2302 ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2305 NO_CMAKE_ENVIRONMENT_PATH
2306 NO_SYSTEM_ENVIRONMENT_PATH
2307 NO_CMAKE_SYSTEM_PATH)
2310 find_program (_${_PYTHON_PREFIX}_CONFIG
2311 NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
2313 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2314 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2317 # Apple frameworks handling
2318 if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
2319 find_program (_${_PYTHON_PREFIX}_CONFIG
2320 NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
2322 PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2327 unset (_${_PYTHON_PREFIX}_CONFIG_NAMES)
2329 if (_${_PYTHON_PREFIX}_CONFIG)
2330 execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --help
2331 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2332 OUTPUT_VARIABLE __${_PYTHON_PREFIX}_HELP
2334 OUTPUT_STRIP_TRAILING_WHITESPACE)
2335 if (_${_PYTHON_PREFIX}_RESULT)
2336 # assume config tool is not usable
2337 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2341 if (NOT _${_PYTHON_PREFIX}_CONFIG)
2345 execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --abiflags
2346 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2347 OUTPUT_VARIABLE __${_PYTHON_PREFIX}_ABIFLAGS
2349 OUTPUT_STRIP_TRAILING_WHITESPACE)
2350 if (_${_PYTHON_PREFIX}_RESULT)
2351 # assume ABI is not supported
2352 set (__${_PYTHON_PREFIX}_ABIFLAGS "")
2354 if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND NOT __${_PYTHON_PREFIX}_ABIFLAGS IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
2356 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2360 if (_${_PYTHON_PREFIX}_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
2361 # check that config tool match library architecture
2362 execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --configdir
2363 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2364 OUTPUT_VARIABLE _${_PYTHON_PREFIX}_CONFIGDIR
2366 OUTPUT_STRIP_TRAILING_WHITESPACE)
2367 if (_${_PYTHON_PREFIX}_RESULT)
2368 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2371 string (FIND "${_${_PYTHON_PREFIX}_CONFIGDIR}" "${CMAKE_LIBRARY_ARCHITECTURE}" _${_PYTHON_PREFIX}_RESULT)
2372 if (_${_PYTHON_PREFIX}_RESULT EQUAL -1)
2373 unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2378 if (_${_PYTHON_PREFIX}_CONFIG)
2386 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
2387 if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2388 if ((${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT CMAKE_CROSSCOMPILING) OR _${_PYTHON_PREFIX}_CONFIG)
2389 # retrieve root install directory
2390 _python_get_config_var (_${_PYTHON_PREFIX}_PREFIX PREFIX)
2392 # enforce current ABI
2393 _python_get_config_var (_${_PYTHON_PREFIX}_ABIFLAGS ABIFLAGS)
2395 set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}")
2398 ## compute some paths and artifact names
2399 if (_${_PYTHON_PREFIX}_CONFIG)
2400 string (REGEX REPLACE "^.+python([0-9.]+)[a-z]*-config" "\\1" _${_PYTHON_PREFIX}_VERSION "${_${_PYTHON_PREFIX}_CONFIG}")
2402 set (_${_PYTHON_PREFIX}_VERSION "${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}")
2404 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_VERSION} LIBRARY)
2405 _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 POSIX LIBRARY)
2407 _python_get_config_var (_${_PYTHON_PREFIX}_CONFIGDIR CONFIGDIR)
2408 list (APPEND _${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_CONFIGDIR}")
2410 list (APPEND _${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
2412 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2413 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2415 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2416 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2417 NO_SYSTEM_ENVIRONMENT_PATH
2418 NO_CMAKE_SYSTEM_PATH)
2421 # Rely on HINTS and standard paths if interpreter or config tool failed to locate artifacts
2422 if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2423 set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
2425 unset (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS)
2426 if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
2427 set (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX)
2430 if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
2432 _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} WIN32 POSIX LIBRARY)
2433 _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} WIN32 DEBUG)
2435 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} LIBRARY)
2438 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_LIB_FIND_VERSIONS})
2440 _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS VERSION ${_${_PYTHON_PREFIX}_FIND_VERSIONS} )
2442 if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
2443 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2444 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2446 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2447 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2448 ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2449 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2451 NO_CMAKE_ENVIRONMENT_PATH
2452 NO_SYSTEM_ENVIRONMENT_PATH
2453 NO_CMAKE_SYSTEM_PATH)
2456 if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
2457 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2458 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2460 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2461 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2462 ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
2463 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2464 NO_SYSTEM_ENVIRONMENT_PATH
2465 NO_CMAKE_SYSTEM_PATH)
2468 # search in HINTS locations
2469 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2470 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2472 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2473 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2474 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2475 NO_SYSTEM_ENVIRONMENT_PATH
2476 NO_CMAKE_SYSTEM_PATH)
2478 if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
2479 set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
2481 unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
2484 if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
2485 set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
2487 unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
2490 # search in all default paths
2491 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2492 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2494 PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2495 ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
2496 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
2498 foreach (_${_PYTHON_PREFIX}_LIB_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
2499 _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 POSIX LIBRARY)
2500 _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 DEBUG)
2502 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION})
2503 _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION})
2505 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} LIBRARY)
2507 if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
2508 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2509 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2511 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2512 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2513 ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2514 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2516 NO_CMAKE_ENVIRONMENT_PATH
2517 NO_SYSTEM_ENVIRONMENT_PATH
2518 NO_CMAKE_SYSTEM_PATH)
2521 if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
2522 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2523 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2525 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2526 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2527 ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
2528 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2529 NO_SYSTEM_ENVIRONMENT_PATH
2530 NO_CMAKE_SYSTEM_PATH)
2533 # search in HINTS locations
2534 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2535 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2537 HINTS ${_${_PYTHON_PREFIX}_HINTS}
2538 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2539 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2540 NO_SYSTEM_ENVIRONMENT_PATH
2541 NO_CMAKE_SYSTEM_PATH)
2543 if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
2544 set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
2546 unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
2549 if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
2550 set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
2552 unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
2555 # search in all default paths
2556 find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2557 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2559 PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2560 ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
2561 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
2563 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2571 # finalize library version information
2572 _python_get_version (LIBRARY PREFIX _${_PYTHON_PREFIX}_)
2573 if (_${_PYTHON_PREFIX}_VERSION EQUAL "${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}")
2574 # not able to extract full version from library name
2575 if (${_PYTHON_PREFIX}_Interpreter_FOUND)
2576 # update from interpreter
2577 set (_${_PYTHON_PREFIX}_VERSION ${${_PYTHON_PREFIX}_VERSION})
2578 set (_${_PYTHON_PREFIX}_VERSION_MAJOR ${${_PYTHON_PREFIX}_VERSION_MAJOR})
2579 set (_${_PYTHON_PREFIX}_VERSION_MINOR ${${_PYTHON_PREFIX}_VERSION_MINOR})
2580 set (_${_PYTHON_PREFIX}_VERSION_PATCH ${${_PYTHON_PREFIX}_VERSION_PATCH})
2584 set (${_PYTHON_PREFIX}_LIBRARY_RELEASE "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
2586 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE AND NOT EXISTS "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
2587 set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Cannot find the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"")
2588 set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
2591 set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
2593 if (WIN32 AND _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2594 # search for debug library
2595 # use release library location as a hint
2596 _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 DEBUG)
2597 get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
2598 find_library (_${_PYTHON_PREFIX}_LIBRARY_DEBUG
2599 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
2601 HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS}
2603 # second try including CMAKE variables to catch-up non conventional layouts
2604 find_library (_${_PYTHON_PREFIX}_LIBRARY_DEBUG
2605 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
2607 NO_SYSTEM_ENVIRONMENT_PATH
2608 NO_CMAKE_SYSTEM_PATH)
2611 # retrieve runtime libraries
2612 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2613 _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 POSIX LIBRARY)
2614 get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
2615 get_filename_component (_${_PYTHON_PREFIX}_PATH2 "${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
2616 _python_find_runtime_library (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
2617 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2619 HINTS "${_${_PYTHON_PREFIX}_PATH}"
2620 "${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS}
2623 if (_${_PYTHON_PREFIX}_LIBRARY_DEBUG)
2624 _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 DEBUG)
2625 get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_DEBUG}" DIRECTORY)
2626 get_filename_component (_${_PYTHON_PREFIX}_PATH2 "${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
2627 _python_find_runtime_library (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
2628 NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
2630 HINTS "${_${_PYTHON_PREFIX}_PATH}"
2631 "${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS}
2636 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
2637 while (NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
2638 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS
2639 AND NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2640 # Don't search for include dir if no library was founded
2644 if ((${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT CMAKE_CROSSCOMPILING) OR _${_PYTHON_PREFIX}_CONFIG)
2645 _python_get_config_var (_${_PYTHON_PREFIX}_INCLUDE_DIRS INCLUDES)
2647 find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
2648 NAMES ${_${_PYTHON_PREFIX}_INCLUDE_NAMES}
2649 HINTS ${_${_PYTHON_PREFIX}_INCLUDE_DIRS}
2650 NO_SYSTEM_ENVIRONMENT_PATH
2651 NO_CMAKE_SYSTEM_PATH)
2654 # Rely on HINTS and standard paths if interpreter or config tool failed to locate artifacts
2655 if (NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
2656 unset (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS)
2657 if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
2658 set (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX)
2660 unset (_${_PYTHON_PREFIX}_INCLUDE_HINTS)
2662 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2663 # Use the library's install prefix as a hint
2664 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "^(.+/Frameworks/Python.framework/Versions/[0-9.]+)")
2665 list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
2666 elseif (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "^(.+)/lib(64|32)?/python[0-9.]+/config")
2667 list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
2668 elseif (DEFINED CMAKE_LIBRARY_ARCHITECTURE AND ${_${_PYTHON_PREFIX}_LIBRARY_RELEASE} MATCHES "^(.+)/lib/${CMAKE_LIBRARY_ARCHITECTURE}")
2669 list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
2671 # assume library is in a directory under root
2672 get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
2673 get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${_${_PYTHON_PREFIX}_PREFIX}" DIRECTORY)
2674 list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${_${_PYTHON_PREFIX}_PREFIX}")
2678 _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS VERSION ${_${_PYTHON_PREFIX}_VERSION})
2679 _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS VERSION ${_${_PYTHON_PREFIX}_VERSION})
2680 _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_VERSION} INCLUDE)
2682 if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
2683 find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
2684 NAMES ${_${_PYTHON_PREFIX}_INCLUDE_NAMES}
2685 HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
2686 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2687 ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2688 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2690 NO_CMAKE_ENVIRONMENT_PATH
2691 NO_SYSTEM_ENVIRONMENT_PATH
2692 NO_CMAKE_SYSTEM_PATH)
2695 if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
2696 find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
2697 NAMES ${_${_PYTHON_PREFIX}_INCLUDE_NAMES}
2698 HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
2699 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2700 ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
2701 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2702 NO_SYSTEM_ENVIRONMENT_PATH
2703 NO_CMAKE_SYSTEM_PATH)
2706 if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
2707 set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
2709 unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
2712 if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
2713 set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
2715 unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
2718 find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
2719 NAMES ${_${_PYTHON_PREFIX}_INCLUDE_NAMES}
2720 HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
2721 PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2722 ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2723 ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
2724 PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2725 NO_SYSTEM_ENVIRONMENT_PATH
2726 NO_CMAKE_SYSTEM_PATH)
2729 # search header file in standard locations
2730 find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
2731 NAMES ${_${_PYTHON_PREFIX}_INCLUDE_NAMES})
2736 set (${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}")
2738 if (_${_PYTHON_PREFIX}_INCLUDE_DIR AND NOT EXISTS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}")
2739 set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Cannot find the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"")
2740 set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
2743 if (_${_PYTHON_PREFIX}_INCLUDE_DIR)
2744 # retrieve version from header file
2745 _python_get_version (INCLUDE PREFIX _${_PYTHON_PREFIX}_INC_)
2747 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2748 if ("${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_INC_VERSION_MINOR}"
2749 VERSION_EQUAL _${_PYTHON_PREFIX}_VERSION)
2751 set (_${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_INC_VERSION})
2752 set (_${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_INC_VERSION_PATCH})
2755 set (_${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_INC_VERSION})
2756 set (_${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR})
2757 set (_${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_INC_VERSION_MINOR})
2758 set (_${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_INC_VERSION_PATCH})
2763 if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT ${_PYTHON_PREFIX}_Compiler_FOUND)
2764 # set public version information
2765 set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION})
2766 set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR})
2767 set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR})
2768 set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH})
2771 # define public variables
2772 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
2773 set (${_PYTHON_PREFIX}_LIBRARY_DEBUG "${_${_PYTHON_PREFIX}_LIBRARY_DEBUG}")
2774 _python_select_library_configurations (${_PYTHON_PREFIX})
2776 set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
2777 set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
2779 if (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
2780 set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
2781 elseif (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
2782 set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
2784 set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${_PYTHON_PREFIX}_RUNTIME_LIBRARY-NOTFOUND")
2787 _python_set_library_dirs (${_PYTHON_PREFIX}_LIBRARY_DIRS
2788 _${_PYTHON_PREFIX}_LIBRARY_RELEASE
2789 _${_PYTHON_PREFIX}_LIBRARY_DEBUG)
2791 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$")
2792 set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS ${${_PYTHON_PREFIX}_LIBRARY_DIRS})
2795 _python_set_library_dirs (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS
2796 _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
2797 _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
2801 if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE OR _${_PYTHON_PREFIX}_INCLUDE_DIR)
2802 if (${_PYTHON_PREFIX}_Interpreter_FOUND OR ${_PYTHON_PREFIX}_Compiler_FOUND)
2803 # development environment must be compatible with interpreter/compiler
2804 if ("${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR}" VERSION_EQUAL "${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}"
2805 AND "${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_INC_VERSION_MINOR}" VERSION_EQUAL "${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR}")
2806 _python_set_development_module_found (Module)
2807 _python_set_development_module_found (Embed)
2809 elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR
2810 AND "${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_INC_VERSION_MINOR}" VERSION_EQUAL "${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR}")
2811 _python_set_development_module_found (Module)
2812 _python_set_development_module_found (Embed)
2814 if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND
2815 (NOT _${_PYTHON_PREFIX}_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS
2816 OR NOT _${_PYTHON_PREFIX}_INC_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS))
2817 set (${_PYTHON_PREFIX}_Development.Module_FOUND FALSE)
2818 set (${_PYTHON_PREFIX}_Development.Embed_FOUND FALSE)
2822 if (( ${_PYTHON_PREFIX}_Development.Module_FOUND
2823 AND ${_PYTHON_PREFIX}_Development.Embed_FOUND)
2824 OR (NOT "Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
2825 AND ${_PYTHON_PREFIX}_Development.Embed_FOUND)
2826 OR (NOT "Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
2827 AND ${_PYTHON_PREFIX}_Development.Module_FOUND))
2828 unset (_${_PYTHON_PREFIX}_Development_REASON_FAILURE)
2831 if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
2832 AND ${_PYTHON_PREFIX}_Development.Module_FOUND
2833 AND ${_PYTHON_PREFIX}_Development.Embed_FOUND)
2834 set (${_PYTHON_PREFIX}_Development_FOUND TRUE)
2837 if ((${_PYTHON_PREFIX}_Development.Module_FOUND
2838 OR ${_PYTHON_PREFIX}_Development.Embed_FOUND)
2839 AND EXISTS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}/PyPy.h")
2840 # retrieve PyPy version
2841 file (STRINGS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}/patchlevel.h" ${_PYTHON_PREFIX}_PyPy_VERSION
2842 REGEX "^#define[ \t]+PYPY_VERSION[ \t]+\"[^\"]+\"")
2843 string (REGEX REPLACE "^#define[ \t]+PYPY_VERSION[ \t]+\"([^\"]+)\".*" "\\1"
2844 ${_PYTHON_PREFIX}_PyPy_VERSION "${${_PYTHON_PREFIX}_PyPy_VERSION}")
2847 if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR VERSION_GREATER_EQUAL "3"
2848 AND NOT DEFINED ${_PYTHON_PREFIX}_SOABI)
2849 _python_get_config_var (${_PYTHON_PREFIX}_SOABI SOABI)
2852 _python_compute_development_signature (Module)
2853 _python_compute_development_signature (Embed)
2855 # Restore the original find library ordering
2856 if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES)
2857 set (CMAKE_FIND_LIBRARY_SUFFIXES ${_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES})
2860 if (${_PYTHON_PREFIX}_ARTIFACTS_INTERACTIVE)
2861 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
2862 set (${_PYTHON_PREFIX}_LIBRARY "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" CACHE FILEPATH "${_PYTHON_PREFIX} Library")
2864 if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
2865 set (${_PYTHON_PREFIX}_INCLUDE_DIR "${_${_PYTHON_PREFIX}_INCLUDE_DIR}" CACHE FILEPATH "${_PYTHON_PREFIX} Include Directory")
2869 _python_mark_as_internal (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2870 _${_PYTHON_PREFIX}_LIBRARY_DEBUG
2871 _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
2872 _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
2873 _${_PYTHON_PREFIX}_INCLUDE_DIR
2874 _${_PYTHON_PREFIX}_CONFIG
2875 _${_PYTHON_PREFIX}_DEVELOPMENT_MODULE_SIGNATURE
2876 _${_PYTHON_PREFIX}_DEVELOPMENT_EMBED_SIGNATURE)
2879 if (${_PYTHON_PREFIX}_FIND_REQUIRED_NumPy)
2880 list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_NumPy_INCLUDE_DIRS)
2882 if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS AND ${_PYTHON_PREFIX}_Interpreter_FOUND)
2883 list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
2885 if (DEFINED ${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR
2886 AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
2887 set (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR "${${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}" CACHE INTERNAL "")
2888 elseif (DEFINED _${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
2889 # compute numpy signature. Depends on interpreter and development signatures
2890 string (MD5 __${_PYTHON_PREFIX}_NUMPY_SIGNATURE "${_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE}:${_${_PYTHON_PREFIX}_DEVELOPMENT_MODULE_SIGNATURE}:${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
2891 if (NOT __${_PYTHON_PREFIX}_NUMPY_SIGNATURE STREQUAL _${_PYTHON_PREFIX}_NUMPY_SIGNATURE
2892 OR NOT EXISTS "${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
2893 unset (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR CACHE)
2894 unset (_${_PYTHON_PREFIX}_NUMPY_SIGNATURE CACHE)
2898 if (NOT _${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
2899 execute_process(COMMAND ${${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
2900 "import sys\ntry: import numpy; sys.stdout.write(numpy.get_include())\nexcept:pass\n"
2901 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2902 OUTPUT_VARIABLE _${_PYTHON_PREFIX}_NumPy_PATH
2904 OUTPUT_STRIP_TRAILING_WHITESPACE)
2906 if (NOT _${_PYTHON_PREFIX}_RESULT)
2907 find_path (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR
2908 NAMES "numpy/arrayobject.h" "numpy/numpyconfig.h"
2909 HINTS "${_${_PYTHON_PREFIX}_NumPy_PATH}"
2914 set (${_PYTHON_PREFIX}_NumPy_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
2916 if(_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR AND NOT EXISTS "${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
2917 set (_${_PYTHON_PREFIX}_NumPy_REASON_FAILURE "Cannot find the directory \"${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}\"")
2918 set_property (CACHE _${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR-NOTFOUND")
2921 if (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
2922 execute_process (COMMAND ${${_PYTHON_PREFIX}_INTERPRETER_LAUNCHER} "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
2923 "import sys\ntry: import numpy; sys.stdout.write(numpy.__version__)\nexcept:pass\n"
2924 RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2925 OUTPUT_VARIABLE _${_PYTHON_PREFIX}_NumPy_VERSION)
2926 if (NOT _${_PYTHON_PREFIX}_RESULT)
2927 set (${_PYTHON_PREFIX}_NumPy_VERSION "${_${_PYTHON_PREFIX}_NumPy_VERSION}")
2929 unset (${_PYTHON_PREFIX}_NumPy_VERSION)
2932 # final step: set NumPy founded only if Development.Module component is founded as well
2933 set(${_PYTHON_PREFIX}_NumPy_FOUND ${${_PYTHON_PREFIX}_Development.Module_FOUND})
2935 set (${_PYTHON_PREFIX}_NumPy_FOUND FALSE)
2938 if (${_PYTHON_PREFIX}_NumPy_FOUND)
2939 unset (_${_PYTHON_PREFIX}_NumPy_REASON_FAILURE)
2941 # compute and save numpy signature
2942 string (MD5 __${_PYTHON_PREFIX}_NUMPY_SIGNATURE "${_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE}:${_${_PYTHON_PREFIX}_DEVELOPMENT_MODULE_SIGNATURE}:${${_PYTHON_PREFIX}_NumPyINCLUDE_DIR}")
2943 set (_${_PYTHON_PREFIX}_NUMPY_SIGNATURE "${__${_PYTHON_PREFIX}_NUMPY_SIGNATURE}" CACHE INTERNAL "")
2945 unset (_${_PYTHON_PREFIX}_NUMPY_SIGNATURE CACHE)
2948 if (${_PYTHON_PREFIX}_ARTIFACTS_INTERACTIVE)
2949 set (${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR "${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}" CACHE FILEPATH "${_PYTHON_PREFIX} NumPy Include Directory")
2952 _python_mark_as_internal (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR
2953 _${_PYTHON_PREFIX}_NUMPY_SIGNATURE)
2957 if (${_PYTHON_PREFIX}_VERSION_MAJOR AND
2958 NOT ${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
2959 _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}\"")
2962 unset (_${_PYTHON_PREFIX}_REASON_FAILURE)
2963 foreach (_${_PYTHON_PREFIX}_COMPONENT IN ITEMS Interpreter Compiler Development NumPy)
2964 if (_${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_REASON_FAILURE)
2965 string (APPEND _${_PYTHON_PREFIX}_REASON_FAILURE "\n ${_${_PYTHON_PREFIX}_COMPONENT}: ${_${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_REASON_FAILURE}")
2966 unset (_${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_REASON_FAILURE)
2970 include (${CMAKE_CURRENT_LIST_DIR}/../FindPackageHandleStandardArgs.cmake)
2971 find_package_handle_standard_args (${_PYTHON_PREFIX}
2972 REQUIRED_VARS ${_${_PYTHON_PREFIX}_REQUIRED_VARS}
2973 VERSION_VAR ${_PYTHON_PREFIX}_VERSION
2975 REASON_FAILURE_MESSAGE "${_${_PYTHON_PREFIX}_REASON_FAILURE}")
2977 # Create imported targets and helper functions
2978 if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT")
2979 if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
2980 AND ${_PYTHON_PREFIX}_Interpreter_FOUND
2981 AND NOT TARGET ${_PYTHON_PREFIX}::Interpreter)
2982 add_executable (${_PYTHON_PREFIX}::Interpreter IMPORTED)
2983 set_property (TARGET ${_PYTHON_PREFIX}::Interpreter
2984 PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_EXECUTABLE}")
2987 if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
2988 AND ${_PYTHON_PREFIX}_Compiler_FOUND
2989 AND NOT TARGET ${_PYTHON_PREFIX}::Compiler)
2990 add_executable (${_PYTHON_PREFIX}::Compiler IMPORTED)
2991 set_property (TARGET ${_PYTHON_PREFIX}::Compiler
2992 PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_COMPILER}")
2995 if (("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
2996 AND ${_PYTHON_PREFIX}_Development.Module_FOUND)
2997 OR ("Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
2998 AND ${_PYTHON_PREFIX}_Development.Embed_FOUND))
3000 macro (__PYTHON_IMPORT_LIBRARY __name)
3001 if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$"
3002 OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
3003 set (_${_PYTHON_PREFIX}_LIBRARY_TYPE SHARED)
3005 set (_${_PYTHON_PREFIX}_LIBRARY_TYPE STATIC)
3008 if (NOT TARGET ${__name})
3009 add_library (${__name} ${_${_PYTHON_PREFIX}_LIBRARY_TYPE} IMPORTED)
3012 set_property (TARGET ${__name}
3013 PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_INCLUDE_DIRS}")
3015 if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
3016 # System manage shared libraries in two parts: import and runtime
3017 if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
3018 set_property (TARGET ${__name} PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG)
3019 set_target_properties (${__name}
3020 PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
3021 IMPORTED_IMPLIB_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}"
3022 IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
3023 set_target_properties (${__name}
3024 PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
3025 IMPORTED_IMPLIB_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}"
3026 IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
3028 set_target_properties (${__name}
3029 PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C"
3030 IMPORTED_IMPLIB "${${_PYTHON_PREFIX}_LIBRARIES}"
3031 IMPORTED_LOCATION "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
3034 if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
3035 set_property (TARGET ${__name} PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG)
3036 set_target_properties (${__name}
3037 PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
3038 IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
3039 set_target_properties (${__name}
3040 PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
3041 IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}")
3043 set_target_properties (${__name}
3044 PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C"
3045 IMPORTED_LOCATION "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
3049 if (_${_PYTHON_PREFIX}_LIBRARY_TYPE STREQUAL "STATIC")
3050 # extend link information with dependent libraries
3051 _python_get_config_var (_${_PYTHON_PREFIX}_LINK_LIBRARIES LIBS)
3052 if (_${_PYTHON_PREFIX}_LINK_LIBRARIES)
3053 set_property (TARGET ${__name}
3054 PROPERTY INTERFACE_LINK_LIBRARIES ${_${_PYTHON_PREFIX}_LINK_LIBRARIES})
3059 if (${_PYTHON_PREFIX}_Development.Embed_FOUND)
3060 __python_import_library (${_PYTHON_PREFIX}::Python)
3063 if (${_PYTHON_PREFIX}_Development.Module_FOUND)
3064 if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS)
3065 # On Windows/CYGWIN/MSYS, Python::Module is the same as Python::Python
3066 # but ALIAS cannot be used because the imported library is not GLOBAL.
3067 __python_import_library (${_PYTHON_PREFIX}::Module)
3069 if (NOT TARGET ${_PYTHON_PREFIX}::Module)
3070 add_library (${_PYTHON_PREFIX}::Module INTERFACE IMPORTED)
3072 set_property (TARGET ${_PYTHON_PREFIX}::Module
3073 PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_INCLUDE_DIRS}")
3075 # When available, enforce shared library generation with undefined symbols
3077 set_property (TARGET ${_PYTHON_PREFIX}::Module
3078 PROPERTY INTERFACE_LINK_OPTIONS "LINKER:-undefined,dynamic_lookup")
3080 if (CMAKE_SYSTEM_NAME STREQUAL "SunOS")
3081 set_property (TARGET ${_PYTHON_PREFIX}::Module
3082 PROPERTY INTERFACE_LINK_OPTIONS "LINKER:-z,nodefs")
3084 if (CMAKE_SYSTEM_NAME STREQUAL "AIX")
3085 set_property (TARGET ${_PYTHON_PREFIX}::Module
3086 PROPERTY INTERFACE_LINK_OPTIONS "LINKER:-b,erok")
3092 # PYTHON_ADD_LIBRARY (<name> [STATIC|SHARED|MODULE] src1 src2 ... srcN)
3093 # It is used to build modules for python.
3095 function (__${_PYTHON_PREFIX}_ADD_LIBRARY prefix name)
3096 cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY "STATIC;SHARED;MODULE;WITH_SOABI" "" "")
3098 if (prefix STREQUAL "Python2" AND PYTHON_ADD_LIBRARY_WITH_SOABI)
3099 message (AUTHOR_WARNING "FindPython2: Option `WITH_SOABI` is not supported for Python2 and will be ignored.")
3100 unset (PYTHON_ADD_LIBRARY_WITH_SOABI)
3103 if (PYTHON_ADD_LIBRARY_STATIC)
3105 elseif (PYTHON_ADD_LIBRARY_SHARED)
3111 if (type STREQUAL "MODULE" AND NOT TARGET ${prefix}::Module)
3112 message (SEND_ERROR "${prefix}_ADD_LIBRARY: dependent target '${prefix}::Module' is not defined.\n Did you miss to request COMPONENT 'Development.Module'?")
3115 if (NOT type STREQUAL "MODULE" AND NOT TARGET ${prefix}::Python)
3116 message (SEND_ERROR "${prefix}_ADD_LIBRARY: dependent target '${prefix}::Python' is not defined.\n Did you miss to request COMPONENT 'Development.Embed'?")
3120 add_library (${name} ${type} ${PYTHON_ADD_LIBRARY_UNPARSED_ARGUMENTS})
3122 get_property (type TARGET ${name} PROPERTY TYPE)
3124 if (type STREQUAL "MODULE_LIBRARY")
3125 target_link_libraries (${name} PRIVATE ${prefix}::Module)
3126 # customize library name to follow module name rules
3127 set_property (TARGET ${name} PROPERTY PREFIX "")
3128 if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
3129 set_property (TARGET ${name} PROPERTY SUFFIX ".pyd")
3132 if (PYTHON_ADD_LIBRARY_WITH_SOABI AND ${prefix}_SOABI)
3133 get_property (suffix TARGET ${name} PROPERTY SUFFIX)
3135 set (suffix "${CMAKE_SHARED_MODULE_SUFFIX}")
3137 set_property (TARGET ${name} PROPERTY SUFFIX ".${${prefix}_SOABI}${suffix}")
3140 if (PYTHON_ADD_LIBRARY_WITH_SOABI)
3141 message (AUTHOR_WARNING "Find${prefix}: Option `WITH_SOABI` is only supported for `MODULE` library type.")
3143 target_link_libraries (${name} PRIVATE ${prefix}::Python)
3148 if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS AND ${_PYTHON_PREFIX}_NumPy_FOUND
3149 AND NOT TARGET ${_PYTHON_PREFIX}::NumPy AND TARGET ${_PYTHON_PREFIX}::Module)
3150 add_library (${_PYTHON_PREFIX}::NumPy INTERFACE IMPORTED)
3151 set_property (TARGET ${_PYTHON_PREFIX}::NumPy
3152 PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_NumPy_INCLUDE_DIRS}")
3153 target_link_libraries (${_PYTHON_PREFIX}::NumPy INTERFACE ${_PYTHON_PREFIX}::Module)
3159 # Restore CMAKE_FIND_APPBUNDLE
3160 if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE)
3161 set (CMAKE_FIND_APPBUNDLE ${_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE})
3162 unset (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE)
3164 unset (CMAKE_FIND_APPBUNDLE)
3166 # Restore CMAKE_FIND_FRAMEWORK
3167 if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
3168 set (CMAKE_FIND_FRAMEWORK ${_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK})
3169 unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
3171 unset (CMAKE_FIND_FRAMEWORK)