aboutsummaryrefslogtreecommitdiff
path: root/vcpkg/ports/vcpkg-get-python/vcpkg-port-config.cmake
blob: e38ba5fa5d8a939edcc4e5d2b3a6342662ea07bb (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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
include_guard(GLOBAL)

function(vcpkg_get_vcpkg_installed_python out_python)
  cmake_parse_arguments(PARSE_ARGV 1 "arg" "INTERPRETER" "" "")
  if(DEFINED arg_UNPARSED_ARGUMENTS)
    message(FATAL_ERROR "${CMAKE_CURRENT_FUNCTION} was passed extra arguments: ${arg_UNPARSED_ARGUMENTS}")
  endif()
  if(NOT VCPKG_TARGET_IS_WINDOWS)
    # vcpkg installed python on !windows works as normal python would work.
    set(${out_python} "${CURRENT_HOST_INSTALLED_DIR}/tools/python3/python3" PARENT_SCOPE)
    return()
  endif()
  if(DEFINED CACHE{z_vcpkg_get_vcpkg_installed_python})
    set(${out_python} "${z_vcpkg_get_vcpkg_installed_python}" PARENT_SCOPE)
    return()
  elseif(arg_INTERPRETER AND DEFINED CACHE{z_vcpkg_get_vcpkg_installed_python_interpreter})
    set(${out_python} "${z_vcpkg_get_vcpkg_installed_python_interpreter}" PARENT_SCOPE)
    return()
  endif()

  # On windows python is unable to lookup DLLs, so a manual venv is created
  set(python_home "${CURRENT_HOST_INSTALLED_DIR}/tools/python3")
  set(python_base "${CURRENT_BUILDTREES_DIR}/python-${TARGET_TRIPLET}")

  file(GLOB python_files LIST_DIRECTORIES false "${python_home}/*")
  if(EXISTS "${CURRENT_HOST_INSTALLED_DIR}/tools/python3/DLLs")
    file(COPY "${CURRENT_HOST_INSTALLED_DIR}/tools/python3/DLLs/" DESTINATION "${python_base}/DLLs")
  endif()
  file(COPY ${python_files} DESTINATION "${python_base}/Scripts")
  file(MAKE_DIRECTORY "${python_base}/Lib/site-packages")

  file(WRITE "${python_base}/pyvenv.cfg"
"
home = ${python_home}
include-system-site-packages = false
version = ${PYTHON3_VERSION}
executable = ${python_home}/python.exe
command = ${python_home}/python.exe -m venv ${python_base}
"
)

  file(WRITE "${python_base}/Lib/site-packages/sitecustomize.py"
"
import os
import sys
from pathlib import Path

import site
#enable direct lookup of installed site-packages without the need to copy them
site.addsitedir(sys.base_prefix + '/Lib/site-packages')

vcpkg_bin_path = Path(sys.base_prefix + '/../../bin')
if vcpkg_bin_path.is_dir():
  os.add_dll_directory(vcpkg_bin_path)
"
)

  # This part is intentionally copies headers and link libraries from the target
  # installation (CURRENT_INSTALLED_DIR): The function provides infrastructure for
  # building extensions for the target python while running the host python interpreter.
  # The calling port is responsible to provided the target python3 dependency.
  # However, it is possible to use just the interpreter,
  # e.g. for running extensions already installed in the host triplet.
  if(EXISTS "${CURRENT_INSTALLED_DIR}/lib/python${PYTHON3_VERSION_MAJOR}${PYTHON3_VERSION_MINOR}.lib")
    file(COPY "${CURRENT_INSTALLED_DIR}/${PYTHON3_INCLUDE}/" DESTINATION "${python_base}/include")
    set(suffix "PCBuild/AMD64") # TODO: ask python for the correct suffix.
    file(COPY "${CURRENT_INSTALLED_DIR}/lib/python${PYTHON3_VERSION_MAJOR}${PYTHON3_VERSION_MINOR}.lib" DESTINATION "${python_base}/${suffix}")
    set(z_vcpkg_get_vcpkg_installed_python "${python_base}/Scripts/python.exe" CACHE INTERNAL "")
  elseif(arg_INTERPRETER)
    set(z_vcpkg_get_vcpkg_installed_python_interpreter "${python_base}/Scripts/python.exe" CACHE INTERNAL "")
  else()
    message(${Z_VCPKG_BACKCOMPAT_MESSAGE_LEVEL}
      "Target python3 installation was not found, and the INTERPRETER wasn't given."
      " Either add a \"python3\" dependency to ${PORT},"
      " or add 'INTERPRETER' to the '${CMAKE_CURRENT_FUNCTION}' call."
    )
  endif()

  set(${out_python} "${python_base}/Scripts/python.exe" PARENT_SCOPE)
endfunction()