Support.cmake
Go to the documentation of this file.
1 # Distributed under the OSI-approved BSD 3-Clause License. See accompanying
2 # file Copyright.txt or https://cmake.org/licensing for details.
3 
4 #
5 # This file is a "template" file used by various FindPython modules.
6 #
7 
8 if (POLICY CMP0094)
9  cmake_policy (GET CMP0094 _${_PYTHON_PREFIX}_LOOKUP_POLICY)
10 endif ()
11 
12 cmake_policy (VERSION 3.7)
13 
14 if (_${_PYTHON_PREFIX}_LOOKUP_POLICY)
15  cmake_policy (SET CMP0094 ${_${_PYTHON_PREFIX}_LOOKUP_POLICY})
16 endif()
17 
18 #
19 # Initial configuration
20 #
21 if (NOT DEFINED _PYTHON_PREFIX)
22  message (FATAL_ERROR "FindPython: INTERNAL ERROR")
23 endif()
24 if (NOT DEFINED _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
25  message (FATAL_ERROR "FindPython: INTERNAL ERROR")
26 endif()
27 if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL "3")
28  set(_${_PYTHON_PREFIX}_VERSIONS 3.9 3.8 3.7 3.6 3.5 3.4 3.3 3.2 3.1 3.0)
29 elseif (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR EQUAL "2")
30  set(_${_PYTHON_PREFIX}_VERSIONS 2.7 2.6 2.5 2.4 2.3 2.2 2.1 2.0)
31 else()
32  message (FATAL_ERROR "FindPython: INTERNAL ERROR")
33 endif()
34 
35 if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.14)
36  get_property(_${_PYTHON_PREFIX}_CMAKE_ROLE GLOBAL PROPERTY CMAKE_ROLE)
37 else ()
38  set(_${_PYTHON_PREFIX}_CMAKE_ROLE "PROJECT")
39 endif ()
40 
41 #
42 # helper commands
43 #
44 macro (_PYTHON_DISPLAY_FAILURE _PYTHON_MSG)
45  if (${_PYTHON_PREFIX}_FIND_REQUIRED)
46  message (FATAL_ERROR "${_PYTHON_MSG}")
47  else()
48  if (NOT ${_PYTHON_PREFIX}_FIND_QUIETLY)
49  message(STATUS "${_PYTHON_MSG}")
50  endif ()
51  endif()
52 
53  set (${_PYTHON_PREFIX}_FOUND FALSE)
54  string (TOUPPER "${_PYTHON_PREFIX}" _${_PYTHON_PREFIX}_UPPER_PREFIX)
55  set (${_PYTHON_UPPER_PREFIX}_FOUND FALSE)
56  return()
57 endmacro()
58 
59 
61  foreach (var IN LISTS ARGV)
62  if (DEFINED CACHE{${var}})
63  set_property (CACHE ${var} PROPERTY TYPE INTERNAL)
64  endif()
65  endforeach()
66 endfunction()
67 
68 
69 macro (_PYTHON_SELECT_LIBRARY_CONFIGURATIONS _PYTHON_BASENAME)
70  if(NOT DEFINED ${_PYTHON_BASENAME}_LIBRARY_RELEASE)
71  set(${_PYTHON_BASENAME}_LIBRARY_RELEASE "${_PYTHON_BASENAME}_LIBRARY_RELEASE-NOTFOUND")
72  endif()
73  if(NOT DEFINED ${_PYTHON_BASENAME}_LIBRARY_DEBUG)
74  set(${_PYTHON_BASENAME}_LIBRARY_DEBUG "${_PYTHON_BASENAME}_LIBRARY_DEBUG-NOTFOUND")
75  endif()
76 
77  get_property(_PYTHON_isMultiConfig GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
78  if (${_PYTHON_BASENAME}_LIBRARY_DEBUG AND ${_PYTHON_BASENAME}_LIBRARY_RELEASE AND
79  NOT ${_PYTHON_BASENAME}_LIBRARY_DEBUG STREQUAL ${_PYTHON_BASENAME}_LIBRARY_RELEASE AND
80  (_PYTHON_isMultiConfig OR CMAKE_BUILD_TYPE))
81  # if the generator is multi-config or if CMAKE_BUILD_TYPE is set for
82  # single-config generators, set optimized and debug libraries
83  set (${_PYTHON_BASENAME}_LIBRARIES "")
84  foreach (_PYTHON_libname IN LISTS ${_PYTHON_BASENAME}_LIBRARY_RELEASE)
85  list( APPEND ${_PYTHON_BASENAME}_LIBRARIES optimized "${_PYTHON_libname}")
86  endforeach()
87  foreach (_PYTHON_libname IN LISTS ${_PYTHON_BASENAME}_LIBRARY_DEBUG)
88  list( APPEND ${_PYTHON_BASENAME}_LIBRARIES debug "${_PYTHON_libname}")
89  endforeach()
90  elseif (${_PYTHON_BASENAME}_LIBRARY_RELEASE)
91  set (${_PYTHON_BASENAME}_LIBRARIES "${${_PYTHON_BASENAME}_LIBRARY_RELEASE}")
92  elseif (${_PYTHON_BASENAME}_LIBRARY_DEBUG)
93  set (${_PYTHON_BASENAME}_LIBRARIES "${${_PYTHON_BASENAME}_LIBRARY_DEBUG}")
94  else()
95  set (${_PYTHON_BASENAME}_LIBRARIES "${_PYTHON_BASENAME}_LIBRARY-NOTFOUND")
96  endif()
97 endmacro()
98 
99 
101  set (${_PYTHON_PREFIX}_FRAMEWORKS)
102  if (CMAKE_HOST_APPLE OR APPLE)
103  file(TO_CMAKE_PATH "$ENV{CMAKE_FRAMEWORK_PATH}" _pff_CMAKE_FRAMEWORK_PATH)
104  set (_pff_frameworks ${CMAKE_FRAMEWORK_PATH}
105  ${_pff_CMAKE_FRAMEWORK_PATH}
106  ~/Library/Frameworks
107  /usr/local/Frameworks
108  ${CMAKE_SYSTEM_FRAMEWORK_PATH})
109  if (_pff_frameworks) # XXX(cmake-3.14)
110  list (REMOVE_DUPLICATES _pff_frameworks)
111  endif ()
112  foreach (_pff_framework IN LISTS _pff_frameworks)
113  if (EXISTS ${_pff_framework}/Python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}.framework)
114  list (APPEND ${_PYTHON_PREFIX}_FRAMEWORKS ${_pff_framework}/Python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}.framework)
115  endif()
116  if (EXISTS ${_pff_framework}/Python.framework)
117  list (APPEND ${_PYTHON_PREFIX}_FRAMEWORKS ${_pff_framework}/Python.framework)
118  endif()
119  endforeach()
120  unset (_pff_frameworks)
121  unset (_pff_framework)
122  endif()
123 endmacro()
124 
125 function (_PYTHON_GET_FRAMEWORKS _PYTHON_PGF_FRAMEWORK_PATHS _PYTHON_VERSION)
126  set (_PYTHON_FRAMEWORK_PATHS)
127  foreach (_PYTHON_FRAMEWORK IN LISTS ${_PYTHON_PREFIX}_FRAMEWORKS)
128  list (APPEND _PYTHON_FRAMEWORK_PATHS
129  "${_PYTHON_FRAMEWORK}/Versions/${_PYTHON_VERSION}")
130  endforeach()
131  set (${_PYTHON_PGF_FRAMEWORK_PATHS} ${_PYTHON_FRAMEWORK_PATHS} PARENT_SCOPE)
132 endfunction()
133 
134 function (_PYTHON_GET_REGISTRIES _PYTHON_PGR_REGISTRY_PATHS _PYTHON_VERSION)
135  string (REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${_PYTHON_VERSION})
136  set (${_PYTHON_PGR_REGISTRY_PATHS}
137  [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
138  [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
139  [HKEY_CURRENT_USER\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}\\InstallPath]
140  [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_PYTHON_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
141  [HKEY_CURRENT_USER\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_PYTHON_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
142  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
143  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
144  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\PythonCore\\${_PYTHON_VERSION}\\InstallPath]
145  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_PYTHON_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH}\\InstallPath]
146  [HKEY_LOCAL_MACHINE\\SOFTWARE\\Python\\ContinuumAnalytics\\Anaconda${_PYTHON_VERSION_NO_DOTS}-${_${_PYTHON_PREFIX}_ARCH2}\\InstallPath]
147  PARENT_SCOPE)
148 endfunction()
149 
150 
151 function (_PYTHON_GET_ABIFLAGS _PGABIFLAGS)
152  set (abiflags)
153  list (GET _${_PYTHON_PREFIX}_FIND_ABI 0 pydebug)
154  list (GET _${_PYTHON_PREFIX}_FIND_ABI 1 pymalloc)
155  list (GET _${_PYTHON_PREFIX}_FIND_ABI 2 unicode)
156 
157  if (pymalloc STREQUAL "ANY" AND unicode STREQUAL "ANY")
158  set (abiflags "mu" "m" "u" "")
159  elseif (pymalloc STREQUAL "ANY" AND unicode STREQUAL "ON")
160  set (abiflags "mu" "u")
161  elseif (pymalloc STREQUAL "ANY" AND unicode STREQUAL "OFF")
162  set (abiflags "m" "")
163  elseif (pymalloc STREQUAL "ON" AND unicode STREQUAL "ANY")
164  set (abiflags "mu" "m")
165  elseif (pymalloc STREQUAL "ON" AND unicode STREQUAL "ON")
166  set (abiflags "mu")
167  elseif (pymalloc STREQUAL "ON" AND unicode STREQUAL "OFF")
168  set (abiflags "m")
169  elseif (pymalloc STREQUAL "ON" AND unicode STREQUAL "ANY")
170  set (abiflags "u" "")
171  elseif (pymalloc STREQUAL "OFF" AND unicode STREQUAL "ON")
172  set (abiflags "u")
173  endif()
174 
175  if (pydebug STREQUAL "ON")
176  if (abiflags)
177  list (TRANSFORM abiflags PREPEND "d")
178  else()
179  set (abiflags "d")
180  endif()
181  elseif (pydebug STREQUAL "ANY")
182  if (abiflags)
183  set (flags "${abiflags}")
184  list (TRANSFORM flags PREPEND "d")
185  list (APPEND abiflags "${flags}")
186  else()
187  set (abiflags "" "d")
188  endif()
189  endif()
190 
191  set (${_PGABIFLAGS} "${abiflags}" PARENT_SCOPE)
192 endfunction()
193 
194 function (_PYTHON_GET_PATH_SUFFIXES _PYTHON_PGPS_PATH_SUFFIXES)
195  cmake_parse_arguments (PARSE_ARGV 1 _PGPS "LIBRARY;INCLUDE" "VERSION" "")
196 
197  if (DEFINED _${_PYTHON_PREFIX}_ABIFLAGS)
198  set (abi "${_${_PYTHON_PREFIX}_ABIFLAGS}")
199  else()
200  set (abi "mu" "m" "u" "")
201  endif()
202 
203  set (path_suffixes)
204  if (_PGPS_LIBRARY)
205  if (CMAKE_LIBRARY_ARCHITECTURE)
206  list (APPEND path_suffixes lib/${CMAKE_LIBRARY_ARCHITECTURE})
207  endif()
208  list (APPEND path_suffixes lib libs)
209 
210  if (CMAKE_LIBRARY_ARCHITECTURE)
211  set (suffixes "${abi}")
212  if (suffixes)
213  list (TRANSFORM suffixes PREPEND "lib/python${_PGPS_VERSION}/config-${_PGPS_VERSION}")
214  list (TRANSFORM suffixes APPEND "-${CMAKE_LIBRARY_ARCHITECTURE}")
215  else()
216  set (suffixes "lib/python${_PGPS_VERSION}/config-${_PGPS_VERSION}-${CMAKE_LIBRARY_ARCHITECTURE}")
217  endif()
218  list (APPEND path_suffixes ${suffixes})
219  endif()
220  set (suffixes "${abi}")
221  if (suffixes)
222  list (TRANSFORM suffixes PREPEND "lib/python${_PGPS_VERSION}/config-${_PGPS_VERSION}")
223  else()
224  set (suffixes "lib/python${_PGPS_VERSION}/config-${_PGPS_VERSION}")
225  endif()
226  list (APPEND path_suffixes ${suffixes})
227  elseif (_PGPS_INCLUDE)
228  set (suffixes "${abi}")
229  if (suffixes)
230  list (TRANSFORM suffixes PREPEND "include/python${_PGPS_VERSION}")
231  else()
232  set (suffixes "include/python${_PGPS_VERSION}")
233  endif()
234  list (APPEND path_suffixes ${suffixes} include)
235  endif()
236 
237  set (${_PYTHON_PGPS_PATH_SUFFIXES} ${path_suffixes} PARENT_SCOPE)
238 endfunction()
239 
240 function (_PYTHON_GET_NAMES _PYTHON_PGN_NAMES)
241  cmake_parse_arguments (PARSE_ARGV 1 _PGN "POSIX;EXECUTABLE;CONFIG;LIBRARY;WIN32;DEBUG" "VERSION" "")
242 
243  set (names)
244 
245  if (_PGN_WIN32)
246  string (REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${_PGN_VERSION})
247 
248  set (name python${_PYTHON_VERSION_NO_DOTS})
249  if (_PGN_DEBUG)
250  string (APPEND name "_d")
251  endif()
252 
253  list (APPEND names "${name}")
254  endif()
255 
256  if (_PGN_POSIX)
257  if (DEFINED _${_PYTHON_PREFIX}_ABIFLAGS)
258  set (abi "${_${_PYTHON_PREFIX}_ABIFLAGS}")
259  else()
260  if (_PGN_EXECUTABLE OR _PGN_CONFIG)
261  set (abi "")
262  else()
263  set (abi "mu" "m" "u" "")
264  endif()
265  endif()
266 
267  if (abi)
268  if (_PGN_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
269  set (abinames "${abi}")
270  list (TRANSFORM abinames PREPEND "${CMAKE_LIBRARY_ARCHITECTURE}-python${_PGN_VERSION}")
271  list (TRANSFORM abinames APPEND "-config")
272  list (APPEND names ${abinames})
273  endif()
274  set (abinames "${abi}")
275  list (TRANSFORM abinames PREPEND "python${_PGN_VERSION}")
276  if (_PGN_CONFIG)
277  list (TRANSFORM abinames APPEND "-config")
278  endif()
279  list (APPEND names ${abinames})
280  else()
281  if (_PGN_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
282  set (abinames "${CMAKE_LIBRARY_ARCHITECTURE}-python${_PGN_VERSION}")
283  endif()
284  list (APPEND abinames "python${_PGN_VERSION}")
285  if (_PGN_CONFIG)
286  list (TRANSFORM abinames APPEND "-config")
287  endif()
288  list (APPEND names ${abinames})
289  endif()
290  endif()
291 
292  set (${_PYTHON_PGN_NAMES} ${names} PARENT_SCOPE)
293 endfunction()
294 
295 function (_PYTHON_GET_CONFIG_VAR _PYTHON_PGCV_VALUE NAME)
296  unset (${_PYTHON_PGCV_VALUE} PARENT_SCOPE)
297 
298  if (NOT NAME MATCHES "^(PREFIX|ABIFLAGS|CONFIGDIR|INCLUDES|LIBS|SOABI)$")
299  return()
300  endif()
301 
302  if (_${_PYTHON_PREFIX}_CONFIG)
303  if (NAME STREQUAL "SOABI")
304  set (config_flag "--extension-suffix")
305  else()
306  set (config_flag "--${NAME}")
307  endif()
308  string (TOLOWER "${config_flag}" config_flag)
309  execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" ${config_flag}
310  RESULT_VARIABLE _result
311  OUTPUT_VARIABLE _values
312  ERROR_QUIET
313  OUTPUT_STRIP_TRAILING_WHITESPACE)
314  if (_result)
315  unset (_values)
316  else()
317  if (NAME STREQUAL "INCLUDES")
318  # do some clean-up
319  string (REGEX MATCHALL "(-I|-iwithsysroot)[ ]*[^ ]+" _values "${_values}")
320  string (REGEX REPLACE "(-I|-iwithsysroot)[ ]*" "" _values "${_values}")
321  if (_values) # XXX(cmake-3.14)
322  list (REMOVE_DUPLICATES _values)
323  endif ()
324  elseif (NAME STREQUAL "SOABI")
325  # clean-up: remove prefix character and suffix
326  string (REGEX REPLACE "^[.-](.+)(${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.(so|pyd))$" "\\1" _values "${_values}")
327  endif()
328  endif()
329  endif()
330 
331  if (_${_PYTHON_PREFIX}_EXECUTABLE AND NOT CMAKE_CROSSCOMPILING)
332  if (NAME STREQUAL "PREFIX")
333  execute_process (COMMAND "${_${_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 '']))"
334  RESULT_VARIABLE _result
335  OUTPUT_VARIABLE _values
336  ERROR_QUIET
337  OUTPUT_STRIP_TRAILING_WHITESPACE)
338  if (_result)
339  unset (_values)
340  else()
341  if (_values) # XXX(cmake-3.14)
342  list (REMOVE_DUPLICATES _values)
343  endif ()
344  endif()
345  elseif (NAME STREQUAL "INCLUDES")
346  if (WIN32)
347  set (_scheme "nt")
348  else()
349  set (_scheme "posix_prefix")
350  endif()
351  execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "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}')]))"
352  RESULT_VARIABLE _result
353  OUTPUT_VARIABLE _values
354  ERROR_QUIET
355  OUTPUT_STRIP_TRAILING_WHITESPACE)
356  if (_result)
357  unset (_values)
358  else()
359  if (_values) # XXX(cmake-3.14)
360  list (REMOVE_DUPLICATES _values)
361  endif ()
362  endif()
363  elseif (NAME STREQUAL "SOABI")
364  execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "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 '']))"
365  RESULT_VARIABLE _result
366  OUTPUT_VARIABLE _soabi
367  ERROR_QUIET
368  OUTPUT_STRIP_TRAILING_WHITESPACE)
369  if (_result)
370  unset (_values)
371  else()
372  foreach (_item IN LISTS _soabi)
373  if (_item)
374  set (_values "${_item}")
375  break()
376  endif()
377  endforeach()
378  if (_values)
379  # clean-up: remove prefix character and suffix
380  string (REGEX REPLACE "^[.-](.+)(${CMAKE_SHARED_LIBRARY_SUFFIX}|\\.(so|pyd))$" "\\1" _values "${_values}")
381  endif()
382  endif()
383  else()
384  set (config_flag "${NAME}")
385  if (NAME STREQUAL "CONFIGDIR")
386  set (config_flag "LIBPL")
387  endif()
388  execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "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}'))"
389  RESULT_VARIABLE _result
390  OUTPUT_VARIABLE _values
391  ERROR_QUIET
392  OUTPUT_STRIP_TRAILING_WHITESPACE)
393  if (_result)
394  unset (_values)
395  endif()
396  endif()
397  endif()
398 
399  if (config_flag STREQUAL "ABIFLAGS")
400  set (${_PYTHON_PGCV_VALUE} "${_values}" PARENT_SCOPE)
401  return()
402  endif()
403 
404  if (NOT _values OR _values STREQUAL "None")
405  return()
406  endif()
407 
408  if (NAME STREQUAL "LIBS")
409  # do some clean-up
410  string (REGEX MATCHALL "-(l|framework)[ ]*[^ ]+" _values "${_values}")
411  # remove elements relative to python library itself
412  if (_values) # XXX(cmake-3.14)
413  list (FILTER _values EXCLUDE REGEX "-lpython")
414  list (REMOVE_DUPLICATES _values)
415  endif ()
416  endif()
417 
418  if (WIN32 AND NAME MATCHES "^(PREFIX|CONFIGDIR|INCLUDES)$")
419  file (TO_CMAKE_PATH "${_values}" _values)
420  endif()
421 
422  set (${_PYTHON_PGCV_VALUE} "${_values}" PARENT_SCOPE)
423 endfunction()
424 
426  cmake_parse_arguments (PARSE_ARGV 0 _PGV "LIBRARY;INCLUDE" "PREFIX" "")
427 
428  unset (${_PGV_PREFIX}VERSION PARENT_SCOPE)
429  unset (${_PGV_PREFIX}VERSION_MAJOR PARENT_SCOPE)
430  unset (${_PGV_PREFIX}VERSION_MINOR PARENT_SCOPE)
431  unset (${_PGV_PREFIX}VERSION_PATCH PARENT_SCOPE)
432  unset (${_PGV_PREFIX}ABI PARENT_SCOPE)
433 
434  if (_PGV_LIBRARY)
435  # retrieve version and abi from library name
436  if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
437  # extract version from library name
438  if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "python([23])([0-9]+)")
439  set (${_PGV_PREFIX}VERSION_MAJOR "${CMAKE_MATCH_1}" PARENT_SCOPE)
440  set (${_PGV_PREFIX}VERSION_MINOR "${CMAKE_MATCH_2}" PARENT_SCOPE)
441  set (${_PGV_PREFIX}VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}" PARENT_SCOPE)
442  set (${_PGV_PREFIX}ABI "" PARENT_SCOPE)
443  elseif (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "python([23])\\.([0-9]+)([dmu]*)")
444  set (${_PGV_PREFIX}VERSION_MAJOR "${CMAKE_MATCH_1}" PARENT_SCOPE)
445  set (${_PGV_PREFIX}VERSION_MINOR "${CMAKE_MATCH_2}" PARENT_SCOPE)
446  set (${_PGV_PREFIX}VERSION "${CMAKE_MATCH_1}.${CMAKE_MATCH_2}" PARENT_SCOPE)
447  set (${_PGV_PREFIX}ABI "${CMAKE_MATCH_3}" PARENT_SCOPE)
448  endif()
449  endif()
450  else()
451  if (_${_PYTHON_PREFIX}_INCLUDE_DIR)
452  # retrieve version from header file
453  file (STRINGS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}/patchlevel.h" version
454  REGEX "^#define[ \t]+PY_VERSION[ \t]+\"[^\"]+\"")
455  string (REGEX REPLACE "^#define[ \t]+PY_VERSION[ \t]+\"([^\"]+)\".*" "\\1"
456  version "${version}")
457  string (REGEX MATCHALL "[0-9]+" versions "${version}")
458  list (GET versions 0 version_major)
459  list (GET versions 1 version_minor)
460  list (GET versions 2 version_patch)
461 
462  set (${_PGV_PREFIX}VERSION "${version_major}.${version_minor}" PARENT_SCOPE)
463  set (${_PGV_PREFIX}VERSION_MAJOR ${version_major} PARENT_SCOPE)
464  set (${_PGV_PREFIX}VERSION_MINOR ${version_minor} PARENT_SCOPE)
465  set (${_PGV_PREFIX}VERSION_PATCH ${version_patch} PARENT_SCOPE)
466 
467  # compute ABI flags
468  if (version_major VERSION_GREATER "2")
469  file (STRINGS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}/pyconfig.h" config REGEX "(Py_DEBUG|WITH_PYMALLOC|Py_UNICODE_SIZE|MS_WIN32)")
470  set (abi)
471  if (config MATCHES "#[ ]*define[ ]+MS_WIN32")
472  # ABI not used on Windows
473  set (abi "")
474  else()
475  if (config MATCHES "#[ ]*define[ ]+Py_DEBUG[ ]+1")
476  string (APPEND abi "d")
477  endif()
478  if (config MATCHES "#[ ]*define[ ]+WITH_PYMALLOC[ ]+1")
479  string (APPEND abi "m")
480  endif()
481  if (config MATCHES "#[ ]*define[ ]+Py_UNICODE_SIZE[ ]+4")
482  string (APPEND abi "u")
483  endif()
484  set (${_PGV_PREFIX}ABI "${abi}" PARENT_SCOPE)
485  endif()
486  else()
487  # ABI not supported
488  set (${_PGV_PREFIX}ABI "" PARENT_SCOPE)
489  endif()
490  endif()
491  endif()
492 endfunction()
493 
494 
496  if (NOT _${_PYTHON_PREFIX}_EXECUTABLE)
497  return()
498  endif()
499 
500  cmake_parse_arguments (PARSE_ARGV 0 _PVI "EXACT;CHECK_EXISTS" "" "")
501  if (_PVI_UNPARSED_ARGUMENTS)
502  set (expected_version ${_PVI_UNPARSED_ARGUMENTS})
503  else()
504  unset (expected_version)
505  endif()
506 
507  if (_PVI_CHECK_EXISTS AND NOT EXISTS "${_${_PYTHON_PREFIX}_EXECUTABLE}")
508  # interpreter does not exist anymore
509  set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Cannot find the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
510  set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
511  return()
512  endif()
513 
514  # validate ABI compatibility
515  if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI)
516  execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
517  "import sys; sys.stdout.write(sys.abiflags)"
518  RESULT_VARIABLE result
519  OUTPUT_VARIABLE abi
520  ERROR_QUIET
521  OUTPUT_STRIP_TRAILING_WHITESPACE)
522  if (result)
523  # assume ABI is not supported
524  set (abi "")
525  endif()
526  if (NOT abi IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
527  # incompatible ABI
528  set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Wrong ABI for the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
529  set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
530  return()
531  endif()
532  endif()
533 
534  get_filename_component (python_name "${_${_PYTHON_PREFIX}_EXECUTABLE}" NAME)
535 
536  if (expected_version AND NOT python_name STREQUAL "python${expected_version}${abi}${CMAKE_EXECUTABLE_SUFFIX}")
537  # executable found must have a specific version
538  execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
539  "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:2]]))"
540  RESULT_VARIABLE result
541  OUTPUT_VARIABLE version
542  ERROR_QUIET
543  OUTPUT_STRIP_TRAILING_WHITESPACE)
544  if (result)
545  # interpreter is not usable
546  set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Cannot use the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
547  set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
548  else()
549  if (_PVI_EXACT AND NOT version VERSION_EQUAL expected_version)
550  # interpreter has wrong version
551  set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Wrong version for the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
552  set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
553  else()
554  # check that version is OK
555  string(REGEX REPLACE "^([0-9]+)\\..*$" "\\1" major_version "${version}")
556  string(REGEX REPLACE "^([0-9]+)\\.?.*$" "\\1" expected_major_version "${expected_version}")
557  if (NOT major_version VERSION_EQUAL expected_major_version
558  OR NOT version VERSION_GREATER_EQUAL expected_version)
559  set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Wrong version for the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
560  set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
561  endif()
562  endif()
563  endif()
564  if (NOT _${_PYTHON_PREFIX}_EXECUTABLE)
565  return()
566  endif()
567  else()
568  if (NOT python_name STREQUAL "python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}${CMAKE_EXECUTABLE_SUFFIX}")
569  # executable found do not have version in name
570  # ensure major version is OK
571  execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
572  "import sys; sys.stdout.write(str(sys.version_info[0]))"
573  RESULT_VARIABLE result
574  OUTPUT_VARIABLE version
575  ERROR_QUIET
576  OUTPUT_STRIP_TRAILING_WHITESPACE)
577  if (result OR NOT version EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
578  # interpreter not usable or has wrong major version
579  if (result)
580  set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Cannot use the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
581  else()
582  set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Wrong major version for the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
583  endif()
584  set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
585  return()
586  endif()
587  endif()
588  endif()
589 
590  if (CMAKE_SIZEOF_VOID_P AND ("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
591  OR "Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
592  AND NOT CMAKE_CROSSCOMPILING)
593  # In this case, interpreter must have same architecture as environment
594  execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
595  "import sys, struct; sys.stdout.write(str(struct.calcsize(\"P\")))"
596  RESULT_VARIABLE result
597  OUTPUT_VARIABLE size
598  ERROR_QUIET
599  OUTPUT_STRIP_TRAILING_WHITESPACE)
600  if (result OR NOT size EQUAL CMAKE_SIZEOF_VOID_P)
601  # interpreter not usable or has wrong architecture
602  if (result)
603  set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Cannot use the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
604  else()
605  set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Wrong architecture for the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
606  endif()
607  set_property (CACHE _${_PYTHON_PREFIX}_EXECUTABLE PROPERTY VALUE "${_PYTHON_PREFIX}_EXECUTABLE-NOTFOUND")
608  return()
609  endif()
610  endif()
611 endfunction()
612 
613 
614 function (_PYTHON_VALIDATE_COMPILER expected_version)
615  if (NOT _${_PYTHON_PREFIX}_COMPILER)
616  return()
617  endif()
618 
619  cmake_parse_arguments (_PVC "EXACT;CHECK_EXISTS" "" "" ${ARGN})
620  if (_PVC_UNPARSED_ARGUMENTS)
621  set (major_version FALSE)
622  set (expected_version ${_PVC_UNPARSED_ARGUMENTS})
623  else()
624  set (major_version TRUE)
625  set (expected_version ${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR})
626  set (_PVC_EXACT TRUE)
627  endif()
628 
629  if (_PVC_CHECK_EXISTS AND NOT EXISTS "${_${_PYTHON_PREFIX}_COMPILER}")
630  # Compiler does not exist anymore
631  set (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE "Cannot find the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
632  set_property (CACHE _${_PYTHON_PREFIX}_COMPILER PROPERTY VALUE "${_PYTHON_PREFIX}_COMPILER-NOTFOUND")
633  return()
634  endif()
635 
636  # retrieve python environment version from compiler
637  set (working_dir "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir")
638  if (major_version)
639  # check only major version
640  file (WRITE "${working_dir}/version.py" "import sys; sys.stdout.write(str(sys.version_info[0]))")
641  else()
642  file (WRITE "${working_dir}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:2]]))\n")
643  endif()
644  execute_process (COMMAND "${_${_PYTHON_PREFIX}_COMPILER}" /target:exe /embed "${working_dir}/version.py"
645  WORKING_DIRECTORY "${working_dir}"
646  OUTPUT_QUIET
647  ERROR_QUIET
648  OUTPUT_STRIP_TRAILING_WHITESPACE)
649  execute_process (COMMAND "${working_dir}/version"
650  WORKING_DIRECTORY "${working_dir}"
651  RESULT_VARIABLE result
652  OUTPUT_VARIABLE version
653  ERROR_QUIET)
654  file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}")
655 
656  if (result OR (_PVC_EXACT AND NOT version VERSION_EQUAL expected_version) OR (version VERSION_LESS expected_version))
657  # Compiler not usable or has wrong version
658  if (result)
659  set (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE "Cannot use the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
660  else()
661  set (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE "Wrong version for the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
662  endif()
663  set_property (CACHE _${_PYTHON_PREFIX}_COMPILER PROPERTY VALUE "${_PYTHON_PREFIX}_COMPILER-NOTFOUND")
664  endif()
665 endfunction()
666 
667 
669  if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
670  unset (_${_PYTHON_PREFIX}_LIBRARY_DEBUG)
671  return()
672  endif()
673 
674  cmake_parse_arguments (PARSE_ARGV 0 _PVL "EXACT;CHECK_EXISTS" "" "")
675  if (_PVL_UNPARSED_ARGUMENTS)
676  set (expected_version ${_PVL_UNPARSED_ARGUMENTS})
677  else()
678  unset (expected_version)
679  endif()
680 
681  if (_PVL_CHECK_EXISTS AND NOT EXISTS "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
682  # library does not exist anymore
683  set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Cannot find the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"")
684  set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
685  if (WIN32)
686  set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_DEBUG PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_DEBUG-NOTFOUND")
687  endif()
688  set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
689  return()
690  endif()
691 
692  # retrieve version and abi from library name
693  _python_get_version (LIBRARY PREFIX lib_)
694 
695  if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND NOT lib_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
696  # incompatible ABI
697  set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Wrong ABI for the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"")
698  set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
699  else()
700  if (expected_version)
701  if ((_PVL_EXACT AND NOT lib_VERSION VERSION_EQUAL expected_version) OR (lib_VERSION VERSION_LESS expected_version))
702  # library has wrong version
703  set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Wrong version for the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"")
704  set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
705  endif()
706  else()
707  if (NOT lib_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
708  # library has wrong major version
709  set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Wrong major version for the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"")
710  set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
711  endif()
712  endif()
713  endif()
714 
715  if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
716  if (WIN32)
717  set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_DEBUG PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_DEBUG-NOTFOUND")
718  endif()
719  unset (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE CACHE)
720  unset (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG CACHE)
721  set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
722  endif()
723 endfunction()
724 
725 
727  if (NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
728  return()
729  endif()
730 
731  cmake_parse_arguments (PARSE_ARGV 0 _PVID "EXACT;CHECK_EXISTS" "" "")
732  if (_PVID_UNPARSED_ARGUMENTS)
733  set (expected_version ${_PVID_UNPARSED_ARGUMENTS})
734  else()
735  unset (expected_version)
736  endif()
737 
738  if (_PVID_CHECK_EXISTS AND NOT EXISTS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}")
739  # include file does not exist anymore
740  set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Cannot find the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"")
741  set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
742  return()
743  endif()
744 
745  # retrieve version from header file
746  _python_get_version (INCLUDE PREFIX inc_)
747 
748  if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND NOT inc_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
749  # incompatible ABI
750  set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Wrong ABI for the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"")
751  set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
752  else()
753  if (expected_version)
754  if ((_PVID_EXACT AND NOT inc_VERSION VERSION_EQUAL expected_version) OR (inc_VERSION VERSION_LESS expected_version))
755  # include dir has wrong version
756  set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Wrong version for the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"")
757  set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
758  endif()
759  else()
760  if (NOT inc_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
761  # include dir has wrong major version
762  set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Wrong major version for the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"")
763  set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
764  endif()
765  endif()
766  endif()
767 endfunction()
768 
769 
770 function (_PYTHON_FIND_RUNTIME_LIBRARY _PYTHON_LIB)
771  string (REPLACE "_RUNTIME" "" _PYTHON_LIB "${_PYTHON_LIB}")
772  # look at runtime part on systems supporting it
773  if (CMAKE_SYSTEM_NAME STREQUAL "Windows" OR
774  (CMAKE_SYSTEM_NAME MATCHES "MSYS|CYGWIN"
775  AND ${_PYTHON_LIB} MATCHES "${CMAKE_IMPORT_LIBRARY_SUFFIX}$"))
776  set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX})
777  # MSYS has a special syntax for runtime libraries
778  if (CMAKE_SYSTEM_NAME MATCHES "MSYS")
779  list (APPEND CMAKE_FIND_LIBRARY_PREFIXES "msys-")
780  endif()
781  find_library (${ARGV})
782  endif()
783 endfunction()
784 
785 
786 function (_PYTHON_SET_LIBRARY_DIRS _PYTHON_SLD_RESULT)
787  unset (_PYTHON_DIRS)
788  set (_PYTHON_LIBS ${ARGN})
789  foreach (_PYTHON_LIB IN LISTS _PYTHON_LIBS)
790  if (${_PYTHON_LIB})
791  get_filename_component (_PYTHON_DIR "${${_PYTHON_LIB}}" DIRECTORY)
792  list (APPEND _PYTHON_DIRS "${_PYTHON_DIR}")
793  endif()
794  endforeach()
795  if (_PYTHON_DIRS)
796  list (REMOVE_DUPLICATES _PYTHON_DIRS)
797  endif()
798  set (${_PYTHON_SLD_RESULT} ${_PYTHON_DIRS} PARENT_SCOPE)
799 endfunction()
800 
801 
802 function (_PYTHON_SET_DEVELOPMENT_MODULE_FOUND module)
803  if ("Development.${module}" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
804  string(TOUPPER "${module}" id)
805  set (module_found TRUE)
806 
807  if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS
808  AND NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
809  set (module_found FALSE)
810  endif()
811  if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS
812  AND NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
813  set (module_found FALSE)
814  endif()
815 
816  set (${_PYTHON_PREFIX}_Development.${module}_FOUND ${module_found} PARENT_SCOPE)
817  endif()
818 endfunction()
819 
820 
821 # If major version is specified, it must be the same as internal major version
822 if (DEFINED ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR
823  AND NOT ${_PYTHON_PREFIX}_FIND_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
824  _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}\"")
825 endif()
826 
827 
828 # handle components
829 if (NOT ${_PYTHON_PREFIX}_FIND_COMPONENTS)
830  set (${_PYTHON_PREFIX}_FIND_COMPONENTS Interpreter)
831  set (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter TRUE)
832 endif()
833 if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
834  list (APPEND ${_PYTHON_PREFIX}_FIND_COMPONENTS "Interpreter" "Development.Module")
835 endif()
836 if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
837  list (APPEND ${_PYTHON_PREFIX}_FIND_COMPONENTS "Development.Module" "Development.Embed")
838 endif()
839 if (${_PYTHON_PREFIX}_FIND_COMPONENTS) # XXX(cmake-3.14)
840  list (REMOVE_DUPLICATES ${_PYTHON_PREFIX}_FIND_COMPONENTS)
841 endif ()
842 foreach (_${_PYTHON_PREFIX}_COMPONENT IN ITEMS Interpreter Compiler Development Development.Module Development.Embed NumPy)
843  set (${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_FOUND FALSE)
844 endforeach()
845 if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development)
846  set (${_PYTHON_PREFIX}_FIND_REQUIRED_Development.Module TRUE)
847  set (${_PYTHON_PREFIX}_FIND_REQUIRED_Development.Embed TRUE)
848 endif()
849 
850 unset (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
851 unset (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS)
852 unset (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS)
853 if ("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
854  if (CMAKE_SYSTEM_NAME MATCHES "^(Windows.*|CYGWIN|MSYS)$")
855  list (APPEND _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS "LIBRARY")
856  endif()
857  list (APPEND _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS "INCLUDE_DIR")
858 endif()
859 if ("Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
860  list (APPEND _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS "LIBRARY" "INCLUDE_DIR")
861 endif()
862 set (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS ${_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS} ${_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS})
863 if (_${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS) # XXX(cmake-3.14)
864  list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
865 endif ()
866 
867 unset (_${_PYTHON_PREFIX}_FIND_VERSIONS)
868 
869 # Set versions to search
870 ## default: search any version
871 set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSIONS})
872 
873 if (${_PYTHON_PREFIX}_FIND_VERSION_COUNT GREATER "1")
874  if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
875  set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_FIND_VERSION_MAJOR}.${${_PYTHON_PREFIX}_FIND_VERSION_MINOR})
876  else()
877  unset (_${_PYTHON_PREFIX}_FIND_VERSIONS)
878  # add all compatible versions
879  foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_VERSIONS)
880  if (_${_PYTHON_PREFIX}_VERSION VERSION_GREATER_EQUAL ${_PYTHON_PREFIX}_FIND_VERSION)
881  list (APPEND _${_PYTHON_PREFIX}_FIND_VERSIONS ${_${_PYTHON_PREFIX}_VERSION})
882  endif()
883  endforeach()
884  endif()
885 endif()
886 
887 # Set ABIs to search
888 ## default: search any ABI
889 if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR VERSION_LESS "3")
890  # ABI not supported
891  unset (_${_PYTHON_PREFIX}_FIND_ABI)
892  set (_${_PYTHON_PREFIX}_ABIFLAGS "")
893 else()
894  unset (_${_PYTHON_PREFIX}_FIND_ABI)
895  unset (_${_PYTHON_PREFIX}_ABIFLAGS)
896  if (DEFINED ${_PYTHON_PREFIX}_FIND_ABI)
897  # normalization
898  string (TOUPPER "${${_PYTHON_PREFIX}_FIND_ABI}" _${_PYTHON_PREFIX}_FIND_ABI)
899  list (TRANSFORM _${_PYTHON_PREFIX}_FIND_ABI REPLACE "^(TRUE|Y(ES)?|1)$" "ON")
900  list (TRANSFORM _${_PYTHON_PREFIX}_FIND_ABI REPLACE "^(FALSE|N(O)?|0)$" "OFF")
901  if (NOT _${_PYTHON_PREFIX}_FIND_ABI MATCHES "^(ON|OFF|ANY);(ON|OFF|ANY);(ON|OFF|ANY)$")
902  message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${${_PYTHON_PREFIX}_FIND_ABI}: invalid value for '${_PYTHON_PREFIX}_FIND_ABI'. Ignore it")
903  unset (_${_PYTHON_PREFIX}_FIND_ABI)
904  endif()
905  _python_get_abiflags (_${_PYTHON_PREFIX}_ABIFLAGS)
906  endif()
907 endif()
908 unset (${_PYTHON_PREFIX}_SOABI)
909 
910 # Define lookup strategy
911 if (_${_PYTHON_PREFIX}_LOOKUP_POLICY STREQUAL "NEW")
912  set (_${_PYTHON_PREFIX}_FIND_STRATEGY "LOCATION")
913 else()
914  set (_${_PYTHON_PREFIX}_FIND_STRATEGY "VERSION")
915 endif()
916 if (DEFINED ${_PYTHON_PREFIX}_FIND_STRATEGY)
917  if (NOT ${_PYTHON_PREFIX}_FIND_STRATEGY MATCHES "^(VERSION|LOCATION)$")
918  message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: ${${_PYTHON_PREFIX}_FIND_STRATEGY}: invalid value for '${_PYTHON_PREFIX}_FIND_STRATEGY'. 'VERSION' or 'LOCATION' expected.")
919  set (_${_PYTHON_PREFIX}_FIND_STRATEGY "VERSION")
920  else()
921  set (_${_PYTHON_PREFIX}_FIND_STRATEGY "${${_PYTHON_PREFIX}_FIND_STRATEGY}")
922  endif()
923 endif()
924 
925 # Python and Anaconda distributions: define which architectures can be used
926 if (CMAKE_SIZEOF_VOID_P)
927  # In this case, search only for 64bit or 32bit
928  math (EXPR _${_PYTHON_PREFIX}_ARCH "${CMAKE_SIZEOF_VOID_P} * 8")
929  set (_${_PYTHON_PREFIX}_ARCH2 ${_${_PYTHON_PREFIX}_ARCH})
930 else()
931  # architecture unknown, search for both 64bit and 32bit
932  set (_${_PYTHON_PREFIX}_ARCH 64)
933  set (_${_PYTHON_PREFIX}_ARCH2 32)
934 endif()
935 
936 # IronPython support
937 if (CMAKE_SIZEOF_VOID_P)
938  # In this case, search only for 64bit or 32bit
939  math (EXPR _${_PYTHON_PREFIX}_ARCH "${CMAKE_SIZEOF_VOID_P} * 8")
940  set (_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES ipy${_${_PYTHON_PREFIX}_ARCH} ipy)
941 else()
942  # architecture unknown, search for natural interpreter
943  set (_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES ipy)
944 endif()
945 set (_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES net45 net40)
946 
947 # Apple frameworks handling
948 _python_find_frameworks ()
949 
950 set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK "FIRST")
951 
952 if (DEFINED ${_PYTHON_PREFIX}_FIND_FRAMEWORK)
953  if (NOT ${_PYTHON_PREFIX}_FIND_FRAMEWORK MATCHES "^(FIRST|LAST|NEVER)$")
954  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.")
955  else()
956  set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK ${${_PYTHON_PREFIX}_FIND_FRAMEWORK})
957  endif()
958 elseif (DEFINED CMAKE_FIND_FRAMEWORK)
959  if (CMAKE_FIND_FRAMEWORK STREQUAL "ONLY")
960  message (AUTHOR_WARNING "Find${_PYTHON_PREFIX}: CMAKE_FIND_FRAMEWORK: 'ONLY' value is not supported. 'FIRST' will be used instead.")
961  elseif (NOT CMAKE_FIND_FRAMEWORK MATCHES "^(FIRST|LAST|NEVER)$")
962  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.")
963  else()
964  set (_${_PYTHON_PREFIX}_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
965  endif()
966 endif()
967 
968 # Save CMAKE_FIND_APPBUNDLE
969 if (DEFINED CMAKE_FIND_APPBUNDLE)
970  set (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE ${CMAKE_FIND_APPBUNDLE})
971 else()
972  unset (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE)
973 endif()
974 # To avoid app bundle lookup
975 set (CMAKE_FIND_APPBUNDLE "NEVER")
976 
977 # Save CMAKE_FIND_FRAMEWORK
978 if (DEFINED CMAKE_FIND_FRAMEWORK)
979  set (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK ${CMAKE_FIND_FRAMEWORK})
980 else()
981  unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
982 endif()
983 # To avoid framework lookup
984 set (CMAKE_FIND_FRAMEWORK "NEVER")
985 
986 # Windows Registry handling
987 if (DEFINED ${_PYTHON_PREFIX}_FIND_REGISTRY)
988  if (NOT ${_PYTHON_PREFIX}_FIND_REGISTRY MATCHES "^(FIRST|LAST|NEVER)$")
989  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.")
990  set (_${_PYTHON_PREFIX}_FIND_REGISTRY "FIRST")
991  else()
992  set (_${_PYTHON_PREFIX}_FIND_REGISTRY ${${_PYTHON_PREFIX}_FIND_REGISTRY})
993  endif()
994 else()
995  set (_${_PYTHON_PREFIX}_FIND_REGISTRY "FIRST")
996 endif()
997 
998 # virtual environments recognition
999 if (DEFINED ENV{VIRTUAL_ENV} OR DEFINED ENV{CONDA_PREFIX})
1000  if (DEFINED ${_PYTHON_PREFIX}_FIND_VIRTUALENV)
1001  if (NOT ${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY|STANDARD)$")
1002  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.")
1003  set (_${_PYTHON_PREFIX}_FIND_VIRTUALENV "FIRST")
1004  else()
1005  set (_${_PYTHON_PREFIX}_FIND_VIRTUALENV ${${_PYTHON_PREFIX}_FIND_VIRTUALENV})
1006  endif()
1007  else()
1008  set (_${_PYTHON_PREFIX}_FIND_VIRTUALENV FIRST)
1009  endif()
1010 else()
1011  set (_${_PYTHON_PREFIX}_FIND_VIRTUALENV STANDARD)
1012 endif()
1013 
1014 
1015 # Compute search signature
1016 # This signature will be used to check validity of cached variables on new search
1017 set (_${_PYTHON_PREFIX}_SIGNATURE "${${_PYTHON_PREFIX}_ROOT_DIR}:${_${_PYTHON_PREFIX}_FIND_STRATEGY}:${${_PYTHON_PREFIX}_FIND_VIRTUALENV}")
1018 if (NOT WIN32)
1019  string (APPEND _${_PYTHON_PREFIX}_SIGNATURE ":${${_PYTHON_PREFIX}_USE_STATIC_LIBS}:")
1020 endif()
1021 if (CMAKE_HOST_APPLE)
1022  string (APPEND _${_PYTHON_PREFIX}_SIGNATURE ":${_${_PYTHON_PREFIX}_FIND_FRAMEWORK}")
1023 endif()
1024 if (CMAKE_HOST_WIN32)
1025  string (APPEND _${_PYTHON_PREFIX}_SIGNATURE ":${_${_PYTHON_PREFIX}_FIND_REGISTRY}")
1026 endif()
1027 
1029  if ("Development.${module}" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1030  string (TOUPPER "${module}" id)
1031  set (signature "${_${_PYTHON_PREFIX}_SIGNATURE}:")
1032  if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1033  list (APPEND signature "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}:")
1034  endif()
1035  if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1036  list (APPEND signature "${_${_PYTHON_PREFIX}_INCLUDE_DIR}:")
1037  endif()
1038  string (MD5 signature "${signature}")
1039  if (signature STREQUAL _${_PYTHON_PREFIX}_DEVELOPMENT_${id}_SIGNATURE)
1040  if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
1041  set (exact EXACT)
1042  endif()
1043  if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1044  _python_validate_library (${${_PYTHON_PREFIX}_FIND_VERSION} ${exact} CHECK_EXISTS)
1045  endif()
1046  if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1047  _python_validate_include_dir (${${_PYTHON_PREFIX}_FIND_VERSION} ${exact} CHECK_EXISTS)
1048  endif()
1049  else()
1050  if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1051  unset (_${_PYTHON_PREFIX}_LIBRARY_RELEASE CACHE)
1052  unset (_${_PYTHON_PREFIX}_LIBRARY_DEBUG CACHE)
1053  endif()
1054  if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1055  unset (_${_PYTHON_PREFIX}_INCLUDE_DIR CACHE)
1056  endif()
1057  endif()
1058  if (("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS
1059  AND NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
1060  OR ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS
1061  AND NOT _${_PYTHON_PREFIX}_INCLUDE_DIR))
1062  unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
1063  unset (_${_PYTHON_PREFIX}_DEVELOPMENT_${id}_SIGNATURE CACHE)
1064  endif()
1065  endif()
1066 endfunction()
1067 
1068 function (_PYTHON_COMPUTE_DEVELOPMENT_SIGNATURE module)
1069  string (TOUPPER "${module}" id)
1070  if (${_PYTHON_PREFIX}_Development.${module}_FOUND)
1071  set (signature "${_${_PYTHON_PREFIX}_SIGNATURE}:")
1072  if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1073  list (APPEND signature "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}:")
1074  endif()
1075  if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_${id}_ARTIFACTS)
1076  list (APPEND signature "${_${_PYTHON_PREFIX}_INCLUDE_DIR}:")
1077  endif()
1078  string (MD5 signature "${signature}")
1079  set (_${_PYTHON_PREFIX}_DEVELOPMENT_${id}_SIGNATURE "${signature}" CACHE INTERNAL "")
1080  else()
1081  unset (_${_PYTHON_PREFIX}_DEVELOPMENT_${id}_SIGNATURE CACHE)
1082  endif()
1083 endfunction()
1084 
1085 
1086 unset (_${_PYTHON_PREFIX}_REQUIRED_VARS)
1087 unset (_${_PYTHON_PREFIX}_CACHED_VARS)
1088 unset (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE)
1089 unset (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE)
1090 unset (_${_PYTHON_PREFIX}_Development_REASON_FAILURE)
1091 unset (_${_PYTHON_PREFIX}_NumPy_REASON_FAILURE)
1092 
1093 
1094 # first step, search for the interpreter
1095 if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1096  list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_EXECUTABLE)
1097  if (${_PYTHON_PREFIX}_FIND_REQUIRED_Interpreter)
1098  list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_EXECUTABLE)
1099  endif()
1100 
1101  if (DEFINED ${_PYTHON_PREFIX}_EXECUTABLE
1102  AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_EXECUTABLE}")
1103  if (NOT ${_PYTHON_PREFIX}_EXECUTABLE STREQUAL _${_PYTHON_PREFIX}_EXECUTABLE)
1104  # invalidate cache properties
1105  unset (_${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES CACHE)
1106  endif()
1107  set (_${_PYTHON_PREFIX}_EXECUTABLE "${${_PYTHON_PREFIX}_EXECUTABLE}" CACHE INTERNAL "")
1108  elseif (DEFINED _${_PYTHON_PREFIX}_EXECUTABLE)
1109  # compute interpreter signature and check validity of definition
1110  string (MD5 __${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE "${_${_PYTHON_PREFIX}_SIGNATURE}:${_${_PYTHON_PREFIX}_EXECUTABLE}")
1111  if (__${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE STREQUAL _${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE)
1112  # check version validity
1113  if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
1114  _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION} EXACT CHECK_EXISTS)
1115  else()
1116  _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION} CHECK_EXISTS)
1117  endif()
1118  else()
1119  unset (_${_PYTHON_PREFIX}_EXECUTABLE CACHE)
1120  endif()
1121  if (NOT _${_PYTHON_PREFIX}_EXECUTABLE)
1122  unset (_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE CACHE)
1123  unset (_${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES CACHE)
1124  endif()
1125  endif()
1126 
1127  if (NOT _${_PYTHON_PREFIX}_EXECUTABLE)
1128  set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
1129 
1130  if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
1131  unset (_${_PYTHON_PREFIX}_NAMES)
1132  unset (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
1133  unset (_${_PYTHON_PREFIX}_REGISTRY_PATHS)
1134 
1135  foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
1136  # build all executable names
1137  _python_get_names (_${_PYTHON_PREFIX}_VERSION_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} POSIX EXECUTABLE)
1138  list (APPEND _${_PYTHON_PREFIX}_NAMES ${_${_PYTHON_PREFIX}_VERSION_NAMES})
1139 
1140  # Framework Paths
1141  _python_get_frameworks (_${_PYTHON_PREFIX}_VERSION_PATHS ${_${_PYTHON_PREFIX}_VERSION})
1142  list (APPEND _${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION_PATHS})
1143 
1144  # Registry Paths
1145  _python_get_registries (_${_PYTHON_PREFIX}_VERSION_PATHS ${_${_PYTHON_PREFIX}_VERSION})
1146  list (APPEND _${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_VERSION_PATHS}
1147  [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath])
1148  endforeach()
1149  list (APPEND _${_PYTHON_PREFIX}_NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR} python)
1150 
1151  while (TRUE)
1152  # Virtual environments handling
1153  if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
1154  find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1155  NAMES ${_${_PYTHON_PREFIX}_NAMES}
1156  NAMES_PER_DIR
1157  HINTS ${_${_PYTHON_PREFIX}_HINTS}
1158  PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX
1159  PATH_SUFFIXES bin Scripts
1160  NO_CMAKE_PATH
1161  NO_CMAKE_ENVIRONMENT_PATH
1162  NO_SYSTEM_ENVIRONMENT_PATH
1163  NO_CMAKE_SYSTEM_PATH)
1164 
1165  _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION})
1166  if (_${_PYTHON_PREFIX}_EXECUTABLE)
1167  break()
1168  endif()
1169  if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV STREQUAL "ONLY")
1170  break()
1171  endif()
1172  endif()
1173 
1174  # Apple frameworks handling
1175  if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
1176  find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1177  NAMES ${_${_PYTHON_PREFIX}_NAMES}
1178  NAMES_PER_DIR
1179  HINTS ${_${_PYTHON_PREFIX}_HINTS}
1180  PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1181  PATH_SUFFIXES bin
1182  NO_CMAKE_PATH
1183  NO_CMAKE_ENVIRONMENT_PATH
1184  NO_SYSTEM_ENVIRONMENT_PATH
1185  NO_CMAKE_SYSTEM_PATH)
1186  _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION})
1187  if (_${_PYTHON_PREFIX}_EXECUTABLE)
1188  break()
1189  endif()
1190  endif()
1191  # Windows registry
1192  if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
1193  find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1194  NAMES ${_${_PYTHON_PREFIX}_NAMES}
1195  ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
1196  NAMES_PER_DIR
1197  HINTS ${_${_PYTHON_PREFIX}_HINTS}
1198  PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1199  PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
1200  NO_SYSTEM_ENVIRONMENT_PATH
1201  NO_CMAKE_SYSTEM_PATH)
1202  _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION})
1203  if (_${_PYTHON_PREFIX}_EXECUTABLE)
1204  break()
1205  endif()
1206  endif()
1207 
1208  # try using HINTS
1209  find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1210  NAMES ${_${_PYTHON_PREFIX}_NAMES}
1211  ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
1212  NAMES_PER_DIR
1213  HINTS ${_${_PYTHON_PREFIX}_HINTS}
1214  PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
1215  NO_SYSTEM_ENVIRONMENT_PATH
1216  NO_CMAKE_SYSTEM_PATH)
1217  _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION})
1218  if (_${_PYTHON_PREFIX}_EXECUTABLE)
1219  break()
1220  endif()
1221  # try using standard paths
1222  find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1223  NAMES ${_${_PYTHON_PREFIX}_NAMES}
1224  ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
1225  NAMES_PER_DIR
1226  PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES})
1227  _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION})
1228  if (_${_PYTHON_PREFIX}_EXECUTABLE)
1229  break()
1230  endif()
1231 
1232  # Apple frameworks handling
1233  if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
1234  find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1235  NAMES ${_${_PYTHON_PREFIX}_NAMES}
1236  NAMES_PER_DIR
1237  PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1238  PATH_SUFFIXES bin
1239  NO_DEFAULT_PATH)
1240  _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION})
1241  if (_${_PYTHON_PREFIX}_EXECUTABLE)
1242  break()
1243  endif()
1244  endif()
1245  # Windows registry
1246  if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
1247  find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1248  NAMES ${_${_PYTHON_PREFIX}_NAMES}
1249  ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
1250  NAMES_PER_DIR
1251  PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1252  PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
1253  NO_DEFAULT_PATH)
1254  _python_validate_interpreter (${${_PYTHON_PREFIX}_FIND_VERSION})
1255  if (_${_PYTHON_PREFIX}_EXECUTABLE)
1256  break()
1257  endif()
1258  endif()
1259 
1260  break()
1261  endwhile()
1262  else()
1263  # look-up for various versions and locations
1264  foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
1265  _python_get_names (_${_PYTHON_PREFIX}_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} POSIX EXECUTABLE)
1266  list (APPEND _${_PYTHON_PREFIX}_NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
1267  python)
1268 
1269  _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION})
1270  _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_VERSION})
1271 
1272  # Virtual environments handling
1273  if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
1274  find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1275  NAMES ${_${_PYTHON_PREFIX}_NAMES}
1276  NAMES_PER_DIR
1277  HINTS ${_${_PYTHON_PREFIX}_HINTS}
1278  PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX
1279  PATH_SUFFIXES bin Scripts
1280  NO_CMAKE_PATH
1281  NO_CMAKE_ENVIRONMENT_PATH
1282  NO_SYSTEM_ENVIRONMENT_PATH
1283  NO_CMAKE_SYSTEM_PATH)
1284  _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
1285  if (_${_PYTHON_PREFIX}_EXECUTABLE)
1286  break()
1287  endif()
1288  if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV STREQUAL "ONLY")
1289  continue()
1290  endif()
1291  endif()
1292 
1293  # Apple frameworks handling
1294  if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
1295  find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1296  NAMES ${_${_PYTHON_PREFIX}_NAMES}
1297  NAMES_PER_DIR
1298  HINTS ${_${_PYTHON_PREFIX}_HINTS}
1299  PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1300  PATH_SUFFIXES bin
1301  NO_CMAKE_PATH
1302  NO_CMAKE_ENVIRONMENT_PATH
1303  NO_SYSTEM_ENVIRONMENT_PATH
1304  NO_CMAKE_SYSTEM_PATH)
1305  endif()
1306 
1307  # Windows registry
1308  if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
1309  find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1310  NAMES ${_${_PYTHON_PREFIX}_NAMES}
1311  ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
1312  NAMES_PER_DIR
1313  HINTS ${_${_PYTHON_PREFIX}_HINTS}
1314  PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1315  [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
1316  PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
1317  NO_SYSTEM_ENVIRONMENT_PATH
1318  NO_CMAKE_SYSTEM_PATH)
1319  endif()
1320 
1321  _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
1322  if (_${_PYTHON_PREFIX}_EXECUTABLE)
1323  break()
1324  endif()
1325 
1326  # try using HINTS
1327  find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1328  NAMES ${_${_PYTHON_PREFIX}_NAMES}
1329  ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
1330  NAMES_PER_DIR
1331  HINTS ${_${_PYTHON_PREFIX}_HINTS}
1332  PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
1333  NO_SYSTEM_ENVIRONMENT_PATH
1334  NO_CMAKE_SYSTEM_PATH)
1335  _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
1336  if (_${_PYTHON_PREFIX}_EXECUTABLE)
1337  break()
1338  endif()
1339  # try using standard paths.
1340  # NAMES_PER_DIR is not defined on purpose to have a chance to find
1341  # expected version.
1342  # For example, typical systems have 'python' for version 2.* and 'python3'
1343  # for version 3.*. So looking for names per dir will find, potentially,
1344  # systematically 'python' (i.e. version 2) even if version 3 is searched.
1345  if (CMAKE_HOST_WIN32)
1346  find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1347  NAMES ${_${_PYTHON_PREFIX}_NAMES}
1348  python
1349  ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES})
1350  else()
1351  find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1352  NAMES ${_${_PYTHON_PREFIX}_NAMES})
1353  endif()
1354  _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
1355  if (_${_PYTHON_PREFIX}_EXECUTABLE)
1356  break()
1357  endif()
1358 
1359  # Apple frameworks handling
1360  if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
1361  find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1362  NAMES ${_${_PYTHON_PREFIX}_NAMES}
1363  NAMES_PER_DIR
1364  PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1365  PATH_SUFFIXES bin
1366  NO_DEFAULT_PATH)
1367  endif()
1368 
1369  # Windows registry
1370  if (CMAKE_HOST_WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
1371  find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1372  NAMES ${_${_PYTHON_PREFIX}_NAMES}
1373  ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES}
1374  NAMES_PER_DIR
1375  PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1376  [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
1377  PATH_SUFFIXES bin ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
1378  NO_DEFAULT_PATH)
1379  endif()
1380 
1381  _python_validate_interpreter (${_${_PYTHON_PREFIX}_VERSION} EXACT)
1382  if (_${_PYTHON_PREFIX}_EXECUTABLE)
1383  break()
1384  endif()
1385  endforeach()
1386 
1387  if (NOT _${_PYTHON_PREFIX}_EXECUTABLE AND
1388  NOT _${_PYTHON_PREFIX}_FIND_VIRTUALENV STREQUAL "ONLY")
1389  # No specific version found. Retry with generic names and standard paths.
1390  # NAMES_PER_DIR is not defined on purpose to have a chance to find
1391  # expected version.
1392  # For example, typical systems have 'python' for version 2.* and 'python3'
1393  # for version 3.*. So looking for names per dir will find, potentially,
1394  # systematically 'python' (i.e. version 2) even if version 3 is searched.
1395  find_program (_${_PYTHON_PREFIX}_EXECUTABLE
1396  NAMES python${_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR}
1397  python
1398  ${_${_PYTHON_PREFIX}_IRON_PYTHON_NAMES})
1399  _python_validate_interpreter ()
1400  endif()
1401  endif()
1402  endif()
1403 
1404  set (${_PYTHON_PREFIX}_EXECUTABLE "${_${_PYTHON_PREFIX}_EXECUTABLE}")
1405 
1406  # retrieve exact version of executable found
1407  if (_${_PYTHON_PREFIX}_EXECUTABLE)
1408  execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c
1409  "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))"
1410  RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1411  OUTPUT_VARIABLE ${_PYTHON_PREFIX}_VERSION
1412  ERROR_QUIET
1413  OUTPUT_STRIP_TRAILING_WHITESPACE)
1414  if (NOT _${_PYTHON_PREFIX}_RESULT)
1415  set (_${_PYTHON_PREFIX}_EXECUTABLE_USABLE TRUE)
1416  else()
1417  # Interpreter is not usable
1418  set (_${_PYTHON_PREFIX}_EXECUTABLE_USABLE FALSE)
1419  unset (${_PYTHON_PREFIX}_VERSION)
1420  set (_${_PYTHON_PREFIX}_Interpreter_REASON_FAILURE "Cannot run the interpreter \"${_${_PYTHON_PREFIX}_EXECUTABLE}\"")
1421  endif()
1422  endif()
1423 
1424  if (_${_PYTHON_PREFIX}_EXECUTABLE AND _${_PYTHON_PREFIX}_EXECUTABLE_USABLE)
1425  if (_${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES)
1426  set (${_PYTHON_PREFIX}_Interpreter_FOUND TRUE)
1427 
1428  list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 0 ${_PYTHON_PREFIX}_INTERPRETER_ID)
1429 
1430  list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 1 ${_PYTHON_PREFIX}_VERSION_MAJOR)
1431  list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 2 ${_PYTHON_PREFIX}_VERSION_MINOR)
1432  list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 3 ${_PYTHON_PREFIX}_VERSION_PATCH)
1433 
1434  list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 4 _${_PYTHON_PREFIX}_ARCH)
1435  set (_${_PYTHON_PREFIX}_ARCH2 ${_${_PYTHON_PREFIX}_ARCH})
1436 
1437  list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 5 _${_PYTHON_PREFIX}_ABIFLAGS)
1438  list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 6 ${_PYTHON_PREFIX}_SOABI)
1439 
1440  list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 7 ${_PYTHON_PREFIX}_STDLIB)
1441  list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 8 ${_PYTHON_PREFIX}_STDARCH)
1442  list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 9 ${_PYTHON_PREFIX}_SITELIB)
1443  list (GET _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES 10 ${_PYTHON_PREFIX}_SITEARCH)
1444  else()
1445  string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${${_PYTHON_PREFIX}_VERSION}")
1446  list (GET _${_PYTHON_PREFIX}_VERSIONS 0 ${_PYTHON_PREFIX}_VERSION_MAJOR)
1447  list (GET _${_PYTHON_PREFIX}_VERSIONS 1 ${_PYTHON_PREFIX}_VERSION_MINOR)
1448  list (GET _${_PYTHON_PREFIX}_VERSIONS 2 ${_PYTHON_PREFIX}_VERSION_PATCH)
1449 
1450  if (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
1451  set (${_PYTHON_PREFIX}_Interpreter_FOUND TRUE)
1452 
1453  # Use interpreter version and ABI for future searches to ensure consistency
1454  set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
1455  execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; sys.stdout.write(sys.abiflags)"
1456  RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1457  OUTPUT_VARIABLE _${_PYTHON_PREFIX}_ABIFLAGS
1458  ERROR_QUIET
1459  OUTPUT_STRIP_TRAILING_WHITESPACE)
1460  if (_${_PYTHON_PREFIX}_RESULT)
1461  # assunme ABI is not supported
1462  set (_${_PYTHON_PREFIX}_ABIFLAGS "")
1463  endif()
1464  endif()
1465 
1466  if (${_PYTHON_PREFIX}_Interpreter_FOUND)
1467  # compute and save interpreter signature
1468  string (MD5 __${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE "${_${_PYTHON_PREFIX}_SIGNATURE}:${_${_PYTHON_PREFIX}_EXECUTABLE}")
1469  set (_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE "${__${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE}" CACHE INTERNAL "")
1470 
1471  if (NOT CMAKE_SIZEOF_VOID_P)
1472  # determine interpreter architecture
1473  execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; print(sys.maxsize > 2**32)"
1474  RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1475  OUTPUT_VARIABLE ${_PYTHON_PREFIX}_IS64BIT
1476  ERROR_VARIABLE ${_PYTHON_PREFIX}_IS64BIT)
1477  if (NOT _${_PYTHON_PREFIX}_RESULT)
1478  if (${_PYTHON_PREFIX}_IS64BIT)
1479  set (_${_PYTHON_PREFIX}_ARCH 64)
1480  set (_${_PYTHON_PREFIX}_ARCH2 64)
1481  else()
1482  set (_${_PYTHON_PREFIX}_ARCH 32)
1483  set (_${_PYTHON_PREFIX}_ARCH2 32)
1484  endif()
1485  endif()
1486  endif()
1487 
1488  # retrieve interpreter identity
1489  execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -V
1490  RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1491  OUTPUT_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID
1492  ERROR_VARIABLE ${_PYTHON_PREFIX}_INTERPRETER_ID)
1493  if (NOT _${_PYTHON_PREFIX}_RESULT)
1494  if (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Anaconda")
1495  set (${_PYTHON_PREFIX}_INTERPRETER_ID "Anaconda")
1496  elseif (${_PYTHON_PREFIX}_INTERPRETER_ID MATCHES "Enthought")
1497  set (${_PYTHON_PREFIX}_INTERPRETER_ID "Canopy")
1498  else()
1499  string (REGEX REPLACE "^([^ ]+).*" "\\1" ${_PYTHON_PREFIX}_INTERPRETER_ID "${${_PYTHON_PREFIX}_INTERPRETER_ID}")
1500  if (${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "Python")
1501  # try to get a more precise ID
1502  execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "import sys; print(sys.copyright)"
1503  RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1504  OUTPUT_VARIABLE ${_PYTHON_PREFIX}_COPYRIGHT
1505  ERROR_QUIET)
1506  if (${_PYTHON_PREFIX}_COPYRIGHT MATCHES "ActiveState")
1507  set (${_PYTHON_PREFIX}_INTERPRETER_ID "ActivePython")
1508  endif()
1509  endif()
1510  endif()
1511  else()
1512  set (${_PYTHON_PREFIX}_INTERPRETER_ID Python)
1513  endif()
1514 
1515  # retrieve various package installation directories
1516  execute_process (COMMAND "${_${_PYTHON_PREFIX}_EXECUTABLE}" -c "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')]))"
1517  RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1518  OUTPUT_VARIABLE _${_PYTHON_PREFIX}_LIBPATHS
1519  ERROR_QUIET)
1520  if (NOT _${_PYTHON_PREFIX}_RESULT)
1521  list (GET _${_PYTHON_PREFIX}_LIBPATHS 0 ${_PYTHON_PREFIX}_STDLIB)
1522  list (GET _${_PYTHON_PREFIX}_LIBPATHS 1 ${_PYTHON_PREFIX}_STDARCH)
1523  list (GET _${_PYTHON_PREFIX}_LIBPATHS 2 ${_PYTHON_PREFIX}_SITELIB)
1524  list (GET _${_PYTHON_PREFIX}_LIBPATHS 3 ${_PYTHON_PREFIX}_SITEARCH)
1525  else()
1526  unset (${_PYTHON_PREFIX}_STDLIB)
1527  unset (${_PYTHON_PREFIX}_STDARCH)
1528  unset (${_PYTHON_PREFIX}_SITELIB)
1529  unset (${_PYTHON_PREFIX}_SITEARCH)
1530  endif()
1531 
1532  if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR VERSION_GREATER_EQUAL "3")
1533  _python_get_config_var (${_PYTHON_PREFIX}_SOABI SOABI)
1534  endif()
1535 
1536  # store properties in the cache to speed-up future searches
1537  set (_${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES
1538  "${${_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")
1539  else()
1540  unset (_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE CACHE)
1541  unset (${_PYTHON_PREFIX}_INTERPRETER_ID)
1542  endif()
1543  endif()
1544  endif()
1545 
1546  if (${_PYTHON_PREFIX}_ARTIFACTS_INTERACTIVE)
1547  set (${_PYTHON_PREFIX}_EXECUTABLE "${_${_PYTHON_PREFIX}_EXECUTABLE}" CACHE FILEPATH "${_PYTHON_PREFIX} Interpreter")
1548  endif()
1549 
1550  _python_mark_as_internal (_${_PYTHON_PREFIX}_EXECUTABLE
1551  _${_PYTHON_PREFIX}_INTERPRETER_PROPERTIES
1552  _${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE)
1553 endif()
1554 
1555 
1556 # second step, search for compiler (IronPython)
1557 if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1558  list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_COMPILER)
1559  if (${_PYTHON_PREFIX}_FIND_REQUIRED_Compiler)
1560  list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_COMPILER)
1561  endif()
1562 
1563  if (DEFINED ${_PYTHON_PREFIX}_COMPILER
1564  AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_COMPILER}")
1565  set (_${_PYTHON_PREFIX}_COMPILER "${${_PYTHON_PREFIX}_COMPILER}" CACHE INTERNAL "")
1566  elseif (DEFINED _${_PYTHON_PREFIX}_COMPILER)
1567  # compute compiler signature and check validity of definition
1568  string (MD5 __${_PYTHON_PREFIX}_COMPILER_SIGNATURE "${_${_PYTHON_PREFIX}_SIGNATURE}:${_${_PYTHON_PREFIX}_COMPILER}")
1569  if (__${_PYTHON_PREFIX}_COMPILER_SIGNATURE STREQUAL _${_PYTHON_PREFIX}_COMPILER_SIGNATURE)
1570  # check version validity
1571  if (${_PYTHON_PREFIX}_FIND_VERSION_EXACT)
1572  _python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION} EXACT CHECK_EXISTS)
1573  else()
1574  _python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION} CHECK_EXISTS)
1575  endif()
1576  else()
1577  unset (_${_PYTHON_PREFIX}_COMPILER CACHE)
1578  unset (_${_PYTHON_PREFIX}_COMPILER_SIGNATURE CACHE)
1579  endif()
1580  endif()
1581 
1582  if (NOT _${_PYTHON_PREFIX}_COMPILER)
1583  # IronPython specific artifacts
1584  # If IronPython interpreter is found, use its path
1585  unset (_${_PYTHON_PREFIX}_IRON_ROOT)
1586  if (${_PYTHON_PREFIX}_Interpreter_FOUND AND ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython")
1587  get_filename_component (_${_PYTHON_PREFIX}_IRON_ROOT "${${_PYTHON_PREFIX}_EXECUTABLE}" DIRECTORY)
1588  endif()
1589 
1590  if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
1591  set (_${_PYTHON_PREFIX}_REGISTRY_PATHS)
1592 
1593  foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
1594  # Registry Paths
1595  list (APPEND _${_PYTHON_PREFIX}_REGISTRY_PATHS
1596  [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath])
1597  endforeach()
1598 
1599  while (TRUE)
1600  if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
1601  find_program (_${_PYTHON_PREFIX}_COMPILER
1602  NAMES ipyc
1603  HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
1604  PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1605  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
1606  NO_SYSTEM_ENVIRONMENT_PATH
1607  NO_CMAKE_SYSTEM_PATH)
1608  _python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION})
1609  if (_${_PYTHON_PREFIX}_COMPILER)
1610  break()
1611  endif()
1612  endif()
1613 
1614  find_program (_${_PYTHON_PREFIX}_COMPILER
1615  NAMES ipyc
1616  HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
1617  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
1618  NO_SYSTEM_ENVIRONMENT_PATH
1619  NO_CMAKE_SYSTEM_PATH)
1620  _python_validate_compiler (${${_PYTHON_PREFIX}_FIND_VERSION})
1621  if (_${_PYTHON_PREFIX}_COMPILER)
1622  break()
1623  endif()
1624 
1625  if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
1626  find_program (_${_PYTHON_PREFIX}_COMPILER
1627  NAMES ipyc
1628  PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
1629  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
1630  NO_DEFAULT_PATH)
1631  endif()
1632 
1633  break()
1634  endwhile()
1635  else()
1636  # try using root dir and registry
1637  foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
1638  if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
1639  find_program (_${_PYTHON_PREFIX}_COMPILER
1640  NAMES ipyc
1641  HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
1642  PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
1643  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
1644  NO_SYSTEM_ENVIRONMENT_PATH
1645  NO_CMAKE_SYSTEM_PATH)
1646  _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION} EXACT)
1647  if (_${_PYTHON_PREFIX}_COMPILER)
1648  break()
1649  endif()
1650  endif()
1651 
1652  find_program (_${_PYTHON_PREFIX}_COMPILER
1653  NAMES ipyc
1654  HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
1655  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
1656  NO_SYSTEM_ENVIRONMENT_PATH
1657  NO_CMAKE_SYSTEM_PATH)
1658  _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION} EXACT)
1659  if (_${_PYTHON_PREFIX}_COMPILER)
1660  break()
1661  endif()
1662 
1663  if (_${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
1664  find_program (_${_PYTHON_PREFIX}_COMPILER
1665  NAMES ipyc
1666  PATHS [HKEY_LOCAL_MACHINE\\SOFTWARE\\IronPython\\${_${_PYTHON_PREFIX}_VERSION}\\InstallPath]
1667  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES}
1668  NO_DEFAULT_PATH)
1669  _python_validate_compiler (${_${_PYTHON_PREFIX}_VERSION} EXACT)
1670  if (_${_PYTHON_PREFIX}_COMPILER)
1671  break()
1672  endif()
1673  endif()
1674  endforeach()
1675 
1676  # no specific version found, re-try in standard paths
1677  find_program (_${_PYTHON_PREFIX}_COMPILER
1678  NAMES ipyc
1679  HINTS ${_${_PYTHON_PREFIX}_IRON_ROOT} ${_${_PYTHON_PREFIX}_HINTS}
1680  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_IRON_PYTHON_PATH_SUFFIXES})
1681  endif()
1682  endif()
1683 
1684  set (${_PYTHON_PREFIX}_COMPILER "${_${_PYTHON_PREFIX}_COMPILER}")
1685 
1686  if (_${_PYTHON_PREFIX}_COMPILER)
1687  # retrieve python environment version from compiler
1688  set (_${_PYTHON_PREFIX}_VERSION_DIR "${CMAKE_CURRENT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/PythonCompilerVersion.dir")
1689  file (WRITE "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py" "import sys; sys.stdout.write('.'.join([str(x) for x in sys.version_info[:3]]))\n")
1690  execute_process (COMMAND "${_${_PYTHON_PREFIX}_COMPILER}" /target:exe /embed "${_${_PYTHON_PREFIX}_VERSION_DIR}/version.py"
1691  WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}"
1692  OUTPUT_QUIET
1693  ERROR_QUIET)
1694  execute_process (COMMAND "${_${_PYTHON_PREFIX}_VERSION_DIR}/version"
1695  WORKING_DIRECTORY "${_${_PYTHON_PREFIX}_VERSION_DIR}"
1696  RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1697  OUTPUT_VARIABLE _${_PYTHON_PREFIX}_VERSION
1698  ERROR_QUIET)
1699  if (NOT _${_PYTHON_PREFIX}_RESULT)
1700  set (_${_PYTHON_PREFIX}_COMPILER_USABLE TRUE)
1701  string (REGEX MATCHALL "[0-9]+" _${_PYTHON_PREFIX}_VERSIONS "${_${_PYTHON_PREFIX}_VERSION}")
1702  list (GET _${_PYTHON_PREFIX}_VERSIONS 0 _${_PYTHON_PREFIX}_VERSION_MAJOR)
1703  list (GET _${_PYTHON_PREFIX}_VERSIONS 1 _${_PYTHON_PREFIX}_VERSION_MINOR)
1704  list (GET _${_PYTHON_PREFIX}_VERSIONS 2 _${_PYTHON_PREFIX}_VERSION_PATCH)
1705 
1706  if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND)
1707  # set public version information
1708  set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION})
1709  set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR})
1710  set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR})
1711  set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH})
1712  endif()
1713  else()
1714  # compiler not usable
1715  set (_${_PYTHON_PREFIX}_COMPILER_USABLE FALSE)
1716  set (_${_PYTHON_PREFIX}_Compiler_REASON_FAILURE "Cannot run the compiler \"${_${_PYTHON_PREFIX}_COMPILER}\"")
1717  endif()
1718  file (REMOVE_RECURSE "${_${_PYTHON_PREFIX}_VERSION_DIR}")
1719  endif()
1720 
1721  if (_${_PYTHON_PREFIX}_COMPILER AND _${_PYTHON_PREFIX}_COMPILER_USABLE)
1722  if (${_PYTHON_PREFIX}_Interpreter_FOUND)
1723  # Compiler must be compatible with interpreter
1724  if ("${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR}" VERSION_EQUAL "${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}")
1725  set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE)
1726  endif()
1727  elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
1728  set (${_PYTHON_PREFIX}_Compiler_FOUND TRUE)
1729  # Use compiler version for future searches to ensure consistency
1730  set (_${_PYTHON_PREFIX}_FIND_VERSIONS ${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR})
1731  endif()
1732  endif()
1733 
1734  if (${_PYTHON_PREFIX}_Compiler_FOUND)
1735  # compute and save compiler signature
1736  string (MD5 __${_PYTHON_PREFIX}_COMPILER_SIGNATURE "${_${_PYTHON_PREFIX}_SIGNATURE}:${_${_PYTHON_PREFIX}_COMPILER}")
1737  set (_${_PYTHON_PREFIX}_COMPILER_SIGNATURE "${__${_PYTHON_PREFIX}_COMPILER_SIGNATURE}" CACHE INTERNAL "")
1738 
1739  set (${_PYTHON_PREFIX}_COMPILER_ID IronPython)
1740  else()
1741  unset (_${_PYTHON_PREFIX}_COMPILER_SIGNATURE CACHE)
1742  unset (${_PYTHON_PREFIX}_COMPILER_ID)
1743  endif()
1744 
1745  if (${_PYTHON_PREFIX}_ARTIFACTS_INTERACTIVE)
1746  set (${_PYTHON_PREFIX}_COMPILER "${_${_PYTHON_PREFIX}_COMPILER}" CACHE FILEPATH "${_PYTHON_PREFIX} Compiler")
1747  endif()
1748 
1749  _python_mark_as_internal (_${_PYTHON_PREFIX}_COMPILER
1750  _${_PYTHON_PREFIX}_COMPILER_SIGNATURE)
1751 endif()
1752 
1753 
1754 # third step, search for the development artifacts
1755 ## Development environment is not compatible with IronPython interpreter
1756 if (("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
1757  OR "Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS)
1758  AND NOT ${_PYTHON_PREFIX}_INTERPRETER_ID STREQUAL "IronPython")
1759  if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
1760  list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_LIBRARY_RELEASE
1761  _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
1762  _${_PYTHON_PREFIX}_LIBRARY_DEBUG
1763  _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
1764  endif()
1765  if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
1766  list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_INCLUDE_DIR)
1767  endif()
1768  if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development.Module)
1769  if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS)
1770  list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_LIBRARIES)
1771  endif()
1772  if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS)
1773  list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_INCLUDE_DIRS)
1774  endif()
1775  endif()
1776  if (${_PYTHON_PREFIX}_FIND_REQUIRED_Development.Embed)
1777  if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS)
1778  list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_LIBRARIES)
1779  endif()
1780  if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_EMBED_ARTIFACTS)
1781  list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_INCLUDE_DIRS)
1782  endif()
1783  endif()
1784  if (_${_PYTHON_PREFIX}_REQUIRED_VARS) # XXX(cmake-3.14)
1785  list (REMOVE_DUPLICATES _${_PYTHON_PREFIX}_REQUIRED_VARS)
1786  endif ()
1787 
1788  _python_check_development_signature (Module)
1789  _python_check_development_signature (Embed)
1790 
1791  if (DEFINED ${_PYTHON_PREFIX}_LIBRARY
1792  AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_LIBRARY}")
1793  set (_${_PYTHON_PREFIX}_LIBRARY_RELEASE "${${_PYTHON_PREFIX}_LIBRARY}" CACHE INTERNAL "")
1794  unset (_${_PYTHON_PREFIX}_LIBRARY_DEBUG CACHE)
1795  unset (_${_PYTHON_PREFIX}_INCLUDE_DIR CACHE)
1796  endif()
1797  if (DEFINED ${_PYTHON_PREFIX}_INCLUDE_DIR
1798  AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_INCLUDE_DIR}")
1799  set (_${_PYTHON_PREFIX}_INCLUDE_DIR "${${_PYTHON_PREFIX}_INCLUDE_DIR}" CACHE INTERNAL "")
1800  endif()
1801 
1802  # Support preference of static libs by adjusting CMAKE_FIND_LIBRARY_SUFFIXES
1803  unset (_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES)
1804  if (DEFINED ${_PYTHON_PREFIX}_USE_STATIC_LIBS AND NOT WIN32)
1805  set(_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
1806  if(${_PYTHON_PREFIX}_USE_STATIC_LIBS)
1807  set (CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
1808  else()
1809  if (CMAKE_FIND_LIBRARY_SUFFIXES) # XXX(cmake-3.14)
1810  list (REMOVE_ITEM CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
1811  endif ()
1812  endif()
1813  endif()
1814 
1815  if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE OR NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
1816  # if python interpreter is found, use it to look-up for artifacts
1817  # to ensure consistency between interpreter and development environments.
1818  # If not, try to locate a compatible config tool
1819  if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND OR CMAKE_CROSSCOMPILING)
1820  set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
1821  unset (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS)
1822  if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
1823  set (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX)
1824  endif()
1825  unset (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
1826 
1827  if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
1828  set (_${_PYTHON_PREFIX}_CONFIG_NAMES)
1829 
1830  foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
1831  _python_get_names (_${_PYTHON_PREFIX}_VERSION_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} POSIX CONFIG)
1832  list (APPEND _${_PYTHON_PREFIX}_CONFIG_NAMES ${_${_PYTHON_PREFIX}_VERSION_NAMES})
1833 
1834  # Framework Paths
1835  _python_get_frameworks (_${_PYTHON_PREFIX}_VERSION_PATHS ${_${_PYTHON_PREFIX}_VERSION})
1836  list (APPEND _${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION_PATHS})
1837  endforeach()
1838 
1839  # Apple frameworks handling
1840  if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
1841  find_program (_${_PYTHON_PREFIX}_CONFIG
1842  NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
1843  NAMES_PER_DIR
1844  HINTS ${_${_PYTHON_PREFIX}_HINTS}
1845  PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
1846  ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1847  PATH_SUFFIXES bin
1848  NO_CMAKE_PATH
1849  NO_CMAKE_ENVIRONMENT_PATH
1850  NO_SYSTEM_ENVIRONMENT_PATH
1851  NO_CMAKE_SYSTEM_PATH)
1852  endif()
1853 
1854  find_program (_${_PYTHON_PREFIX}_CONFIG
1855  NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
1856  NAMES_PER_DIR
1857  HINTS ${_${_PYTHON_PREFIX}_HINTS}
1858  PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
1859  PATH_SUFFIXES bin)
1860 
1861  # Apple frameworks handling
1862  if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
1863  find_program (_${_PYTHON_PREFIX}_CONFIG
1864  NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
1865  NAMES_PER_DIR
1866  PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1867  PATH_SUFFIXES bin
1868  NO_DEFAULT_PATH)
1869  endif()
1870 
1871  if (_${_PYTHON_PREFIX}_CONFIG)
1872  execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --help
1873  RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1874  OUTPUT_VARIABLE __${_PYTHON_PREFIX}_HELP
1875  ERROR_QUIET
1876  OUTPUT_STRIP_TRAILING_WHITESPACE)
1877  if (_${_PYTHON_PREFIX}_RESULT)
1878  # assume config tool is not usable
1879  unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
1880  endif()
1881  endif()
1882 
1883  if (_${_PYTHON_PREFIX}_CONFIG)
1884  execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --abiflags
1885  RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1886  OUTPUT_VARIABLE __${_PYTHON_PREFIX}_ABIFLAGS
1887  ERROR_QUIET
1888  OUTPUT_STRIP_TRAILING_WHITESPACE)
1889  if (_${_PYTHON_PREFIX}_RESULT)
1890  # assume ABI is not supported
1891  set (__${_PYTHON_PREFIX}_ABIFLAGS "")
1892  endif()
1893  if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND NOT __${_PYTHON_PREFIX}_ABIFLAGS IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
1894  # Wrong ABI
1895  unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
1896  endif()
1897  endif()
1898 
1899  if (_${_PYTHON_PREFIX}_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
1900  # check that config tool match library architecture
1901  execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --configdir
1902  RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1903  OUTPUT_VARIABLE _${_PYTHON_PREFIX}_CONFIGDIR
1904  ERROR_QUIET
1905  OUTPUT_STRIP_TRAILING_WHITESPACE)
1906  if (_${_PYTHON_PREFIX}_RESULT)
1907  unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
1908  else()
1909  string(FIND "${_${_PYTHON_PREFIX}_CONFIGDIR}" "${CMAKE_LIBRARY_ARCHITECTURE}" _${_PYTHON_PREFIX}_RESULT)
1910  if (_${_PYTHON_PREFIX}_RESULT EQUAL -1)
1911  unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
1912  endif()
1913  endif()
1914  endif()
1915  else()
1916  foreach (_${_PYTHON_PREFIX}_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
1917  # try to use pythonX.Y-config tool
1918  _python_get_names (_${_PYTHON_PREFIX}_CONFIG_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} POSIX CONFIG)
1919 
1920  # Framework Paths
1921  _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION})
1922 
1923  # Apple frameworks handling
1924  if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
1925  find_program (_${_PYTHON_PREFIX}_CONFIG
1926  NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
1927  NAMES_PER_DIR
1928  HINTS ${_${_PYTHON_PREFIX}_HINTS}
1929  PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
1930  ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1931  PATH_SUFFIXES bin
1932  NO_CMAKE_PATH
1933  NO_CMAKE_ENVIRONMENT_PATH
1934  NO_SYSTEM_ENVIRONMENT_PATH
1935  NO_CMAKE_SYSTEM_PATH)
1936  endif()
1937 
1938  find_program (_${_PYTHON_PREFIX}_CONFIG
1939  NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
1940  NAMES_PER_DIR
1941  HINTS ${_${_PYTHON_PREFIX}_HINTS}
1942  PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
1943  PATH_SUFFIXES bin)
1944 
1945  # Apple frameworks handling
1946  if (CMAKE_HOST_APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
1947  find_program (_${_PYTHON_PREFIX}_CONFIG
1948  NAMES ${_${_PYTHON_PREFIX}_CONFIG_NAMES}
1949  NAMES_PER_DIR
1950  PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
1951  PATH_SUFFIXES bin
1952  NO_DEFAULT_PATH)
1953  endif()
1954 
1955  unset (_${_PYTHON_PREFIX}_CONFIG_NAMES)
1956 
1957  if (_${_PYTHON_PREFIX}_CONFIG)
1958  execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --help
1959  RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1960  OUTPUT_VARIABLE __${_PYTHON_PREFIX}_HELP
1961  ERROR_QUIET
1962  OUTPUT_STRIP_TRAILING_WHITESPACE)
1963  if (_${_PYTHON_PREFIX}_RESULT)
1964  # assume config tool is not usable
1965  unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
1966  endif()
1967  endif()
1968 
1969  if (NOT _${_PYTHON_PREFIX}_CONFIG)
1970  continue()
1971  endif()
1972 
1973  execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --abiflags
1974  RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1975  OUTPUT_VARIABLE __${_PYTHON_PREFIX}_ABIFLAGS
1976  ERROR_QUIET
1977  OUTPUT_STRIP_TRAILING_WHITESPACE)
1978  if (_${_PYTHON_PREFIX}_RESULT)
1979  # assume ABI is not supported
1980  set (__${_PYTHON_PREFIX}_ABIFLAGS "")
1981  endif()
1982  if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND NOT __${_PYTHON_PREFIX}_ABIFLAGS IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS)
1983  # Wrong ABI
1984  unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
1985  continue()
1986  endif()
1987 
1988  if (_${_PYTHON_PREFIX}_CONFIG AND DEFINED CMAKE_LIBRARY_ARCHITECTURE)
1989  # check that config tool match library architecture
1990  execute_process (COMMAND "${_${_PYTHON_PREFIX}_CONFIG}" --configdir
1991  RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
1992  OUTPUT_VARIABLE _${_PYTHON_PREFIX}_CONFIGDIR
1993  ERROR_QUIET
1994  OUTPUT_STRIP_TRAILING_WHITESPACE)
1995  if (_${_PYTHON_PREFIX}_RESULT)
1996  unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
1997  continue()
1998  endif()
1999  string (FIND "${_${_PYTHON_PREFIX}_CONFIGDIR}" "${CMAKE_LIBRARY_ARCHITECTURE}" _${_PYTHON_PREFIX}_RESULT)
2000  if (_${_PYTHON_PREFIX}_RESULT EQUAL -1)
2001  unset (_${_PYTHON_PREFIX}_CONFIG CACHE)
2002  continue()
2003  endif()
2004  endif()
2005 
2006  if (_${_PYTHON_PREFIX}_CONFIG)
2007  break()
2008  endif()
2009  endforeach()
2010  endif()
2011  endif()
2012  endif()
2013 
2014  if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
2015  if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2016  if ((${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT CMAKE_CROSSCOMPILING) OR _${_PYTHON_PREFIX}_CONFIG)
2017  # retrieve root install directory
2018  _python_get_config_var (_${_PYTHON_PREFIX}_PREFIX PREFIX)
2019 
2020  # enforce current ABI
2021  _python_get_config_var (_${_PYTHON_PREFIX}_ABIFLAGS ABIFLAGS)
2022 
2023  set (_${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_PREFIX}")
2024 
2025  # retrieve library
2026  ## compute some paths and artifact names
2027  if (_${_PYTHON_PREFIX}_CONFIG)
2028  string (REGEX REPLACE "^.+python([0-9.]+)[a-z]*-config" "\\1" _${_PYTHON_PREFIX}_VERSION "${_${_PYTHON_PREFIX}_CONFIG}")
2029  else()
2030  set (_${_PYTHON_PREFIX}_VERSION "${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}")
2031  endif()
2032  _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_VERSION} LIBRARY)
2033  _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 POSIX LIBRARY)
2034 
2035  _python_get_config_var (_${_PYTHON_PREFIX}_CONFIGDIR CONFIGDIR)
2036  list (APPEND _${_PYTHON_PREFIX}_HINTS "${_${_PYTHON_PREFIX}_CONFIGDIR}")
2037 
2038  list (APPEND _${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
2039 
2040  find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2041  NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2042  NAMES_PER_DIR
2043  HINTS ${_${_PYTHON_PREFIX}_HINTS}
2044  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2045  NO_SYSTEM_ENVIRONMENT_PATH
2046  NO_CMAKE_SYSTEM_PATH)
2047  endif()
2048 
2049  # Rely on HINTS and standard paths if interpreter or config tool failed to locate artifacts
2050  if (NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2051  set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
2052 
2053  unset (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS)
2054  if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
2055  set (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX)
2056  endif()
2057 
2058  if (_${_PYTHON_PREFIX}_FIND_STRATEGY STREQUAL "LOCATION")
2059  unset (_${_PYTHON_PREFIX}_LIB_NAMES)
2060  unset (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG)
2061  unset (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
2062  unset (_${_PYTHON_PREFIX}_REGISTRY_PATHS)
2063  unset (_${_PYTHON_PREFIX}_PATH_SUFFIXES)
2064 
2065  foreach (_${_PYTHON_PREFIX}_LIB_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
2066  # library names
2067  _python_get_names (_${_PYTHON_PREFIX}_VERSION_NAMES VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 POSIX LIBRARY)
2068  list (APPEND _${_PYTHON_PREFIX}_LIB_NAMES ${_${_PYTHON_PREFIX}_VERSION_NAMES})
2069  _python_get_names (_${_PYTHON_PREFIX}_VERSION_NAMES VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 DEBUG)
2070  list (APPEND _${_PYTHON_PREFIX}_LIB_NAMES_DEBUG ${_${_PYTHON_PREFIX}_VERSION_NAMES})
2071 
2072  # Framework Paths
2073  _python_get_frameworks (_${_PYTHON_PREFIX}_VERSION_PATHS ${_${_PYTHON_PREFIX}_LIB_VERSION})
2074  list (APPEND _${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION_PATHS})
2075 
2076  # Registry Paths
2077  _python_get_registries (_${_PYTHON_PREFIX}_VERSION_PATHS ${_${_PYTHON_PREFIX}_LIB_VERSION})
2078  list (APPEND _${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_VERSION_PATHS})
2079 
2080  # Paths suffixes
2081  _python_get_path_suffixes (_${_PYTHON_PREFIX}_VERSION_PATHS VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} LIBRARY)
2082  list (APPEND _${_PYTHON_PREFIX}_PATH_SUFFIXES ${_${_PYTHON_PREFIX}_VERSION_PATHS})
2083  endforeach()
2084 
2085  if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
2086  find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2087  NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2088  NAMES_PER_DIR
2089  HINTS ${_${_PYTHON_PREFIX}_HINTS}
2090  PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2091  ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2092  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2093  NO_CMAKE_PATH
2094  NO_CMAKE_ENVIRONMENT_PATH
2095  NO_SYSTEM_ENVIRONMENT_PATH
2096  NO_CMAKE_SYSTEM_PATH)
2097  endif()
2098 
2099  if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
2100  find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2101  NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2102  NAMES_PER_DIR
2103  HINTS ${_${_PYTHON_PREFIX}_HINTS}
2104  PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2105  ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
2106  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2107  NO_SYSTEM_ENVIRONMENT_PATH
2108  NO_CMAKE_SYSTEM_PATH)
2109  endif()
2110 
2111  # search in HINTS locations
2112  find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2113  NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2114  NAMES_PER_DIR
2115  HINTS ${_${_PYTHON_PREFIX}_HINTS}
2116  PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2117  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2118  NO_SYSTEM_ENVIRONMENT_PATH
2119  NO_CMAKE_SYSTEM_PATH)
2120 
2121  if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
2122  set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
2123  else()
2124  unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
2125  endif()
2126 
2127  if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
2128  set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
2129  else()
2130  unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
2131  endif()
2132 
2133  # search in all default paths
2134  find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2135  NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2136  NAMES_PER_DIR
2137  PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2138  ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
2139  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
2140  else()
2141  foreach (_${_PYTHON_PREFIX}_LIB_VERSION IN LISTS _${_PYTHON_PREFIX}_FIND_VERSIONS)
2142  _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 POSIX LIBRARY)
2143  _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} WIN32 DEBUG)
2144 
2145  _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_LIB_VERSION})
2146  _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_LIB_VERSION})
2147 
2148  _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_LIB_VERSION} LIBRARY)
2149 
2150  if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
2151  find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2152  NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2153  NAMES_PER_DIR
2154  HINTS ${_${_PYTHON_PREFIX}_HINTS}
2155  PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2156  ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2157  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2158  NO_CMAKE_PATH
2159  NO_CMAKE_ENVIRONMENT_PATH
2160  NO_SYSTEM_ENVIRONMENT_PATH
2161  NO_CMAKE_SYSTEM_PATH)
2162  endif()
2163 
2164  if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
2165  find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2166  NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2167  NAMES_PER_DIR
2168  HINTS ${_${_PYTHON_PREFIX}_HINTS}
2169  PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2170  ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
2171  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2172  NO_SYSTEM_ENVIRONMENT_PATH
2173  NO_CMAKE_SYSTEM_PATH)
2174  endif()
2175 
2176  # search in HINTS locations
2177  find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2178  NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2179  NAMES_PER_DIR
2180  HINTS ${_${_PYTHON_PREFIX}_HINTS}
2181  PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2182  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2183  NO_SYSTEM_ENVIRONMENT_PATH
2184  NO_CMAKE_SYSTEM_PATH)
2185 
2186  if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
2187  set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
2188  else()
2189  unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
2190  endif()
2191 
2192  if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
2193  set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
2194  else()
2195  unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
2196  endif()
2197 
2198  # search in all default paths
2199  find_library (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2200  NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2201  NAMES_PER_DIR
2202  PATHS ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2203  ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
2204  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES})
2205 
2206  if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2207  break()
2208  endif()
2209  endforeach()
2210  endif()
2211  endif()
2212  endif()
2213 
2214  # finalize library version information
2215  _python_get_version (LIBRARY PREFIX _${_PYTHON_PREFIX}_)
2216 
2217  set (${_PYTHON_PREFIX}_LIBRARY_RELEASE "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
2218 
2219  if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE AND NOT EXISTS "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
2220  set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Cannot find the library \"${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}\"")
2221  set_property (CACHE _${_PYTHON_PREFIX}_LIBRARY_RELEASE PROPERTY VALUE "${_PYTHON_PREFIX}_LIBRARY_RELEASE-NOTFOUND")
2222  endif()
2223 
2224  set (_${_PYTHON_PREFIX}_HINTS "${${_PYTHON_PREFIX}_ROOT_DIR}" ENV ${_PYTHON_PREFIX}_ROOT_DIR)
2225 
2226  if (WIN32 AND _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2227  # search for debug library
2228  # use release library location as a hint
2229  _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 DEBUG)
2230  get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
2231  find_library (_${_PYTHON_PREFIX}_LIBRARY_DEBUG
2232  NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
2233  NAMES_PER_DIR
2234  HINTS "${_${_PYTHON_PREFIX}_PATH}" ${_${_PYTHON_PREFIX}_HINTS}
2235  NO_DEFAULT_PATH)
2236  endif()
2237 
2238  # retrieve runtime libraries
2239  if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2240  _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 POSIX LIBRARY)
2241  get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
2242  get_filename_component (_${_PYTHON_PREFIX}_PATH2 "${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
2243  _python_find_runtime_library (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
2244  NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES}
2245  NAMES_PER_DIR
2246  HINTS "${_${_PYTHON_PREFIX}_PATH}" "${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS}
2247  PATH_SUFFIXES bin)
2248  endif()
2249  if (_${_PYTHON_PREFIX}_LIBRARY_DEBUG)
2250  _python_get_names (_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG VERSION ${_${_PYTHON_PREFIX}_VERSION} WIN32 DEBUG)
2251  get_filename_component (_${_PYTHON_PREFIX}_PATH "${_${_PYTHON_PREFIX}_LIBRARY_DEBUG}" DIRECTORY)
2252  get_filename_component (_${_PYTHON_PREFIX}_PATH2 "${_${_PYTHON_PREFIX}_PATH}" DIRECTORY)
2253  _python_find_runtime_library (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
2254  NAMES ${_${_PYTHON_PREFIX}_LIB_NAMES_DEBUG}
2255  NAMES_PER_DIR
2256  HINTS "${_${_PYTHON_PREFIX}_PATH}" "${_${_PYTHON_PREFIX}_PATH2}" ${_${_PYTHON_PREFIX}_HINTS}
2257  PATH_SUFFIXES bin)
2258  endif()
2259  endif()
2260 
2261  if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
2262  while (NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
2263  if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS
2264  AND NOT _${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2265  # Don't search for include dir if no library was founded
2266  break()
2267  endif()
2268 
2269  if ((${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT CMAKE_CROSSCOMPILING) OR _${_PYTHON_PREFIX}_CONFIG)
2270  _python_get_config_var (_${_PYTHON_PREFIX}_INCLUDE_DIRS INCLUDES)
2271 
2272  find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
2273  NAMES Python.h
2274  HINTS ${_${_PYTHON_PREFIX}_INCLUDE_DIRS}
2275  NO_SYSTEM_ENVIRONMENT_PATH
2276  NO_CMAKE_SYSTEM_PATH)
2277  endif()
2278 
2279  # Rely on HINTS and standard paths if interpreter or config tool failed to locate artifacts
2280  if (NOT _${_PYTHON_PREFIX}_INCLUDE_DIR)
2281  unset (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS)
2282  if (_${_PYTHON_PREFIX}_FIND_VIRTUALENV MATCHES "^(FIRST|ONLY)$")
2283  set (_${_PYTHON_PREFIX}_VIRTUALENV_PATHS ENV VIRTUAL_ENV ENV CONDA_PREFIX)
2284  endif()
2285  unset (_${_PYTHON_PREFIX}_INCLUDE_HINTS)
2286 
2287  if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2288  # Use the library's install prefix as a hint
2289  if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "^(.+/Frameworks/Python.framework/Versions/[0-9.]+)")
2290  list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
2291  elseif (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "^(.+)/lib(64|32)?/python[0-9.]+/config")
2292  list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
2293  elseif (DEFINED CMAKE_LIBRARY_ARCHITECTURE AND ${_${_PYTHON_PREFIX}_LIBRARY_RELEASE} MATCHES "^(.+)/lib/${CMAKE_LIBRARY_ARCHITECTURE}")
2294  list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${CMAKE_MATCH_1}")
2295  else()
2296  # assume library is in a directory under root
2297  get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" DIRECTORY)
2298  get_filename_component (_${_PYTHON_PREFIX}_PREFIX "${_${_PYTHON_PREFIX}_PREFIX}" DIRECTORY)
2299  list (APPEND _${_PYTHON_PREFIX}_INCLUDE_HINTS "${_${_PYTHON_PREFIX}_PREFIX}")
2300  endif()
2301  endif()
2302 
2303  _python_get_frameworks (_${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_VERSION})
2304  _python_get_registries (_${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_VERSION})
2305  _python_get_path_suffixes (_${_PYTHON_PREFIX}_PATH_SUFFIXES VERSION ${_${_PYTHON_PREFIX}_VERSION} INCLUDE)
2306 
2307  if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "FIRST")
2308  find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
2309  NAMES Python.h
2310  HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
2311  PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2312  ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2313  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2314  NO_CMAKE_PATH
2315  NO_CMAKE_ENVIRONMENT_PATH
2316  NO_SYSTEM_ENVIRONMENT_PATH
2317  NO_CMAKE_SYSTEM_PATH)
2318  endif()
2319 
2320  if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "FIRST")
2321  find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
2322  NAMES Python.h
2323  HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
2324  PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2325  ${_${_PYTHON_PREFIX}_REGISTRY_PATHS}
2326  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2327  NO_SYSTEM_ENVIRONMENT_PATH
2328  NO_CMAKE_SYSTEM_PATH)
2329  endif()
2330 
2331  if (APPLE AND _${_PYTHON_PREFIX}_FIND_FRAMEWORK STREQUAL "LAST")
2332  set (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS ${_${_PYTHON_PREFIX}_FRAMEWORK_PATHS})
2333  else()
2334  unset (__${_PYTHON_PREFIX}_FRAMEWORK_PATHS)
2335  endif()
2336 
2337  if (WIN32 AND _${_PYTHON_PREFIX}_FIND_REGISTRY STREQUAL "LAST")
2338  set (__${_PYTHON_PREFIX}_REGISTRY_PATHS ${_${_PYTHON_PREFIX}_REGISTRY_PATHS})
2339  else()
2340  unset (__${_PYTHON_PREFIX}_REGISTRY_PATHS)
2341  endif()
2342 
2343  find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
2344  NAMES Python.h
2345  HINTS ${_${_PYTHON_PREFIX}_INCLUDE_HINTS} ${_${_PYTHON_PREFIX}_HINTS}
2346  PATHS ${_${_PYTHON_PREFIX}_VIRTUALENV_PATHS}
2347  ${__${_PYTHON_PREFIX}_FRAMEWORK_PATHS}
2348  ${__${_PYTHON_PREFIX}_REGISTRY_PATHS}
2349  PATH_SUFFIXES ${_${_PYTHON_PREFIX}_PATH_SUFFIXES}
2350  NO_SYSTEM_ENVIRONMENT_PATH
2351  NO_CMAKE_SYSTEM_PATH)
2352  endif()
2353 
2354  # search header file in standard locations
2355  find_path (_${_PYTHON_PREFIX}_INCLUDE_DIR
2356  NAMES Python.h)
2357 
2358  break()
2359  endwhile()
2360 
2361  set (${_PYTHON_PREFIX}_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}")
2362 
2363  if (_${_PYTHON_PREFIX}_INCLUDE_DIR AND NOT EXISTS "${_${_PYTHON_PREFIX}_INCLUDE_DIR}")
2364  set (_${_PYTHON_PREFIX}_Development_REASON_FAILURE "Cannot find the directory \"${_${_PYTHON_PREFIX}_INCLUDE_DIR}\"")
2365  set_property (CACHE _${_PYTHON_PREFIX}_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_INCLUDE_DIR-NOTFOUND")
2366  endif()
2367 
2368  if (_${_PYTHON_PREFIX}_INCLUDE_DIR)
2369  # retrieve version from header file
2370  _python_get_version (INCLUDE PREFIX _${_PYTHON_PREFIX}_INC_)
2371 
2372  if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE)
2373  # update versioning
2374  if (_${_PYTHON_PREFIX}_INC_VERSION VERSION_EQUAL _${_PYTHON_PREFIX}_VERSION)
2375  set (_${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_INC_VERSION_PATCH})
2376  endif()
2377  else()
2378  set (_${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_INC_VERSION})
2379  set (_${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR})
2380  set (_${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_INC_VERSION_MINOR})
2381  set (_${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_INC_VERSION_PATCH})
2382  endif()
2383  endif()
2384  endif()
2385 
2386  if (NOT ${_PYTHON_PREFIX}_Interpreter_FOUND AND NOT ${_PYTHON_PREFIX}_Compiler_FOUND)
2387  # set public version information
2388  set (${_PYTHON_PREFIX}_VERSION ${_${_PYTHON_PREFIX}_VERSION})
2389  set (${_PYTHON_PREFIX}_VERSION_MAJOR ${_${_PYTHON_PREFIX}_VERSION_MAJOR})
2390  set (${_PYTHON_PREFIX}_VERSION_MINOR ${_${_PYTHON_PREFIX}_VERSION_MINOR})
2391  set (${_PYTHON_PREFIX}_VERSION_PATCH ${_${_PYTHON_PREFIX}_VERSION_PATCH})
2392  endif()
2393 
2394  # define public variables
2395  if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
2396  set (${_PYTHON_PREFIX}_LIBRARY_DEBUG "${_${_PYTHON_PREFIX}_LIBRARY_DEBUG}")
2397  _python_select_library_configurations (${_PYTHON_PREFIX})
2398 
2399  set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
2400  set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
2401 
2402  if (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
2403  set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
2404  elseif (_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
2405  set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${_${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
2406  else()
2407  set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY "${_PYTHON_PREFIX}_RUNTIME_LIBRARY-NOTFOUND")
2408  endif()
2409 
2410  _python_set_library_dirs (${_PYTHON_PREFIX}_LIBRARY_DIRS
2411  _${_PYTHON_PREFIX}_LIBRARY_RELEASE _${_PYTHON_PREFIX}_LIBRARY_DEBUG)
2412  if (UNIX)
2413  if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$")
2414  set (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS ${${_PYTHON_PREFIX}_LIBRARY_DIRS})
2415  endif()
2416  else()
2417  _python_set_library_dirs (${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DIRS
2418  _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG)
2419  endif()
2420  endif()
2421 
2422  if (_${_PYTHON_PREFIX}_LIBRARY_RELEASE OR _${_PYTHON_PREFIX}_INCLUDE_DIR)
2423  if (${_PYTHON_PREFIX}_Interpreter_FOUND OR ${_PYTHON_PREFIX}_Compiler_FOUND)
2424  # development environment must be compatible with interpreter/compiler
2425  if ("${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR}" VERSION_EQUAL "${${_PYTHON_PREFIX}_VERSION_MAJOR}.${${_PYTHON_PREFIX}_VERSION_MINOR}"
2426  AND "${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_INC_VERSION_MINOR}" VERSION_EQUAL "${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR}")
2427  _python_set_development_module_found (Module)
2428  _python_set_development_module_found (Embed)
2429  endif()
2430  elseif (${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR
2431  AND "${_${_PYTHON_PREFIX}_INC_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_INC_VERSION_MINOR}" VERSION_EQUAL "${_${_PYTHON_PREFIX}_VERSION_MAJOR}.${_${_PYTHON_PREFIX}_VERSION_MINOR}")
2432  _python_set_development_module_found (Module)
2433  _python_set_development_module_found (Embed)
2434  endif()
2435  if (DEFINED _${_PYTHON_PREFIX}_FIND_ABI AND
2436  (NOT _${_PYTHON_PREFIX}_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS
2437  OR NOT _${_PYTHON_PREFIX}_INC_ABI IN_LIST _${_PYTHON_PREFIX}_ABIFLAGS))
2438  set (${_PYTHON_PREFIX}_Development.Module_FOUND FALSE)
2439  set (${_PYTHON_PREFIX}_Development.Embed_FOUND FALSE)
2440  endif()
2441  endif()
2442 
2443  if ("Development" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
2444  AND ${_PYTHON_PREFIX}_Development.Module_FOUND
2445  AND ${_PYTHON_PREFIX}_Development.Embed_FOUND)
2446  set (${_PYTHON_PREFIX}_Development_FOUND TRUE)
2447  endif()
2448 
2449  if (_${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR VERSION_GREATER_EQUAL "3"
2450  AND NOT DEFINED ${_PYTHON_PREFIX}_SOABI)
2451  _python_get_config_var (${_PYTHON_PREFIX}_SOABI SOABI)
2452  endif()
2453 
2454  _python_compute_development_signature (Module)
2455  _python_compute_development_signature (Embed)
2456 
2457  # Restore the original find library ordering
2458  if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES)
2459  set (CMAKE_FIND_LIBRARY_SUFFIXES ${_${_PYTHON_PREFIX}_CMAKE_FIND_LIBRARY_SUFFIXES})
2460  endif()
2461 
2462  if (${_PYTHON_PREFIX}_ARTIFACTS_INTERACTIVE)
2463  if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
2464  set (${_PYTHON_PREFIX}_LIBRARY "${_${_PYTHON_PREFIX}_LIBRARY_RELEASE}" CACHE FILEPATH "${_PYTHON_PREFIX} Library")
2465  endif()
2466  if ("INCLUDE_DIR" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_ARTIFACTS)
2467  set (${_PYTHON_PREFIX}_INCLUDE_DIR "${_${_PYTHON_PREFIX}_INCLUDE_DIR}" CACHE FILEPATH "${_PYTHON_PREFIX} Include Directory")
2468  endif()
2469  endif()
2470 
2471  _python_mark_as_internal (_${_PYTHON_PREFIX}_LIBRARY_RELEASE
2472  _${_PYTHON_PREFIX}_LIBRARY_DEBUG
2473  _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE
2474  _${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG
2475  _${_PYTHON_PREFIX}_INCLUDE_DIR
2476  _${_PYTHON_PREFIX}_CONFIG
2477  _${_PYTHON_PREFIX}_DEVELOPMENT_MODULE_SIGNATURE
2478  _${_PYTHON_PREFIX}_DEVELOPMENT_EMBED_SIGNATURE)
2479 endif()
2480 
2481 if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS AND ${_PYTHON_PREFIX}_Interpreter_FOUND)
2482  list (APPEND _${_PYTHON_PREFIX}_CACHED_VARS _${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
2483  if (${_PYTHON_PREFIX}_FIND_REQUIRED_NumPy)
2484  list (APPEND _${_PYTHON_PREFIX}_REQUIRED_VARS ${_PYTHON_PREFIX}_NumPy_INCLUDE_DIRS)
2485  endif()
2486 
2487  if (DEFINED ${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR
2488  AND IS_ABSOLUTE "${${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
2489  set (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR "${${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}" CACHE INTERNAL "")
2490  elseif (DEFINED _${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
2491  # compute numpy signature. Depends on interpreter and development signatures
2492  string (MD5 __${_PYTHON_PREFIX}_NUMPY_SIGNATURE "${_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE}:${_${_PYTHON_PREFIX}_DEVELOPMENT_MODULE_SIGNATURE}:${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
2493  if (NOT __${_PYTHON_PREFIX}_NUMPY_SIGNATURE STREQUAL _${_PYTHON_PREFIX}_NUMPY_SIGNATURE
2494  OR NOT EXISTS "${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
2495  unset (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR CACHE)
2496  unset (_${_PYTHON_PREFIX}_NUMPY_SIGNATURE CACHE)
2497  endif()
2498  endif()
2499 
2500  if (NOT _${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
2501  execute_process(
2502  COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
2503  "from __future__ import print_function\ntry: import numpy; print(numpy.get_include(), end='')\nexcept:pass\n"
2504  RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2505  OUTPUT_VARIABLE _${_PYTHON_PREFIX}_NumPy_PATH
2506  ERROR_QUIET
2507  OUTPUT_STRIP_TRAILING_WHITESPACE)
2508 
2509  if (NOT _${_PYTHON_PREFIX}_RESULT)
2510  find_path (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR
2511  NAMES "numpy/arrayobject.h" "numpy/numpyconfig.h"
2512  HINTS "${_${_PYTHON_PREFIX}_NumPy_PATH}"
2513  NO_DEFAULT_PATH)
2514  endif()
2515  endif()
2516 
2517  set (${_PYTHON_PREFIX}_NumPy_INCLUDE_DIRS "${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
2518 
2519  if(_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR AND NOT EXISTS "${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}")
2520  set (_${_PYTHON_PREFIX}_NumPy_REASON_FAILURE "Cannot find the directory \"${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}\"")
2521  set_property (CACHE _${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR PROPERTY VALUE "${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR-NOTFOUND")
2522  endif()
2523 
2524  if (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR)
2525  execute_process (
2526  COMMAND "${${_PYTHON_PREFIX}_EXECUTABLE}" -c
2527  "from __future__ import print_function\ntry: import numpy; print(numpy.__version__, end='')\nexcept:pass\n"
2528  RESULT_VARIABLE _${_PYTHON_PREFIX}_RESULT
2529  OUTPUT_VARIABLE _${_PYTHON_PREFIX}_NumPy_VERSION)
2530  if (NOT _${_PYTHON_PREFIX}_RESULT)
2531  set (${_PYTHON_PREFIX}_NumPy_VERSION "${_${_PYTHON_PREFIX}_NumPy_VERSION}")
2532  else()
2533  unset (${_PYTHON_PREFIX}_NumPy_VERSION)
2534  endif()
2535 
2536  # final step: set NumPy founded only if Development.Module component is founded as well
2537  set(${_PYTHON_PREFIX}_NumPy_FOUND ${${_PYTHON_PREFIX}_Development.Module_FOUND})
2538  else()
2539  set (${_PYTHON_PREFIX}_NumPy_FOUND FALSE)
2540  endif()
2541 
2542  if (${_PYTHON_PREFIX}_NumPy_FOUND)
2543  # compute and save numpy signature
2544  string (MD5 __${_PYTHON_PREFIX}_NUMPY_SIGNATURE "${_${_PYTHON_PREFIX}_INTERPRETER_SIGNATURE}:${_${_PYTHON_PREFIX}_DEVELOPMENT_MODULE_SIGNATURE}:${${_PYTHON_PREFIX}_NumPyINCLUDE_DIR}")
2545  set (_${_PYTHON_PREFIX}_NUMPY_SIGNATURE "${__${_PYTHON_PREFIX}_NUMPY_SIGNATURE}" CACHE INTERNAL "")
2546  else()
2547  unset (_${_PYTHON_PREFIX}_NUMPY_SIGNATURE CACHE)
2548  endif()
2549 
2550  if (${_PYTHON_PREFIX}_ARTIFACTS_INTERACTIVE)
2551  set (${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR "${_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR}" CACHE FILEPATH "${_PYTHON_PREFIX} NumPy Include Directory")
2552  endif()
2553 
2554  _python_mark_as_internal (_${_PYTHON_PREFIX}_NumPy_INCLUDE_DIR
2555  _${_PYTHON_PREFIX}_NUMPY_SIGNATURE)
2556 endif()
2557 
2558 # final validation
2559 if (${_PYTHON_PREFIX}_VERSION_MAJOR AND
2560  NOT ${_PYTHON_PREFIX}_VERSION_MAJOR VERSION_EQUAL _${_PYTHON_PREFIX}_REQUIRED_VERSION_MAJOR)
2561  _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}\"")
2562 endif()
2563 
2564 unset (_${_PYTHON_PREFIX}_REASON_FAILURE)
2565 foreach (_${_PYTHON_PREFIX}_COMPONENT IN ITEMS Interpreter Compiler Development NumPy)
2566  if (_${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_REASON_FAILURE)
2567  string (APPEND _${_PYTHON_PREFIX}_REASON_FAILURE "\n ${_${_PYTHON_PREFIX}_COMPONENT}: ${_${_PYTHON_PREFIX}_${_${_PYTHON_PREFIX}_COMPONENT}_REASON_FAILURE}")
2568  endif()
2569 endforeach()
2570 
2571 set(_python_reason_failure_args)
2572 if (CMAKE_VERSION VERSION_GREATER_EQUAL 3.16)
2573  set(_python_reason_failure_args
2574  REASON_FAILURE_MESSAGE "${_${_PYTHON_PREFIX}_REASON_FAILURE}")
2575 endif ()
2576 
2577 include (FindPackageHandleStandardArgs)
2578 find_package_handle_standard_args (${_PYTHON_PREFIX}
2579  REQUIRED_VARS ${_${_PYTHON_PREFIX}_REQUIRED_VARS}
2580  VERSION_VAR ${_PYTHON_PREFIX}_VERSION
2581  HANDLE_COMPONENTS
2582  ${_python_reason_failure_args})
2583 unset(_python_reason_failure_args)
2584 
2585 # Create imported targets and helper functions
2586 if(_${_PYTHON_PREFIX}_CMAKE_ROLE STREQUAL "PROJECT")
2587  if ("Interpreter" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
2588  AND ${_PYTHON_PREFIX}_Interpreter_FOUND
2589  AND NOT TARGET ${_PYTHON_PREFIX}::Interpreter)
2590  add_executable (${_PYTHON_PREFIX}::Interpreter IMPORTED)
2591  set_property (TARGET ${_PYTHON_PREFIX}::Interpreter
2592  PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_EXECUTABLE}")
2593  endif()
2594 
2595  if ("Compiler" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
2596  AND ${_PYTHON_PREFIX}_Compiler_FOUND
2597  AND NOT TARGET ${_PYTHON_PREFIX}::Compiler)
2598  add_executable (${_PYTHON_PREFIX}::Compiler IMPORTED)
2599  set_property (TARGET ${_PYTHON_PREFIX}::Compiler
2600  PROPERTY IMPORTED_LOCATION "${${_PYTHON_PREFIX}_COMPILER}")
2601  endif()
2602 
2603  if (("Development.Module" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
2604  AND ${_PYTHON_PREFIX}_Development.Module_FOUND)
2605  OR ("Development.Embed" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS
2606  AND ${_PYTHON_PREFIX}_Development.Embed_FOUND))
2607 
2608  macro (__PYTHON_IMPORT_LIBRARY __name)
2609  if (${_PYTHON_PREFIX}_LIBRARY_RELEASE MATCHES "${CMAKE_SHARED_LIBRARY_SUFFIX}$"
2610  OR ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
2611  set (_${_PYTHON_PREFIX}_LIBRARY_TYPE SHARED)
2612  else()
2613  set (_${_PYTHON_PREFIX}_LIBRARY_TYPE STATIC)
2614  endif()
2615 
2616  if (NOT TARGET ${__name})
2617  add_library (${__name} ${_${_PYTHON_PREFIX}_LIBRARY_TYPE} IMPORTED)
2618  endif()
2619 
2620  set_property (TARGET ${__name}
2621  PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_INCLUDE_DIRS}")
2622 
2623  if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE)
2624  # System manage shared libraries in two parts: import and runtime
2625  if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
2626  set_property (TARGET ${__name} PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG)
2627  set_target_properties (${__name}
2628  PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
2629  IMPORTED_IMPLIB_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}"
2630  IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
2631  set_target_properties (${__name}
2632  PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
2633  IMPORTED_IMPLIB_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}"
2634  IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_DEBUG}")
2635  else()
2636  set_target_properties (${__name}
2637  PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C"
2638  IMPORTED_IMPLIB "${${_PYTHON_PREFIX}_LIBRARIES}"
2639  IMPORTED_LOCATION "${${_PYTHON_PREFIX}_RUNTIME_LIBRARY_RELEASE}")
2640  endif()
2641  else()
2642  if (${_PYTHON_PREFIX}_LIBRARY_RELEASE AND ${_PYTHON_PREFIX}_LIBRARY_DEBUG)
2643  set_property (TARGET ${__name} PROPERTY IMPORTED_CONFIGURATIONS RELEASE DEBUG)
2644  set_target_properties (${__name}
2645  PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "C"
2646  IMPORTED_LOCATION_RELEASE "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
2647  set_target_properties (${__name}
2648  PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES_DEBUG "C"
2649  IMPORTED_LOCATION_DEBUG "${${_PYTHON_PREFIX}_LIBRARY_DEBUG}")
2650  else()
2651  set_target_properties (${__name}
2652  PROPERTIES IMPORTED_LINK_INTERFACE_LANGUAGES "C"
2653  IMPORTED_LOCATION "${${_PYTHON_PREFIX}_LIBRARY_RELEASE}")
2654  endif()
2655  endif()
2656 
2657  if (_${_PYTHON_PREFIX}_LIBRARY_TYPE STREQUAL "STATIC")
2658  # extend link information with dependent libraries
2659  _python_get_config_var (_${_PYTHON_PREFIX}_LINK_LIBRARIES LIBS)
2660  if (_${_PYTHON_PREFIX}_LINK_LIBRARIES)
2661  set_property (TARGET ${__name}
2662  PROPERTY INTERFACE_LINK_LIBRARIES ${_${_PYTHON_PREFIX}_LINK_LIBRARIES})
2663  endif()
2664  endif()
2665  endmacro()
2666 
2667  if (${_PYTHON_PREFIX}_Development.Embed_FOUND)
2668  __python_import_library (${_PYTHON_PREFIX}::Python)
2669  endif()
2670 
2671  if (${_PYTHON_PREFIX}_Development.Module_FOUND)
2672  if ("LIBRARY" IN_LIST _${_PYTHON_PREFIX}_FIND_DEVELOPMENT_MODULE_ARTIFACTS)
2673  # On Windows/CYGWIN/MSYS, Python::Module is the same as Python::Python
2674  # but ALIAS cannot be used because the imported library is not GLOBAL.
2675  __python_import_library (${_PYTHON_PREFIX}::Module)
2676  else()
2677  if (NOT TARGET ${_PYTHON_PREFIX}::Module)
2678  add_library (${_PYTHON_PREFIX}::Module INTERFACE IMPORTED)
2679  endif()
2680  set_property (TARGET ${_PYTHON_PREFIX}::Module
2681  PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_INCLUDE_DIRS}")
2682 
2683  # When available, enforce shared library generation with undefined symbols
2684  if (APPLE)
2685  set_property (TARGET ${_PYTHON_PREFIX}::Module
2686  PROPERTY INTERFACE_LINK_OPTIONS "LINKER:-undefined,dynamic_lookup")
2687  endif()
2688  if (CMAKE_SYSTEM_NAME STREQUAL "SunOS")
2689  set_property (TARGET ${_PYTHON_PREFIX}::Module
2690  PROPERTY INTERFACE_LINK_OPTIONS "LINKER:-z,nodefs")
2691  endif()
2692  if (CMAKE_SYSTEM_NAME STREQUAL "AIX")
2693  set_property (TARGET ${_PYTHON_PREFIX}::Module
2694  PROPERTY INTERFACE_LINK_OPTIONS "LINKER:-b,erok")
2695  endif()
2696  endif()
2697  endif()
2698 
2699  #
2700  # PYTHON_ADD_LIBRARY (<name> [STATIC|SHARED|MODULE] src1 src2 ... srcN)
2701  # It is used to build modules for python.
2702  #
2703  function (__${_PYTHON_PREFIX}_ADD_LIBRARY prefix name)
2704  cmake_parse_arguments (PARSE_ARGV 2 PYTHON_ADD_LIBRARY
2705  "STATIC;SHARED;MODULE;WITH_SOABI" "" "")
2706 
2707  if (prefix STREQUAL "Python2" AND PYTHON_ADD_LIBRARY_WITH_SOABI)
2708  message (AUTHOR_WARNING "FindPython2: Option `WITH_SOABI` is not supported for Python2 and will be ignored.")
2709  unset (PYTHON_ADD_LIBRARY_WITH_SOABI)
2710  endif()
2711 
2712  if (PYTHON_ADD_LIBRARY_STATIC)
2713  set (type STATIC)
2714  elseif (PYTHON_ADD_LIBRARY_SHARED)
2715  set (type SHARED)
2716  else()
2717  set (type MODULE)
2718  endif()
2719 
2720  if (type STREQUAL "MODULE" AND NOT TARGET ${prefix}::Module)
2721  message (SEND_ERROR "${prefix}_ADD_LIBRARY: dependent target '${prefix}::Module' is not defined.\n Did you miss to request COMPONENT 'Development.Module'?")
2722  return()
2723  endif()
2724  if (NOT type STREQUAL "MODULE" AND NOT TARGET ${prefix}::Python)
2725  message (SEND_ERROR "${prefix}_ADD_LIBRARY: dependent target '${prefix}::Python' is not defined.\n Did you miss to request COMPONENT 'Development.Embed'?")
2726  return()
2727  endif()
2728 
2729  add_library (${name} ${type} ${PYTHON_ADD_LIBRARY_UNPARSED_ARGUMENTS})
2730 
2731  get_property (type TARGET ${name} PROPERTY TYPE)
2732 
2733  if (type STREQUAL "MODULE_LIBRARY")
2734  target_link_libraries (${name} PRIVATE ${prefix}::Module)
2735  # customize library name to follow module name rules
2736  set_property (TARGET ${name} PROPERTY PREFIX "")
2737  if(CMAKE_SYSTEM_NAME STREQUAL "Windows")
2738  set_property (TARGET ${name} PROPERTY SUFFIX ".pyd")
2739  endif()
2740 
2741  if (PYTHON_ADD_LIBRARY_WITH_SOABI AND ${prefix}_SOABI)
2742  get_property (suffix TARGET ${name} PROPERTY SUFFIX)
2743  if (NOT suffix)
2744  set (suffix "${CMAKE_SHARED_MODULE_SUFFIX}")
2745  endif()
2746  set_property (TARGET ${name} PROPERTY SUFFIX ".${${prefix}_SOABI}${suffix}")
2747  endif()
2748  else()
2749  if (PYTHON_ADD_LIBRARY_WITH_SOABI)
2750  message (AUTHOR_WARNING "Find${prefix}: Option `WITH_SOABI` is only supported for `MODULE` library type.")
2751  endif()
2752  target_link_libraries (${name} PRIVATE ${prefix}::Python)
2753  endif()
2754  endfunction()
2755  endif()
2756 
2757  if ("NumPy" IN_LIST ${_PYTHON_PREFIX}_FIND_COMPONENTS AND ${_PYTHON_PREFIX}_NumPy_FOUND
2758  AND NOT TARGET ${_PYTHON_PREFIX}::NumPy AND TARGET ${_PYTHON_PREFIX}::Module)
2759  add_library (${_PYTHON_PREFIX}::NumPy INTERFACE IMPORTED)
2760  set_property (TARGET ${_PYTHON_PREFIX}::NumPy
2761  PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${${_PYTHON_PREFIX}_NumPy_INCLUDE_DIRS}")
2762  target_link_libraries (${_PYTHON_PREFIX}::NumPy INTERFACE ${_PYTHON_PREFIX}::Module)
2763  endif()
2764 endif()
2765 
2766 # final clean-up
2767 
2768 # Restore CMAKE_FIND_APPBUNDLE
2769 if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE)
2770  set (CMAKE_FIND_APPBUNDLE ${_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE})
2771  unset (_${_PYTHON_PREFIX}_CMAKE_FIND_APPBUNDLE)
2772 else()
2773  unset (CMAKE_FIND_APPBUNDLE)
2774 endif()
2775 # Restore CMAKE_FIND_FRAMEWORK
2776 if (DEFINED _${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
2777  set (CMAKE_FIND_FRAMEWORK ${_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK})
2778  unset (_${_PYTHON_PREFIX}_CMAKE_FIND_FRAMEWORK)
2779 else()
2780  unset (CMAKE_FIND_FRAMEWORK)
2781 endif()
location
boost::graph_traits< vtkGraph *>::vertex_descriptor target(boost::graph_traits< vtkGraph *>::edge_descriptor e, vtkGraph *)
type
function _PYTHON_GET_NAMES(_PYTHON_PGN_NAMES)
Definition: Support.cmake:240
on
version
macro _PYTHON_DISPLAY_FAILURE(_PYTHON_MSG)
Definition: Support.cmake:44
string
function _PYTHON_VALIDATE_LIBRARY()
Definition: Support.cmake:668
macro _PYTHON_SELECT_LIBRARY_CONFIGURATIONS(_PYTHON_BASENAME)
Definition: Support.cmake:69
function _PYTHON_GET_FRAMEWORKS(_PYTHON_PGF_FRAMEWORK_PATHS, _PYTHON_VERSION)
Definition: Support.cmake:125
function _PYTHON_VALIDATE_COMPILER(expected_version)
Definition: Support.cmake:614
name
dir
function _PYTHON_MARK_AS_INTERNAL()
Definition: Support.cmake:60
#define VERSION
Definition: jconfigint.h:17
size
function _PYTHON_GET_PATH_SUFFIXES(_PYTHON_PGPS_PATH_SUFFIXES)
Definition: Support.cmake:194
void save(Archiver &ar, const vtkUnicodeString &str, const unsigned int vtkNotUsed(version))
function _PYTHON_GET_ABIFLAGS(_PGABIFLAGS)
Definition: Support.cmake:151
function _PYTHON_VALIDATE_INTERPRETER()
Definition: Support.cmake:495
function _PYTHON_FIND_RUNTIME_LIBRARY(_PYTHON_LIB)
Definition: Support.cmake:770
macro _PYTHON_FIND_FRAMEWORKS()
Definition: Support.cmake:100
function _PYTHON_GET_REGISTRIES(_PYTHON_PGR_REGISTRY_PATHS, _PYTHON_VERSION)
Definition: Support.cmake:134
function _PYTHON_GET_VERSION()
Definition: Support.cmake:425
function _PYTHON_VALIDATE_INCLUDE_DIR()
Definition: Support.cmake:726
function _PYTHON_CHECK_DEVELOPMENT_SIGNATURE(module)
Definition: Support.cmake:1028
function _PYTHON_GET_CONFIG_VAR(_PYTHON_PGCV_VALUE, NAME)
Definition: Support.cmake:295