2017-05-20 16:58:30 +08:00
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 ( )
2018-01-05 00:55:01 +08:00
set ( PYTHON_VERSION_MAJOR 3 )
2021-10-07 03:53:06 +08:00
set ( PYTHON_VERSION_MINOR 10 )
2021-12-11 05:58:11 +08:00
set ( PYTHON_VERSION_PATCH 1 )
2018-01-05 00:55:01 +08:00
set ( PYTHON_VERSION ${ PYTHON_VERSION_MAJOR } . ${ PYTHON_VERSION_MINOR } . ${ PYTHON_VERSION_PATCH } )
2017-05-20 05:31:04 +08:00
2020-12-19 04:00:45 +08:00
set ( PATCHES
0 0 0 2 - u s e - v c p k g - z l i b . p a t c h
0 0 0 3 - d e v e n d o r - e x t e r n a l - d e p e n d e n c i e s . p a t c h
0 0 0 4 - d o n t - c o p y - v c r u n t i m e . p a t c h
0 0 0 5 - o n l y - b u i l d - r e q u i r e d - p r o j e c t s . p a t c h
2021-11-30 02:05:12 +08:00
0 0 0 8 - f i x - p a r a l l e l - i n s t a l l . p a t c h
2020-12-19 04:00:45 +08:00
)
if ( VCPKG_LIBRARY_LINKAGE STREQUAL "static" )
list ( PREPEND PATCHES 0001-static-library.patch )
2020-06-12 13:23:26 +08:00
endif ( )
2021-03-30 01:09:14 +08:00
# Python 3.9 removed support for Windows 7. This patch re-adds support for Windows 7 and is therefore
# required to build this port on Windows 7 itself due to Python using itself in its own build system.
if ( "deprecated-win7-support" IN_LIST FEATURES )
2021-10-07 03:53:06 +08:00
list ( APPEND PATCHES 0006-restore-support-for-windows-7.patch )
2021-03-30 01:09:14 +08:00
message ( WARNING "Windows 7 support is deprecated and may be removed at any time." )
elseif ( VCPKG_TARGET_IS_WINDOWS AND CMAKE_SYSTEM_VERSION EQUAL 6.1 )
message ( FATAL_ERROR "python3 requires the feature deprecated-win7-support when building on Windows 7." )
endif ( )
2021-09-30 00:00:21 +08:00
# The Windows 11 SDK has a problem that causes it to error on the resource files, so we patch that.
if ( VCPKG_TARGET_IS_WINDOWS OR VCPKG_TARGET_IS_UWP )
vcpkg_get_windows_sdk ( WINSDK_VERSION )
if ( "${WINSDK_VERSION}" VERSION_GREATER_EQUAL "10.0.22000" )
2021-10-07 03:53:06 +08:00
list ( APPEND PATCHES "0007-workaround-windows-11-sdk-rc-compiler-error.patch" )
2021-09-30 00:00:21 +08:00
endif ( )
endif ( )
2017-05-20 05:31:04 +08:00
vcpkg_from_github (
2020-12-19 04:00:45 +08:00
O U T _ S O U R C E _ P A T H S O U R C E _ P A T H
2017-05-20 05:31:04 +08:00
R E P O p y t h o n / c p y t h o n
2018-01-05 00:55:01 +08:00
R E F v $ { P Y T H O N _ V E R S I O N }
2021-12-11 12:48:52 +08:00
S H A 5 1 2 2 3 f 9 9 b 7 7 c 7 9 7 8 2 8 2 d 4 3 a 6 e 4 4 2 8 1 1 d e 1 d 6 e 8 c c 9 5 9 7 c 6 d 1 1 4 3 e c 6 5 a e 9 8 6 f 6 4 8 0 5 c 3 6 a 0 a 0 3 3 6 3 2 a 4 d 1 a 8 9 0 5 3 a 5 5 8 5 4 9 0 4 b c f 1 1 4 1 5 d 9 1 e 2 a 3 b 4 a 5 3 0 8 c 4 a 2 1 d e 8 0 0 9 8
2017-05-20 05:31:04 +08:00
H E A D _ R E F m a s t e r
2020-06-12 13:23:26 +08:00
P A T C H E S $ { P A T C H E S }
2018-03-18 19:31:30 +08:00
)
2020-12-19 04:00:45 +08:00
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 )
2021-09-14 11:00:44 +08:00
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"
2020-12-19 04:00:45 +08:00
" < ? x m l v e r s i o n = ' 1 . 0 ' e n c o d i n g = ' u t f - 8 ' ? >
< P r o j e c t x m l n s = ' h t t p : / / s c h e m a s . m i c r o s o f t . c o m / d e v e l o p e r / m s b u i l d / 2 0 0 3 ' / > "
)
if ( PYTHON_ALLOW_EXTENSIONS )
set ( OPTIONS
" / p : I n c l u d e E x t e n s i o n s = t r u e "
" / p : I n c l u d e E x t e r n a l s = t r u e "
" / p : I n c l u d e C T y p e s = t r u e "
" / p : I n c l u d e S S L = t r u e "
" / p : I n c l u d e T k i n t e r = f a l s e "
" / p : I n c l u d e T e s t s = f a l s e "
" / p : F o r c e I m p o r t B e f o r e C p p T a r g e t s = $ { S O U R C E _ P A T H } / P C b u i l d / p y t h o n _ v c p k g . p r o p s "
)
else ( )
set ( OPTIONS
" / p : I n c l u d e E x t e n s i o n s = f a l s e "
" / p : I n c l u d e E x t e r n a l s = f a l s e "
" / p : I n c l u d e T e s t s = f a l s e "
" / p : F o r c e I m p o r t B e f o r e C p p T a r g e t s = $ { S O U R C E _ P A T H } / P C b u i l d / p y t h o n _ v c p k g . p r o p s "
)
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" )
2020-05-22 02:39:48 +08:00
endif ( )
2020-03-11 03:25:18 +08:00
2020-12-19 04:00:45 +08:00
# _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 (
2021-09-14 11:00:44 +08:00
S O U R C E _ P A T H " $ { S O U R C E _ P A T H } "
2020-12-19 04:00:45 +08:00
P R O J E C T _ S U B P A T H " P C b u i l d / p c b u i l d . p r o j "
O P T I O N S $ { O P T I O N S }
L I C E N S E _ S U B P A T H " L I C E N S E "
2021-09-30 00:00:21 +08:00
T A R G E T _ P L A T F O R M _ V E R S I O N " $ { W I N S D K _ V E R S I O N } "
2020-12-19 04:00:45 +08:00
S K I P _ C L E A N
)
# 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"
D E S T I N A T I O N " $ { C U R R E N T _ P A C K A G E S _ D I R } / i n c l u d e / p y t h o n $ { P Y T H O N _ V E R S I O N _ M A J O R } . $ { P Y T H O N _ V E R S I O N _ M I N O R } "
F I L E S _ M A T C H I N G P A T T E R N * . 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
" $ { C U R R E N T _ P A C K A G E S _ D I R } / l i b / * . l i b "
" $ { C U R R E N T _ P A C K A G E S _ D I R } / d e b u g / l i b / * . l i b "
)
list ( FILTER PYTHON_LIBS EXCLUDE REGEX [[python[0-9]*(_d ) ? \ . l i b $ ] ] )
file ( GLOB PYTHON_INSTALLERS "${CURRENT_PACKAGES_DIR}/tools/${PORT}/wininst-*.exe" )
file ( REMOVE ${ PYTHON_LIBS } ${ PYTHON_INSTALLERS } )
2021-12-17 14:20:11 +08:00
# The generated python executable must match the host arch
if ( PYTHON_ALLOW_EXTENSIONS AND NOT VCPKG_CROSSCOMPILING )
2020-12-19 04:00:45 +08:00
message ( STATUS "Bootstrapping pip" )
vcpkg_execute_required_process ( COMMAND python -m ensurepip
W O R K I N G _ D I R E C T O R Y " $ { C U R R E N T _ P A C K A G E S _ D I R } / t o o l s / $ { P O R T } "
L O G N A M E " e n s u r e p i p - $ { T A R G E T _ T R I P L E T } "
)
endif ( )
vcpkg_clean_msbuild ( )
else ( )
set ( OPTIONS
" - - w i t h - o p e n s s l = $ { C U R R E N T _ I N S T A L L E D _ D I R } "
" - - w i t h - e n s u r e p i p "
2021-10-01 14:58:36 +08:00
" - - w i t h - s u f f i x = "
2020-12-19 04:00:45 +08:00
" - - w i t h - s y s t e m - e x p a t "
)
if ( VCPKG_TARGET_IS_OSX )
list ( APPEND OPTIONS "LIBS=-liconv -lintl" )
endif ( )
2019-11-19 06:04:25 +08:00
2020-12-19 04:00:45 +08:00
vcpkg_configure_make (
2021-09-14 11:00:44 +08:00
S O U R C E _ P A T H " $ { S O U R C E _ P A T H } "
2020-12-19 04:00:45 +08:00
O P T I O N S $ { O P T I O N S }
O P T I O N S _ D E B U G " - - w i t h - p y d e b u g "
)
vcpkg_install_make ( ADD_BIN_TO_PATH INSTALL_TARGET altinstall )
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
" $ { C U R R E N T _ P A C K A G E S _ D I R } / l i b / p y t h o n $ { P Y T H O N _ V E R S I O N _ M A J O R } . $ { P Y T H O N _ V E R S I O N _ M I N O R } / * "
" $ { C U R R E N T _ P A C K A G E S _ D I R } / d e b u g / l i b / p y t h o n $ { P Y T H O N _ V E R S I O N _ M A J O R } . $ { P Y T H O N _ V E R S I O N _ M I N O R } / * " )
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" )
2021-11-10 03:45:15 +08:00
vcpkg_fixup_pkgconfig ( )
2019-09-30 09:58:00 +08:00
endif ( )
2021-01-06 05:39:53 +08:00
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 (
" $ { C M A K E _ C U R R E N T _ L I S T _ D I R } / v c p k g - c m a k e - w r a p p e r . c m a k e "
" $ { C U R R E N T _ P A C K A G E S _ D I R } / s h a r e / $ { P y t h o n F i n d e r _ D I R E C T O R Y } / v c p k g - c m a k e - w r a p p e r . c m a k e "
@ O N L Y
)
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 )
2021-11-10 03:45:15 +08:00
if ( NOT VCPKG_TARGET_IS_WINDOWS )
2021-12-03 11:51:47 +08:00
function ( replace_dirs_in_config_file python_config_file )
vcpkg_replace_string ( "${python_config_file}" "${CURRENT_INSTALLED_DIR}" "' + _base + '" )
vcpkg_replace_string ( "${python_config_file}" "${CURRENT_PACKAGES_DIR}" "' + _base + '" )
vcpkg_replace_string ( "${python_config_file}" "${CURRENT_BUILDTREES_DIR}" "not/existing" )
endfunction ( )
if ( NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release" )
file ( GLOB python_config_files "${CURRENT_PACKAGES_DIR}/lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/_sysconfigdata*" )
list ( POP_FRONT python_config_files python_config_file )
vcpkg_replace_string ( "${python_config_file}" "# system configuration generated and used by the sysconfig module" "# system configuration generated and used by the sysconfig module\nimport os\n_base = os.path.dirname(os.path.dirname(os.path.dirname(__file__)))\n" )
replace_dirs_in_config_file ( "${python_config_file}" )
endif ( )
if ( NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug" )
file ( GLOB python_config_files "${CURRENT_PACKAGES_DIR}/debug/lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/_sysconfigdata*" )
list ( POP_FRONT python_config_files python_config_file )
vcpkg_replace_string ( "${python_config_file}" "# system configuration generated and used by the sysconfig module" "# system configuration generated and used by the sysconfig module\nimport os\n_base = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))\n" )
replace_dirs_in_config_file ( "${python_config_file}" )
endif ( )
2021-11-10 03:45:15 +08:00
endif ( )