Skip to content

Commit 7746e69

Browse files
authored
[Traits] Integrate traits into module loading (#7689)
# Motivation In my previous PR I landed the APIs for package traits. We now have to take this information into consideration when evaluating the module graph. # Modification This PR implements the various trait features in the module graph loading stage. Including resolving optional dependencies, enabled traits of dependencies, build settings based on traits and passing defines for traits. This PR also contains an exhaustive test fixtures which we can use to check if all trait functionality is working as expected.
1 parent 516ae33 commit 7746e69

File tree

43 files changed

+1284
-86
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1284
-86
lines changed

Fixtures/Traits/Example/Package.swift

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
// swift-tools-version: 999.0.0
2+
3+
@_spi(ExperimentalTraits) import PackageDescription
4+
5+
let package = Package(
6+
name: "TraitsExample",
7+
traits: [
8+
Trait(name: "Package1", isDefault: true),
9+
Trait(name: "Package2", isDefault: true),
10+
Trait(name: "Package3", isDefault: true),
11+
Trait(name: "Package4", isDefault: true),
12+
"Package5",
13+
"Package7",
14+
"Package9",
15+
"Package10",
16+
Trait(name: "BuildCondition1", isDefault: true),
17+
"BuildCondition2",
18+
"BuildCondition3",
19+
],
20+
dependencies: [
21+
.package(
22+
path: "../Package1",
23+
traits: ["Package1Trait1"]
24+
),
25+
.package(
26+
path: "../Package2",
27+
traits: ["Package2Trait1"]
28+
),
29+
.package(
30+
path: "../Package3"
31+
),
32+
.package(
33+
path: "../Package4",
34+
traits: []
35+
),
36+
.package(
37+
path: "../Package5",
38+
traits: ["Package5Trait1"]
39+
),
40+
.package(
41+
path: "../Package7"
42+
),
43+
.package(
44+
path: "../Package9"
45+
),
46+
.package(
47+
path: "../Package10",
48+
traits: ["Package10Trait2"]
49+
),
50+
],
51+
targets: [
52+
.executableTarget(
53+
name: "Example",
54+
dependencies: [
55+
.product(
56+
name: "Package1Library1",
57+
package: "Package1",
58+
condition: .when(traits: ["Package1"])
59+
),
60+
.product(
61+
name: "Package2Library1",
62+
package: "Package2",
63+
condition: .when(traits: ["Package2"])
64+
),
65+
.product(
66+
name: "Package3Library1",
67+
package: "Package3",
68+
condition: .when(traits: ["Package3"])
69+
),
70+
.product(
71+
name: "Package4Library1",
72+
package: "Package4",
73+
condition: .when(traits: ["Package4"])
74+
),
75+
.product(
76+
name: "Package5Library1",
77+
package: "Package5",
78+
condition: .when(traits: ["Package5"])
79+
),
80+
.product(
81+
name: "Package7Library1",
82+
package: "Package7",
83+
condition: .when(traits: ["Package7"])
84+
),
85+
.product(
86+
name: "Package9Library1",
87+
package: "Package9",
88+
condition: .when(traits: ["Package9"])
89+
),
90+
.product(
91+
name: "Package10Library1",
92+
package: "Package10",
93+
condition: .when(traits: ["Package10"])
94+
),
95+
],
96+
swiftSettings: [
97+
.define("DEFINE1", .when(traits: ["BuildCondition1"])),
98+
.define("DEFINE2", .when(traits: ["BuildCondition2"])),
99+
.define("DEFINE3", .when(traits: ["BuildCondition3"])),
100+
]
101+
),
102+
]
103+
)
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#if Package1
2+
import Package1Library1
3+
#endif
4+
#if Package2
5+
import Package2Library1
6+
#endif
7+
#if Package3
8+
import Package3Library1
9+
#endif
10+
#if Package4
11+
import Package4Library1
12+
#endif
13+
#if Package5
14+
import Package5Library1
15+
#endif
16+
#if Package7
17+
import Package7Library1
18+
#endif
19+
#if Package9
20+
import Package9Library1
21+
#endif
22+
#if Package10
23+
import Package10Library1
24+
#endif
25+
26+
@main
27+
struct Example {
28+
static func main() {
29+
#if Package1
30+
Package1Library1.hello()
31+
#endif
32+
#if Package2
33+
Package2Library1.hello()
34+
#endif
35+
#if Package3
36+
Package3Library1.hello()
37+
#endif
38+
#if Package4
39+
Package4Library1.hello()
40+
#endif
41+
#if Package5
42+
Package5Library1.hello()
43+
#endif
44+
#if Package7
45+
Package7Library1.hello()
46+
#endif
47+
#if Package9
48+
Package9Library1.hello()
49+
#endif
50+
#if Package10
51+
Package10Library1.hello()
52+
#endif
53+
#if DEFINE1
54+
print("DEFINE1 enabled")
55+
#else
56+
print("DEFINE1 disabled")
57+
#endif
58+
#if DEFINE2
59+
print("DEFINE2 enabled")
60+
#else
61+
print("DEFINE2 disabled")
62+
#endif
63+
#if DEFINE3
64+
print("DEFINE3 enabled")
65+
#else
66+
print("DEFINE3 disabled")
67+
#endif
68+
}
69+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// swift-tools-version: 999.0.0
2+
3+
@_spi(ExperimentalTraits) import PackageDescription
4+
5+
let package = Package(
6+
name: "Package1",
7+
products: [
8+
.library(
9+
name: "Package1Library1",
10+
targets: ["Package1Library1"]
11+
),
12+
],
13+
traits: [
14+
"Package1Trait1"
15+
],
16+
targets: [
17+
.target(
18+
name: "Package1Library1"
19+
),
20+
]
21+
)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
public func hello() {
2+
#if Package1Trait1
3+
print("Package1Library1 trait1 enabled")
4+
#else
5+
print("Package1Library1 trait1 disabled")
6+
#endif
7+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// swift-tools-version: 999.0.0
2+
3+
@_spi(ExperimentalTraits) import PackageDescription
4+
5+
let package = Package(
6+
name: "Package10",
7+
products: [
8+
.library(
9+
name: "Package10Library1",
10+
targets: ["Package10Library1"]
11+
),
12+
],
13+
traits: [
14+
"Package10Trait1",
15+
"Package10Trait2"
16+
],
17+
targets: [
18+
.target(
19+
name: "Package10Library1"
20+
),
21+
]
22+
)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
public func hello() {
2+
#if Package10Trait1
3+
print("Package10Library1 trait1 enabled")
4+
#else
5+
print("Package10Library1 trait1 disabled")
6+
#endif
7+
#if Package10Trait2
8+
print("Package10Library1 trait2 enabled")
9+
#else
10+
print("Package10Library1 trait2 disabled")
11+
#endif
12+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// swift-tools-version: 999.0.0
2+
3+
@_spi(ExperimentalTraits) import PackageDescription
4+
5+
let package = Package(
6+
name: "Package2",
7+
products: [
8+
.library(
9+
name: "Package2Library1",
10+
targets: ["Package2Library1"]
11+
),
12+
],
13+
traits: [
14+
Trait(name: "Package2Trait1", enabledTraits: ["Package2Trait2"]),
15+
"Package2Trait2",
16+
],
17+
targets: [
18+
.target(
19+
name: "Package2Library1"
20+
),
21+
]
22+
)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
public func hello() {
2+
#if Package2Trait2
3+
print("Package2Library1 trait2 enabled")
4+
#else
5+
print("Package2Library1 trait2 disabled")
6+
#endif
7+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// swift-tools-version: 999.0.0
2+
3+
@_spi(ExperimentalTraits) import PackageDescription
4+
5+
let package = Package(
6+
name: "Package3",
7+
products: [
8+
.library(
9+
name: "Package3Library1",
10+
targets: ["Package3Library1"]
11+
),
12+
],
13+
traits: [
14+
Trait(name: "Package3Trait1", enabledTraits: ["Package3Trait2"]),
15+
Trait(name: "Package3Trait2", enabledTraits: ["Package3Trait3"]),
16+
Trait(name: "Package3Trait3", isDefault: true),
17+
],
18+
targets: [
19+
.target(
20+
name: "Package3Library1"
21+
),
22+
]
23+
)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
public func hello() {
2+
#if Package3Trait3
3+
print("Package3Library1 trait3 enabled")
4+
#else
5+
print("Package3Library1 trait3 disabled")
6+
#endif
7+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
// swift-tools-version: 999.0.0
2+
3+
@_spi(ExperimentalTraits) import PackageDescription
4+
5+
let package = Package(
6+
name: "Package4",
7+
products: [
8+
.library(
9+
name: "Package4Library1",
10+
targets: ["Package4Library1"]
11+
),
12+
],
13+
traits: [
14+
Trait(name: "Package4Trait1", isDefault: true),
15+
],
16+
targets: [
17+
.target(
18+
name: "Package4Library1"
19+
),
20+
]
21+
)
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
public func hello() {
2+
#if Package4Trait1
3+
print("Package4Library1 trait1 enabled")
4+
#else
5+
print("Package4Library1 trait1 disabled")
6+
#endif
7+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// swift-tools-version: 999.0.0
2+
3+
@_spi(ExperimentalTraits) import PackageDescription
4+
5+
let package = Package(
6+
name: "Package5",
7+
products: [
8+
.library(
9+
name: "Package5Library1",
10+
targets: ["Package5Library1"]
11+
),
12+
],
13+
traits: [
14+
"Package5Trait1"
15+
],
16+
dependencies: [
17+
.package(
18+
path: "../Package6",
19+
traits: [
20+
Package.Dependency.Trait(name: "Package6Trait1", condition: .when(traits: ["Package5Trait1"]))
21+
]
22+
)
23+
],
24+
targets: [
25+
.target(
26+
name: "Package5Library1",
27+
dependencies: [
28+
.product(
29+
name: "Package6Library1",
30+
package: "Package6"
31+
)
32+
]
33+
),
34+
]
35+
)
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
#if Package5Trait1
2+
import Package6Library1
3+
#endif
4+
5+
public func hello() {
6+
#if Package5Trait1
7+
print("Package5Library1 trait1 enabled")
8+
Package6Library1.hello()
9+
#else
10+
print("Package5Library1 trait1 disabled")
11+
#endif
12+
}

0 commit comments

Comments
 (0)