Skip to content

Commit 920574c

Browse files
committed
Drop unknown platforms when generating PIF
1 parent d7465ef commit 920574c

File tree

7 files changed

+56
-14
lines changed

7 files changed

+56
-14
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// swift-tools-version: 6.2
2+
3+
import PackageDescription
4+
5+
let package = Package(
6+
name: "UnknownPlatforms",
7+
targets: [
8+
.executableTarget(
9+
name: "UnknownPlatforms",
10+
swiftSettings: [
11+
.define("FOO", .when(platforms: [.custom("DoesNotExist")])),
12+
.define("BAR", .when(platforms: [.linux])),
13+
.define("BAZ", .when(platforms: [.macOS])),
14+
],
15+
),
16+
]
17+
)
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// The Swift Programming Language
2+
// https://docs.swift.org/swift-book
3+
4+
@main
5+
struct UnknownPlatforms {
6+
static func main() {
7+
print("Hello, world!")
8+
}
9+
}

Sources/SwiftBuildSupport/PackagePIFBuilder+Helpers.swift

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ extension Sequence<PackageModel.PackageCondition> {
234234
}
235235

236236
var pifPlatformsForCondition: [ProjectModel.BuildSettings.Platform] = platforms
237-
.map { ProjectModel.BuildSettings.Platform(from: $0) }
237+
.compactMap { try? ProjectModel.BuildSettings.Platform(from: $0) }
238238

