diff --git a/CMakeLists.txt b/CMakeLists.txt index e3aa18097e..ffd49a919c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,6 +47,8 @@ if(HAS_LIBDISPATCH_API) find_package(dispatch CONFIG REQUIRED) endif() +find_package(ICU COMPONENTS uc i18n REQUIRED) + include(SwiftSupport) include(GNUInstallDirs) include(XCTest) diff --git a/CoreFoundation/CMakeLists.txt b/CoreFoundation/CMakeLists.txt index de106bc33a..3250606642 100644 --- a/CoreFoundation/CMakeLists.txt +++ b/CoreFoundation/CMakeLists.txt @@ -38,7 +38,6 @@ if(NOT CMAKE_SYSTEM_NAME STREQUAL Darwin) find_package(CURL REQUIRED) endif() endif() - find_package(ICU COMPONENTS uc i18n REQUIRED) endif() include(GNUInstallDirs) diff --git a/Sources/Foundation/CMakeLists.txt b/Sources/Foundation/CMakeLists.txt index f06166eb41..5743ffd53e 100644 --- a/Sources/Foundation/CMakeLists.txt +++ b/Sources/Foundation/CMakeLists.txt @@ -166,17 +166,27 @@ set_target_properties(Foundation PROPERTIES INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_BINARY_DIR}/swift) if(NOT BUILD_SHARED_LIBS) - add_dependencies(Foundation CoreFoundation uuid) + # ICU_I18N_LIBRARY is set by find_package(ICU) in the top level CMakeLists.txt + # It's an absolute path to the found library file + get_target_property(icui18n_path ICU::i18n IMPORTED_LOCATION) + get_filename_component(icu_i18n_basename "${icui18n_path}" NAME_WE) + get_filename_component(icu_i18n_dir "${icui18n_path}" DIRECTORY) + string(REPLACE "lib" "" icu_i18n_basename "${icu_i18n_basename}") + target_compile_options(Foundation PRIVATE - "SHELL:-Xfrontend -public-autolink-library -Xfrontend icui18n + "SHELL:-Xfrontend -public-autolink-library -Xfrontend ${icu_i18n_basename} -Xfrontend -public-autolink-library -Xfrontend BlocksRuntime") + # ICU libraries are linked by absolute library path in this project, + # but -public-autolink-library forces to resolve library path by + # library search path given by -L, so add a directory of icui18n + # in the search path + target_link_directories(Foundation PUBLIC "${icu_i18n_dir}") # Merge private dependencies into single static objects archive set_property(TARGET Foundation PROPERTY STATIC_LIBRARY_OPTIONS $ - $ - $) + $) endif() if(CMAKE_SYSTEM_NAME STREQUAL Windows) diff --git a/Sources/Foundation/ISO8601DateFormatter.swift b/Sources/Foundation/ISO8601DateFormatter.swift index 0764ca89fd..54de843b52 100644 --- a/Sources/Foundation/ISO8601DateFormatter.swift +++ b/Sources/Foundation/ISO8601DateFormatter.swift @@ -112,6 +112,13 @@ open class ISO8601DateFormatter : Formatter, NSSecureCoding { aCoder.encode(timeZone._nsObject, forKey: "NS.timeZone") } } + + open override func copy(with zone: NSZone? = nil) -> Any { + let copied = ISO8601DateFormatter() + copied.timeZone = timeZone + copied.formatOptions = formatOptions + return copied + } public static var supportsSecureCoding: Bool { return true } diff --git a/Sources/FoundationNetworking/CMakeLists.txt b/Sources/FoundationNetworking/CMakeLists.txt index 164ef63b91..c1462d1dc0 100644 --- a/Sources/FoundationNetworking/CMakeLists.txt +++ b/Sources/FoundationNetworking/CMakeLists.txt @@ -64,6 +64,17 @@ target_link_libraries(FoundationNetworking CFURLSessionInterface PUBLIC Foundation) + +if(NOT BUILD_SHARED_LIBS) + target_compile_options(FoundationNetworking + PRIVATE + "SHELL:-Xfrontend -public-autolink-library -Xfrontend curl") + + # Merge private dependencies into single static objects archive + set_property(TARGET FoundationNetworking PROPERTY STATIC_LIBRARY_OPTIONS + $) +endif() + set_target_properties(FoundationNetworking PROPERTIES INSTALL_RPATH "$ORIGIN" Swift_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/swift diff --git a/Sources/FoundationXML/CMakeLists.txt b/Sources/FoundationXML/CMakeLists.txt index cbc1a95ba3..913c8f42b3 100644 --- a/Sources/FoundationXML/CMakeLists.txt +++ b/Sources/FoundationXML/CMakeLists.txt @@ -16,6 +16,17 @@ target_link_libraries(FoundationXML CFXMLInterface PUBLIC Foundation) + +if(NOT BUILD_SHARED_LIBS) + target_compile_options(FoundationXML + PRIVATE + "SHELL:-Xfrontend -public-autolink-library -Xfrontend xml2") + + # Merge private dependencies into single static objects archive + set_property(TARGET FoundationXML PROPERTY STATIC_LIBRARY_OPTIONS + $) +endif() + set_target_properties(FoundationXML PROPERTIES INSTALL_RPATH "$ORIGIN" Swift_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/swift diff --git a/Tests/Foundation/Tests/TestISO8601DateFormatter.swift b/Tests/Foundation/Tests/TestISO8601DateFormatter.swift index 6054794b7c..e1fdd2d614 100644 --- a/Tests/Foundation/Tests/TestISO8601DateFormatter.swift +++ b/Tests/Foundation/Tests/TestISO8601DateFormatter.swift @@ -326,6 +326,28 @@ class TestISO8601DateFormatter: XCTestCase { try fixture.assertLoadedValuesMatch(areEqual(_:_:)) } } + + func test_copy() throws { + let original = ISO8601DateFormatter() + original.timeZone = try XCTUnwrap(TimeZone(identifier: "GMT")) + original.formatOptions = [ + .withInternetDateTime, + .withDashSeparatorInDate, + .withColonSeparatorInTime, + .withColonSeparatorInTimeZone, + ] + + let copied = try XCTUnwrap(original.copy() as? ISO8601DateFormatter) + XCTAssertEqual(copied.timeZone, original.timeZone) + XCTAssertEqual(copied.formatOptions, original.formatOptions) + + copied.timeZone = try XCTUnwrap(TimeZone(identifier: "JST")) + copied.formatOptions.insert(.withFractionalSeconds) + XCTAssertNotEqual(copied.timeZone, original.timeZone) + XCTAssertNotEqual(copied.formatOptions, original.formatOptions) + XCTAssertFalse(original.formatOptions.contains(.withFractionalSeconds)) + XCTAssertTrue(copied.formatOptions.contains(.withFractionalSeconds)) + } static var allTests : [(String, (TestISO8601DateFormatter) -> () throws -> Void)] { @@ -335,6 +357,7 @@ class TestISO8601DateFormatter: XCTestCase { ("test_stringFromDateClass", test_stringFromDateClass), ("test_codingRoundtrip", test_codingRoundtrip), ("test_loadingFixtures", test_loadingFixtures), + ("test_copy", test_copy), ] } }