From 378ffbb940e0a9112f60f837f68db202e2e280bf Mon Sep 17 00:00:00 2001 From: Adam Johnson Date: Tue, 5 Jan 2021 16:39:53 -0500 Subject: [python3] Add vcpkg-cmake-wrapper. (#15221) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [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 --- ports/python3/portfile.cmake | 16 +++++ ports/python3/usage | 4 ++ ports/python3/vcpkg-cmake-wrapper.cmake | 120 ++++++++++++++++++++++++++++++++ ports/python3/vcpkg.json | 10 ++- 4 files changed, 149 insertions(+), 1 deletion(-) create mode 100644 ports/python3/usage create mode 100644 ports/python3/vcpkg-cmake-wrapper.cmake (limited to 'ports/python3') diff --git a/ports/python3/portfile.cmake b/ports/python3/portfile.cmake index 711b317e0..72b4ee3bd 100644 --- a/ports/python3/portfile.cmake +++ b/ports/python3/portfile.cmake @@ -179,3 +179,19 @@ else() file(INSTALL "${SOURCE_PATH}/LICENSE" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME "copyright") endif() + +file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/usage" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}") + +function(_generate_finder) + cmake_parse_arguments(PythonFinder "NO_OVERRIDE" "DIRECTORY;PREFIX" "" ${ARGN}) + configure_file( + "${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake" + "${CURRENT_PACKAGES_DIR}/share/${PythonFinder_DIRECTORY}/vcpkg-cmake-wrapper.cmake" + @ONLY + ) +endfunction() + +message(STATUS "Installing cmake wrappers") +_generate_finder(DIRECTORY "python" PREFIX "Python") +_generate_finder(DIRECTORY "python3" PREFIX "Python3") +_generate_finder(DIRECTORY "pythoninterp" PREFIX "PYTHON" NO_OVERRIDE) diff --git a/ports/python3/usage b/ports/python3/usage new file mode 100644 index 000000000..e177b11f6 --- /dev/null +++ b/ports/python3/usage @@ -0,0 +1,4 @@ +The package python3 is compatible with built-in CMake targets: + + find_package(Python3 COMPONENTS Development REQUIRED) + target_link_libraries(main PRIVATE Python3::Python) diff --git a/ports/python3/vcpkg-cmake-wrapper.cmake b/ports/python3/vcpkg-cmake-wrapper.cmake new file mode 100644 index 000000000..83c3fbd1c --- /dev/null +++ b/ports/python3/vcpkg-cmake-wrapper.cmake @@ -0,0 +1,120 @@ +# 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 + "$,${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 + "$,${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) diff --git a/ports/python3/vcpkg.json b/ports/python3/vcpkg.json index b8aa2ac3c..d89136da3 100644 --- a/ports/python3/vcpkg.json +++ b/ports/python3/vcpkg.json @@ -1,7 +1,7 @@ { "name": "python3", "version-string": "3.9.0", - "port-version": 2, + "port-version": 3, "description": "The Python programming language", "homepage": "https://github.com/python/cpython", "supports": "!(arm | uwp)", @@ -11,10 +11,18 @@ "platform": "!(windows & static)" }, "expat", + { + "name": "gettext", + "platform": "osx" + }, { "name": "libffi", "platform": "!(windows & static)" }, + { + "name": "libiconv", + "platform": "osx" + }, { "name": "liblzma", "platform": "!(windows & static)" -- cgit v1.2.3