diff --git a/Sources/PackageDescription/Target.swift b/Sources/PackageDescription/Target.swift index 3fd66f27622..29eba1aa7d2 100644 --- a/Sources/PackageDescription/Target.swift +++ b/Sources/PackageDescription/Target.swift @@ -37,9 +37,9 @@ public final class Target { case productItem(name: String, package: String?) case byNameItem(name: String) #else - case _targetItem(name: String, condition: BuildSettingCondition?) - case _productItem(name: String, package: String?, condition: BuildSettingCondition?) - case _byNameItem(name: String, condition: BuildSettingCondition?) + case _targetItem(name: String, condition: TargetDependencyCondition?) + case _productItem(name: String, package: String?, condition: TargetDependencyCondition?) + case _byNameItem(name: String, condition: TargetDependencyCondition?) #endif } @@ -656,7 +656,7 @@ extension Target.Dependency { /// - name: The name of the target. /// - condition: The condition under which the dependency is exercised. @available(_PackageDescription, introduced: 999) - public static func target(name: String, condition: BuildSettingCondition? = nil) -> Target.Dependency { + public static func target(name: String, condition: TargetDependencyCondition? = nil) -> Target.Dependency { return ._targetItem(name: name, condition: condition) } @@ -670,7 +670,7 @@ extension Target.Dependency { public static func product( name: String, package: String, - condition: BuildSettingCondition? = nil + condition: TargetDependencyCondition? = nil ) -> Target.Dependency { return ._productItem(name: name, package: package, condition: condition) } @@ -682,7 +682,7 @@ extension Target.Dependency { /// - name: The name of the dependency, either a target or a product. /// - condition: The condition under which the dependency is exercised. @available(_PackageDescription, introduced: 999) - public static func byName(name: String, condition: BuildSettingCondition? = nil) -> Target.Dependency { + public static func byName(name: String, condition: TargetDependencyCondition? = nil) -> Target.Dependency { return ._byNameItem(name: name, condition: condition) } #endif @@ -704,3 +704,25 @@ extension Target.Dependency: ExpressibleByStringLiteral { #endif } } + +/// A condition that limits the application of a target's dependency. +public struct TargetDependencyCondition: Encodable { + + private let platforms: [Platform]? + + private init(platforms: [Platform]?) { + self.platforms = platforms + } + + /// Create a target dependency condition. + /// + /// - Parameters: + /// - platforms: The applicable platforms for this target dependency condition. + public static func when( + platforms: [Platform]? = nil + ) -> TargetDependencyCondition { + // FIXME: This should be an error, not a precondition. + precondition(!(platforms == nil)) + return TargetDependencyCondition(platforms: platforms) + } +} diff --git a/Tests/PackageLoadingTests/PDNextLoadingTests.swift b/Tests/PackageLoadingTests/PDNextLoadingTests.swift index fae904c8a47..496265021eb 100644 --- a/Tests/PackageLoadingTests/PDNextLoadingTests.swift +++ b/Tests/PackageLoadingTests/PDNextLoadingTests.swift @@ -303,8 +303,8 @@ class PackageDescriptionNextLoadingTests: PackageDescriptionLoadingTests { .target(name: "Foo", dependencies: [ .target(name: "Biz"), .target(name: "Bar", condition: .when(platforms: [.linux])), - .product(name: "Baz", package: "Baz", condition: .when(configuration: .release)), - .byName(name: "Bar", condition: .when(platforms: [.watchOS, .iOS], configuration: .debug)), + .product(name: "Baz", package: "Baz", condition: .when(platforms: [.macOS])), + .byName(name: "Bar", condition: .when(platforms: [.watchOS, .iOS])), ]), .target(name: "Bar"), .target(name: "Biz"), @@ -317,8 +317,8 @@ class PackageDescriptionNextLoadingTests: PackageDescriptionLoadingTests { XCTAssertEqual(dependencies[0], .target(name: "Biz")) XCTAssertEqual(dependencies[1], .target(name: "Bar", condition: .init(platformNames: ["linux"], config: nil))) - XCTAssertEqual(dependencies[2], .product(name: "Baz", package: "Baz", condition: .init(platformNames: [], config: "release"))) - XCTAssertEqual(dependencies[3], .byName(name: "Bar", condition: .init(platformNames: ["watchos", "ios"], config: "debug"))) + XCTAssertEqual(dependencies[2], .product(name: "Baz", package: "Baz", condition: .init(platformNames: ["macos"]))) + XCTAssertEqual(dependencies[3], .byName(name: "Bar", condition: .init(platformNames: ["watchos", "ios"]))) } } }