From 19910c6c227ff7e05bd344a85cb66fa1acc4b263 Mon Sep 17 00:00:00 2001 From: Stuart Montgomery Date: Wed, 5 Jun 2024 15:06:54 -0500 Subject: [PATCH 1/9] Add swift-testing to update-checkout --- utils/update_checkout/update-checkout-config.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/utils/update_checkout/update-checkout-config.json b/utils/update_checkout/update-checkout-config.json index 18889754f4882..7072a92f3b860 100644 --- a/utils/update_checkout/update-checkout-config.json +++ b/utils/update_checkout/update-checkout-config.json @@ -40,6 +40,8 @@ "remote": { "id": "apple/swift-system" } }, "swift-stress-tester": { "remote": { "id": "swiftlang/swift-stress-tester" } }, + "swift-testing": { + "remote": { "id": "swiftlang/swift-testing" } }, "swift-corelibs-xctest": { "remote": { "id": "apple/swift-corelibs-xctest" } }, "swift-corelibs-foundation": { @@ -139,6 +141,7 @@ "swift-syntax": "main", "swift-system": "1.3.0", "swift-stress-tester": "main", + "swift-testing": "main", "swift-corelibs-xctest": "main", "swift-corelibs-foundation": "main", "swift-foundation-icu": "main", @@ -290,6 +293,7 @@ "swift-syntax": "main", "swift-system": "1.3.0", "swift-stress-tester": "main", + "swift-testing": "main", "swift-corelibs-xctest": "main", "swift-corelibs-foundation": "main", "swift-foundation-icu": "main", @@ -674,6 +678,7 @@ "swift-syntax": "main", "swift-system": "1.3.0", "swift-stress-tester": "main", + "swift-testing": "main", "swift-corelibs-xctest": "main", "swift-corelibs-foundation": "main", "swift-corelibs-libdispatch": "main", From 97e85a6bf20b38e2ac754de81d1d87585cea2a95 Mon Sep 17 00:00:00 2001 From: Stuart Montgomery Date: Wed, 10 Jul 2024 13:42:36 -0500 Subject: [PATCH 2/9] Build script changes to begin building and installing swift-testing into toolchains (on Darwin, so far) --- utils/build-presets.ini | 2 + .../build_swift/driver_arguments.py | 5 ++ utils/build_swift/tests/expected_options.py | 4 ++ .../build_script_invocation.py | 2 + .../productpipeline_list_builder.py | 2 +- .../swift_build_support/products/__init__.py | 2 + .../products/swift_testing.py | 67 +++++++++++++++++++ 7 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 utils/swift_build_support/swift_build_support/products/swift_testing.py diff --git a/utils/build-presets.ini b/utils/build-presets.ini index dbdcc7e48506b..72a2f6283a2cf 100644 --- a/utils/build-presets.ini +++ b/utils/build-presets.ini @@ -1319,6 +1319,7 @@ swift-driver # Failing to build in CI: rdar://78408440 # swift-inspect swiftsyntax +swift-testing swiftformat playgroundsupport indexstore-db @@ -1363,6 +1364,7 @@ install-llbuild install-swiftpm install-swift-driver install-swiftsyntax +install-swift-testing install-playgroundsupport install-sourcekit-lsp install-swiftformat diff --git a/utils/build_swift/build_swift/driver_arguments.py b/utils/build_swift/build_swift/driver_arguments.py index 3ea1927032551..059f5a090b334 100644 --- a/utils/build_swift/build_swift/driver_arguments.py +++ b/utils/build_swift/build_swift/driver_arguments.py @@ -809,6 +809,11 @@ def create_argument_parser(): option(['--wasmkit'], toggle_true('build_wasmkit'), help='build WasmKit') + option('--swift-testing', toggle_true('build_swift_testing'), + help='build swift-testing') + option('--install-swift-testing', toggle_true('install_swift_testing'), + help='install swift-testing') + option('--xctest', toggle_true('build_xctest'), help='build xctest') diff --git a/utils/build_swift/tests/expected_options.py b/utils/build_swift/tests/expected_options.py index 632d03b7a8c8c..04b8f9052b00c 100644 --- a/utils/build_swift/tests/expected_options.py +++ b/utils/build_swift/tests/expected_options.py @@ -95,6 +95,7 @@ 'build_swiftpm': False, 'build_swift_driver': False, 'build_swift_libexec': True, + 'build_swift_testing': False, 'build_early_swift_driver': True, 'build_early_swiftsyntax': True, 'build_swiftsyntax': False, @@ -111,6 +112,7 @@ 'install_static_linux_config': False, 'install_swiftpm': False, 'install_swiftsyntax': False, + 'install_swift_testing': False, 'install_swift_driver': False, 'install_swiftdocc': False, 'swiftsyntax_verify_generated_files': False, @@ -566,6 +568,7 @@ class BuildScriptImplOption(_BaseOption): SetTrueOption('--swiftpm', dest='build_swiftpm'), SetTrueOption('--swift-driver', dest='build_swift_driver'), SetTrueOption('--swiftsyntax', dest='build_swiftsyntax'), + SetTrueOption('--swift-testing', dest='build_swift_testing'), SetTrueOption('--skstresstester', dest='build_skstresstester'), SetTrueOption('--swiftformat', dest='build_swiftformat'), SetTrueOption('--swiftdocc', dest='build_swiftdocc'), @@ -646,6 +649,7 @@ class BuildScriptImplOption(_BaseOption): EnableOption('--install-llvm', dest='install_llvm'), EnableOption('--install-static-linux-config', dest='install_static_linux_config'), EnableOption('--install-swiftsyntax', dest='install_swiftsyntax'), + EnableOption('--install-swift-testing', dest='install_swift_testing'), EnableOption('--swiftsyntax-verify-generated-files', dest='swiftsyntax_verify_generated_files'), EnableOption('--swiftsyntax-enable-rawsyntax-validation', diff --git a/utils/swift_build_support/swift_build_support/build_script_invocation.py b/utils/swift_build_support/swift_build_support/build_script_invocation.py index 3f4aa70338d67..8daa61de5eb21 100644 --- a/utils/swift_build_support/swift_build_support/build_script_invocation.py +++ b/utils/swift_build_support/swift_build_support/build_script_invocation.py @@ -678,6 +678,8 @@ def compute_product_pipelines(self): is_enabled=self.args.build_foundation) builder.add_product(products.SwiftSyntax, is_enabled=self.args.build_swiftsyntax) + builder.add_product(products.SwiftTesting, + is_enabled=self.args.build_swift_testing) builder.add_product(products.SwiftFormat, is_enabled=self.args.build_swiftformat) builder.add_product(products.SKStressTester, diff --git a/utils/swift_build_support/swift_build_support/productpipeline_list_builder.py b/utils/swift_build_support/swift_build_support/productpipeline_list_builder.py index 09c16611090ef..056e8af2f117f 100644 --- a/utils/swift_build_support/swift_build_support/productpipeline_list_builder.py +++ b/utils/swift_build_support/swift_build_support/productpipeline_list_builder.py @@ -101,7 +101,7 @@ def add_product(self, product_cls, is_enabled): self.current_pipeline.append(product_cls, is_enabled) def add_impl_product(self, product_cls, is_enabled): - """Add a non-impl product to the current pipeline begin constructed""" + """Add an impl product to the current pipeline begin constructed""" assert self.current_pipeline is not None assert self.is_current_pipeline_impl assert product_cls.is_build_script_impl_product() diff --git a/utils/swift_build_support/swift_build_support/products/__init__.py b/utils/swift_build_support/swift_build_support/products/__init__.py index a029b952e0faa..1b6f80527d689 100644 --- a/utils/swift_build_support/swift_build_support/products/__init__.py +++ b/utils/swift_build_support/swift_build_support/products/__init__.py @@ -30,6 +30,7 @@ from .sourcekitlsp import SourceKitLSP from .staticswiftlinux import StaticSwiftLinuxConfig from .swift import Swift +from .swift_testing import SwiftTesting from .swiftdocc import SwiftDocC from .swiftdoccrender import SwiftDocCRender from .swiftdriver import SwiftDriver @@ -68,6 +69,7 @@ 'SwiftInspect', 'SwiftPM', 'SwiftDriver', + 'SwiftTesting', 'EarlySwiftDriver', 'XCTest', 'SwiftSyntax', diff --git a/utils/swift_build_support/swift_build_support/products/swift_testing.py b/utils/swift_build_support/swift_build_support/products/swift_testing.py new file mode 100644 index 0000000000000..98213a9f1a2ec --- /dev/null +++ b/utils/swift_build_support/swift_build_support/products/swift_testing.py @@ -0,0 +1,67 @@ +# swift_build_support/products/xctest.py -------------------------*- python -*- +# +# This source file is part of the Swift.org open source project +# +# Copyright (c) 2024 Apple Inc. and the Swift project authors +# Licensed under Apache License v2.0 with Runtime Library Exception +# +# See https://swift.org/LICENSE.txt for license information +# See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +# +# ---------------------------------------------------------------------------- + +import os + +from . import cmake_product +from . import swift +from . import swiftsyntax + +class SwiftTesting(cmake_product.CMakeProduct): + @classmethod + def is_build_script_impl_product(cls): + return False + + @classmethod + def is_before_build_script_impl_product(cls): + return False + + @classmethod + def product_source_name(cls): + return "swift-testing" + + @classmethod + def get_dependencies(cls): + return [swift.Swift, + swiftsyntax.SwiftSyntax] + + def should_build(self, host_target): + return True + + def build(self, host_target): + self.cmake_options.define('BUILD_SHARED_LIBS', 'YES') + + # Use empty CMake install prefix, since the `DESTDIR` env var is set by + # `install_with_cmake` later which already has the same prefix. + self.cmake_options.define('CMAKE_INSTALL_PREFIX', '') + + build_root = os.path.dirname(self.build_dir) + swift_build_dir = os.path.join( + '..', build_root, '%s-%s' % ('swift', host_target)) + swift_cmake_dir = os.path.join(swift_build_dir, 'cmake', 'modules') + self.cmake_options.define('SwiftSyntax_DIR:PATH', swift_cmake_dir) + + self.build_with_cmake([], self.args.build_variant, [], + prefer_native_toolchain=True) + + def should_test(self, host_target): + # TODO + return False + + def should_install(self, host_target): + return self.args.install_swift_testing + + def install(self, host_target): + install_destdir = self.host_install_destdir(host_target) + install_prefix = install_destdir + self.args.install_prefix + + self.install_with_cmake(['install'], install_prefix) From ff5ece15bc5e7a0faa6d1a0abbe57f146f349142 Mon Sep 17 00:00:00 2001 From: Stuart Montgomery Date: Thu, 11 Jul 2024 21:40:38 -0500 Subject: [PATCH 3/9] Add swift-testing to Linux presets too --- utils/build-presets.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils/build-presets.ini b/utils/build-presets.ini index 72a2f6283a2cf..d2ca7ef64ed8c 100644 --- a/utils/build-presets.ini +++ b/utils/build-presets.ini @@ -839,6 +839,7 @@ mixin-preset= llbuild swiftpm swift-driver +swift-testing xctest swiftdocc swiftformat @@ -852,6 +853,7 @@ install-llbuild install-swiftpm install-swift-driver install-swiftsyntax +install-swift-testing install-xctest install-prefix=/usr install-sourcekit-lsp From c8d7d134b01897d16d0b4617a65911c38aec3c5a Mon Sep 17 00:00:00 2001 From: Stuart Montgomery Date: Tue, 16 Jul 2024 08:53:38 -0500 Subject: [PATCH 4/9] Improve description of new build-script flags --- utils/build_swift/build_swift/driver_arguments.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/build_swift/build_swift/driver_arguments.py b/utils/build_swift/build_swift/driver_arguments.py index 059f5a090b334..017d726c73c1f 100644 --- a/utils/build_swift/build_swift/driver_arguments.py +++ b/utils/build_swift/build_swift/driver_arguments.py @@ -810,9 +810,9 @@ def create_argument_parser(): help='build WasmKit') option('--swift-testing', toggle_true('build_swift_testing'), - help='build swift-testing') + help='build Swift Testing') option('--install-swift-testing', toggle_true('install_swift_testing'), - help='install swift-testing') + help='install Swift Testing') option('--xctest', toggle_true('build_xctest'), help='build xctest') From 155e4c857bbee230ea16b228e2f7d3612507d14e Mon Sep 17 00:00:00 2001 From: Stuart Montgomery Date: Tue, 16 Jul 2024 13:38:29 -0500 Subject: [PATCH 5/9] Fix header comment --- .../swift_build_support/products/swift_testing.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/utils/swift_build_support/swift_build_support/products/swift_testing.py b/utils/swift_build_support/swift_build_support/products/swift_testing.py index 98213a9f1a2ec..fb2a91942d5b7 100644 --- a/utils/swift_build_support/swift_build_support/products/swift_testing.py +++ b/utils/swift_build_support/swift_build_support/products/swift_testing.py @@ -1,4 +1,4 @@ -# swift_build_support/products/xctest.py -------------------------*- python -*- +# swift_build_support/products/swift_testing.py -----------------*- python -*- # # This source file is part of the Swift.org open source project # From e06d38b3ac6b063fc116df9dfcb44b48eeefb5f3 Mon Sep 17 00:00:00 2001 From: Rintaro Ishizaki Date: Wed, 24 Jul 2024 22:34:47 +0000 Subject: [PATCH 6/9] [swift-testing] Build tweak * Remove SwiftSyntax product dependency * Correct CMAKE_BUILD_TYPE --- .../swift_build_support/products/swift_testing.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/utils/swift_build_support/swift_build_support/products/swift_testing.py b/utils/swift_build_support/swift_build_support/products/swift_testing.py index fb2a91942d5b7..773a1174f8ff4 100644 --- a/utils/swift_build_support/swift_build_support/products/swift_testing.py +++ b/utils/swift_build_support/swift_build_support/products/swift_testing.py @@ -14,7 +14,7 @@ from . import cmake_product from . import swift -from . import swiftsyntax + class SwiftTesting(cmake_product.CMakeProduct): @classmethod @@ -31,8 +31,7 @@ def product_source_name(cls): @classmethod def get_dependencies(cls): - return [swift.Swift, - swiftsyntax.SwiftSyntax] + return [swift.Swift] def should_build(self, host_target): return True @@ -44,6 +43,8 @@ def build(self, host_target): # `install_with_cmake` later which already has the same prefix. self.cmake_options.define('CMAKE_INSTALL_PREFIX', '') + self.cmake_options.define('CMAKE_BUILD_TYPE', self.args.build_variant) + build_root = os.path.dirname(self.build_dir) swift_build_dir = os.path.join( '..', build_root, '%s-%s' % ('swift', host_target)) From f069aecca504ce98abf85faf80d4919ca59af1cc Mon Sep 17 00:00:00 2001 From: Rintaro Date: Thu, 25 Jul 2024 15:00:37 -0700 Subject: [PATCH 7/9] [Windows] Build and install swift-testing in Windows toolchains * Basically following XCTest scheme. * Build TestingMacro separately from Testing library and install it to the toolchain's `bin` * Testing swift-testing itself is TODO --- utils/build.ps1 | 91 ++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 78 insertions(+), 13 deletions(-) diff --git a/utils/build.ps1 b/utils/build.ps1 index 2b441dc6633dd..3a2c50f43a1f6 100644 --- a/utils/build.ps1 +++ b/utils/build.ps1 @@ -215,6 +215,7 @@ $ArchX64 = @{ PlatformInstallRoot = "$BinaryCache\x64\Windows.platform"; SDKInstallRoot = "$BinaryCache\x64\Windows.platform\Developer\SDKs\Windows.sdk"; XCTestInstallRoot = "$BinaryCache\x64\Windows.platform\Developer\Library\XCTest-development"; + SwiftTestingInstallRoot = "$BinaryCache\x64\Windows.platform\Developer\Library\Testing-development"; ToolchainInstallRoot = "$BinaryCache\x64\toolchains\$ProductVersion+Asserts"; } @@ -230,6 +231,7 @@ $ArchX86 = @{ PlatformInstallRoot = "$BinaryCache\x86\Windows.platform"; SDKInstallRoot = "$BinaryCache\x86\Windows.platform\Developer\SDKs\Windows.sdk"; XCTestInstallRoot = "$BinaryCache\x86\Windows.platform\Developer\Library\XCTest-development"; + SwiftTestingInstallRoot = "$BinaryCache\x86\Windows.platform\Developer\Library\Testing-development"; } $ArchARM64 = @{ @@ -245,6 +247,7 @@ $ArchARM64 = @{ SDKInstallRoot = "$BinaryCache\arm64\Windows.platform\Developer\SDKs\Windows.sdk"; XCTestInstallRoot = "$BinaryCache\arm64\Windows.platform\Developer\Library\XCTest-development"; ToolchainInstallRoot = "$BinaryCache\arm64\toolchains\$ProductVersion+Asserts"; + SwiftTestingInstallRoot = "$BinaryCache\arm64\Windows.platform\Developer\Library\Testing-development"; } $AndroidARM64 = @{ @@ -258,6 +261,7 @@ $AndroidARM64 = @{ PlatformInstallRoot = "$BinaryCache\arm64\Android.platform"; SDKInstallRoot = "$BinaryCache\arm64\Android.platform\Developer\SDKs\Android.sdk"; XCTestInstallRoot = "$BinaryCache\arm64\Android.platform\Developer\Library\XCTest-development"; + SwiftTestingInstallRoot = "$BinaryCache\arm64\Android.platform\Developer\Library\Testing-development"; } $AndroidARMv7 = @{ @@ -271,6 +275,7 @@ $AndroidARMv7 = @{ PlatformInstallRoot = "$BinaryCache\armv7\Android.platform"; SDKInstallRoot = "$BinaryCache\armv7\Android.platform\Developer\SDKs\Android.sdk"; XCTestInstallRoot = "$BinaryCache\armv7\Android.platform\Developer\Library\XCTest-development"; + SwiftTestingInstallRoot = "$BinaryCache\armv7\Android.platform\Developer\Library\Testing-development"; } $AndroidX86 = @{ @@ -284,6 +289,7 @@ $AndroidX86 = @{ PlatformInstallRoot = "$BinaryCache\x86\Android.platform"; SDKInstallRoot = "$BinaryCache\x86\Android.platform\Developer\SDKs\Android.sdk"; XCTestInstallRoot = "$BinaryCache\x86\Android.platform\Developer\Library\XCTest-development"; + SwiftTestingInstallRoot = "$BinaryCache\x86\Android.platform\Developer\Library\Testing-development"; } $AndroidX64 = @{ @@ -297,6 +303,7 @@ $AndroidX64 = @{ PlatformInstallRoot = "$BinaryCache\x64\Android.platform"; SDKInstallRoot = "$BinaryCache\x64\Android.platform\Developer\SDKs\Android.sdk"; XCTestInstallRoot = "$BinaryCache\x64\Android.platform\Developer\Library\XCTest-development"; + SwiftTestingInstallRoot = "$BinaryCache\x64\Android.platform\Developer\Library\Testing-development"; } $HostArch = switch ($HostArchName) { @@ -387,6 +394,7 @@ enum TargetComponent { Dispatch Foundation XCTest + SwiftTesting } function Get-TargetProjectBinaryCache($Arch, [TargetComponent]$Project) { @@ -413,6 +421,7 @@ enum HostComponent { LMDB SymbolKit DocC + SwiftTestingMacros } function Get-HostProjectBinaryCache([HostComponent]$Project) { @@ -1731,11 +1740,43 @@ function Build-XCTest([Platform]$Platform, $Arch, [switch]$Test = $false) { dispatch_DIR = "$DispatchBinaryCache\cmake\modules"; Foundation_DIR = "$FoundationBinaryCache\cmake\modules"; } + $TestingDefines) + } +} + +function Build-SwiftTesting([Platform]$Platform, $Arch, [switch]$Test = $false) { + $SwiftTestingBinaryCache = Get-TargetProjectBinaryCache $Arch SwiftTesting + + Isolate-EnvVars { + if ($Test) { + # TODO: Test + return + } else { + $Targets = @("default") + $InstallPath = "$($Arch.SwiftTestingInstallRoot)\usr" + } + + Build-CMakeProject ` + -Src $SourceCache\swift-testing ` + -Bin $SwiftTestingBinaryCache ` + -InstallTo $InstallPath ` + -Arch $Arch ` + -Platform $Platform ` + -UseBuiltCompilers C,CXX,Swift ` + -BuildTargets $Targets ` + -Defines (@{ + BUILD_SHARED_LIBS = "YES"; + CMAKE_BUILD_WITH_INSTALL_RPATH = "YES"; + SwiftSyntax_DIR = (Get-HostProjectCMakeModules Compilers); + # FIXME: Build the plugin for the builder and specify the path. + SwiftTesting_MACRO = "NO"; + }) + } +} +function Write-PlatformInfoPlist($Arch) { $PList = Join-Path -Path $Arch.PlatformInstallRoot -ChildPath "Info.plist" - Invoke-Program $python -c "import plistlib; print(str(plistlib.dumps({ 'DefaultProperties': { 'XCTEST_VERSION': 'development', 'SWIFTC_FLAGS': ['-use-ld=lld'] } }), encoding='utf-8'))" ` + Invoke-Program $python -c "import plistlib; print(str(plistlib.dumps({ 'DefaultProperties': { 'XCTEST_VERSION': 'development', 'SWIFT_TESTING_VERSION': 'development', 'SWIFTC_FLAGS': ['-use-ld=lld'] } }), encoding='utf-8'))" ` -OutFile "$PList" - } } # Copies files installed by CMake from the arch-specific platform root, @@ -2167,6 +2208,21 @@ function Build-SourceKitLSP($Arch) { } } +function Build-SwiftTestingMacros($Arch) { + Build-CMakeProject ` + -Src $SourceCache\swift-testing\Sources\TestingMacros ` + -Bin (Get-HostProjectBinaryCache SwiftTestingMacros) ` + -InstallTo "$($Arch.ToolchainInstallRoot)\usr" ` + -Arch $Arch ` + -Platform Windows ` + -UseBuiltCompilers Swift ` + -SwiftSDK (Get-HostSwiftSDK) ` + -BuildTargets default ` + -Defines @{ + SwiftSyntax_DIR = (Get-HostProjectCMakeModules Compilers); + } +} + function Install-HostToolchain() { if ($ToBatch) { return } @@ -2325,20 +2381,24 @@ if (-not $SkipBuild) { Invoke-BuildStep Build-Dispatch Windows $Arch Invoke-BuildStep Build-Foundation Windows $Arch Invoke-BuildStep Build-XCTest Windows $Arch + Invoke-BuildStep Build-SwiftTesting Windows $Arch + Invoke-BuildStep Write-PlatformInfoPlist $Arch } - foreach ($Arch in $AndroidSDKArchs) { - Invoke-BuildStep Build-ZLib Android $Arch - Invoke-BuildStep Build-XML2 Android $Arch - Invoke-BuildStep Build-CURL Android $Arch - Invoke-BuildStep Build-LLVM Android $Arch + foreach ($Arch in $AndroidSDKArchs) { + Invoke-BuildStep Build-ZLib Android $Arch + Invoke-BuildStep Build-XML2 Android $Arch + Invoke-BuildStep Build-CURL Android $Arch + Invoke-BuildStep Build-LLVM Android $Arch - # Build platform: SDK, Redist and XCTest - Invoke-BuildStep Build-Runtime Android $Arch - Invoke-BuildStep Build-Dispatch Android $Arch - Invoke-BuildStep Build-Foundation Android $Arch - Invoke-BuildStep Build-XCTest Android $Arch - } + # Build platform: SDK, Redist and XCTest + Invoke-BuildStep Build-Runtime Android $Arch + Invoke-BuildStep Build-Dispatch Android $Arch + Invoke-BuildStep Build-Foundation Android $Arch + Invoke-BuildStep Build-XCTest Android $Arch + Invoke-BuildStep Build-SwiftTesting Android $Arch + Invoke-BuildStep Write-PlatformInfoPlist $Arch + } } if (-not $ToBatch) { @@ -2360,6 +2420,8 @@ if (-not $ToBatch) { } if (-not $SkipBuild) { + # TestingMacros can't be built before the standard library for the host as it is required for the Swift code. + Invoke-BuildStep Build-SwiftTestingMacros $HostArch Invoke-BuildStep Build-SQLite $HostArch Invoke-BuildStep Build-System $HostArch Invoke-BuildStep Build-ToolsSupportCore $HostArch @@ -2414,6 +2476,9 @@ if (-not $IsCrossCompiling) { if ($Test -contains "xctest") { Build-XCTest Windows $HostArch -Test } + if ($Test -contains "testing") { + Build-SwiftTesting Windows $HostArch -Test + } if ($Test -contains "llbuild") { Build-LLBuild $HostArch -Test } if ($Test -contains "swiftpm") { Test-PackageManager $HostArch } } From 6a383293c4a916b3e77924cf1c45fecf771c61ef Mon Sep 17 00:00:00 2001 From: Rintaro Ishizaki Date: Sat, 3 Aug 2024 09:54:27 -0700 Subject: [PATCH 8/9] [build-preset] Add swift-testing to incrmental bots --- utils/build-presets.ini | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/utils/build-presets.ini b/utils/build-presets.ini index d2ca7ef64ed8c..c3c09e3a1a2c4 100644 --- a/utils/build-presets.ini +++ b/utils/build-presets.ini @@ -383,6 +383,7 @@ sourcekit-lsp # swift-inspect swiftsyntax swiftformat +swift-testing skstresstester @@ -406,6 +407,7 @@ install-swiftpm install-swift-driver install-swiftsyntax install-swiftformat +install-swift-testing [preset: buildbot_incremental,tools=RA,stdlib=RA,apple_silicon] mixin-preset=buildbot_incremental,tools=RA,stdlib=RA @@ -1182,12 +1184,14 @@ llbuild swiftpm swift-driver xctest +swift-testing foundation libdispatch swiftsyntax swiftformat indexstore-db sourcekit-lsp + install-llvm install-static-linux-config install-swift @@ -1198,6 +1202,7 @@ install-swiftsyntax install-foundation install-libdispatch install-xctest +install-swift-testing install-swiftformat [preset: buildbot_incremental_linux,long_test] @@ -1690,6 +1695,7 @@ swiftpm # swift-inspect swift-driver swiftsyntax +swift-testing swiftformat swiftdocc @@ -1709,6 +1715,7 @@ install-llbuild install-swiftpm install-swift-driver install-swiftsyntax +install-swift-testing install-swiftdocc install-swiftformat From e98c5eab6111801357176ef10992ec63eef5f071 Mon Sep 17 00:00:00 2001 From: Rintaro Ishizaki Date: Thu, 8 Aug 2024 15:00:27 -0700 Subject: [PATCH 9/9] [build-script] Separate SwiftTestinMacros from SwiftTesting product Also, build them for all hosts including cross compiling host. --- utils/build-presets.ini | 10 ++ .../build_swift/driver_arguments.py | 5 + utils/build_swift/tests/expected_options.py | 5 + .../build_script_invocation.py | 2 + .../swift_build_support/products/__init__.py | 2 + .../swift_build_support/products/product.py | 21 +++- .../products/swift_testing.py | 73 ++++++++++-- .../products/swift_testing_macros.py | 112 ++++++++++++++++++ 8 files changed, 211 insertions(+), 19 deletions(-) create mode 100644 utils/swift_build_support/swift_build_support/products/swift_testing_macros.py diff --git a/utils/build-presets.ini b/utils/build-presets.ini index c3c09e3a1a2c4..5ba48a09f2c5c 100644 --- a/utils/build-presets.ini +++ b/utils/build-presets.ini @@ -384,6 +384,7 @@ sourcekit-lsp swiftsyntax swiftformat swift-testing +swift-testing-macros skstresstester @@ -408,6 +409,7 @@ install-swift-driver install-swiftsyntax install-swiftformat install-swift-testing +install-swift-testing-macros [preset: buildbot_incremental,tools=RA,stdlib=RA,apple_silicon] mixin-preset=buildbot_incremental,tools=RA,stdlib=RA @@ -842,6 +844,7 @@ llbuild swiftpm swift-driver swift-testing +swift-testing-macros xctest swiftdocc swiftformat @@ -856,6 +859,7 @@ install-swiftpm install-swift-driver install-swiftsyntax install-swift-testing +install-swift-testing-macros install-xctest install-prefix=/usr install-sourcekit-lsp @@ -1185,6 +1189,7 @@ swiftpm swift-driver xctest swift-testing +swift-testing-macros foundation libdispatch swiftsyntax @@ -1203,6 +1208,7 @@ install-foundation install-libdispatch install-xctest install-swift-testing +install-swift-testing-macros install-swiftformat [preset: buildbot_incremental_linux,long_test] @@ -1327,6 +1333,7 @@ swift-driver # swift-inspect swiftsyntax swift-testing +swift-testing-macros swiftformat playgroundsupport indexstore-db @@ -1372,6 +1379,7 @@ install-swiftpm install-swift-driver install-swiftsyntax install-swift-testing +install-swift-testing-macros install-playgroundsupport install-sourcekit-lsp install-swiftformat @@ -1696,6 +1704,7 @@ swiftpm swift-driver swiftsyntax swift-testing +swift-testing-macros swiftformat swiftdocc @@ -1716,6 +1725,7 @@ install-swiftpm install-swift-driver install-swiftsyntax install-swift-testing +install-swift-testing-macros install-swiftdocc install-swiftformat diff --git a/utils/build_swift/build_swift/driver_arguments.py b/utils/build_swift/build_swift/driver_arguments.py index 017d726c73c1f..81d284a5f31f6 100644 --- a/utils/build_swift/build_swift/driver_arguments.py +++ b/utils/build_swift/build_swift/driver_arguments.py @@ -813,6 +813,11 @@ def create_argument_parser(): help='build Swift Testing') option('--install-swift-testing', toggle_true('install_swift_testing'), help='install Swift Testing') + option('--swift-testing-macros', toggle_true('build_swift_testing_macros'), + help='build Swift Testing macro plugin') + option('--install-swift-testing-macros', + toggle_true('install_swift_testing_macros'), + help='install Swift Testing macro plugin') option('--xctest', toggle_true('build_xctest'), help='build xctest') diff --git a/utils/build_swift/tests/expected_options.py b/utils/build_swift/tests/expected_options.py index 04b8f9052b00c..5738f88736623 100644 --- a/utils/build_swift/tests/expected_options.py +++ b/utils/build_swift/tests/expected_options.py @@ -96,6 +96,7 @@ 'build_swift_driver': False, 'build_swift_libexec': True, 'build_swift_testing': False, + 'build_swift_testing_macros': False, 'build_early_swift_driver': True, 'build_early_swiftsyntax': True, 'build_swiftsyntax': False, @@ -113,6 +114,7 @@ 'install_swiftpm': False, 'install_swiftsyntax': False, 'install_swift_testing': False, + 'install_swift_testing_macros': False, 'install_swift_driver': False, 'install_swiftdocc': False, 'swiftsyntax_verify_generated_files': False, @@ -569,6 +571,7 @@ class BuildScriptImplOption(_BaseOption): SetTrueOption('--swift-driver', dest='build_swift_driver'), SetTrueOption('--swiftsyntax', dest='build_swiftsyntax'), SetTrueOption('--swift-testing', dest='build_swift_testing'), + SetTrueOption('--swift-testing-macros', dest='build_swift_testing_macros'), SetTrueOption('--skstresstester', dest='build_skstresstester'), SetTrueOption('--swiftformat', dest='build_swiftformat'), SetTrueOption('--swiftdocc', dest='build_swiftdocc'), @@ -650,6 +653,8 @@ class BuildScriptImplOption(_BaseOption): EnableOption('--install-static-linux-config', dest='install_static_linux_config'), EnableOption('--install-swiftsyntax', dest='install_swiftsyntax'), EnableOption('--install-swift-testing', dest='install_swift_testing'), + EnableOption('--install-swift-testing-macros', + dest='install_swift_testing_macros'), EnableOption('--swiftsyntax-verify-generated-files', dest='swiftsyntax_verify_generated_files'), EnableOption('--swiftsyntax-enable-rawsyntax-validation', diff --git a/utils/swift_build_support/swift_build_support/build_script_invocation.py b/utils/swift_build_support/swift_build_support/build_script_invocation.py index 8daa61de5eb21..75d393edee695 100644 --- a/utils/swift_build_support/swift_build_support/build_script_invocation.py +++ b/utils/swift_build_support/swift_build_support/build_script_invocation.py @@ -678,6 +678,8 @@ def compute_product_pipelines(self): is_enabled=self.args.build_foundation) builder.add_product(products.SwiftSyntax, is_enabled=self.args.build_swiftsyntax) + builder.add_product(products.SwiftTestingMacros, + is_enabled=self.args.build_swift_testing_macros) builder.add_product(products.SwiftTesting, is_enabled=self.args.build_swift_testing) builder.add_product(products.SwiftFormat, diff --git a/utils/swift_build_support/swift_build_support/products/__init__.py b/utils/swift_build_support/swift_build_support/products/__init__.py index 1b6f80527d689..ebd7eaabfb630 100644 --- a/utils/swift_build_support/swift_build_support/products/__init__.py +++ b/utils/swift_build_support/swift_build_support/products/__init__.py @@ -31,6 +31,7 @@ from .staticswiftlinux import StaticSwiftLinuxConfig from .swift import Swift from .swift_testing import SwiftTesting +from .swift_testing_macros import SwiftTestingMacros from .swiftdocc import SwiftDocC from .swiftdoccrender import SwiftDocCRender from .swiftdriver import SwiftDriver @@ -70,6 +71,7 @@ 'SwiftPM', 'SwiftDriver', 'SwiftTesting', + 'SwiftTestingMacros', 'EarlySwiftDriver', 'XCTest', 'SwiftSyntax', diff --git a/utils/swift_build_support/swift_build_support/products/product.py b/utils/swift_build_support/swift_build_support/products/product.py index de813c2bcb58d..e62eb23c8bb5e 100644 --- a/utils/swift_build_support/swift_build_support/products/product.py +++ b/utils/swift_build_support/swift_build_support/products/product.py @@ -293,7 +293,8 @@ def target_for_platform(self, platform, arch, include_version=True): arch, self.args.darwin_deployment_version_xros) return target - def generate_darwin_toolchain_file(self, platform, arch): + def generate_darwin_toolchain_file(self, platform, arch, + macos_deployment_version=None): """ Generates a new CMake tolchain file that specifies Darwin as a target platform. @@ -306,9 +307,14 @@ def generate_darwin_toolchain_file(self, platform, arch): cmake_osx_sysroot = xcrun.sdk_path(platform) - target = self.target_for_platform(platform, arch) - if not target: - raise RuntimeError('Unhandled platform {}?!'.format(platform)) + if platform == 'macosx': + if macos_deployment_version is None: + macos_deployment_version = self.args.darwin_deployment_version_osx + target = '{}-apple-macosx{}'.format(arch, macos_deployment_version) + else: + target = self.target_for_platform(platform, arch) + if not target: + raise RuntimeError('Unhandled platform {}?!'.format(platform)) toolchain_args = {} @@ -429,7 +435,8 @@ def generate_linux_toolchain_file(self, platform, arch): return toolchain_file - def generate_toolchain_file_for_darwin_or_linux(self, host_target): + def generate_toolchain_file_for_darwin_or_linux( + self, host_target, override_macos_deployment_version=None): """ Checks `host_target` platform and generates a new CMake tolchain file appropriate for that target platform (either Darwin or Linux). Defines @@ -448,7 +455,9 @@ def generate_toolchain_file_for_darwin_or_linux(self, host_target): toolchain_file = None if self.is_darwin_host(host_target): - toolchain_file = self.generate_darwin_toolchain_file(platform, arch) + toolchain_file = self.generate_darwin_toolchain_file( + platform, arch, + macos_deployment_version=override_macos_deployment_version) self.cmake_options.define('CMAKE_TOOLCHAIN_FILE:PATH', toolchain_file) elif platform == "linux": toolchain_file = self.generate_linux_toolchain_file(platform, arch) diff --git a/utils/swift_build_support/swift_build_support/products/swift_testing.py b/utils/swift_build_support/swift_build_support/products/swift_testing.py index 773a1174f8ff4..0e96f71f14c06 100644 --- a/utils/swift_build_support/swift_build_support/products/swift_testing.py +++ b/utils/swift_build_support/swift_build_support/products/swift_testing.py @@ -12,11 +12,14 @@ import os +from build_swift.build_swift.versions import Version + from . import cmake_product +from . import product from . import swift -class SwiftTesting(cmake_product.CMakeProduct): +class SwiftTesting(product.Product): @classmethod def is_build_script_impl_product(cls): return False @@ -36,7 +39,59 @@ def get_dependencies(cls): def should_build(self, host_target): return True + def should_test(self, host_target): + # TODO: Implement. + return False + + def should_install(self, host_target): + return self.args.install_swift_testing_macros + + def _cmake_product(self, host_target): + build_root = os.path.dirname(self.build_dir) + build_dir = os.path.join( + build_root, '%s-%s' % (self.product_name(), host_target)) + + return SwiftTestingCMakeShim( + args=self.args, + toolchain=self.toolchain, + source_dir=self.source_dir, + build_dir=build_dir) + + def _build_with_cmake(self, host_target): + self._cmake_product(host_target).build(host_target) + + def build(self, host_target): + self._build_with_cmake(host_target) + + # For Darwin host, 'build' is only called for the builder. + # Manually iterate the cross compile hosts. + if self.has_cross_compile_hosts() and self.is_darwin_host(host_target): + for target in self.args.cross_compile_hosts: + self._build_with_cmake(target) + + # FIXME: build testing library for 'stdlib_deployment_targets'? + pass + + def _install_with_cmake(self, host_target): + self._cmake_product(host_target).install(host_target) + + def install(self, host_target): + self._install_with_cmake(host_target) + + # For Darwin host, 'install' is only called for the builder. + # Manually iterate the cross compile hosts. + if self.has_cross_compile_hosts() and self.is_darwin_host(host_target): + for target in self.args.cross_compile_hosts: + self._install_with_cmake(target) + + +class SwiftTestingCMakeShim(cmake_product.CMakeProduct): def build(self, host_target): + override_deployment_version = None + if host_target.startswith('macosx'): + if Version(self.args.darwin_deployment_version_osx) < Version('10.15'): + override_deployment_version = '10.15' + self.cmake_options.define('BUILD_SHARED_LIBS', 'YES') # Use empty CMake install prefix, since the `DESTDIR` env var is set by @@ -45,22 +100,14 @@ def build(self, host_target): self.cmake_options.define('CMAKE_BUILD_TYPE', self.args.build_variant) - build_root = os.path.dirname(self.build_dir) - swift_build_dir = os.path.join( - '..', build_root, '%s-%s' % ('swift', host_target)) - swift_cmake_dir = os.path.join(swift_build_dir, 'cmake', 'modules') - self.cmake_options.define('SwiftSyntax_DIR:PATH', swift_cmake_dir) + # FIXME: If we build macros for the builder, specify the path. + self.cmake_options.define('SwiftTesting_MACRO', 'NO') + self.generate_toolchain_file_for_darwin_or_linux( + host_target, override_macos_deployment_version=override_deployment_version) self.build_with_cmake([], self.args.build_variant, [], prefer_native_toolchain=True) - def should_test(self, host_target): - # TODO - return False - - def should_install(self, host_target): - return self.args.install_swift_testing - def install(self, host_target): install_destdir = self.host_install_destdir(host_target) install_prefix = install_destdir + self.args.install_prefix diff --git a/utils/swift_build_support/swift_build_support/products/swift_testing_macros.py b/utils/swift_build_support/swift_build_support/products/swift_testing_macros.py new file mode 100644 index 0000000000000..38e2d8ab3a8fa --- /dev/null +++ b/utils/swift_build_support/swift_build_support/products/swift_testing_macros.py @@ -0,0 +1,112 @@ +# swift_build_support/products/swift_testing_macros.py ----------*- python -*- +# +# This source file is part of the Swift.org open source project +# +# Copyright (c) 2024 Apple Inc. and the Swift project authors +# Licensed under Apache License v2.0 with Runtime Library Exception +# +# See https://swift.org/LICENSE.txt for license information +# See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors +# +# ---------------------------------------------------------------------------- + +import os + +from build_swift.build_swift.versions import Version + +from . import cmake_product +from . import product +from . import swift + + +class SwiftTestingMacros(product.Product): + @classmethod + def is_build_script_impl_product(cls): + return False + + @classmethod + def is_before_build_script_impl_product(cls): + return False + + @classmethod + def product_source_name(cls): + return "swift-testing/Sources/TestingMacros" + + @classmethod + def get_dependencies(cls): + return [swift.Swift] + + def should_build(self, host_target): + return True + + def should_test(self, host_target): + return False + + def should_install(self, host_target): + return self.args.install_swift_testing_macros + + def _cmake_product(self, host_target): + build_root = os.path.dirname(self.build_dir) + build_dir = os.path.join( + build_root, '%s-%s' % (self.product_name(), host_target)) + + return SwiftTestingMacrosCMakeShim( + args=self.args, + toolchain=self.toolchain, + source_dir=self.source_dir, + build_dir=build_dir) + + def _build_with_cmake(self, host_target): + self._cmake_product(host_target).build(host_target) + + def build(self, host_target): + self._build_with_cmake(host_target) + + # For Darwin host, 'build' is only called for the builder. + # Manually iterate the cross compile hosts. + if self.has_cross_compile_hosts() and self.is_darwin_host(host_target): + for target in self.args.cross_compile_hosts: + self._build_with_cmake(target) + + def _install_with_cmake(self, host_target): + self._cmake_product(host_target).install(host_target) + + def install(self, host_target): + self._install_with_cmake(host_target) + + # For Darwin host, 'install' is only called for the builder. + # Manually iterate the cross compile hosts. + if self.has_cross_compile_hosts() and self.is_darwin_host(host_target): + for target in self.args.cross_compile_hosts: + self._install_with_cmake(target) + + +class SwiftTestingMacrosCMakeShim(cmake_product.CMakeProduct): + def build(self, host_target): + override_deployment_version = None + if host_target.startswith('macosx'): + if Version(self.args.darwin_deployment_version_osx) < Version('10.15'): + override_deployment_version = '10.15' + + # Use empty CMake install prefix, since the `DESTDIR` env var is set by + # `install_with_cmake` later which already has the same prefix. + self.cmake_options.define('CMAKE_INSTALL_PREFIX', '') + + self.cmake_options.define('CMAKE_BUILD_TYPE', self.args.build_variant) + + build_root = os.path.dirname(self.build_dir) + swift_build_dir = os.path.join( + '..', build_root, '%s-%s' % ('swift', host_target)) + swift_cmake_dir = os.path.join(swift_build_dir, 'cmake', 'modules') + self.cmake_options.define('SwiftSyntax_DIR:PATH', swift_cmake_dir) + + self.generate_toolchain_file_for_darwin_or_linux( + host_target, override_macos_deployment_version=override_deployment_version) + self.build_with_cmake([], self.args.build_variant, [], + prefer_native_toolchain=True) + + def install(self, host_target): + install_destdir = self.host_install_destdir(host_target) + install_prefix = install_destdir + self.args.install_prefix + + self.install_with_cmake(['install'], install_prefix)