summaryrefslogtreecommitdiff
path: root/indra/cmake/Python.cmake
blob: 39fd21c33f8f6c418450136bb0460b9908768776 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# -*- cmake -*-

set(PYTHONINTERP_FOUND)

if (DEFINED ENV{PYTHON})
  # Allow python executable to be explicitly set
  set(python "$ENV{PYTHON}")
  set(PYTHONINTERP_FOUND ON)
elseif (WINDOWS)
  # On Windows, explicitly avoid Cygwin Python.

  # if the user has their own version of Python installed, prefer that
  foreach(hive HKEY_CURRENT_USER HKEY_LOCAL_MACHINE)
    # prefer more recent Python versions to older ones, if multiple versions
    # are installed
    foreach(pyver 3.14 3.13 3.12 3.11 3.10 3.9 3.8 3.7)
      list(APPEND regpaths "[${hive}\\SOFTWARE\\Python\\PythonCore\\${pyver}\\InstallPath]")
    endforeach()
  endforeach()

  # TODO: This logic has the disadvantage that if you have multiple versions
  # of Python installed, the selected path won't necessarily be the newest -
  # e.g. this GLOB will prefer Python310 to Python311. But since pymaybe is
  # checked AFTER the registry entries, this will only surface as a problem if
  # no installed Python appears in the registry.
  file(GLOB pymaybe
    "$ENV{PROGRAMFILES}/Python*"
##  "$ENV{PROGRAMFILES(X86)}/Python*"
    # The Windows environment variable is in fact as shown above, but CMake
    # disallows querying an environment variable containing parentheses -
    # thanks, Windows. Fudge by just appending " (x86)" to $PROGRAMFILES and
    # hoping for the best.
    "$ENV{PROGRAMFILES} (x86)/Python*"
    "c:/Python*")

  find_program(python
    NAMES python3.exe python.exe
    NO_DEFAULT_PATH # added so that cmake does not find cygwin python
    PATHS
    ${regpaths}
    ${pymaybe}
    )
  find_package(Python3 COMPONENTS Interpreter)
else()
  find_program(python python3)

  if (python)
    set(PYTHONINTERP_FOUND ON)
  endif (python)
endif (DEFINED ENV{PYTHON})

if (NOT python)
  message(FATAL_ERROR "No Python interpreter found")
endif (NOT python)

set(PYTHON_EXECUTABLE "${python}" CACHE FILEPATH "Python interpreter for builds")
mark_as_advanced(PYTHON_EXECUTABLE)