Skip to content

Commit e1adf20

Browse files
committed
Use availability annotations instead of #if to unify PackageDescription 4.0 and 4.2+
Replace the compile-time conditionals in PackageDescription with availability annotations. This will let us build a single PackageDescription, which will make the build scripts easier (with the goal of being able to build it entirely from the package itself).
1 parent 79152ec commit e1adf20

File tree

7 files changed

+26
-178
lines changed

7 files changed

+26
-178
lines changed

Package.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ let package = Package(
122122
name: "PackageDescription",
123123
swiftSettings: [
124124
.define("PACKAGE_DESCRIPTION_4_2"),
125+
.unsafeFlags(["-package-description-version", "5.5"])
125126
]),
126127

127128
.target(

Sources/PackageDescription/LanguageStandardSettings.swift

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,6 @@ public enum CXXLanguageStandard: String, Encodable {
144144
case gnucxx20 = "gnu++20"
145145
}
146146

147-
#if !PACKAGE_DESCRIPTION_4
148147
/// The version of the Swift language to use for compiling Swift sources in the package.
149148
public enum SwiftVersion {
150149
@available(_PackageDescription, introduced: 4, obsoleted: 5)
@@ -187,4 +186,3 @@ extension SwiftVersion: Encodable {
187186
try container.encode(value)
188187
}
189188
}
190-
#endif

Sources/PackageDescription/PackageDependency.swift

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -147,11 +147,7 @@ extension Package.Dependency {
147147
url: String,
148148
_ range: Range<Version>
149149
) -> Package.Dependency {
150-
#if PACKAGE_DESCRIPTION_4
151150
return .init(name: nil, url: url, requirement: .rangeItem(range))
152-
#else
153-
return .init(name: nil, url: url, requirement: ._rangeItem(range))
154-
#endif
155151
}
156152

157153
/// Adds a package dependency starting with a specific minimum version, up to
@@ -172,11 +168,7 @@ extension Package.Dependency {
172168
url: String,
173169
_ range: Range<Version>
174170
) -> Package.Dependency {
175-
#if PACKAGE_DESCRIPTION_4
176171
return .init(name: name, url: url, requirement: .rangeItem(range))
177-
#else
178-
return .init(name: name, url: url, requirement: ._rangeItem(range))
179-
#endif
180172
}
181173

182174
/// Adds a package dependency starting with a specific minimum version, going
@@ -202,11 +194,7 @@ extension Package.Dependency {
202194
upper.major, upper.minor, upper.patch + 1,
203195
prereleaseIdentifiers: upper.prereleaseIdentifiers,
204196
buildMetadataIdentifiers: upper.buildMetadataIdentifiers)
205-
#if PACKAGE_DESCRIPTION_4
206197
return .init(name: nil, url: url, requirement: .rangeItem(range.lowerBound..<upperBound))
207-
#else
208-
return .init(name: nil, url: url, requirement: ._rangeItem(range.lowerBound..<upperBound))
209-
#endif
210198
}
211199

212200
/// Adds a package dependency starting with a specific minimum version, going
@@ -233,14 +221,9 @@ extension Package.Dependency {
233221
upper.major, upper.minor, upper.patch + 1,
234222
prereleaseIdentifiers: upper.prereleaseIdentifiers,
235223
buildMetadataIdentifiers: upper.buildMetadataIdentifiers)
236-
#if PACKAGE_DESCRIPTION_4
237224
return .init(name: name, url: url, requirement: .rangeItem(range.lowerBound..<upperBound))
238-
#else
239-
return .init(name: name, url: url, requirement: ._rangeItem(range.lowerBound..<upperBound))
240-
#endif
241225
}
242226

243-
#if !PACKAGE_DESCRIPTION_4
244227
/// Adds a package dependency to a local package on the filesystem.
245228
///
246229
/// The Swift Package Manager uses the package dependency as-is
@@ -253,7 +236,7 @@ extension Package.Dependency {
253236
public static func package(
254237
path: String
255238
) -> Package.Dependency {
256-
return .init(name: nil, url: path, requirement: ._localPackageItem)
239+
return .init(name: nil, url: path, requirement: .localPackageItem)
257240
}
258241

259242
/// Adds a package dependency to a local package on the filesystem.
@@ -271,9 +254,8 @@ extension Package.Dependency {
271254
name: String? = nil,
272255
path: String
273256
) -> Package.Dependency {
274-
return .init(name: name, url: path, requirement: ._localPackageItem)
257+
return .init(name: name, url: path, requirement: .localPackageItem)
275258
}
276-
#endif
277259
}
278260

279261
// Mark common APIs used by mistake as unavailable to provide better error messages.

Sources/PackageDescription/PackageDescription.swift

