aboutsummaryrefslogtreecommitdiff
path: root/vcpkg/ports/python3/vcpkg-cmake-wrapper.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'vcpkg/ports/python3/vcpkg-cmake-wrapper.cmake')
-rw-r--r--vcpkg/ports/python3/vcpkg-cmake-wrapper.cmake169
1 files changed, 169 insertions, 0 deletions
diff --git a/vcpkg/ports/python3/vcpkg-cmake-wrapper.cmake b/vcpkg/ports/python3/vcpkg-cmake-wrapper.cmake
new file mode 100644
index 0000000..f5ed6b7
--- /dev/null
+++ b/vcpkg/ports/python3/vcpkg-cmake-wrapper.cmake
@@ -0,0 +1,169 @@
+# For very old ports whose upstream do not properly set the minimum CMake version.
+cmake_policy(SET CMP0012 NEW)
+cmake_policy(SET CMP0057 NEW)
+
+# This prevents the port's python.exe from overriding the Python fetched by
+# vcpkg_find_acquire_program(PYTHON3) and prevents the vcpkg toolchain from
+# stomping on FindPython's default functionality.
+list(REMOVE_ITEM CMAKE_PROGRAM_PATH "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/tools/python3")
+if(@PythonFinder_NO_OVERRIDE@)
+ _find_package(${ARGS})
+ return()
+endif()
+
+# CMake 4.0+ introduced Python_ARTIFACTS_PREFIX to add a suffix (yes, a suffix)
+# to the results of find_package(Python), so we need to handle that here.
+set(_PythonFinder_PREFIX "@PythonFinder_PREFIX@")
+if(@PythonFinder_SUPPORTS_ARTIFACTS_PREFIX@ AND CMAKE_VERSION VERSION_GREATER_EQUAL 4.0)
+ string(APPEND _PythonFinder_PREFIX "${@PythonFinder_PREFIX@_ARTIFACTS_PREFIX}")
+endif()
+
+# CMake's FindPython's separation of concerns is very muddy. We only want to force vcpkg's Python
+# if the consumer is using the development component. What we don't want to do is break detection
+# of the system Python, which may have certain packages the user expects. But - if the user is
+# embedding Python or using both the development and interpreter components, then we need the
+# interpreter matching vcpkg's Python libraries. Note that the "Development" component implies
+# both "Development.Module" and "Development.Embed".
+# The android toolchain links with --no-undefined. So modules must be linked with Python libs.
+if("Development" IN_LIST ARGS OR "Development.Embed" IN_LIST ARGS)
+ set(_PythonFinder_WantInterp TRUE)
+ set(_PythonFinder_WantLibs TRUE)
+elseif("Development.Module" IN_LIST ARGS OR "Development.SABIModule" IN_LIST ARGS)
+ if("Interpreter" IN_LIST ARGS)
+ set(_PythonFinder_WantInterp TRUE)
+ endif()
+ set(_PythonFinder_WantLibs TRUE)
+ if(ANDROID)
+ list(APPEND ARGS COMPONENTS Development.Embed)
+ endif()
+endif()
+
+if(_PythonFinder_WantLibs)
+ find_path(
+ _${_PythonFinder_PREFIX}_INCLUDE_DIR
+ NAMES "Python.h"
+ PATHS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/include"
+ PATH_SUFFIXES "python@PYTHON_VERSION_MAJOR@.@PYTHON_VERSION_MINOR@"
+ NO_DEFAULT_PATH
+ )
+
+ # Don't set the public facing hint or the finder will be unable to detect the debug library.
+ # Internally, it uses the same value with an underscore prepended.
+ find_library(
+ _${_PythonFinder_PREFIX}_LIBRARY_RELEASE
+ NAMES
+ "python@PYTHON_VERSION_MAJOR@@PYTHON_VERSION_MINOR@"
+ "python@PYTHON_VERSION_MAJOR@.@PYTHON_VERSION_MINOR@"
+ PATHS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/lib"
+ NO_DEFAULT_PATH
+ )
+ find_library(
+ _${_PythonFinder_PREFIX}_LIBRARY_DEBUG
+ NAMES
+ "python@PYTHON_VERSION_MAJOR@@PYTHON_VERSION_MINOR@_d"
+ "python@PYTHON_VERSION_MAJOR@.@PYTHON_VERSION_MINOR@d"
+ PATHS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/debug/lib"
+ NO_DEFAULT_PATH
+ )
+
+ if(_PythonFinder_WantInterp)
+ find_program(
+ ${_PythonFinder_PREFIX}_EXECUTABLE
+ NAMES "python" "python@PYTHON_VERSION_MAJOR@.@PYTHON_VERSION_MINOR@"
+ PATHS "${_VCPKG_INSTALLED_DIR}/${VCPKG_TARGET_TRIPLET}/tools/python3"
+ NO_DEFAULT_PATH
+ )
+ endif()
+
+ # These are duplicated as normal variables to nullify FindPython's checksum verifications.
+ set(_${_PythonFinder_PREFIX}_INCLUDE_DIR "${_${_PythonFinder_PREFIX}_INCLUDE_DIR}")
+ set(_${_PythonFinder_PREFIX}_LIBRARY_RELEASE "${_${_PythonFinder_PREFIX}_LIBRARY_RELEASE}")
+ set(_${_PythonFinder_PREFIX}_LIBRARY_DEBUG "${_${_PythonFinder_PREFIX}_LIBRARY_DEBUG}")
+
+ _find_package(${ARGS})
+
+ get_directory_property(_${_PythonFinder_PREFIX}_IMPORTED_TARGETS IMPORTED_TARGETS)
+ if(ANDROID AND ${_PythonFinder_PREFIX}::Module IN_LIST _${_PythonFinder_PREFIX}_IMPORTED_TARGETS)
+ set_property(TARGET ${_PythonFinder_PREFIX}::Module APPEND PROPERTY INTERFACE_LINK_LIBRARIES $<LINK_ONLY:${_PythonFinder_PREFIX}::Python>)
+ endif()
+ unset(_${_PythonFinder_PREFIX}_IMPORTED_TARGETS)
+
+ if(@VCPKG_LIBRARY_LINKAGE@ STREQUAL "static")
+ # Python for Windows embeds the zlib module into the core, so we have to link against it.
+ # This is a separate extension module on Unix-like platforms.
+ if(WIN32)
+ find_package(ZLIB)
+ if(TARGET ${_PythonFinder_PREFIX}::Python)
+ set_property(TARGET ${_PythonFinder_PREFIX}::Python APPEND PROPERTY INTERFACE_LINK_LIBRARIES ZLIB::ZLIB)
+ endif()
+ if(TARGET ${_PythonFinder_PREFIX}::Module)
+ set_property(TARGET ${_PythonFinder_PREFIX}::Module APPEND PROPERTY INTERFACE_LINK_LIBRARIES ZLIB::ZLIB)
+ endif()
+ if(DEFINED ${_PythonFinder_PREFIX}_LIBRARIES)
+ list(APPEND ${_PythonFinder_PREFIX}_LIBRARIES ${ZLIB_LIBRARIES})
+ endif()
+ endif()
+
+ if(UNIX AND NOT APPLE)
+ if(TARGET ${_PythonFinder_PREFIX}::Python)
+ set_property(TARGET ${_PythonFinder_PREFIX}::Python APPEND PROPERTY INTERFACE_LINK_LIBRARIES m)
+ endif()
+ if(TARGET ${_PythonFinder_PREFIX}::Module)
+ set_property(TARGET ${_PythonFinder_PREFIX}::Module APPEND PROPERTY INTERFACE_LINK_LIBRARIES m)
+ endif()
+ if(DEFINED ${_PythonFinder_PREFIX}_LIBRARIES)
+ list(APPEND ${_PythonFinder_PREFIX}_LIBRARIES m)
+ endif()
+ endif()
+
+ if(APPLE)
+ find_package(Iconv)
+ find_package(Intl)
+ if(TARGET ${_PythonFinder_PREFIX}::Python)
+ get_target_property(_PYTHON_INTERFACE_LIBS ${_PythonFinder_PREFIX}::Python INTERFACE_LINK_LIBRARIES)
+ if(NOT _PYTHON_INTERFACE_LIBS)
+ set(_PYTHON_INTERFACE_LIBS "")
+ endif()
+ list(REMOVE_ITEM _PYTHON_INTERFACE_LIBS "-liconv" "-lintl")
+ list(APPEND _PYTHON_INTERFACE_LIBS
+ Iconv::Iconv
+ "$<IF:$<CONFIG:Debug>,${Intl_LIBRARY_DEBUG},${Intl_LIBRARY_RELEASE}>"
+ )
+ set_property(TARGET ${_PythonFinder_PREFIX}::Python PROPERTY INTERFACE_LINK_LIBRARIES ${_PYTHON_INTERFACE_LIBS})
+ unset(_PYTHON_INTERFACE_LIBS)
+ endif()
+ if(TARGET ${_PythonFinder_PREFIX}::Module)
+ get_target_property(_PYTHON_INTERFACE_LIBS ${_PythonFinder_PREFIX}::Module INTERFACE_LINK_LIBRARIES)
+ if(NOT _PYTHON_INTERFACE_LIBS)
+ set(_PYTHON_INTERFACE_LIBS "")
+ endif()
+ list(REMOVE_ITEM _PYTHON_INTERFACE_LIBS "-liconv" "-lintl")
+ list(APPEND _PYTHON_INTERFACE_LIBS
+ Iconv::Iconv
+ "$<IF:$<CONFIG:Debug>,${Intl_LIBRARY_DEBUG},${Intl_LIBRARY_RELEASE}>"
+ )
+ set_property(TARGET ${_PythonFinder_PREFIX}::Module PROPERTY INTERFACE_LINK_LIBRARIES ${_PYTHON_INTERFACE_LIBS})
+ unset(_PYTHON_INTERFACE_LIBS)
+ endif()
+ if(DEFINED ${_PythonFinder_PREFIX}_LIBRARIES)
+ list(APPEND ${_PythonFinder_PREFIX}_LIBRARIES "-framework CoreFoundation" ${Iconv_LIBRARIES} ${Intl_LIBRARIES})
+ endif()
+ endif()
+ endif()
+else()
+ _find_package(${ARGS})
+endif()
+
+if(TARGET ${_PythonFinder_PREFIX}::Python)
+ target_compile_definitions(${_PythonFinder_PREFIX}::Python INTERFACE "Py_NO_LINK_LIB")
+endif()
+if(TARGET ${_PythonFinder_PREFIX}::Module)
+ target_compile_definitions(${_PythonFinder_PREFIX}::Module INTERFACE "Py_NO_LINK_LIB")
+endif()
+if(TARGET ${_PythonFinder_PREFIX}::SABIModule)
+ target_compile_definitions(${_PythonFinder_PREFIX}::SABIModule INTERFACE "Py_NO_LINK_LIB")
+endif()
+
+unset(_PythonFinder_PREFIX)
+unset(_PythonFinder_WantInterp)
+unset(_PythonFinder_WantLibs)