mirror of
https://github.com/microsoft/vcpkg.git
synced 2024-12-19 06:31:07 +08:00
378ffbb940
* [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>
198 lines
9.1 KiB
CMake
198 lines
9.1 KiB
CMake
if (VCPKG_LIBRARY_LINKAGE STREQUAL dynamic AND VCPKG_CRT_LINKAGE STREQUAL static)
|
|
message(STATUS "Warning: Dynamic library with static CRT is not supported. Building static library.")
|
|
set(VCPKG_LIBRARY_LINKAGE static)
|
|
endif()
|
|
|
|
set(PYTHON_VERSION_MAJOR 3)
|
|
set(PYTHON_VERSION_MINOR 9)
|
|
set(PYTHON_VERSION_PATCH 0)
|
|
set(PYTHON_VERSION ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}.${PYTHON_VERSION_PATCH})
|
|
|
|
set(PATCHES
|
|
0002-use-vcpkg-zlib.patch
|
|
0003-devendor-external-dependencies.patch
|
|
0004-dont-copy-vcruntime.patch
|
|
0005-only-build-required-projects.patch
|
|
0006-fix-duplicate-symbols.patch
|
|
)
|
|
if(VCPKG_LIBRARY_LINKAGE STREQUAL "static")
|
|
list(PREPEND PATCHES 0001-static-library.patch)
|
|
endif()
|
|
|
|
vcpkg_from_github(
|
|
OUT_SOURCE_PATH SOURCE_PATH
|
|
REPO python/cpython
|
|
REF v${PYTHON_VERSION}
|
|
SHA512 39d304cae181674c4872c63768c0e5aeace2c92eb6d5ea550428d65c8571bc60922b3a3d484b51c46b466aadb7e27500559cafec13a489b48613bbb3fe6a5a5d
|
|
HEAD_REF master
|
|
PATCHES ${PATCHES}
|
|
)
|
|
|
|
if(VCPKG_TARGET_IS_WINDOWS OR VCPKG_TARGET_IS_UWP)
|
|
# Due to the way Python handles C extension modules on Windows, a static python core cannot
|
|
# load extension modules.
|
|
string(COMPARE EQUAL ${VCPKG_LIBRARY_LINKAGE} "dynamic" PYTHON_ALLOW_EXTENSIONS)
|
|
if(PYTHON_ALLOW_EXTENSIONS)
|
|
find_library(BZ2_RELEASE NAMES bz2 PATHS "${CURRENT_INSTALLED_DIR}/lib" NO_DEFAULT_PATH)
|
|
find_library(BZ2_DEBUG NAMES bz2d PATHS "${CURRENT_INSTALLED_DIR}/debug/lib" NO_DEFAULT_PATH)
|
|
find_library(CRYPTO_RELEASE NAMES libcrypto PATHS "${CURRENT_INSTALLED_DIR}/lib" NO_DEFAULT_PATH)
|
|
find_library(CRYPTO_DEBUG NAMES libcrypto PATHS "${CURRENT_INSTALLED_DIR}/debug/lib" NO_DEFAULT_PATH)
|
|
find_library(EXPAT_RELEASE NAMES libexpat libexpatMD PATHS "${CURRENT_INSTALLED_DIR}/lib" NO_DEFAULT_PATH)
|
|
find_library(EXPAT_DEBUG NAMES libexpatd libexpatdMD PATHS "${CURRENT_INSTALLED_DIR}/debug/lib" NO_DEFAULT_PATH)
|
|
find_library(FFI_RELEASE NAMES libffi PATHS "${CURRENT_INSTALLED_DIR}/lib" NO_DEFAULT_PATH)
|
|
find_library(FFI_DEBUG NAMES libffi PATHS "${CURRENT_INSTALLED_DIR}/debug/lib" NO_DEFAULT_PATH)
|
|
find_library(LZMA_RELEASE NAMES lzma PATHS "${CURRENT_INSTALLED_DIR}/lib" NO_DEFAULT_PATH)
|
|
find_library(LZMA_DEBUG NAMES lzmad PATHS "${CURRENT_INSTALLED_DIR}/debug/lib" NO_DEFAULT_PATH)
|
|
find_library(SQLITE_RELEASE NAMES sqlite3 PATHS "${CURRENT_INSTALLED_DIR}/lib" NO_DEFAULT_PATH)
|
|
find_library(SQLITE_DEBUG NAMES sqlite3 PATHS "${CURRENT_INSTALLED_DIR}/debug/lib" NO_DEFAULT_PATH)
|
|
find_library(SSL_RELEASE NAMES libssl PATHS "${CURRENT_INSTALLED_DIR}/lib" NO_DEFAULT_PATH)
|
|
find_library(SSL_DEBUG NAMES libssl PATHS "${CURRENT_INSTALLED_DIR}/debug/lib" NO_DEFAULT_PATH)
|
|
else()
|
|
message(STATUS "WARNING: Static builds of Python will not have C extension modules available.")
|
|
endif()
|
|
find_library(ZLIB_RELEASE NAMES zlib PATHS "${CURRENT_INSTALLED_DIR}/lib" NO_DEFAULT_PATH)
|
|
find_library(ZLIB_DEBUG NAMES zlib zlibd PATHS "${CURRENT_INSTALLED_DIR}/debug/lib" NO_DEFAULT_PATH)
|
|
|
|
configure_file(${SOURCE_PATH}/PC/pyconfig.h ${SOURCE_PATH}/PC/pyconfig.h)
|
|
configure_file(${CMAKE_CURRENT_LIST_DIR}/python_vcpkg.props.in ${SOURCE_PATH}/PCbuild/python_vcpkg.props)
|
|
configure_file(${CMAKE_CURRENT_LIST_DIR}/openssl.props.in ${SOURCE_PATH}/PCbuild/openssl.props)
|
|
file(WRITE ${SOURCE_PATH}/PCbuild/libffi.props
|
|
"<?xml version='1.0' encoding='utf-8'?>
|
|
<Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003' />"
|
|
)
|
|
|
|
if(PYTHON_ALLOW_EXTENSIONS)
|
|
set(OPTIONS
|
|
"/p:IncludeExtensions=true"
|
|
"/p:IncludeExternals=true"
|
|
"/p:IncludeCTypes=true"
|
|
"/p:IncludeSSL=true"
|
|
"/p:IncludeTkinter=false"
|
|
"/p:IncludeTests=false"
|
|
"/p:ForceImportBeforeCppTargets=${SOURCE_PATH}/PCbuild/python_vcpkg.props"
|
|
)
|
|
else()
|
|
set(OPTIONS
|
|
"/p:IncludeExtensions=false"
|
|
"/p:IncludeExternals=false"
|
|
"/p:IncludeTests=false"
|
|
"/p:ForceImportBeforeCppTargets=${SOURCE_PATH}/PCbuild/python_vcpkg.props"
|
|
)
|
|
endif()
|
|
if(VCPKG_TARGET_IS_UWP)
|
|
list(APPEND OPTIONS "/p:IncludeUwp=true")
|
|
else()
|
|
list(APPEND OPTIONS "/p:IncludeUwp=false")
|
|
endif()
|
|
if(VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic")
|
|
list(APPEND OPTIONS "/p:_VcpkgPythonLinkage=DynamicLibrary")
|
|
else()
|
|
list(APPEND OPTIONS "/p:_VcpkgPythonLinkage=StaticLibrary")
|
|
endif()
|
|
|
|
# _freeze_importlib.exe is run as part of the build process, so make sure the required dynamic libs are available.
|
|
if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release")
|
|
vcpkg_add_to_path("${CURRENT_INSTALLED_DIR}/bin")
|
|
endif()
|
|
if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug")
|
|
vcpkg_add_to_path("${CURRENT_INSTALLED_DIR}/debug/bin")
|
|
endif()
|
|
|
|
vcpkg_install_msbuild(
|
|
SOURCE_PATH ${SOURCE_PATH}
|
|
PROJECT_SUBPATH "PCbuild/pcbuild.proj"
|
|
OPTIONS ${OPTIONS}
|
|
LICENSE_SUBPATH "LICENSE"
|
|
SKIP_CLEAN
|
|
)
|
|
|
|
# The extension modules must be placed in the DLLs directory, so we can't use vcpkg_copy_tools()
|
|
if(PYTHON_ALLOW_EXTENSIONS)
|
|
file(GLOB_RECURSE PYTHON_EXTENSIONS "${CURRENT_BUILDTREES_DIR}/*.pyd")
|
|
list(FILTER PYTHON_EXTENSIONS EXCLUDE REGEX [[.*_d\.pyd]])
|
|
file(COPY ${PYTHON_EXTENSIONS} DESTINATION "${CURRENT_PACKAGES_DIR}/tools/${PORT}/DLLs")
|
|
vcpkg_copy_tool_dependencies("${CURRENT_PACKAGES_DIR}/tools/${PORT}/DLLs")
|
|
file(REMOVE "${CURRENT_PACKAGES_DIR}/tools/${PORT}/DLLs/python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}.dll")
|
|
endif()
|
|
|
|
file(COPY "${SOURCE_PATH}/Include/" "${SOURCE_PATH}/PC/pyconfig.h"
|
|
DESTINATION "${CURRENT_PACKAGES_DIR}/include/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}"
|
|
FILES_MATCHING PATTERN *.h
|
|
)
|
|
file(COPY "${SOURCE_PATH}/Lib" DESTINATION "${CURRENT_PACKAGES_DIR}/tools/${PORT}")
|
|
|
|
# Remove any extension libraries and other unversioned binaries that could conflict with the python2 port.
|
|
# You don't need to link against these anyway.
|
|
file(GLOB PYTHON_LIBS
|
|
"${CURRENT_PACKAGES_DIR}/lib/*.lib"
|
|
"${CURRENT_PACKAGES_DIR}/debug/lib/*.lib"
|
|
)
|
|
list(FILTER PYTHON_LIBS EXCLUDE REGEX [[python[0-9]*(_d)?\.lib$]])
|
|
file(GLOB PYTHON_INSTALLERS "${CURRENT_PACKAGES_DIR}/tools/${PORT}/wininst-*.exe")
|
|
file(REMOVE ${PYTHON_LIBS} ${PYTHON_INSTALLERS})
|
|
|
|
if(PYTHON_ALLOW_EXTENSIONS)
|
|
message(STATUS "Bootstrapping pip")
|
|
vcpkg_execute_required_process(COMMAND python -m ensurepip
|
|
WORKING_DIRECTORY "${CURRENT_PACKAGES_DIR}/tools/${PORT}"
|
|
LOGNAME "ensurepip-${TARGET_TRIPLET}"
|
|
)
|
|
endif()
|
|
|
|
vcpkg_clean_msbuild()
|
|
else()
|
|
set(OPTIONS
|
|
"--with-openssl=${CURRENT_INSTALLED_DIR}"
|
|
"--with-ensurepip"
|
|
[[--with-suffix=""]]
|
|
"--with-system-expat"
|
|
)
|
|
if(VCPKG_TARGET_IS_OSX)
|
|
list(APPEND OPTIONS "LIBS=-liconv -lintl")
|
|
endif()
|
|
|
|
vcpkg_configure_make(
|
|
SOURCE_PATH ${SOURCE_PATH}
|
|
OPTIONS ${OPTIONS}
|
|
OPTIONS_DEBUG "--with-pydebug"
|
|
)
|
|
vcpkg_install_make(ADD_BIN_TO_PATH INSTALL_TARGET altinstall)
|
|
|
|
file(COPY "${CURRENT_PACKAGES_DIR}/bin/" DESTINATION "${CURRENT_PACKAGES_DIR}/tools/${PORT}/bin")
|
|
file(COPY "${CURRENT_PACKAGES_DIR}/tools/${PORT}/bin/" DESTINATION "${CURRENT_PACKAGES_DIR}/tools/${PORT}")
|
|
|
|
# Makefiles, c files, __pycache__, and other junk.
|
|
file(GLOB PYTHON_LIB_DIRS LIST_DIRECTORIES true
|
|
"${CURRENT_PACKAGES_DIR}/lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/*"
|
|
"${CURRENT_PACKAGES_DIR}/debug/lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/*")
|
|
list(FILTER PYTHON_LIB_DIRS INCLUDE REGEX [[config-[0-9].*.*]])
|
|
file(REMOVE_RECURSE ${PYTHON_LIB_DIRS})
|
|
|
|
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/bin")
|
|
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/bin")
|
|
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include")
|
|
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/share")
|
|
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/include/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}d")
|
|
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/share/${PORT}/man1")
|
|
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/tools/${PORT}/bin")
|
|
file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/tools/${PORT}/debug")
|
|
|
|
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)
|