From 787513991262e640d9324a049c379fefd76f550d Mon Sep 17 00:00:00 2001 From: Saleem Abdulrasool Date: Wed, 2 Jul 2025 08:22:47 -0700 Subject: [PATCH 1/3] build: adjust the autolink library for Windows (#5215) When building statically, ensure that we prefix the Swift libraries with the correct prefix to permit static linking of the libraries. --- Sources/Foundation/CMakeLists.txt | 2 +- Sources/FoundationNetworking/CMakeLists.txt | 2 +- Sources/FoundationXML/CMakeLists.txt | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Sources/Foundation/CMakeLists.txt b/Sources/Foundation/CMakeLists.txt index f6299e5c90..c901e5ab24 100644 --- a/Sources/Foundation/CMakeLists.txt +++ b/Sources/Foundation/CMakeLists.txt @@ -161,7 +161,7 @@ if(NOT BUILD_SHARED_LIBS) target_compile_options(Foundation PRIVATE "SHELL:$<$:-Xfrontend -public-autolink-library -Xfrontend _FoundationICU>") target_compile_options(Foundation PRIVATE - "SHELL:$<$:-Xfrontend -public-autolink-library -Xfrontend swiftSynchronization>") + "SHELL:$<$:-Xfrontend -public-autolink-library -Xfrontend $<$:${CMAKE_STATIC_LIBRARY_PREFIX_Swift}>swiftSynchronization>") endif() if(dispatch_FOUND) diff --git a/Sources/FoundationNetworking/CMakeLists.txt b/Sources/FoundationNetworking/CMakeLists.txt index ec0818baeb..88de57ca2c 100644 --- a/Sources/FoundationNetworking/CMakeLists.txt +++ b/Sources/FoundationNetworking/CMakeLists.txt @@ -61,7 +61,7 @@ if(NOT BUILD_SHARED_LIBS) target_compile_options(FoundationNetworking PRIVATE "SHELL:$<$:-Xfrontend -public-autolink-library -Xfrontend curl>") target_compile_options(FoundationNetworking PRIVATE - "SHELL:$<$:-Xfrontend -public-autolink-library -Xfrontend swiftSynchronization>") + "SHELL:$<$:-Xfrontend -public-autolink-library -Xfrontend $<$:${CMAKE_STATIC_LIBRARY_PREFIX_Swift}>swiftSynchronization>") if(BUILD_FULLY_STATIC) target_compile_options(FoundationNetworking diff --git a/Sources/FoundationXML/CMakeLists.txt b/Sources/FoundationXML/CMakeLists.txt index bb3f78bf4d..74aed77a33 100644 --- a/Sources/FoundationXML/CMakeLists.txt +++ b/Sources/FoundationXML/CMakeLists.txt @@ -36,7 +36,7 @@ if(NOT BUILD_SHARED_LIBS) target_compile_options(FoundationXML PRIVATE "SHELL:$<$:-Xfrontend -public-autolink-library -Xfrontend xml2>") target_compile_options(FoundationXML PRIVATE - "SHELL:$<$:-Xfrontend -public-autolink-library -Xfrontend swiftSynchronization>") + "SHELL:$<$:-Xfrontend -public-autolink-library -Xfrontend $<$:${CMAKE_STATIC_LIBRARY_PREFIX_Swift}>swiftSynchronization>") if(BUILD_FULLY_STATIC) target_compile_options(FoundationXML From 7ae62663432306ff2ffd5e3f875612c979887d59 Mon Sep 17 00:00:00 2001 From: Tony Parker Date: Wed, 9 Jul 2025 11:12:36 -0500 Subject: [PATCH 2/3] Use a regular downcast instead of an unsafe downcast for Error to NSError conversion (#5221) (#5222) --- Sources/Foundation/NSError.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/Foundation/NSError.swift b/Sources/Foundation/NSError.swift index d6a4d1868c..67dda22e87 100644 --- a/Sources/Foundation/NSError.swift +++ b/Sources/Foundation/NSError.swift @@ -891,8 +891,8 @@ func _convertNSErrorToError(_ error: NSError?) -> Error { public // COMPILER_INTRINSIC func _convertErrorToNSError(_ error: Error) -> NSError { - if let object = _extractDynamicValue(error as Any) { - return unsafeDowncast(object, to: NSError.self) + if let object = _extractDynamicValue(error as Any), let asNS = object as? NSError { + return asNS } else { let domain: String let code: Int From 0e489e921d7325d220dab368d174d9b7bcb5db75 Mon Sep 17 00:00:00 2001 From: Jeremy Schonfeld Date: Thu, 10 Jul 2025 09:27:08 -0700 Subject: [PATCH 3/3] Add CMake build of SwiftPM dependencies (#5233) * Add CMake build of SwiftPM dependencies * Specify cl as the C compiler * Update readme --- CMakeLists.txt | 7 + README.md | 11 + .../modules/WindowsSwiftPMDependencies.cmake | 190 ++++++++++++++++++ 3 files changed, 208 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/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. diff --git a/cmake/modules/WindowsSwiftPMDependencies.cmake b/cmake/modules/WindowsSwiftPMDependencies.cmake new file mode 100644 index 0000000000..4346a734b8 --- /dev/null +++ b/cmake/modules/WindowsSwiftPMDependencies.cmake @@ -0,0 +1,190 @@ +##===----------------------------------------------------------------------===## +## +## 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 + -DCMAKE_C_COMPILER=cl + -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 + -DCMAKE_C_COMPILER=cl + -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 + -DCMAKE_C_COMPILER=cl + -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()