Skip to content

Commit 5aee920

Browse files
committed
Add CMake build of SwiftPM dependencies
1 parent 7875139 commit 5aee920

File tree

2 files changed

+197
-0
lines changed

2 files changed

+197
-0
lines changed

CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,13 @@ endif()
4040
project(Foundation
4141
LANGUAGES C Swift)
4242

43+
option(FOUNDATION_SWIFTPM_DEPS "build Windows SwiftPM dependencies via CMake" NO)
44+
if(FOUNDATION_SWIFTPM_DEPS)
45+
include(WindowsSwiftPMDependencies)
46+
_foundation_setup_windows_swiftpm_dependencies_target()
47+
return()
48+
endif()
49+
4350
if(NOT SWIFT_SYSTEM_NAME)
4451
if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
4552
set(SWIFT_SYSTEM_NAME macosx)
Lines changed: 190 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,190 @@
1+
##===----------------------------------------------------------------------===##
2+
##
3+
## This source file is part of the Swift open source project
4+
##
5+
## Copyright (c) 2025 Apple Inc. and the Swift project authors
6+
## Licensed under Apache License v2.0
7+
##
8+
## See LICENSE.txt for license information
9+
## See CONTRIBUTORS.md for the list of Swift project authors
10+
##
11+
## SPDX-License-Identifier: Apache-2.0
12+
##
13+
##===----------------------------------------------------------------------===##
14+
15+
# Builds Windows CMake dependencies for a SwiftPM build (zlib, libxml, and curl)
16+
function(_foundation_setup_windows_swiftpm_dependencies_target)
17+
18+
message(STATUS "Configuring Windows SwiftPM dependencies target")
19+
20+
if(NOT CMAKE_HOST_SYSTEM_NAME STREQUAL Windows)
21+
message(FATAL_ERROR "Windows SwiftPM dependencies is only allowed on Windows hosts. Building on Linux does not require pre-building dependencies via CMake.")
22+
endif()
23+
24+
include(ExternalProject)
25+
26+
set(DEST_DIR "${CMAKE_BINARY_DIR}/windows-deps")
27+
28+
ExternalProject_Add(zlib
29+
GIT_REPOSITORY https://github.com/madler/zlib.git
30+
GIT_TAG v1.3.1
31+
CMAKE_ARGS
32+
-DCMAKE_INSTALL_PREFIX=${DEST_DIR}/zlib
33+
-DBUILD_SHARED_LIBS=NO
34+
-DCMAKE_POSITION_INDEPENDENT_CODE=YES
35+
-DCMAKE_BUILD_TYPE=Release
36+
EXCLUDE_FROM_ALL YES
37+
)
38+
39+
ExternalProject_Add(libxml
40+
GIT_REPOSITORY https://github.com/gnome/libxml2.git
41+
GIT_TAG v2.11.5
42+
CMAKE_ARGS
43+
-DCMAKE_INSTALL_PREFIX=${DEST_DIR}/libxml
44+
-DBUILD_SHARED_LIBS=NO
45+
-DLIBXML2_WITH_ICONV=NO
46+
-DLIBXML2_WITH_ICU=NO
47+
-DLIBXML2_WITH_LZMA=NO
48+
-DLIBXML2_WITH_PYTHON=NO
49+
-DLIBXML2_WITH_TESTS=NO
50+
-DLIBXML2_WITH_THREADS=YES
51+
-DLIBXML2_WITH_ZLIB=NO
52+
-DCMAKE_BUILD_TYPE=Release
53+
EXCLUDE_FROM_ALL YES
54+
)
55+
56+
set(ZLIB_ROOT "${DEST_DIR}/zlib")
57+
set(ZLIB_LIBRARY_DIR "${ZLIB_ROOT}/lib")
58+
set(ZLIB_INCLUDE_DIR "${ZLIB_ROOT}/include")
59+
set(ZLIB_LIBRARY_PATH "${ZLIB_LIBRARY_DIR}/zlibstatic.lib")
60+
61+
# Add a custom target for zlib's install step that curl can depend on
62+
ExternalProject_Add_StepTargets(zlib install)
63+
64+
ExternalProject_Add(curl
65+
GIT_REPOSITORY https://github.com/curl/curl.git
66+
GIT_TAG curl-8_9_1
67+
CMAKE_ARGS
68+
-DCMAKE_INSTALL_PREFIX=${DEST_DIR}/curl
69+
-DBUILD_SHARED_LIBS=NO
70+
-DBUILD_TESTING=NO
71+
-DBUILD_CURL_EXE=NO
72+
-DCURL_CA_BUNDLE=none
73+
-DCURL_CA_FALLBACK=NO
74+
-DCURL_CA_PATH=none
75+
-DCURL_BROTLI=NO
76+
-DCURL_DISABLE_ALTSVC=NO
77+
-DCURL_DISABLE_AWS=YES
78+
-DCURL_DISABLE_BASIC_AUTH=NO
79+
-DCURL_DISABLE_BEARER_AUTH=NO
80+
-DCURL_DISABLE_COOKIES=NO
81+
-DCURL_DISABLE_DICT=YES
82+
-DCURL_DISABLE_DIGEST_AUTH=NO
83+
-DCURL_DISABLE_DOH=NO
84+
-DCURL_DISABLE_FILE=YES
85+
-DCURL_DISABLE_FORM_API=NO
86+
-DCURL_DISABLE_FTP=YES
87+
-DCURL_DISABLE_GETOPTIONS=NO
88+
-DCURL_DISABLE_GOPHER=YES
89+
-DCURL_DISABLE_HSTS=NO
90+
-DCURL_DISABLE_HTTP=NO
91+
-DCURL_DISABLE_HTTP_AUTH=NO
92+
-DCURL_DISABLE_IMAP=YES
93+
-DCURL_DISABLE_KERBEROS_AUTH=NO
94+
-DCURL_DISABLE_LDAP=YES
95+
-DCURL_DISABLE_LDAPS=YES
96+
-DCURL_DISABLE_MIME=NO
97+
-DCURL_DISABLE_MQTT=YES
98+
-DCURL_DISABLE_NEGOTIATE_AUTH=NO
99+
-DCURL_DISABLE_NETRC=NO
100+
-DCURL_DISABLE_NTLM=NO
101+
-DCURL_DISABLE_PARSEDATE=NO
102+
-DCURL_DISABLE_POP3=YES
103+
-DCURL_DISABLE_PROGRESS_METER=YES
104+
-DCURL_DISABLE_PROXY=NO
105+
-DCURL_DISABLE_RTSP=YES
106+
-DCURL_DISABLE_SHUFFLE_DNS=YES
107+
-DCURL_DISABLE_SMB=YES
108+
-DCURL_DISABLE_SMTP=YES
109+
-DCURL_DISABLE_SOCKETPAIR=YES
110+
-DCURL_DISABLE_SRP=NO
111+
-DCURL_DISABLE_TELNET=YES
112+
-DCURL_DISABLE_TFTP=YES
113+
-DCURL_DISABLE_VERBOSE_STRINGS=NO
114+
-DCURL_LTO=NO
115+
-DCURL_USE_BEARSSL=NO
116+
-DCURL_USE_GNUTLS=NO
117+
-DCURL_USE_GSSAPI=NO
118+
-DCURL_USE_LIBPSL=NO
119+
-DCURL_USE_LIBSSH=NO
120+
-DCURL_USE_LIBSSH2=NO
121+
-DCURL_USE_MBEDTLS=NO
122+
-DCURL_USE_OPENSSL=NO
123+
-DCURL_USE_SCHANNEL=YES
124+
-DCURL_USE_WOLFSSL=NO
125+
-DCURL_WINDOWS_SSPI=YES
126+
-DCURL_ZLIB=YES
127+
-DCURL_ZSTD=NO
128+
-DENABLE_ARES=NO
129+
-DENABLE_CURLDEBUG=NO
130+
-DENABLE_DEBUG=NO
131+
-DENABLE_IPV6=YES
132+
-DENABLE_MANUAL=NO
133+
-DENABLE_THREADED_RESOLVER=NO
134+
-DENABLE_UNICODE=YES
135+
-DENABLE_UNIX_SOCKETS=NO
136+
-DENABLE_WEBSOCKETS=YES
137+
-DHAVE_POLL_FINE=NO
138+
-DUSE_IDN2=NO
139+
-DUSE_MSH3=NO
140+
-DUSE_NGHTTP2=NO
141+
-DUSE_NGTCP2=NO
142+
-DUSE_QUICHE=NO
143+
-DUSE_WIN32_IDN=YES
144+
-DUSE_WIN32_LARGE_FILES=YES
145+
-DUSE_WIN32_LDAP=NO
146+
-DCMAKE_BUILD_TYPE=Release
147+
-DZLIB_ROOT=${ZLIB_ROOT}
148+
-DZLIB_LIBRARY=${ZLIB_LIBRARY_PATH}
149+
-DZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIR}
150+
DEPENDS zlib-install
151+
EXCLUDE_FROM_ALL YES
152+
)
153+
154+
155+
set(LIBXML_LIBRARY_DIR "${DEST_DIR}/libxml/lib")
156+
set(LIBXML_INCLUDE_DIR "${DEST_DIR}/libxml/include/libxml2")
157+
158+
ExternalProject_Get_Property(curl INSTALL_DIR)
159+
set(CURL_LIBRARY_DIR "${DEST_DIR}/curl/lib")
160+
set(CURL_INCLUDE_DIR "${DEST_DIR}/curl/include")
161+
162+
message(STATUS "LIBXML_INCLUDE_PATH=${LIBXML_INCLUDE_DIR}")
163+
message(STATUS "LIBXML_LIBRARY_PATH=${LIBXML_LIBRARY_DIR}")
164+
message(STATUS "CURL_INCLUDE_PATH=${CURL_INCLUDE_DIR}")
165+
message(STATUS "CURL_LIBRARY_PATH=${CURL_LIBRARY_DIR}")
166+
message(STATUS "ZLIB_LIBRARY_PATH=${ZLIB_LIBRARY_DIR}")
167+
168+
set(COMMENT "Windows dependencies have been built! Please setup your environment variables using the commands below:\n\nset LIBXML_INCLUDE_PATH=${LIBXML_INCLUDE_DIR}")
169+
170+
ExternalProject_Add_StepTargets(libxml install)
171+
ExternalProject_Add_StepTargets(curl install)
172+
add_custom_target(WindowsSwiftPMDependencies
173+
DEPENDS libxml-install curl-install)
174+
175+
add_custom_command(TARGET WindowsSwiftPMDependencies POST_BUILD
176+
COMMAND echo Please run the following commands to set environment variables for the SwiftPM build:)
177+
add_custom_command(TARGET WindowsSwiftPMDependencies POST_BUILD
178+
COMMAND echo:)
179+
add_custom_command(TARGET WindowsSwiftPMDependencies POST_BUILD
180+
COMMAND echo set LIBXML_INCLUDE_PATH=${LIBXML_INCLUDE_DIR})
181+
add_custom_command(TARGET WindowsSwiftPMDependencies POST_BUILD
182+
COMMAND echo set LIBXML_LIBRARY_PATH=${LIBXML_LIBRARY_DIR})
183+
add_custom_command(TARGET WindowsSwiftPMDependencies POST_BUILD
184+
COMMAND echo set CURL_INCLUDE_PATH=${CURL_INCLUDE_DIR})
185+
add_custom_command(TARGET WindowsSwiftPMDependencies POST_BUILD
186+
COMMAND echo set CURL_LIBRARY_PATH=${CURL_LIBRARY_DIR})
187+
add_custom_command(TARGET WindowsSwiftPMDependencies POST_BUILD
188+
COMMAND echo set ZLIB_LIBRARY_PATH=${ZLIB_LIBRARY_DIR})
189+
190+
endfunction()

0 commit comments

Comments
 (0)