Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[6.0] Build and install swift-testing in toolchains #75837

Merged
merged 11 commits into from
Aug 22, 2024
21 changes: 21 additions & 0 deletions utils/build-presets.ini
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,8 @@ sourcekit-lsp
# swift-inspect
swiftsyntax
swiftformat
swift-testing
swift-testing-macros

skstresstester

Expand All @@ -402,6 +404,8 @@ install-swiftpm
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
Expand Down Expand Up @@ -835,6 +839,8 @@ mixin-preset=
llbuild
swiftpm
swift-driver
swift-testing
swift-testing-macros
xctest
libicu
swiftdocc
Expand All @@ -849,6 +855,8 @@ install-llbuild
install-swiftpm
install-swift-driver
install-swiftsyntax
install-swift-testing
install-swift-testing-macros
install-xctest
install-libicu
install-prefix=/usr
Expand Down Expand Up @@ -1169,12 +1177,15 @@ llbuild
swiftpm
swift-driver
xctest
swift-testing
swift-testing-macros
foundation
libdispatch
swiftsyntax
swiftformat
indexstore-db
sourcekit-lsp

install-llvm
install-static-linux-config
install-swift
Expand All @@ -1186,6 +1197,8 @@ install-swiftsyntax
install-foundation
install-libdispatch
install-xctest
install-swift-testing
install-swift-testing-macros
install-swiftformat

[preset: buildbot_incremental_linux,long_test]
Expand Down Expand Up @@ -1309,6 +1322,8 @@ swift-driver
# Failing to build in CI: rdar://78408440
# swift-inspect
swiftsyntax
swift-testing
swift-testing-macros
swiftformat
playgroundsupport
indexstore-db
Expand Down Expand Up @@ -1351,6 +1366,8 @@ install-llbuild
install-swiftpm
install-swift-driver
install-swiftsyntax
install-swift-testing
install-swift-testing-macros
install-playgroundsupport
install-sourcekit-lsp
install-swiftformat
Expand Down Expand Up @@ -1652,6 +1669,8 @@ swiftpm
# swift-inspect
swift-driver
swiftsyntax
swift-testing
swift-testing-macros
swiftformat
swiftdocc

Expand All @@ -1671,6 +1690,8 @@ install-llbuild
install-swiftpm
install-swift-driver
install-swiftsyntax
install-swift-testing
install-swift-testing-macros
install-swiftdocc
install-swiftformat

Expand Down
63 changes: 61 additions & 2 deletions utils/build.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,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";
}

Expand All @@ -202,6 +203,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 = @{
Expand All @@ -217,6 +219,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";
}

$HostArch = switch ($HostArchName) {
Expand Down Expand Up @@ -284,6 +287,7 @@ enum TargetComponent {
Dispatch
Foundation
XCTest
SwiftTesting
}

function Get-TargetProjectBinaryCache($Arch, [TargetComponent]$Project) {
Expand Down Expand Up @@ -311,6 +315,7 @@ enum HostComponent {
LMDB
SymbolKit
DocC
SwiftTestingMacros
}

function Get-HostProjectBinaryCache([HostComponent]$Project) {
Expand Down Expand Up @@ -1542,11 +1547,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([Platform]$Platform, $Arch) {
$PList = [IO.Path]::Combine($Arch.BinaryCache, "${Platform}.platform".ToLower(), "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,
Expand Down Expand Up @@ -1950,6 +1987,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 ([IO.Path]::Combine((Get-InstallDir $HostArch), "Platforms", "Windows.platform", "Developer", "SDKs", "Windows.sdk")) `
-BuildTargets default `
-Defines @{
SwiftSyntax_DIR = (Get-HostProjectCMakeModules Compilers);
}
}

function Install-HostToolchain() {
if ($ToBatch) { return }

Expand Down Expand Up @@ -2110,6 +2162,8 @@ if (-not $SkipBuild) {
Invoke-BuildStep Build-FoundationMacros -Build Windows $BuildArch
Invoke-BuildStep Build-Foundation Windows $Arch
Invoke-BuildStep Build-XCTest Windows $Arch
Invoke-BuildStep Build-SwiftTesting Windows $Arch
Invoke-BuildStep Write-PlatformInfoPlist Windows $Arch
}
}

Expand All @@ -2133,6 +2187,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
Expand Down Expand Up @@ -2187,6 +2243,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 }
}
Expand Down
10 changes: 10 additions & 0 deletions utils/build_swift/build_swift/driver_arguments.py
Original file line number Diff line number Diff line change
Expand Up @@ -811,6 +811,16 @@ 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('--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')

Expand Down
9 changes: 9 additions & 0 deletions utils/build_swift/tests/expected_options.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,8 @@
'build_swiftpm': False,
'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,
Expand All @@ -111,6 +113,8 @@
'install_static_linux_config': False,
'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,
Expand Down Expand Up @@ -565,6 +569,8 @@ 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('--swift-testing-macros', dest='build_swift_testing_macros'),
SetTrueOption('--skstresstester', dest='build_skstresstester'),
SetTrueOption('--swiftformat', dest='build_swiftformat'),
SetTrueOption('--swiftdocc', dest='build_swiftdocc'),
Expand Down Expand Up @@ -644,6 +650,9 @@ 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('--install-swift-testing-macros',
dest='install_swift_testing_macros'),
EnableOption('--swiftsyntax-verify-generated-files',
dest='swiftsyntax_verify_generated_files'),
EnableOption('--swiftsyntax-enable-rawsyntax-validation',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -662,6 +662,10 @@ def compute_product_pipelines(self):
# Begin the post build-script-impl build phase.
builder.begin_pipeline()

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.SwiftPM,
is_enabled=self.args.build_swiftpm)
builder.add_product(products.SwiftSyntax,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@
from .sourcekitlsp import SourceKitLSP
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
Expand Down Expand Up @@ -65,6 +67,8 @@
'SwiftInspect',
'SwiftPM',
'SwiftDriver',
'SwiftTesting',
'SwiftTestingMacros',
'EarlySwiftDriver',
'XCTest',
'SwiftSyntax',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
plaftorm.
Expand All @@ -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 = {}

Expand Down Expand Up @@ -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 plaftorm (either Darwin or Linux). Defines
Expand All @@ -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)
Expand Down
Loading