Skip to content

Commit e16b997

Browse files
authored
[Traits] Package trait description and serialization (#7669)
### Motivation: This PR is the first one to land the package traits feature in SwiftPM. It focuses on the new public APIs and serialization of them. ### Modifications: This PR contains: - The `PackageDescription` APIs used to define traits, optional dependencies based on traits and build settings based on traits; - The serialization logic to encode the trait specific changes in the package description; - The deserialization logic to decode the trait specific changes into the `PackageModel`; - Validation logic for traits; - Tests for all of the above. I gated the new APIs behind both the `999` availability and an `@_spi(ExperimentalTraits)` to allow us to land this on `main` before the proposal is accepted. ### Result: We can now define a package with traits 🚀
1 parent 4b9f96f commit e16b997

29 files changed

+1595
-139
lines changed

Sources/Commands/PackageCommands/AddDependency.swift

+2-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,8 @@ extension SwiftPackageCommand {
136136
nameForTargetDependencyResolutionOnly: nil,
137137
location: location,
138138
requirement: requirement,
139-
productFilter: .everything
139+
productFilter: .everything,
140+
traits: []
140141
)
141142

142143
let editResult = try AddPackageDependency.addPackageDependency(

Sources/PackageDescription/BuildSettings.swift

+25-5
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,13 @@ public struct BuildSettingCondition: Sendable {
5959
let platforms: [Platform]?
6060
/// The applicable build configuration for this build setting condition.
6161
let config: BuildConfiguration?
62+
/// The applicable traits for this build setting condition.
63+
let traits: Set<String>?
6264

63-
private init(platforms: [Platform]?, config: BuildConfiguration?) {
65+
private init(platforms: [Platform]?, config: BuildConfiguration?, traits: Set<String>?) {
6466
self.platforms = platforms
6567
self.config = config
68+
self.traits = traits
6669
}
6770

6871
@available(_PackageDescription, deprecated: 5.7)
@@ -71,7 +74,24 @@ public struct BuildSettingCondition: Sendable {
7174
configuration: BuildConfiguration? = nil
7275
) -> BuildSettingCondition {
7376
precondition(!(platforms == nil && configuration == nil))
74-
return BuildSettingCondition(platforms: platforms, config: configuration)
77+
return BuildSettingCondition(platforms: platforms, config: configuration, traits: nil)
78+
}
79+
80+
/// Creates a build setting condition.
81+
///
82+
/// - Parameters:
83+
/// - platforms: The applicable platforms for this build setting condition.
84+
/// - configuration: The applicable build configuration for this build setting condition.
85+
/// - traits: The applicable traits for this build setting condition.
86+
@_spi(ExperimentalTraits)
87+
@available(_PackageDescription, introduced: 999.0)
88+
public static func when(
89+
platforms: [Platform]? = nil,
90+
configuration: BuildConfiguration? = nil,
91+
traits: Set<String>? = nil
92+
) -> BuildSettingCondition {
93+
precondition(!(platforms == nil && configuration == nil && traits == nil))
94+
return BuildSettingCondition(platforms: platforms, config: configuration, traits: traits)
7595
}
7696

7797
/// Creates a build setting condition.
@@ -81,23 +101,23 @@ public struct BuildSettingCondition: Sendable {
81101
/// - configuration: The applicable build configuration for this build setting condition.
82102
@available(_PackageDescription, introduced: 5.7)
83103
public static func when(platforms: [Platform], configuration: BuildConfiguration) -> BuildSettingCondition {
84-
BuildSettingCondition(platforms: platforms, config: configuration)
104+
BuildSettingCondition(platforms: platforms, config: configuration, traits: nil)
85105
}
86106

87107
/// Creates a build setting condition.
88108
///
89109
/// - Parameter platforms: The applicable platforms for this build setting condition.
90110
@available(_PackageDescription, introduced: 5.7)
91111
public static func when(platforms: [Platform]) -> BuildSettingCondition {
92-
BuildSettingCondition(platforms: platforms, config: .none)
112+
BuildSettingCondition(platforms: platforms, config: .none, traits: nil)
93113
}
94114

95115
/// Creates a build setting condition.
96116
///
97117
/// - Parameter configuration: The applicable build configuration for this build setting condition.
98118
@available(_PackageDescription, introduced: 5.7)
99119
public static func when(configuration: BuildConfiguration) -> BuildSettingCondition {
100-
BuildSettingCondition(platforms: .none, config: configuration)
120+
BuildSettingCondition(platforms: .none, config: configuration, traits: nil)
101121
}
102122
}
103123

Sources/PackageDescription/CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,13 @@ add_library(PackageDescription
1515
PackageDescriptionSerialization.swift
1616
PackageDescriptionSerializationConversion.swift
1717
PackageDependency.swift
18+
PackageDependencyTrait.swift
1819
PackageRequirement.swift
1920
Product.swift
2021
Resource.swift
2122
SupportedPlatforms.swift
2223
Target.swift
24+
Trait.swift
2325
Version.swift
2426
Version+StringLiteralConvertible.swift)
2527

0 commit comments

Comments
 (0)