Lines changed: 11 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -122,26 +122,14 @@ public final class Package {
122122
/// dependency requirements; you should remove commit-based dependency
123123
/// requirements before publishing a version of your package.
124124
public enum Requirement {
125-
#if PACKAGE_DESCRIPTION_4
126125
case exactItem(Version)
127126
case rangeItem(Range<Version>)
128127
case revisionItem(String)
129128
case branchItem(String)
130129
case localPackageItem
131-
#else
132-
case _exactItem(Version)
133-
case _rangeItem(Range<Version>)
134-
case _revisionItem(String)
135-
case _branchItem(String)
136-
case _localPackageItem
137-
#endif
138130

139131
var isLocalPackage: Bool {
140-
#if PACKAGE_DESCRIPTION_4
141132
if case .localPackageItem = self { return true }
142-
#else
143-
if case ._localPackageItem = self { return true }
144-
#endif
145133
return false
146134
}
147135
}
@@ -167,14 +155,12 @@ public final class Package {
167155
/// The name of the Swift package.
168156
public var name: String
169157

170-
#if !PACKAGE_DESCRIPTION_4
171158
/// The list of supported platforms with a custom deployment target.
172159
@available(_PackageDescription, introduced: 5)
173160
public var platforms: [SupportedPlatform]? {
174161
get { return _platforms }
175162
set { _platforms = newValue }
176163
}
177-
#endif
178164
private var _platforms: [SupportedPlatform]?
179165

180166
/// The default localization for resources.
@@ -203,27 +189,21 @@ public final class Package {
203189
/// The list of package dependencies.
204190
public var dependencies: [Dependency]
205191

206-
#if PACKAGE_DESCRIPTION_4
207-
/// The list of Swift versions that this package is compatible with.
208-
public var swiftLanguageVersions: [Int]?
209-
#else
210192
/// The list of Swift versions that this package is compatible with.
211193
public var swiftLanguageVersions: [SwiftVersion]?
212-
#endif
213194

214195
/// The C language standard to use for all C targets in this package.
215196
public var cLanguageStandard: CLanguageStandard?
216197

217198
/// The C++ language standard to use for all C++ targets in this package.
218199
public var cxxLanguageStandard: CXXLanguageStandard?
219200

220-
#if PACKAGE_DESCRIPTION_4
221201
/// Initializes a Swift package with configuration options you provide.
222202
///
223203
/// - Parameters:
224204
/// - name: The name of the Swift package, or `nil`, if you want the Swift Package Manager to deduce the
225205
/// name from the package’s Git URL.
226-
/// - pkgConfig: The name to use for C modules. If present, the Swift
206+
/// - pkgConfig: The name to use for C modules. If present, the Swift
227207
/// Package Manager searches for a `<name>.pc` file to get the
228208
/// additional flags required for a system target.
229209
/// - providers: The package providers for a system package.
@@ -233,6 +213,7 @@ public final class Package {
233213
/// - swiftLanguageVersions: The list of Swift versions that this package is compatible with.
234214
/// - cLanguageStandard: The C language standard to use for all C targets in this package.
235215
/// - cxxLanguageStandard: The C++ language standard to use for all C++ targets in this package.
216+
@available(_PackageDescription, obsoleted: 4.2)
236217
public init(
237218
name: String,
238219
pkgConfig: String? = nil,
@@ -250,12 +231,12 @@ public final class Package {
250231
self.products = products
251232
self.dependencies = dependencies
252233
self.targets = targets
253-
self.swiftLanguageVersions = swiftLanguageVersions
234+
self.swiftLanguageVersions = swiftLanguageVersions.map{ $0.map{ .version("\($0)") } }
254235
self.cLanguageStandard = cLanguageStandard
255236
self.cxxLanguageStandard = cxxLanguageStandard
256237
registerExitHandler()
257238
}
258-
#else
239+
259240
/// Initializes a Swift package with configuration options you provide.
260241
///
261242
/// - Parameters:
@@ -378,7 +359,6 @@ public final class Package {
378359
self.cxxLanguageStandard = cxxLanguageStandard
379360
registerExitHandler()
380361
}
381-
#endif
382362

383363
private func registerExitHandler() {
384364
// Add a custom exit handler to cause the package's JSON representation
@@ -457,26 +437,18 @@ extension LanguageTag: CustomStringConvertible {
457437
/// The system package providers used in this Swift package.
458438
public enum SystemPackageProvider {
459439

460-
#if PACKAGE_DESCRIPTION_4
461440
case brewItem([String])
462441
case aptItem([String])
463-
#else
464-
case _brewItem([String])
465-
case _aptItem([String])
466-
case _yumItem([String])
467-
#endif
442+
@available(_PackageDescription, introduced: 5.3)
443+
case yumItem([String])
468444

469445
/// Creates a system package provider with a list of installable packages
470446
/// for users of the HomeBrew package manager on macOS.
471447
///
472448
/// - Parameters:
473449
/// - packages: The list of package names.
474450
public static func brew(_ packages: [String]) -> SystemPackageProvider {
475-
#if PACKAGE_DESCRIPTION_4
476451
return .brewItem(packages)
477-
#else
478-
return ._brewItem(packages)
479-
#endif
480452
}
481453

482454
/// Creates a system package provider with a list of installable packages
@@ -485,26 +457,18 @@ public enum SystemPackageProvider {
485457
/// - Parameters:
486458
/// - packages: The list of package names.
487459
public static func apt(_ packages: [String]) -> SystemPackageProvider {
488-
#if PACKAGE_DESCRIPTION_4
489460
return .aptItem(packages)
490-
#else
491-
return ._aptItem(packages)
492-
#endif
493461
}
494462

495-
#if PACKAGE_DESCRIPTION_4
496-
// yum is not supported
497-
#else
498463
/// Creates a system package provider with a list of installable packages
499464
/// for users of the yum package manager on Red Hat Enterprise Linux or CentOS.
500465
///
501466
/// - Parameters:
502467
/// - packages: The list of package names.
503468
@available(_PackageDescription, introduced: 5.3)
504469
public static func yum(_ packages: [String]) -> SystemPackageProvider {
505-
return ._yumItem(packages)
470+
return .yumItem(packages)
506471
}
507-
#endif
508472
}
509473

510474
// MARK: Package JSON serialization
@@ -528,26 +492,19 @@ extension Package: Encodable {
528492
var container = encoder.container(keyedBy: CodingKeys.self)
529493
try container.encode(name, forKey: .name)
530494

531-
#if !PACKAGE_DESCRIPTION_4
532495
if let defaultLocalization = _defaultLocalization {
533496
try container.encode(defaultLocalization.tag, forKey: .defaultLocalization)
534497
}
535498
if let platforms = self._platforms {
536499
try container.encode(platforms, forKey: .platforms)
537500
}
538-
#endif
539501

540502
try container.encode(pkgConfig, forKey: .pkgConfig)
541503
try container.encode(providers, forKey: .providers)
542504
try container.encode(products, forKey: .products)
543505
try container.encode(dependencies, forKey: .dependencies)
544506
try container.encode(targets, forKey: .targets)
545-
#if PACKAGE_DESCRIPTION_4
546-
let slv = swiftLanguageVersions?.map({ String($0) })
547-
try container.encode(slv, forKey: .swiftLanguageVersions)
548-
#else
549507
try container.encode(swiftLanguageVersions, forKey: .swiftLanguageVersions)
550-
#endif
551508
try container.encode(cLanguageStandard, forKey: .cLanguageStandard)
552509
try container.encode(cxxLanguageStandard, forKey: .cxxLanguageStandard)
553510
}
@@ -567,28 +524,17 @@ extension SystemPackageProvider: Encodable {
567524

568525
public func encode(to encoder: Encoder) throws {
569526
var container = encoder.container(keyedBy: CodingKeys.self)
570-
#if PACKAGE_DESCRIPTION_4
571527
switch self {
572528
case .brewItem(let packages):
573529
try container.encode(Name.brew, forKey: .name)
574530
try container.encode(packages, forKey: .values)
575531
case .aptItem(let packages):
576532
try container.encode(Name.apt, forKey: .name)
577533
try container.encode(packages, forKey: .values)
578-
}
579-
#else
580-
switch self {
581-
case ._brewItem(let packages):
582-
try container.encode(Name.brew, forKey: .name)
583-
try container.encode(packages, forKey: .values)
584-
case ._aptItem(let packages):
585-
try container.encode(Name.apt, forKey: .name)
586-
try container.encode(packages, forKey: .values)
587-
case ._yumItem(let packages):
534+
case .yumItem(let packages):
588535
try container.encode(Name.yum, forKey: .name)
589536
try container.encode(packages, forKey: .values)
590537
}
591-
#endif
592538
}
593539
}
594540

@@ -626,36 +572,21 @@ extension Target.Dependency: Encodable {
626572

627573
public func encode(to encoder: Encoder) throws {
628574
var container = encoder.container(keyedBy: CodingKeys.self)
629-
#if PACKAGE_DESCRIPTION_4
630-
switch self {
631-
case .targetItem(let name):
632-
try container.encode(Kind.target, forKey: .type)
633-
try container.encode(name, forKey: .name)
634-
case .productItem(let name, let package):
635-
try container.encode(Kind.product, forKey: .type)
636-
try container.encode(name, forKey: .name)
637-
try container.encode(package, forKey: .package)
638-
case .byNameItem(let name):
639-
try container.encode(Kind.byName, forKey: .type)
640-
try container.encode(name, forKey: .name)
641-
}
642-
#else
643575
switch self {
644-
case ._targetItem(let name, let condition):
576+
case .targetItem(let name, let condition):
645577
try container.encode(Kind.target, forKey: .type)
646578
try container.encode(name, forKey: .name)
647579
try container.encode(condition, forKey: .condition)
648-
case ._productItem(let name, let package, let condition):
580+
case .productItem(let name, let package, let condition):
649581
try container.encode(Kind.product, forKey: .type)
650582
try container.encode(name, forKey: .name)
651583
try container.encode(package, forKey: .package)
652584
try container.encode(condition, forKey: .condition)
653-
case ._byNameItem(let name, let condition):
585+
case .byNameItem(let name, let condition):
654586
try container.encode(Kind.byName, forKey: .type)
655587
try container.encode(name, forKey: .name)
656588
try container.encode(condition, forKey: .condition)
657589
}
658-
#endif
659590
}
660591
}
661592

0 commit comments

Comments
 (0)