vcpkg/ports/python3/vcpkg-cmake-wrapper.cmake
Adam Johnson 378ffbb940
[python3] Add vcpkg-cmake-wrapper. (#15221)
* [python3] Add vcpkg-cmake-wrapper.cmake.

This is still a WIP... For now, we only remove registry detection on
Windows.

* [python3] Fix Windows static embedding linkage.

* [python3] Fix Linux static library embedding.

* [python3] Fix linkage on macOS.

* [python3] Only link extra libs when static.

* [python3] Bump port version for vcpkg-cmake-wrapper.

* [itk] Remove obsolete Python artifact specification.

* [pybind11] Remove obsolete Python artifact specification.

* [python3] Mark `find_package()` calls as REQUIRED.

Co-authored-by: Jack·Boos·Yu <47264268+JackBoosY@users.noreply.github.com>

* [python3] Bump port version after #15378.

* [python3] Be more selective about when to unleash the nukes.

* [python3] Add usage message.

* [python3] Don't swallow `vcpkg_find_acquire_program`'s Python3.

* [python3] Don't forcibly change the registry find state.

* [python3] fix copypasta error

* [python3] Fix config error with the opensubdiv port.

Co-authored-by: Jack·Boos·Yu <47264268+JackBoosY@users.noreply.github.com>
Co-authored-by: Billy Robert O'Neal III <bion@microsoft.com>
2021-01-05 13:39:53 -08:00

121 lines
5.3 KiB
CMake

# 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'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"
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)
if("Interpreter" IN_LIST ARGS)
set(_PythonFinder_WantInterp TRUE)
endif()
set(_PythonFinder_WantLibs TRUE)
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()
_find_package(${ARGS})
if(@VCPKG_LIBRARY_LINKAGE@ STREQUAL static)
include(CMakeFindDependencyMacro)
# 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_dependency(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(APPLE)
find_dependency(Iconv)
find_dependency(Intl)
if(TARGET @PythonFinder_PREFIX@::Python)
get_target_property(_PYTHON_INTERFACE_LIBS @PythonFinder_PREFIX@::Python INTERFACE_LINK_LIBRARIES)
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)
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()
unset(_PythonFinder_WantInterp)
unset(_PythonFinder_WantLibs)