239239
// Treat catalyst like macOS for backwards compatibility with older tools versions.
240240
if pifPlatformsForCondition.contains(.macOS), toolsVersion < ToolsVersion.v5_5 {
@@ -537,7 +537,7 @@ extension PackageGraph.ResolvedModule {
537537
/// Collect the build settings defined in the package manifest.
538538
/// Some of them apply *only* to the target itself, while others are also imparted to clients.
539539
/// Note that the platform is *optional*; unconditional settings have no platform condition.
540-
var allBuildSettings: AllBuildSettings {
540+
func computeAllBuildSettings(observabilityScope: ObservabilityScope) -> AllBuildSettings {
541541
var allSettings = AllBuildSettings()
542542

543543
for (declaration, settingsAssigments) in self.underlying.buildSettings.assignments {
@@ -565,7 +565,16 @@ extension PackageGraph.ResolvedModule {
565565
let (platforms, configurations, _) = settingAssignment.conditions.splitIntoConcreteConditions
566566

567567
for platform in platforms {
568-
let pifPlatform = platform.map { ProjectModel.BuildSettings.Platform(from: $0) }
568+
let pifPlatform: ProjectModel.BuildSettings.Platform?
569+
if let platform {
570+
guard let computedPifPlatform = try? ProjectModel.BuildSettings.Platform(from: platform) else {
571+
observabilityScope.logPIF(.warning, "Ignoring settings assignments for unknown platform '\(platform.name)'")
572+
continue
573+
}
574+
pifPlatform = computedPifPlatform
575+
} else {
576+
pifPlatform = nil
577+
}
569578

570579
if pifDeclaration == .OTHER_LDFLAGS {
571580
var settingsByDeclaration: [ProjectModel.BuildSettings.Declaration: [String]]
@@ -962,7 +971,11 @@ extension ProjectModel.BuildSettings.MultipleValueSetting {
962971
}
963972

964973
extension ProjectModel.BuildSettings.Platform {
965-
init(from platform: PackageModel.Platform) {
974+
enum Error: Swift.Error {
975+
case unknownPlatform(String)
976+
}
977+
978+
init(from platform: PackageModel.Platform) throws {
966979
self = switch platform {
967980
case .macOS: .macOS
968981
case .macCatalyst: .macCatalyst
@@ -977,7 +990,7 @@ extension ProjectModel.BuildSettings.Platform {
977990
case .wasi: .wasi
978991
case .openbsd: .openbsd
979992
case .freebsd: .freebsd
980-
default: preconditionFailure("Unexpected platform: \(platform.name)")
993+
default: throw Error.unknownPlatform(platform.name)
981994
}
982995
}
983996
}

Sources/SwiftBuildSupport/PackagePIFBuilder.swift

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,10 @@ public final class PackagePIFBuilder {
562562
self.delegate.configureProjectBuildSettings(&settings)
563563

564564
for (platform, platformOptions) in self.package.sdkOptions(delegate: self.delegate) {
565-
let pifPlatform = ProjectModel.BuildSettings.Platform(from: platform)
565+
guard let pifPlatform = try? ProjectModel.BuildSettings.Platform(from: platform) else {
566+
log(.warning, "Ignoring options '\(platformOptions.joined(separator: " "))' specified for unknown platform \(platform.name)")
567+
continue
568+
}
566569
settings.platformSpecificSettings[pifPlatform]![.SPECIALIZATION_SDK_OPTIONS]!
567570
.append(contentsOf: platformOptions)
568571
}
@@ -584,11 +587,11 @@ public final class PackagePIFBuilder {
584587
let arm64ePlatforms: [PackageModel.Platform] = [.iOS, .macOS, .visionOS]
585588
for arm64ePlatform in arm64ePlatforms {
586589
if self.delegate.shouldPackagesBuildForARM64e(platform: arm64ePlatform) {
587-
let pifPlatform: ProjectModel.BuildSettings.Platform = switch arm64ePlatform {
588-
case .iOS:
589-
._iOSDevice
590-
default:
591-
.init(from: arm64ePlatform)
590+
let pifPlatform: ProjectModel.BuildSettings.Platform
591+
do {
592+
pifPlatform = try .init(from: arm64ePlatform)
593+
} catch {
594+
preconditionFailure("Unhandled arm64e platform: \(error)")
592595
}
593596
settings.platformSpecificSettings[pifPlatform]![.ARCHS, default: []].append(contentsOf: ["arm64e"])
594597
}

Sources/SwiftBuildSupport/PackagePIFProjectBuilder+Modules.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -738,7 +738,7 @@ extension PackagePIFProjectBuilder {
738738
var debugSettings = settings
739739
var releaseSettings = settings
740740

741-
let allBuildSettings = sourceModule.allBuildSettings
741+
let allBuildSettings = sourceModule.computeAllBuildSettings(observabilityScope: pifBuilder.observabilityScope)
742742

743743
// Apply target-specific build settings defined in the manifest.
744744
for (buildConfig, declarationsByPlatform) in allBuildSettings.targetSettings {
@@ -756,7 +756,7 @@ extension PackagePIFProjectBuilder {
756756
}
757757

758758
// Impart the linker flags.
759-
for (platform, settingsByDeclaration) in sourceModule.allBuildSettings.impartedSettings {
759+
for (platform, settingsByDeclaration) in sourceModule.computeAllBuildSettings(observabilityScope: pifBuilder.observabilityScope).impartedSettings {
760760
// Note: A `nil` platform means that the declaration applies to *all* platforms.
761761
for (declaration, stringValues) in settingsByDeclaration {
762762
impartedSettings.append(values: stringValues, to: declaration, platform: platform)

Sources/SwiftBuildSupport/PackagePIFProjectBuilder+Products.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ extension PackagePIFProjectBuilder {
470470
var releaseSettings: ProjectModel.BuildSettings = settings
471471

472472
// Apply target-specific build settings defined in the manifest.
473-
for (buildConfig, declarationsByPlatform) in mainModule.allBuildSettings.targetSettings {
473+
for (buildConfig, declarationsByPlatform) in mainModule.computeAllBuildSettings(observabilityScope: pifBuilder.observabilityScope).targetSettings {
474474
for (platform, declarations) in declarationsByPlatform {
475475
// A `nil` platform means that the declaration applies to *all* platforms.
476476
for (declaration, stringValues) in declarations {

Tests/SwiftBuildSupportTests/PIFBuilderTests.swift

Whitespace-only changes.

0 commit comments

Comments
 (0)