From 0869919ecac2f5294794d73a40e135152479d119 Mon Sep 17 00:00:00 2001 From: Eric Miotto Date: Wed, 30 Jul 2025 08:19:10 -0700 Subject: [PATCH] Test: allow different deployment target versions for tests on Darwin Currently we are using the same versions we use to build compiler and standard library. This is an unnecessary coupling especially when testing the generation of backdeployed executables for macOS -- here we have interest in being able to run the tests on previous OSes, not the compiler itself. To support this, add new `--darwin-test-deployment-version-` flags to build-script, which by default take the same value as the matching `--darwin-deployment-version-` ones. Addresses rdar://156724078 --- CMakeLists.txt | 11 +++++++ cmake/modules/DarwinSDKs.cmake | 30 ++++++++++++------- cmake/modules/SwiftConfigureSDK.cmake | 10 ++++++- test/cmake/modules/SwiftTestUtils.cmake | 2 +- .../build_swift/driver_arguments.py | 21 +++++++++++++ utils/build_swift/tests/expected_options.py | 15 ++++++++++ .../swift_build_support/products/swift.py | 16 ++++++++++ .../tests/products/test_swift.py | 17 ++++++++++- 8 files changed, 109 insertions(+), 13 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index e76ce7d0f9f..3143251bb08 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -630,6 +630,17 @@ set(COMPATIBILITY_MINIMUM_DEPLOYMENT_VERSION_WATCHOS "2.0") set(COMPATIBILITY_MINIMUM_DEPLOYMENT_VERSION_XROS "1.0") set(COMPATIBILITY_MINIMUM_DEPLOYMENT_VERSION_MACCATALYST "13.1") +set(SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_OSX "${SWIFT_DARWIN_DEPLOYMENT_VERSION_OSX}" CACHE STRING + "Deployment target version for building macOS tests") +set(SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_IOS "${SWIFT_DARWIN_DEPLOYMENT_VERSION_IOS}" CACHE STRING + "Deployment target version for building iOS tests") +set(SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_TVOS "${SWIFT_DARWIN_DEPLOYMENT_VERSION_TVOS}" CACHE STRING + "Deployment target version for building tvOS tests") +set(SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_WATCHOS "${SWIFT_DARWIN_DEPLOYMENT_VERSION_WATCHOS}" CACHE STRING + "Deployment target version for building watchOS tests") +set(SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_XROS "${SWIFT_DARWIN_DEPLOYMENT_VERSION_XROS}" CACHE STRING + "Deployment target version for building visionOS tests") + # # User-configurable debugging options. # diff --git a/cmake/modules/DarwinSDKs.cmake b/cmake/modules/DarwinSDKs.cmake index 7441403a36b..5d4d1ea59e8 100644 --- a/cmake/modules/DarwinSDKs.cmake +++ b/cmake/modules/DarwinSDKs.cmake @@ -12,7 +12,8 @@ is_sdk_requested(OSX swift_build_osx) if(swift_build_osx) configure_sdk_darwin( OSX "OS X" "${SWIFT_DARWIN_DEPLOYMENT_VERSION_OSX}" - macosx macosx macos macOS "${SUPPORTED_OSX_ARCHS}") + macosx macosx macos macOS "${SUPPORTED_OSX_ARCHS}" + "${SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_OSX}") configure_target_variant(OSX-DA "OS X Debug+Asserts" OSX DA "Debug+Asserts") configure_target_variant(OSX-RA "OS X Release+Asserts" OSX RA "Release+Asserts") configure_target_variant(OSX-R "OS X Release" OSX R "Release") @@ -36,7 +37,8 @@ if(swift_build_freestanding AND (SWIFT_FREESTANDING_FLAVOR STREQUAL "apple")) FREESTANDING "FREESTANDING" "${SWIFT_FREESTANDING_DEPLOYMENT_VERSION}" "${SWIFT_FREESTANDING_SDK}" "${SWIFT_FREESTANDING_TRIPLE_NAME}" "${SWIFT_FREESTANDING_MODULE_NAME}" - "${SWIFT_FREESTANDING_AVAILABILITY_NAME}" "${SWIFT_FREESTANDING_ARCHS}") + "${SWIFT_FREESTANDING_AVAILABILITY_NAME}" "${SWIFT_FREESTANDING_ARCHS}" + "${SWIFT_FREESTANDING_DEPLOYMENT_VERSION}") set(SWIFT_SDK_FREESTANDING_LIB_SUBDIR "freestanding") configure_target_variant(FREESTANDING-DA "FREESTANDING Debug+Asserts" FREESTANDING DA "Debug+Asserts") configure_target_variant(FREESTANDING-RA "FREESTANDING Release+Asserts" FREESTANDING RA "Release+Asserts") @@ -54,7 +56,8 @@ is_sdk_requested(IOS swift_build_ios) if(swift_build_ios) configure_sdk_darwin( IOS "iOS" "${SWIFT_DARWIN_DEPLOYMENT_VERSION_IOS}" - iphoneos ios ios iOS "${SUPPORTED_IOS_ARCHS}") + iphoneos ios ios iOS "${SUPPORTED_IOS_ARCHS}" + "${SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_IOS}") configure_target_variant(IOS-DA "iOS Debug+Asserts" IOS DA "Debug+Asserts") configure_target_variant(IOS-RA "iOS Release+Asserts" IOS RA "Release+Asserts") configure_target_variant(IOS-R "iOS Release" IOS R "Release") @@ -65,7 +68,8 @@ if(swift_build_ios_simulator) configure_sdk_darwin( IOS_SIMULATOR "iOS Simulator" "${SWIFT_DARWIN_DEPLOYMENT_VERSION_IOS}" iphonesimulator ios ios-simulator iOS - "${SUPPORTED_IOS_SIMULATOR_ARCHS}") + "${SUPPORTED_IOS_SIMULATOR_ARCHS}" + "${SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_IOS}") configure_target_variant( IOS_SIMULATOR-DA "iOS Debug+Asserts" IOS_SIMULATOR DA "Debug+Asserts") configure_target_variant( @@ -78,7 +82,8 @@ is_sdk_requested(TVOS swift_build_tvos) if(swift_build_tvos) configure_sdk_darwin( TVOS "tvOS" "${SWIFT_DARWIN_DEPLOYMENT_VERSION_TVOS}" - appletvos tvos tvos tvOS "${SUPPORTED_TVOS_ARCHS}") + appletvos tvos tvos tvOS "${SUPPORTED_TVOS_ARCHS}" + "${SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_TVOS}") configure_target_variant(TVOS-DA "tvOS Debug+Asserts" TVOS DA "Debug+Asserts") configure_target_variant(TVOS-RA "tvOS Release+Asserts" TVOS RA "Release+Asserts") configure_target_variant(TVOS-R "tvOS Release" TVOS R "Release") @@ -89,7 +94,8 @@ if(swift_build_tvos_simulator) configure_sdk_darwin( TVOS_SIMULATOR "tvOS Simulator" "${SWIFT_DARWIN_DEPLOYMENT_VERSION_TVOS}" appletvsimulator tvos tvos-simulator tvOS - "${SUPPORTED_TVOS_SIMULATOR_ARCHS}") + "${SUPPORTED_TVOS_SIMULATOR_ARCHS}" + "${SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_TVOS}") configure_target_variant( TVOS_SIMULATOR-DA "tvOS Debug+Asserts" TVOS_SIMULATOR DA "Debug+Asserts") configure_target_variant( @@ -102,7 +108,8 @@ is_sdk_requested(WATCHOS swift_build_watchos) if(swift_build_watchos) configure_sdk_darwin( WATCHOS "watchOS" "${SWIFT_DARWIN_DEPLOYMENT_VERSION_WATCHOS}" - watchos watchos watchos watchOS "${SUPPORTED_WATCHOS_ARCHS}") + watchos watchos watchos watchOS "${SUPPORTED_WATCHOS_ARCHS}" + "${SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_WATCHOS}") configure_target_variant(WATCHOS-DA "watchOS Debug+Asserts" WATCHOS DA "Debug+Asserts") configure_target_variant(WATCHOS-RA "watchOS Release+Asserts" WATCHOS RA "Release+Asserts") configure_target_variant(WATCHOS-R "watchOS Release" WATCHOS R "Release") @@ -113,7 +120,8 @@ if(swift_build_watchos_simulator) configure_sdk_darwin( WATCHOS_SIMULATOR "watchOS Simulator" "${SWIFT_DARWIN_DEPLOYMENT_VERSION_WATCHOS}" watchsimulator watchos watchos-simulator watchOS - "${SUPPORTED_WATCHOS_SIMULATOR_ARCHS}") + "${SUPPORTED_WATCHOS_SIMULATOR_ARCHS}" + "${SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_WATCHOS}") configure_target_variant(WATCHOS_SIMULATOR-DA "watchOS Debug+Asserts" WATCHOS_SIMULATOR DA "Debug+Asserts") configure_target_variant(WATCHOS_SIMULATOR-RA "watchOS Release+Asserts" WATCHOS_SIMULATOR RA "Release+Asserts") configure_target_variant(WATCHOS_SIMULATOR-R "watchOS Release" WATCHOS_SIMULATOR R "Release") @@ -123,7 +131,8 @@ is_sdk_requested(XROS swift_build_xros) if(swift_build_xros) configure_sdk_darwin( XROS "xrOS" "${SWIFT_DARWIN_DEPLOYMENT_VERSION_XROS}" - xros xros xros visionOS "${SUPPORTED_XROS_ARCHS}") + xros xros xros visionOS "${SUPPORTED_XROS_ARCHS}" + "${SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_XROS}") configure_target_variant(XROS-DA "xrOS Debug+Asserts" XROS DA "Debug+Asserts") configure_target_variant(XROS-RA "xrOS Release+Asserts" XROS RA "Release+Asserts") configure_target_variant(XROS-R "xrOS Release" XROS R "Release") @@ -134,7 +143,8 @@ if(swift_build_xros_simulator) configure_sdk_darwin( XROS_SIMULATOR "xrOS Simulator" "${SWIFT_DARWIN_DEPLOYMENT_VERSION_XROS}" xrsimulator xros xros-simulator visionOS - "${SUPPORTED_XROS_SIMULATOR_ARCHS}") + "${SUPPORTED_XROS_SIMULATOR_ARCHS}" + "${SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_XROS}") configure_target_variant( XROS_SIMULATOR-DA "xrOS Simulator Debug+Asserts" XROS_SIMULATOR DA "Debug+Asserts") diff --git a/cmake/modules/SwiftConfigureSDK.cmake b/cmake/modules/SwiftConfigureSDK.cmake index 7e87711feac..bdc9f9fb272 100644 --- a/cmake/modules/SwiftConfigureSDK.cmake +++ b/cmake/modules/SwiftConfigureSDK.cmake @@ -32,6 +32,7 @@ function(_report_sdk prefix) message(STATUS " Version: ${SWIFT_SDK_${prefix}_VERSION}") message(STATUS " Build number: ${SWIFT_SDK_${prefix}_BUILD_NUMBER}") message(STATUS " Deployment version: ${SWIFT_SDK_${prefix}_DEPLOYMENT_VERSION}") + message(STATUS " Deployment version for tests: ${SWIFT_SDK_${prefix}_TEST_DEPLOYMENT_VERSION}") message(STATUS " Triple name: ${SWIFT_SDK_${prefix}_TRIPLE_NAME}") message(STATUS " Simulator: ${SWIFT_SDK_${prefix}_IS_SIMULATOR}") endif() @@ -138,6 +139,7 @@ endfunction() # triple_name # The name used in Swift's -triple # availability_name # The name used in Swift's @availability # architectures # A list of architectures this SDK supports +# test_deployment_version # Deployment versions to be used for tests # ) # # Sadly there are three OS naming conventions. @@ -170,7 +172,8 @@ endfunction() # macro(configure_sdk_darwin prefix name deployment_version xcrun_name - triple_name module_name availability_name architectures) + triple_name module_name availability_name architectures + test_deployment_version) # Note: this has to be implemented as a macro because it sets global # variables. @@ -202,6 +205,11 @@ macro(configure_sdk_darwin # Set other variables. set(SWIFT_SDK_${prefix}_NAME "${name}") set(SWIFT_SDK_${prefix}_DEPLOYMENT_VERSION "${deployment_version}") + if(NOT "${test_deployment_version}" STREQUAL "") + set(SWIFT_SDK_${prefix}_TEST_DEPLOYMENT_VERSION "${test_deployment_version}") + else() + set(SWIFT_SDK_${prefix}_TEST_DEPLOYMENT_VERSION "${deployment_version}") + endif() set(SWIFT_SDK_${prefix}_LIB_SUBDIR "${xcrun_name}") set(SWIFT_SDK_${prefix}_TRIPLE_NAME "${triple_name}") set(SWIFT_SDK_${prefix}_AVAILABILITY_NAME "${availability_name}") diff --git a/test/cmake/modules/SwiftTestUtils.cmake b/test/cmake/modules/SwiftTestUtils.cmake index 746c25d416d..1bdbab8cc61 100644 --- a/test/cmake/modules/SwiftTestUtils.cmake +++ b/test/cmake/modules/SwiftTestUtils.cmake @@ -30,7 +30,7 @@ function(get_swift_test_versioned_target_triple variant_triple_out_var sdk arch # Use the macCatalyst target triple and compiler resources for the iOS-like build flavor. set(variant_triple "${arch}-apple-ios13.1-macabi") else() - get_versioned_target_triple(variant_triple ${sdk} ${arch} "${SWIFT_SDK_${sdk}_DEPLOYMENT_VERSION}") + get_versioned_target_triple(variant_triple ${sdk} ${arch} "${SWIFT_SDK_${sdk}_TEST_DEPLOYMENT_VERSION}") endif() set(${variant_triple_out_var} "${variant_triple}" PARENT_SCOPE) diff --git a/utils/build_swift/build_swift/driver_arguments.py b/utils/build_swift/build_swift/driver_arguments.py index e47fd450231..6a62e11b47b 100644 --- a/utils/build_swift/build_swift/driver_arguments.py +++ b/utils/build_swift/build_swift/driver_arguments.py @@ -549,6 +549,27 @@ def create_argument_parser(): metavar='MAJOR.MINOR', help='minimum deployment target version for xrOS') + option('--darwin-test-deployment-version-osx', store, + default=defaults.DARWIN_DEPLOYMENT_VERSION_OSX, + metavar='MAJOR.MINOR', + help='deployment target version to use when building macOS tests') + option('--darwin-test-deployment-version-ios', store, + default=defaults.DARWIN_DEPLOYMENT_VERSION_IOS, + metavar='MAJOR.MINOR', + help='deployment target version to use when building iOS tests') + option('--darwin-test-deployment-version-tvos', store, + default=defaults.DARWIN_DEPLOYMENT_VERSION_TVOS, + metavar='MAJOR.MINOR', + help='deployment target version to use when building tvOS tests') + option('--darwin-test-deployment-version-watchos', store, + default=defaults.DARWIN_DEPLOYMENT_VERSION_WATCHOS, + metavar='MAJOR.MINOR', + help='deployment target version to use when building watchOS tests') + option('--darwin-test-deployment-version-xros', store, + default=defaults.DARWIN_DEPLOYMENT_VERSION_XROS, + metavar='MAJOR.MINOR', + help='deployment target version to use when building visionOS tests') + option('--extra-cmake-options', append, type=argparse.ShellSplitType(), help='Pass through extra options to CMake in the form of comma ' diff --git a/utils/build_swift/tests/expected_options.py b/utils/build_swift/tests/expected_options.py index dddb505174e..be2939b7e34 100644 --- a/utils/build_swift/tests/expected_options.py +++ b/utils/build_swift/tests/expected_options.py @@ -169,6 +169,16 @@ EXPECTED_DEFAULTS = { defaults.DARWIN_DEPLOYMENT_VERSION_WATCHOS, 'darwin_deployment_version_xros': defaults.DARWIN_DEPLOYMENT_VERSION_XROS, + 'darwin_test_deployment_version_osx': + defaults.DARWIN_DEPLOYMENT_VERSION_OSX, + 'darwin_test_deployment_version_ios': + defaults.DARWIN_DEPLOYMENT_VERSION_IOS, + 'darwin_test_deployment_version_tvos': + defaults.DARWIN_DEPLOYMENT_VERSION_TVOS, + 'darwin_test_deployment_version_watchos': + defaults.DARWIN_DEPLOYMENT_VERSION_WATCHOS, + 'darwin_test_deployment_version_xros': + defaults.DARWIN_DEPLOYMENT_VERSION_XROS, 'darwin_symroot_path_filters': [], 'darwin_xcrun_toolchain': None, 'distcc': False, @@ -805,6 +815,11 @@ EXPECTED_OPTIONS = [ StrOption('--darwin-deployment-version-tvos'), StrOption('--darwin-deployment-version-watchos'), StrOption('--darwin-deployment-version-xros'), + StrOption('--darwin-test-deployment-version-osx'), + StrOption('--darwin-test-deployment-version-ios'), + StrOption('--darwin-test-deployment-version-tvos'), + StrOption('--darwin-test-deployment-version-watchos'), + StrOption('--darwin-test-deployment-version-xros'), DisableOption('--skip-test-xros-host', dest='test_xros_host'), DisableOption('--skip-test-xros', dest='test_xros'), DisableOption('--skip-test-xros-simulator', dest='test_xros_simulator'), diff --git a/utils/swift_build_support/swift_build_support/products/swift.py b/utils/swift_build_support/swift_build_support/products/swift.py index 97cac9b3924..80fb099da8b 100644 --- a/utils/swift_build_support/swift_build_support/products/swift.py +++ b/utils/swift_build_support/swift_build_support/products/swift.py @@ -106,6 +106,9 @@ class Swift(product.Product): self.cmake_options.extend( self._enable_new_runtime_build) + self.cmake_options.extend( + self._darwin_test_deployment_versions) + self.cmake_options.extend_raw(self.args.extra_swift_cmake_options) @classmethod @@ -307,6 +310,19 @@ updated without updating swift.py?") return [('SWIFT_ENABLE_NEW_RUNTIME_BUILD:BOOL', self.args.enable_new_runtime_build)] + @property + def _darwin_test_deployment_versions(self): + return [('SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_OSX:STRING', + self.args.darwin_test_deployment_version_osx), + ('SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_IOS:STRING', + self.args.darwin_test_deployment_version_ios), + ('SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_TVOS:STRING', + self.args.darwin_test_deployment_version_tvos), + ('SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_WATCHOS:STRING', + self.args.darwin_test_deployment_version_watchos), + ('SWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_XROS:STRING', + self.args.darwin_test_deployment_version_xros)] + def _handle_swift_debuginfo_non_lto_args(self): if ('swift_debuginfo_non_lto_args' not in self.args or self.args.swift_debuginfo_non_lto_args is None): diff --git a/utils/swift_build_support/tests/products/test_swift.py b/utils/swift_build_support/tests/products/test_swift.py index 9cb4e70a85c..5d4c9def758 100644 --- a/utils/swift_build_support/tests/products/test_swift.py +++ b/utils/swift_build_support/tests/products/test_swift.py @@ -74,7 +74,12 @@ class SwiftTestCase(unittest.TestCase): build_swift_private_stdlib=True, swift_tools_ld64_lto_codegen_only_for_supporting_targets=False, build_stdlib_docs=False, - enable_new_runtime_build=False) + enable_new_runtime_build=False, + darwin_test_deployment_version_osx="10.9", + darwin_test_deployment_version_ios="15.0", + darwin_test_deployment_version_tvos="14.0", + darwin_test_deployment_version_watchos="6.0", + darwin_test_deployment_version_xros="1.0") # Setup shell shell.dry_run = True @@ -126,6 +131,11 @@ class SwiftTestCase(unittest.TestCase): '-USWIFT_DEBUGINFO_NON_LTO_ARGS', '-DSWIFT_STDLIB_BUILD_SYMBOL_GRAPHS:BOOL=FALSE', '-DSWIFT_ENABLE_NEW_RUNTIME_BUILD:BOOL=FALSE', + '-DSWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_OSX:STRING=10.9', + '-DSWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_IOS:STRING=15.0', + '-DSWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_TVOS:STRING=14.0', + '-DSWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_WATCHOS:STRING=6.0', + '-DSWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_XROS:STRING=1.0', '-DHELLO=YES', ] self.assertEqual(set(swift.cmake_options), set(expected)) @@ -163,6 +173,11 @@ class SwiftTestCase(unittest.TestCase): '-USWIFT_DEBUGINFO_NON_LTO_ARGS', '-DSWIFT_STDLIB_BUILD_SYMBOL_GRAPHS:BOOL=FALSE', '-DSWIFT_ENABLE_NEW_RUNTIME_BUILD:BOOL=FALSE', + '-DSWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_OSX:STRING=10.9', + '-DSWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_IOS:STRING=15.0', + '-DSWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_TVOS:STRING=14.0', + '-DSWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_WATCHOS:STRING=6.0', + '-DSWIFT_DARWIN_TEST_DEPLOYMENT_VERSION_XROS:STRING=1.0', '-DHELLO=YES', ] self.assertEqual(set(swift.cmake_options), set(flags_set))