]>
Commit | Line | Data |
---|---|---|
1e59de90 TL |
1 | if (VCPKG_LIBRARY_LINKAGE STREQUAL dynamic AND VCPKG_CRT_LINKAGE STREQUAL static) |
2 | message(STATUS "Warning: Dynamic library with static CRT is not supported. Building static library.") | |
3 | set(VCPKG_LIBRARY_LINKAGE static) | |
4 | endif() | |
5 | ||
6 | set(PYTHON_VERSION_MAJOR 3) | |
7 | set(PYTHON_VERSION_MINOR 9) | |
8 | set(PYTHON_VERSION_PATCH 2) | |
9 | set(PYTHON_VERSION ${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}.${PYTHON_VERSION_PATCH}) | |
10 | ||
11 | set(PATCHES | |
12 | 0002-use-vcpkg-zlib.patch | |
13 | 0003-devendor-external-dependencies.patch | |
14 | 0004-dont-copy-vcruntime.patch | |
15 | 0005-only-build-required-projects.patch | |
16 | 0006-fix-duplicate-symbols.patch | |
17 | ) | |
18 | if(VCPKG_LIBRARY_LINKAGE STREQUAL "static") | |
19 | list(PREPEND PATCHES 0001-static-library.patch) | |
20 | endif() | |
21 | ||
22 | # Python 3.9 removed support for Windows 7. This patch re-adds support for Windows 7 and is therefore | |
23 | # required to build this port on Windows 7 itself due to Python using itself in its own build system. | |
24 | if("deprecated-win7-support" IN_LIST FEATURES) | |
25 | list(APPEND PATCHES 0007-restore-support-for-windows-7.patch) | |
26 | message(WARNING "Windows 7 support is deprecated and may be removed at any time.") | |
27 | elseif(VCPKG_TARGET_IS_WINDOWS AND CMAKE_SYSTEM_VERSION EQUAL 6.1) | |
28 | message(FATAL_ERROR "python3 requires the feature deprecated-win7-support when building on Windows 7.") | |
29 | endif() | |
30 | ||
31 | vcpkg_from_github( | |
32 | OUT_SOURCE_PATH SOURCE_PATH | |
33 | REPO python/cpython | |
34 | REF v${PYTHON_VERSION} | |
35 | SHA512 f13c7e50d2c7c00e67b801b0bbb6ab6a8b6bd16c706b3bdd9d2186de3830f0043d0b95d7993d65a169adc9097738906c07727f0df49cd2fb2916bdf0456896b6 | |
36 | HEAD_REF master | |
37 | PATCHES ${PATCHES} | |
38 | ) | |
39 | ||
40 | if(VCPKG_TARGET_IS_WINDOWS OR VCPKG_TARGET_IS_UWP) | |
41 | # Due to the way Python handles C extension modules on Windows, a static python core cannot | |
42 | # load extension modules. | |
43 | string(COMPARE EQUAL ${VCPKG_LIBRARY_LINKAGE} "dynamic" PYTHON_ALLOW_EXTENSIONS) | |
44 | if(PYTHON_ALLOW_EXTENSIONS) | |
45 | find_library(BZ2_RELEASE NAMES bz2 PATHS "${CURRENT_INSTALLED_DIR}/lib" NO_DEFAULT_PATH) | |
46 | find_library(BZ2_DEBUG NAMES bz2d PATHS "${CURRENT_INSTALLED_DIR}/debug/lib" NO_DEFAULT_PATH) | |
47 | find_library(CRYPTO_RELEASE NAMES libcrypto PATHS "${CURRENT_INSTALLED_DIR}/lib" NO_DEFAULT_PATH) | |
48 | find_library(CRYPTO_DEBUG NAMES libcrypto PATHS "${CURRENT_INSTALLED_DIR}/debug/lib" NO_DEFAULT_PATH) | |
49 | find_library(EXPAT_RELEASE NAMES libexpat libexpatMD PATHS "${CURRENT_INSTALLED_DIR}/lib" NO_DEFAULT_PATH) | |
50 | find_library(EXPAT_DEBUG NAMES libexpatd libexpatdMD PATHS "${CURRENT_INSTALLED_DIR}/debug/lib" NO_DEFAULT_PATH) | |
51 | find_library(FFI_RELEASE NAMES libffi PATHS "${CURRENT_INSTALLED_DIR}/lib" NO_DEFAULT_PATH) | |
52 | find_library(FFI_DEBUG NAMES libffi PATHS "${CURRENT_INSTALLED_DIR}/debug/lib" NO_DEFAULT_PATH) | |
53 | find_library(LZMA_RELEASE NAMES lzma PATHS "${CURRENT_INSTALLED_DIR}/lib" NO_DEFAULT_PATH) | |
54 | find_library(LZMA_DEBUG NAMES lzmad PATHS "${CURRENT_INSTALLED_DIR}/debug/lib" NO_DEFAULT_PATH) | |
55 | find_library(SQLITE_RELEASE NAMES sqlite3 PATHS "${CURRENT_INSTALLED_DIR}/lib" NO_DEFAULT_PATH) | |
56 | find_library(SQLITE_DEBUG NAMES sqlite3 PATHS "${CURRENT_INSTALLED_DIR}/debug/lib" NO_DEFAULT_PATH) | |
57 | find_library(SSL_RELEASE NAMES libssl PATHS "${CURRENT_INSTALLED_DIR}/lib" NO_DEFAULT_PATH) | |
58 | find_library(SSL_DEBUG NAMES libssl PATHS "${CURRENT_INSTALLED_DIR}/debug/lib" NO_DEFAULT_PATH) | |
59 | else() | |
60 | message(STATUS "WARNING: Static builds of Python will not have C extension modules available.") | |
61 | endif() | |
62 | find_library(ZLIB_RELEASE NAMES zlib PATHS "${CURRENT_INSTALLED_DIR}/lib" NO_DEFAULT_PATH) | |
63 | find_library(ZLIB_DEBUG NAMES zlib zlibd PATHS "${CURRENT_INSTALLED_DIR}/debug/lib" NO_DEFAULT_PATH) | |
64 | ||
65 | configure_file(${SOURCE_PATH}/PC/pyconfig.h ${SOURCE_PATH}/PC/pyconfig.h) | |
66 | configure_file(${CMAKE_CURRENT_LIST_DIR}/python_vcpkg.props.in ${SOURCE_PATH}/PCbuild/python_vcpkg.props) | |
67 | configure_file(${CMAKE_CURRENT_LIST_DIR}/openssl.props.in ${SOURCE_PATH}/PCbuild/openssl.props) | |
68 | file(WRITE ${SOURCE_PATH}/PCbuild/libffi.props | |
69 | "<?xml version='1.0' encoding='utf-8'?> | |
70 | <Project xmlns='http://schemas.microsoft.com/developer/msbuild/2003' />" | |
71 | ) | |
72 | ||
73 | if(PYTHON_ALLOW_EXTENSIONS) | |
74 | set(OPTIONS | |
75 | "/p:IncludeExtensions=true" | |
76 | "/p:IncludeExternals=true" | |
77 | "/p:IncludeCTypes=true" | |
78 | "/p:IncludeSSL=true" | |
79 | "/p:IncludeTkinter=false" | |
80 | "/p:IncludeTests=false" | |
81 | "/p:ForceImportBeforeCppTargets=${SOURCE_PATH}/PCbuild/python_vcpkg.props" | |
82 | ) | |
83 | else() | |
84 | set(OPTIONS | |
85 | "/p:IncludeExtensions=false" | |
86 | "/p:IncludeExternals=false" | |
87 | "/p:IncludeTests=false" | |
88 | "/p:ForceImportBeforeCppTargets=${SOURCE_PATH}/PCbuild/python_vcpkg.props" | |
89 | ) | |
90 | endif() | |
91 | string(REPLACE "\\" "" WindowsSDKVersion "$ENV{WindowsSDKVersion}") | |
92 | list(APPEND OPTIONS | |
93 | "/p:WindowsTargetPlatformVersion=${WindowsSDKVersion}" | |
94 | "/p:DefaultWindowsSDKVersion=${WindowsSDKVersion}" | |
95 | ) | |
96 | if(VCPKG_TARGET_IS_UWP) | |
97 | list(APPEND OPTIONS "/p:IncludeUwp=true") | |
98 | else() | |
99 | list(APPEND OPTIONS "/p:IncludeUwp=false") | |
100 | endif() | |
101 | if(VCPKG_LIBRARY_LINKAGE STREQUAL "dynamic") | |
102 | list(APPEND OPTIONS "/p:_VcpkgPythonLinkage=DynamicLibrary") | |
103 | else() | |
104 | list(APPEND OPTIONS "/p:_VcpkgPythonLinkage=StaticLibrary") | |
105 | endif() | |
106 | ||
107 | # _freeze_importlib.exe is run as part of the build process, so make sure the required dynamic libs are available. | |
108 | if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "release") | |
109 | vcpkg_add_to_path("${CURRENT_INSTALLED_DIR}/bin") | |
110 | endif() | |
111 | if(NOT DEFINED VCPKG_BUILD_TYPE OR VCPKG_BUILD_TYPE STREQUAL "debug") | |
112 | vcpkg_add_to_path("${CURRENT_INSTALLED_DIR}/debug/bin") | |
113 | endif() | |
114 | ||
115 | vcpkg_install_msbuild( | |
116 | SOURCE_PATH ${SOURCE_PATH} | |
117 | PROJECT_SUBPATH "PCbuild/pcbuild.proj" | |
118 | OPTIONS ${OPTIONS} | |
119 | LICENSE_SUBPATH "LICENSE" | |
120 | SKIP_CLEAN | |
121 | ) | |
122 | ||
123 | # The extension modules must be placed in the DLLs directory, so we can't use vcpkg_copy_tools() | |
124 | if(PYTHON_ALLOW_EXTENSIONS) | |
125 | file(GLOB_RECURSE PYTHON_EXTENSIONS "${CURRENT_BUILDTREES_DIR}/*.pyd") | |
126 | list(FILTER PYTHON_EXTENSIONS EXCLUDE REGEX [[.*_d\.pyd]]) | |
127 | file(COPY ${PYTHON_EXTENSIONS} DESTINATION "${CURRENT_PACKAGES_DIR}/tools/${PORT}/DLLs") | |
128 | vcpkg_copy_tool_dependencies("${CURRENT_PACKAGES_DIR}/tools/${PORT}/DLLs") | |
129 | file(REMOVE "${CURRENT_PACKAGES_DIR}/tools/${PORT}/DLLs/python${PYTHON_VERSION_MAJOR}${PYTHON_VERSION_MINOR}.dll") | |
130 | endif() | |
131 | ||
132 | file(COPY "${SOURCE_PATH}/Include/" "${SOURCE_PATH}/PC/pyconfig.h" | |
133 | DESTINATION "${CURRENT_PACKAGES_DIR}/include/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}" | |
134 | FILES_MATCHING PATTERN *.h | |
135 | ) | |
136 | file(COPY "${SOURCE_PATH}/Lib" DESTINATION "${CURRENT_PACKAGES_DIR}/tools/${PORT}") | |
137 | ||
138 | # Remove any extension libraries and other unversioned binaries that could conflict with the python2 port. | |
139 | # You don't need to link against these anyway. | |
140 | file(GLOB PYTHON_LIBS | |
141 | "${CURRENT_PACKAGES_DIR}/lib/*.lib" | |
142 | "${CURRENT_PACKAGES_DIR}/debug/lib/*.lib" | |
143 | ) | |
144 | list(FILTER PYTHON_LIBS EXCLUDE REGEX [[python[0-9]*(_d)?\.lib$]]) | |
145 | file(GLOB PYTHON_INSTALLERS "${CURRENT_PACKAGES_DIR}/tools/${PORT}/wininst-*.exe") | |
146 | file(REMOVE ${PYTHON_LIBS} ${PYTHON_INSTALLERS}) | |
147 | ||
148 | if(PYTHON_ALLOW_EXTENSIONS) | |
149 | message(STATUS "Bootstrapping pip") | |
150 | vcpkg_execute_required_process(COMMAND python -m ensurepip | |
151 | WORKING_DIRECTORY "${CURRENT_PACKAGES_DIR}/tools/${PORT}" | |
152 | LOGNAME "ensurepip-${TARGET_TRIPLET}" | |
153 | ) | |
154 | endif() | |
155 | ||
156 | vcpkg_clean_msbuild() | |
157 | else() | |
158 | set(OPTIONS | |
159 | "--with-openssl=${CURRENT_INSTALLED_DIR}" | |
160 | "--with-ensurepip" | |
161 | [[--with-suffix=""]] | |
162 | "--with-system-expat" | |
163 | ) | |
164 | if(VCPKG_TARGET_IS_OSX) | |
165 | list(APPEND OPTIONS "LIBS=-liconv -lintl") | |
166 | endif() | |
167 | ||
168 | vcpkg_configure_make( | |
169 | SOURCE_PATH ${SOURCE_PATH} | |
170 | OPTIONS ${OPTIONS} | |
171 | OPTIONS_DEBUG "--with-pydebug" | |
172 | ) | |
173 | vcpkg_install_make(ADD_BIN_TO_PATH INSTALL_TARGET altinstall) | |
174 | ||
175 | file(COPY "${CURRENT_PACKAGES_DIR}/bin/" DESTINATION "${CURRENT_PACKAGES_DIR}/tools/${PORT}/bin") | |
176 | file(COPY "${CURRENT_PACKAGES_DIR}/tools/${PORT}/bin/" DESTINATION "${CURRENT_PACKAGES_DIR}/tools/${PORT}") | |
177 | ||
178 | # Makefiles, c files, __pycache__, and other junk. | |
179 | file(GLOB PYTHON_LIB_DIRS LIST_DIRECTORIES true | |
180 | "${CURRENT_PACKAGES_DIR}/lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/*" | |
181 | "${CURRENT_PACKAGES_DIR}/debug/lib/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}/*") | |
182 | list(FILTER PYTHON_LIB_DIRS INCLUDE REGEX [[config-[0-9].*.*]]) | |
183 | file(REMOVE_RECURSE ${PYTHON_LIB_DIRS}) | |
184 | ||
185 | file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/bin") | |
186 | file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/bin") | |
187 | file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/include") | |
188 | file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/debug/share") | |
189 | file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/include/python${PYTHON_VERSION_MAJOR}.${PYTHON_VERSION_MINOR}d") | |
190 | file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/share/${PORT}/man1") | |
191 | file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/tools/${PORT}/bin") | |
192 | file(REMOVE_RECURSE "${CURRENT_PACKAGES_DIR}/tools/${PORT}/debug") | |
193 | ||
194 | file(INSTALL "${SOURCE_PATH}/LICENSE" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}" RENAME "copyright") | |
195 | endif() | |
196 | ||
197 | file(INSTALL "${CMAKE_CURRENT_LIST_DIR}/usage" DESTINATION "${CURRENT_PACKAGES_DIR}/share/${PORT}") | |
198 | ||
199 | function(_generate_finder) | |
200 | cmake_parse_arguments(PythonFinder "NO_OVERRIDE" "DIRECTORY;PREFIX" "" ${ARGN}) | |
201 | configure_file( | |
202 | "${CMAKE_CURRENT_LIST_DIR}/vcpkg-cmake-wrapper.cmake" | |
203 | "${CURRENT_PACKAGES_DIR}/share/${PythonFinder_DIRECTORY}/vcpkg-cmake-wrapper.cmake" | |
204 | @ONLY | |
205 | ) | |
206 | endfunction() | |
207 | ||
208 | message(STATUS "Installing cmake wrappers") | |
209 | _generate_finder(DIRECTORY "python" PREFIX "Python") | |
210 | _generate_finder(DIRECTORY "python3" PREFIX "Python3") | |
211 | _generate_finder(DIRECTORY "pythoninterp" PREFIX "PYTHON" NO_OVERRIDE) |