From 42e13bc4ef86fed65d733dcb827238ad2145586f Mon Sep 17 00:00:00 2001 From: Jeremy Schonfeld Date: Thu, 3 Jul 2025 11:45:42 -0700 Subject: [PATCH 1/3] Add CMake build of SwiftPM dependencies --- CMakeLists.txt | 7 + .../modules/WindowsSwiftPMDependencies.cmake | 187 ++++++++++++++++++ 2 files changed, 194 insertions(+) create mode 100644 cmake/modules/WindowsSwiftPMDependencies.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 08f699050f..f191165743 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -40,6 +40,13 @@ endif() project(Foundation LANGUAGES C Swift) +option(FOUNDATION_SWIFTPM_DEPS "build Windows SwiftPM dependencies via CMake" NO) +if(FOUNDATION_SWIFTPM_DEPS) + include(WindowsSwiftPMDependencies) + _foundation_setup_windows_swiftpm_dependencies_target() + return() +endif() + if(NOT SWIFT_SYSTEM_NAME) if(CMAKE_SYSTEM_NAME STREQUAL Darwin) set(SWIFT_SYSTEM_NAME macosx) diff --git a/cmake/modules/WindowsSwiftPMDependencies.cmake b/cmake/modules/WindowsSwiftPMDependencies.cmake new file mode 100644 index 0000000000..47f4982f0a --- /dev/null +++ b/cmake/modules/WindowsSwiftPMDependencies.cmake @@ -0,0 +1,187 @@ +##===----------------------------------------------------------------------===## +## +## This source file is part of the Swift open source project +## +## Copyright (c) 2025 Apple Inc. and the Swift project authors +## Licensed under Apache License v2.0 +## +## See LICENSE.txt for license information +## See CONTRIBUTORS.md for the list of Swift project authors +## +## SPDX-License-Identifier: Apache-2.0 +## +##===----------------------------------------------------------------------===## + +# Builds Windows CMake dependencies for a SwiftPM build (zlib, libxml, and curl) +function(_foundation_setup_windows_swiftpm_dependencies_target) + + message(STATUS "Configuring Windows SwiftPM dependencies target") + + if(NOT CMAKE_HOST_SYSTEM_NAME STREQUAL Windows) + message(FATAL_ERROR "Windows SwiftPM dependencies is only allowed on Windows hosts. Building on Linux does not require pre-building dependencies via CMake.") + endif() + + include(ExternalProject) + + set(DEST_DIR "${CMAKE_BINARY_DIR}/windows-deps") + + ExternalProject_Add(zlib + GIT_REPOSITORY https://github.com/madler/zlib.git + GIT_TAG v1.3.1 + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX=${DEST_DIR}/zlib + -DBUILD_SHARED_LIBS=NO + -DCMAKE_POSITION_INDEPENDENT_CODE=YES + -DCMAKE_BUILD_TYPE=Release + EXCLUDE_FROM_ALL YES + ) + + ExternalProject_Add(libxml + GIT_REPOSITORY https://github.com/gnome/libxml2.git + GIT_TAG v2.11.5 + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX=${DEST_DIR}/libxml + -DBUILD_SHARED_LIBS=NO + -DLIBXML2_WITH_ICONV=NO + -DLIBXML2_WITH_ICU=NO + -DLIBXML2_WITH_LZMA=NO + -DLIBXML2_WITH_PYTHON=NO + -DLIBXML2_WITH_TESTS=NO + -DLIBXML2_WITH_THREADS=YES + -DLIBXML2_WITH_ZLIB=NO + -DCMAKE_BUILD_TYPE=Release + EXCLUDE_FROM_ALL YES + ) + + set(ZLIB_ROOT "${DEST_DIR}/zlib") + set(ZLIB_LIBRARY_DIR "${ZLIB_ROOT}/lib") + set(ZLIB_INCLUDE_DIR "${ZLIB_ROOT}/include") + set(ZLIB_LIBRARY_PATH "${ZLIB_LIBRARY_DIR}/zlibstatic.lib") + + # Add a custom target for zlib's install step that curl can depend on + ExternalProject_Add_StepTargets(zlib install) + + ExternalProject_Add(curl + GIT_REPOSITORY https://github.com/curl/curl.git + GIT_TAG curl-8_9_1 + CMAKE_ARGS + -DCMAKE_INSTALL_PREFIX=${DEST_DIR}/curl + -DBUILD_SHARED_LIBS=NO + -DBUILD_TESTING=NO + -DBUILD_CURL_EXE=NO + -DCURL_CA_BUNDLE=none + -DCURL_CA_FALLBACK=NO + -DCURL_CA_PATH=none + -DCURL_BROTLI=NO + -DCURL_DISABLE_ALTSVC=NO + -DCURL_DISABLE_AWS=YES + -DCURL_DISABLE_BASIC_AUTH=NO + -DCURL_DISABLE_BEARER_AUTH=NO + -DCURL_DISABLE_COOKIES=NO + -DCURL_DISABLE_DICT=YES + -DCURL_DISABLE_DIGEST_AUTH=NO + -DCURL_DISABLE_DOH=NO + -DCURL_DISABLE_FILE=YES + -DCURL_DISABLE_FORM_API=NO + -DCURL_DISABLE_FTP=YES + -DCURL_DISABLE_GETOPTIONS=NO + -DCURL_DISABLE_GOPHER=YES + -DCURL_DISABLE_HSTS=NO + -DCURL_DISABLE_HTTP=NO + -DCURL_DISABLE_HTTP_AUTH=NO + -DCURL_DISABLE_IMAP=YES + -DCURL_DISABLE_KERBEROS_AUTH=NO + -DCURL_DISABLE_LDAP=YES + -DCURL_DISABLE_LDAPS=YES + -DCURL_DISABLE_MIME=NO + -DCURL_DISABLE_MQTT=YES + -DCURL_DISABLE_NEGOTIATE_AUTH=NO + -DCURL_DISABLE_NETRC=NO + -DCURL_DISABLE_NTLM=NO + -DCURL_DISABLE_PARSEDATE=NO + -DCURL_DISABLE_POP3=YES + -DCURL_DISABLE_PROGRESS_METER=YES + -DCURL_DISABLE_PROXY=NO + -DCURL_DISABLE_RTSP=YES + -DCURL_DISABLE_SHUFFLE_DNS=YES + -DCURL_DISABLE_SMB=YES + -DCURL_DISABLE_SMTP=YES + -DCURL_DISABLE_SOCKETPAIR=YES + -DCURL_DISABLE_SRP=NO + -DCURL_DISABLE_TELNET=YES + -DCURL_DISABLE_TFTP=YES + -DCURL_DISABLE_VERBOSE_STRINGS=NO + -DCURL_LTO=NO + -DCURL_USE_BEARSSL=NO + -DCURL_USE_GNUTLS=NO + -DCURL_USE_GSSAPI=NO + -DCURL_USE_LIBPSL=NO + -DCURL_USE_LIBSSH=NO + -DCURL_USE_LIBSSH2=NO + -DCURL_USE_MBEDTLS=NO + -DCURL_USE_OPENSSL=NO + -DCURL_USE_SCHANNEL=YES + -DCURL_USE_WOLFSSL=NO + -DCURL_WINDOWS_SSPI=YES + -DCURL_ZLIB=YES + -DCURL_ZSTD=NO + -DENABLE_ARES=NO + -DENABLE_CURLDEBUG=NO + -DENABLE_DEBUG=NO + -DENABLE_IPV6=YES + -DENABLE_MANUAL=NO + -DENABLE_THREADED_RESOLVER=NO + -DENABLE_UNICODE=YES + -DENABLE_UNIX_SOCKETS=NO + -DENABLE_WEBSOCKETS=YES + -DHAVE_POLL_FINE=NO + -DUSE_IDN2=NO + -DUSE_MSH3=NO + -DUSE_NGHTTP2=NO + -DUSE_NGTCP2=NO + -DUSE_QUICHE=NO + -DUSE_WIN32_IDN=YES + -DUSE_WIN32_LARGE_FILES=YES + -DUSE_WIN32_LDAP=NO + -DCMAKE_BUILD_TYPE=Release + -DZLIB_ROOT=${ZLIB_ROOT} + -DZLIB_LIBRARY=${ZLIB_LIBRARY_PATH} + -DZLIB_INCLUDE_DIR=${ZLIB_INCLUDE_DIR} + DEPENDS zlib-install + EXCLUDE_FROM_ALL YES + ) + + + set(LIBXML_LIBRARY_DIR "${DEST_DIR}/libxml/lib") + set(LIBXML_INCLUDE_DIR "${DEST_DIR}/libxml/include/libxml2") + + set(CURL_LIBRARY_DIR "${DEST_DIR}/curl/lib") + set(CURL_INCLUDE_DIR "${DEST_DIR}/curl/include") + + message(STATUS "LIBXML_INCLUDE_PATH=${LIBXML_INCLUDE_DIR}") + message(STATUS "LIBXML_LIBRARY_PATH=${LIBXML_LIBRARY_DIR}") + message(STATUS "CURL_INCLUDE_PATH=${CURL_INCLUDE_DIR}") + message(STATUS "CURL_LIBRARY_PATH=${CURL_LIBRARY_DIR}") + message(STATUS "ZLIB_LIBRARY_PATH=${ZLIB_LIBRARY_DIR}") + + ExternalProject_Add_StepTargets(libxml install) + ExternalProject_Add_StepTargets(curl install) + add_custom_target(WindowsSwiftPMDependencies + DEPENDS libxml-install curl-install) + + add_custom_command(TARGET WindowsSwiftPMDependencies POST_BUILD + COMMAND echo Please set the following environment variables for the SwiftPM build:) + add_custom_command(TARGET WindowsSwiftPMDependencies POST_BUILD + COMMAND echo:) + add_custom_command(TARGET WindowsSwiftPMDependencies POST_BUILD + COMMAND echo LIBXML_INCLUDE_PATH=${LIBXML_INCLUDE_DIR}) + add_custom_command(TARGET WindowsSwiftPMDependencies POST_BUILD + COMMAND echo LIBXML_LIBRARY_PATH=${LIBXML_LIBRARY_DIR}) + add_custom_command(TARGET WindowsSwiftPMDependencies POST_BUILD + COMMAND echo CURL_INCLUDE_PATH=${CURL_INCLUDE_DIR}) + add_custom_command(TARGET WindowsSwiftPMDependencies POST_BUILD + COMMAND echo CURL_LIBRARY_PATH=${CURL_LIBRARY_DIR}) + add_custom_command(TARGET WindowsSwiftPMDependencies POST_BUILD + COMMAND echo ZLIB_LIBRARY_PATH=${ZLIB_LIBRARY_DIR}) + +endfunction() From 5637cd82f3d5c62b85b53780e6b67c1de2be14d4 Mon Sep 17 00:00:00 2001 From: Jeremy Schonfeld Date: Thu, 3 Jul 2025 13:51:52 -0700 Subject: [PATCH 2/3] Specify cl as the C compiler --- cmake/modules/WindowsSwiftPMDependencies.cmake | 3 +++ 1 file changed, 3 insertions(+) diff --git a/cmake/modules/WindowsSwiftPMDependencies.cmake b/cmake/modules/WindowsSwiftPMDependencies.cmake index 47f4982f0a..4346a734b8 100644 --- a/cmake/modules/WindowsSwiftPMDependencies.cmake +++ b/cmake/modules/WindowsSwiftPMDependencies.cmake @@ -30,6 +30,7 @@ function(_foundation_setup_windows_swiftpm_dependencies_target) GIT_TAG v1.3.1 CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${DEST_DIR}/zlib + -DCMAKE_C_COMPILER=cl -DBUILD_SHARED_LIBS=NO -DCMAKE_POSITION_INDEPENDENT_CODE=YES -DCMAKE_BUILD_TYPE=Release @@ -41,6 +42,7 @@ function(_foundation_setup_windows_swiftpm_dependencies_target) GIT_TAG v2.11.5 CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${DEST_DIR}/libxml + -DCMAKE_C_COMPILER=cl -DBUILD_SHARED_LIBS=NO -DLIBXML2_WITH_ICONV=NO -DLIBXML2_WITH_ICU=NO @@ -66,6 +68,7 @@ function(_foundation_setup_windows_swiftpm_dependencies_target) GIT_TAG curl-8_9_1 CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${DEST_DIR}/curl + -DCMAKE_C_COMPILER=cl -DBUILD_SHARED_LIBS=NO -DBUILD_TESTING=NO -DBUILD_CURL_EXE=NO From c067e437a02da5fd56323bb7f3e7424ffc7305a0 Mon Sep 17 00:00:00 2001 From: Jeremy Schonfeld Date: Thu, 3 Jul 2025 16:25:12 -0700 Subject: [PATCH 3/3] Update readme --- README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/README.md b/README.md index e7d6551e3d..5770ced9f8 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,17 @@ swift-corelibs-foundation builds as a standalone project using Swift Package Man swift-corelibs-foundation also builds as part of the toolchain for non-Darwin platforms. Instructions on building the toolchain are available in the [Swift project](https://github.com/swiftlang/swift?tab=readme-ov-file#building). +### Building swift-corelibs-foundation on Windows + +When building Foundation as a standalone project, it requires you to provide some dependencies that it will link during the build. SwiftPM already fetches most of these dependencies and on Linux the remaining dependencies (dispatch, zlib, curl, libxml) are found in the Swift toolchain or on the host OS. However, Windows does not ship with zlib/curl/libxml on the host OS. In order to build swift-corelibs-foundation as a package on Windows, you must first checkout and build these dependenies before running `swift build` as recommended above. To do this, you can build the provided CMake target which (instead of building Foundation via CMake) will checkout and build these 3 dependencies via CMake and provide environment variables that will connect the SwiftPM build to these dependencies. To build these targets, run the following commands: + +``` +cmake -G Ninja -B -DFOUNDATION_SWIFTPM_DEPS=YES +cmake --build --target --target WindowsSwiftPMDependencies +``` + +After running these commands, the output will include a list of environment variables to set. After setting these environment variables, you can run `swift test`/`swift build` just like on Linux in order to build swift-corelibs-foundation with an existing Swift toolchain. + ## Contributions We welcome contributions to Foundation! Please see the [known issues](Docs/Issues.md) page if you are looking for an area where we need help. We are also standing by on the [mailing lists](https://swift.org/community/#communication) to answer questions about what is most important to do and what we will accept into the project.