Skip to content

Commit 10c7cd1

Browse files
committed
Make change conditional on --experimental-macros-cross-compilation
1 parent 47dd496 commit 10c7cd1

24 files changed

+218
-65
lines changed

Sources/Build/BuildPlan/BuildPlan+Test.swift

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,9 @@ extension BuildPlan {
9191
dependencies: testProduct.targets.map { .target($0, conditions: []) },
9292
defaultLocalization: testProduct.defaultLocalization,
9393
supportedPlatforms: testProduct.supportedPlatforms,
94-
platformVersionProvider: testProduct.platformVersionProvider
94+
platformVersionProvider: testProduct.platformVersionProvider,
95+
isExperimentalMacrosCrossCompilationEnabled:
96+
destinationBuildParameters.isExperimentalMacrosCrossCompilationEnabled
9597
)
9698
let discoveryTargetBuildDescription = try SwiftTargetBuildDescription(
9799
package: package,
@@ -132,7 +134,9 @@ extension BuildPlan {
132134
dependencies: testProduct.targets.map { .target($0, conditions: []) } + resolvedTargetDependencies,
133135
defaultLocalization: testProduct.defaultLocalization,
134136
supportedPlatforms: testProduct.supportedPlatforms,
135-
platformVersionProvider: testProduct.platformVersionProvider
137+
platformVersionProvider: testProduct.platformVersionProvider,
138+
isExperimentalMacrosCrossCompilationEnabled:
139+
destinationBuildParameters.isExperimentalMacrosCrossCompilationEnabled
136140
)
137141
return try SwiftTargetBuildDescription(
138142
package: package,
@@ -178,7 +182,9 @@ extension BuildPlan {
178182
dependencies: entryPointResolvedTarget.dependencies + resolvedTargetDependencies,
179183
defaultLocalization: testProduct.defaultLocalization,
180184
supportedPlatforms: testProduct.supportedPlatforms,
181-
platformVersionProvider: testProduct.platformVersionProvider
185+
platformVersionProvider: testProduct.platformVersionProvider,
186+
isExperimentalMacrosCrossCompilationEnabled:
187+
destinationBuildParameters.isExperimentalMacrosCrossCompilationEnabled
182188
)
183189
let entryPointTargetBuildDescription = try SwiftTargetBuildDescription(
184190
package: package,

Sources/CoreCommands/Options.swift

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,10 @@ package struct BuildOptions: ParsableArguments {
446446
@Flag(name: .customLong("experimental-explicit-module-build"))
447447
package var useExplicitModuleBuild: Bool = false
448448

449+
/// Whether to use the explicit module build flow (with the integrated driver)
450+
@Flag(name: .customLong("experimental-macros-cross-compilation"), help: .hidden)
451+
package var isExperimentalMacrosCrossCompilationEnabled: Bool = false
452+
449453
/// The build system to use.
450454
@Option(name: .customLong("build-system"))
451455
var _buildSystem: BuildSystemProvider.Kind = .native

Sources/CoreCommands/SwiftCommandState.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -608,6 +608,8 @@ package final class SwiftCommandState {
608608
forceResolvedVersions: options.resolver.forceResolvedVersions,
609609
testEntryPointPath: testEntryPointPath,
610610
availableLibraries: self.getHostToolchain().providedLibraries,
611+
isExperimentalMacrosCrossCompilationEnabled:
612+
self.productsBuildParameters.isExperimentalMacrosCrossCompilationEnabled,
611613
observabilityScope: self.observabilityScope
612614
)
613615

@@ -743,6 +745,7 @@ package final class SwiftCommandState {
743745
workers: options.build.jobs ?? UInt32(ProcessInfo.processInfo.activeProcessorCount),
744746
sanitizers: options.build.enabledSanitizers,
745747
indexStoreMode: options.build.indexStoreMode.buildParameter,
748+
isExperimentalMacrosCrossCompilationEnabled: self.options.build.isExperimentalMacrosCrossCompilationEnabled,
746749
isXcodeBuildSystemEnabled: options.build.buildSystem == .xcode,
747750
debuggingParameters: .init(
748751
debugInfoFormat: options.build.debugInfoFormat.buildParameter,

Sources/PackageGraph/ModulesGraph+Loading.swift

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ extension ModulesGraph {
3333
customXCTestMinimumDeploymentTargets: [PackageModel.Platform: PlatformVersion]? = .none,
3434
testEntryPointPath: AbsolutePath? = nil,
3535
availableLibraries: [LibraryMetadata],
36+
isExperimentalMacrosCrossCompilationEnabled: Bool,
3637
fileSystem: FileSystem,
3738
observabilityScope: ObservabilityScope
3839
) throws -> ModulesGraph {
@@ -146,9 +147,13 @@ extension ModulesGraph {
146147

147148
let platformVersionProvider: PlatformVersionProvider
148149
if let customXCTestMinimumDeploymentTargets {
149-
platformVersionProvider = .init(implementation: .customXCTestMinimumDeploymentTargets(customXCTestMinimumDeploymentTargets))
150+
platformVersionProvider = .init(
151+
implementation: .customXCTestMinimumDeploymentTargets(customXCTestMinimumDeploymentTargets)
152+
)
150153
} else {
151-
platformVersionProvider = .init(implementation: .minimumDeploymentTargetDefault)
154+
platformVersionProvider = .init(
155+
implementation: .minimumDeploymentTargetDefault
156+
)
152157
}
153158

154159
// Resolve dependencies and create resolved packages.
@@ -161,6 +166,7 @@ extension ModulesGraph {
161166
platformRegistry: customPlatformsRegistry ?? .default,
162167
platformVersionProvider: platformVersionProvider,
163168
availableLibraries: availableLibraries,
169+
isExperimentalMacrosCrossCompilationEnabled: isExperimentalMacrosCrossCompilationEnabled,
164170
fileSystem: fileSystem,
165171
observabilityScope: observabilityScope
166172
)
@@ -251,12 +257,13 @@ private func createResolvedPackages(
251257
platformRegistry: PlatformRegistry,
252258
platformVersionProvider: PlatformVersionProvider,
253259
availableLibraries: [LibraryMetadata],
260+
isExperimentalMacrosCrossCompilationEnabled: Bool,
254261
fileSystem: FileSystem,
255262
observabilityScope: ObservabilityScope
256263
) throws -> [ResolvedPackage] {
257264

258265
// Create package builder objects from the input manifests.
259-
let packageBuilders: [ResolvedPackageBuilder] = nodes.compactMap{ node in
266+
let packageBuilders: [ResolvedPackageBuilder] = nodes.compactMap { node in
260267
guard let package = manifestToPackage[node.manifest] else {
261268
return nil
262269
}
@@ -268,7 +275,8 @@ private func createResolvedPackages(
268275
productFilter: node.productFilter,
269276
isAllowedToVendUnsafeProducts: isAllowedToVendUnsafeProducts,
270277
allowedToOverride: allowedToOverride,
271-
platformVersionProvider: platformVersionProvider
278+
platformVersionProvider: platformVersionProvider,
279+
isExperimentalMacrosCrossCompilationEnabled: isExperimentalMacrosCrossCompilationEnabled
272280
)
273281
}
274282

@@ -386,7 +394,8 @@ private func createResolvedPackages(
386394
packageIdentity: package.identity,
387395
target: $0,
388396
observabilityScope: packageObservabilityScope,
389-
platformVersionProvider: platformVersionProvider
397+
platformVersionProvider: platformVersionProvider,
398+
isExperimentalMacrosCrossCompilationEnabled: isExperimentalMacrosCrossCompilationEnabled
390399
)
391400
}
392401
packageBuilder.targets = targetBuilders
@@ -417,7 +426,7 @@ private func createResolvedPackages(
417426
throw InternalError("unknown target \($0)")
418427
}
419428
return target
420-
})
429+
}, isExperimentalMacrosCrossCompilationEnabled: isExperimentalMacrosCrossCompilationEnabled)
421430
}
422431

423432
// add registry metadata if available
@@ -870,17 +879,26 @@ private final class ResolvedProductBuilder: ResolvedBuilder<ResolvedProduct> {
870879
/// The target builders in the product.
871880
let targets: [ResolvedTargetBuilder]
872881

873-
init(product: Product, packageBuilder: ResolvedPackageBuilder, targets: [ResolvedTargetBuilder]) {
882+
let isExperimentalMacrosCrossCompilationEnabled: Bool
883+
884+
init(
885+
product: Product,
886+
packageBuilder: ResolvedPackageBuilder,
887+
targets: [ResolvedTargetBuilder],
888+
isExperimentalMacrosCrossCompilationEnabled: Bool
889+
) {
874890
self.product = product
875891
self.packageBuilder = packageBuilder
876892
self.targets = targets
893+
self.isExperimentalMacrosCrossCompilationEnabled = isExperimentalMacrosCrossCompilationEnabled
877894
}
878895

879896
override func constructImpl() throws -> ResolvedProduct {
880897
return ResolvedProduct(
881898
packageIdentity: packageBuilder.package.identity,
882899
product: product,
883-
targets: IdentifiableSet(try targets.map { try $0.construct() })
900+
targets: IdentifiableSet(try targets.map { try $0.construct() }),
901+
isExperimentalMacrosCrossCompilationEnabled: self.isExperimentalMacrosCrossCompilationEnabled
884902
)
885903
}
886904
}
@@ -914,17 +932,20 @@ private final class ResolvedTargetBuilder: ResolvedBuilder<ResolvedTarget> {
914932

915933
let observabilityScope: ObservabilityScope
916934
let platformVersionProvider: PlatformVersionProvider
935+
let isExperimentalMacrosCrossCompilationEnabled: Bool
917936

918937
init(
919938
packageIdentity: PackageIdentity,
920939
target: Target,
921940
observabilityScope: ObservabilityScope,
922-
platformVersionProvider: PlatformVersionProvider
941+
platformVersionProvider: PlatformVersionProvider,
942+
isExperimentalMacrosCrossCompilationEnabled: Bool
923943
) {
924944
self.packageIdentity = packageIdentity
925945
self.target = target
926946
self.observabilityScope = observabilityScope
927947
self.platformVersionProvider = platformVersionProvider
948+
self.isExperimentalMacrosCrossCompilationEnabled = isExperimentalMacrosCrossCompilationEnabled
928949
}
929950

930951
override func constructImpl() throws -> ResolvedTarget {
@@ -957,7 +978,8 @@ private final class ResolvedTargetBuilder: ResolvedBuilder<ResolvedTarget> {
957978
dependencies: dependencies,
958979
defaultLocalization: self.defaultLocalization,
959980
supportedPlatforms: self.supportedPlatforms,
960-
platformVersionProvider: self.platformVersionProvider
981+
platformVersionProvider: self.platformVersionProvider,
982+
isExperimentalMacrosCrossCompilationEnabled: self.isExperimentalMacrosCrossCompilationEnabled
961983
)
962984
}
963985
}
@@ -1021,19 +1043,22 @@ private final class ResolvedPackageBuilder: ResolvedBuilder<ResolvedPackage> {
10211043
var registryMetadata: RegistryReleaseMetadata?
10221044

10231045
let platformVersionProvider: PlatformVersionProvider
1046+
let isExperimentalMacrosCrossCompilationEnabled: Bool
10241047

10251048
init(
10261049
_ package: Package,
10271050
productFilter: ProductFilter,
10281051
isAllowedToVendUnsafeProducts: Bool,
10291052
allowedToOverride: Bool,
1030-
platformVersionProvider: PlatformVersionProvider
1053+
platformVersionProvider: PlatformVersionProvider,
1054+
isExperimentalMacrosCrossCompilationEnabled: Bool
10311055
) {
10321056
self.package = package
10331057
self.productFilter = productFilter
10341058
self.isAllowedToVendUnsafeProducts = isAllowedToVendUnsafeProducts
10351059
self.allowedToOverride = allowedToOverride
10361060
self.platformVersionProvider = platformVersionProvider
1061+
self.isExperimentalMacrosCrossCompilationEnabled = isExperimentalMacrosCrossCompilationEnabled
10371062
}
10381063

10391064
override func constructImpl() throws -> ResolvedPackage {
@@ -1045,7 +1070,8 @@ private final class ResolvedPackageBuilder: ResolvedBuilder<ResolvedPackage> {
10451070
targets: try self.targets.map{ try $0.construct() },
10461071
products: try self.products.map{ try $0.construct() },
10471072
registryMetadata: self.registryMetadata,
1048-
platformVersionProvider: self.platformVersionProvider
1073+
platformVersionProvider: self.platformVersionProvider,
1074+
isExperimentalMacrosCrossCompilationEnabled: self.isExperimentalMacrosCrossCompilationEnabled
10491075
)
10501076
}
10511077
}

Sources/PackageGraph/Resolution/ResolvedPackage.swift

Lines changed: 35 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -64,46 +64,53 @@ public struct ResolvedPackage {
6464
targets: [ResolvedTarget],
6565
products: [ResolvedProduct],
6666
registryMetadata: RegistryReleaseMetadata?,
67-
platformVersionProvider: PlatformVersionProvider
67+
platformVersionProvider: PlatformVersionProvider,
68+
isExperimentalMacrosCrossCompilationEnabled: Bool
6869
) {
6970
self.underlying = underlying
7071

7172
var processedTargets = OrderedDictionary<ResolvedTarget.ID, ResolvedTarget>(
7273
uniqueKeysWithValues: targets.map { ($0.id, $0) }
7374
)
74-
var processedProducts = [ResolvedProduct]()
75-
// Make sure that direct macro dependencies of test products are also built for the target triple.
76-
// Without this workaround, `assertMacroExpansion` in tests can't be built, as it requires macros
77-
// and SwiftSyntax to be built for the target triple: https://github.com/apple/swift-package-manager/pull/7349
78-
for var product in products {
79-
if product.type == .test {
80-
var targets = IdentifiableSet<ResolvedTarget>()
81-
for var target in product.targets {
82-
var dependencies = [ResolvedTarget.Dependency]()
83-
for dependency in target.dependencies {
84-
switch dependency {
85-
case .target(var target, let conditions) where target.type == .macro:
86-
target.buildTriple = .destination
87-
dependencies.append(.target(target, conditions: conditions))
88-
processedTargets[target.id] = target
89-
case .product(var product, let conditions) where product.type == .macro:
90-
product.buildTriple = .destination
91-
dependencies.append(.product(product, conditions: conditions))
92-
default:
93-
dependencies.append(dependency)
75+
76+
if isExperimentalMacrosCrossCompilationEnabled {
77+
var processedProducts = [ResolvedProduct]()
78+
// Make sure that direct macro dependencies of test products are also built for the target triple.
79+
// Without this workaround, `assertMacroExpansion` in tests can't be built, as it requires macros
80+
// and SwiftSyntax to be built for the target triple: https://github.com/apple/swift-package-manager/pull/7349
81+
for var product in products {
82+
if product.type == .test {
83+
var targets = IdentifiableSet<ResolvedTarget>()
84+
for var target in product.targets {
85+
var dependencies = [ResolvedTarget.Dependency]()
86+
for dependency in target.dependencies {
87+
switch dependency {
88+
case .target(var target, let conditions) where target.type == .macro:
89+
target.buildTriple = .destination
90+
dependencies.append(.target(target, conditions: conditions))
91+
processedTargets[target.id] = target
92+
case .product(var product, let conditions) where product.type == .macro:
93+
product.buildTriple = .destination
94+
dependencies.append(.product(product, conditions: conditions))
95+
default:
96+
dependencies.append(dependency)
97+
}
9498
}
99+
target.dependencies = dependencies
100+
targets.insert(target)
95101
}
96-
target.dependencies = dependencies
97-
targets.insert(target)
102+
product.targets = targets
98103
}
99-
product.targets = targets
104+
105+
processedProducts.append(product)
100106
}
101107

102-
processedProducts.append(product)
108+
self.products = processedProducts
109+
self.targets = Array(processedTargets.values)
110+
} else {
111+
self.products = products
112+
self.targets = targets
103113
}
104-
105-
self.products = processedProducts
106-
self.targets = Array(processedTargets.values)
107114
self.dependencies = dependencies
108115
self.defaultLocalization = defaultLocalization
109116
self.supportedPlatforms = supportedPlatforms

Sources/PackageGraph/Resolution/ResolvedProduct.swift

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,8 @@ public struct ResolvedProduct {
7070
public init(
7171
packageIdentity: PackageIdentity,
7272
product: Product,
73-
targets: IdentifiableSet<ResolvedTarget>
73+
targets: IdentifiableSet<ResolvedTarget>,
74+
isExperimentalMacrosCrossCompilationEnabled: Bool
7475
) {
7576
assert(product.targets.count == targets.count && product.targets.map(\.name).sorted() == targets.map(\.name).sorted())
7677
self.packageIdentity = packageIdentity
@@ -101,12 +102,17 @@ public struct ResolvedProduct {
101102
dependencies: targets.map { .target($0, conditions: []) },
102103
defaultLocalization: defaultLocalization ?? .none, // safe since this is a derived product
103104
supportedPlatforms: platforms,
104-
platformVersionProvider: platformVersionProvider
105+
platformVersionProvider: platformVersionProvider,
106+
isExperimentalMacrosCrossCompilationEnabled: isExperimentalMacrosCrossCompilationEnabled
105107
)
106108
}
107109

108-
self.buildTriple = product.buildTriple
109-
self.updateBuildTriplesOfDependencies()
110+
if isExperimentalMacrosCrossCompilationEnabled {
111+
self.buildTriple = product.buildTriple
112+
self.updateBuildTriplesOfDependencies()
113+
} else {
114+
self.buildTriple = .destination
115+
}
110116
}
111117

112118
private mutating func updateBuildTriplesOfDependencies() {

Sources/PackageGraph/Resolution/ResolvedTarget.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,8 @@ public struct ResolvedTarget {
157157
dependencies: [ResolvedTarget.Dependency],
158158
defaultLocalization: String? = nil,
159159
supportedPlatforms: [SupportedPlatform],
160-
platformVersionProvider: PlatformVersionProvider
160+
platformVersionProvider: PlatformVersionProvider,
161+
isExperimentalMacrosCrossCompilationEnabled: Bool
161162
) {
162163
self.packageIdentity = packageIdentity
163164
self.underlying = underlying
@@ -166,7 +167,10 @@ public struct ResolvedTarget {
166167
self.supportedPlatforms = supportedPlatforms
167168
self.platformVersionProvider = platformVersionProvider
168169
self.buildTriple = underlying.buildTriple
169-
self.updateBuildTriplesOfDependencies()
170+
171+
if isExperimentalMacrosCrossCompilationEnabled {
172+
self.updateBuildTriplesOfDependencies()
173+
}
170174
}
171175

172176
private mutating func updateBuildTriplesOfDependencies() {

0 commit comments

Comments
 (0)