From 2dead3812a485d4da6714710e8820b8a48ce7a19 Mon Sep 17 00:00:00 2001 From: Doug Schaefer Date: Tue, 30 Sep 2025 16:36:39 +0100 Subject: [PATCH] Fix macros that depend on libraries that also depend on swift-syntax Previously the library would be built from source and then link together with the prebuilt to create the macro executable. That causes a crash in the macro. This change extends what we build using the prebuilt to all targets when built for host. It will continue to build from source when targets are built for destination. This will include plugin tools as well. The separation of build output between host and destination (which is potentially a different platform) makes this work. This is accomplished by recording in the BuildEnvironment whether the destination was host and the adding in an internal HostCondition that checks it in it's satisfy method. --- .../PackageGraph/ModulesGraph+Loading.swift | 19 +- .../Resolution/ResolvedModule.swift | 7 +- Sources/PackageLoading/PackageBuilder.swift | 57 +++--- Sources/PackageModel/BuildEnvironment.swift | 4 +- .../PackageConditionDescription.swift | 19 +- .../BuildParameters/BuildParameters.swift | 2 +- .../PackagePIFBuilder+Helpers.swift | 3 + Tests/BuildTests/BuildPlanTests.swift | 24 ++- .../LLBuildManifestBuilderTests.swift | 4 + Tests/BuildTests/PluginInvocationTests.swift | 8 +- .../ProductBuildDescriptionTests.swift | 2 +- Tests/FunctionalTests/PluginTests.swift | 4 +- .../PackageGraphTests/ModulesGraphTests.swift | 20 +- .../PackageBuilderTests.swift | 84 ++++----- .../BuildParametersTests.swift | 2 +- Tests/WorkspaceTests/PrebuiltsTests.swift | 177 +++++++++++------- 16 files changed, 246 insertions(+), 190 deletions(-) diff --git a/Sources/PackageGraph/ModulesGraph+Loading.swift b/Sources/PackageGraph/ModulesGraph+Loading.swift index 2ea14951129..1435795840c 100644 --- a/Sources/PackageGraph/ModulesGraph+Loading.swift +++ b/Sources/PackageGraph/ModulesGraph+Loading.swift @@ -728,23 +728,10 @@ private func createResolvedPackages( moduleBuilder.dependencies += implicitSystemLibraryDeps.map { .module($0, conditions: []) } // Establish product dependencies. - for case .product(let productRef, let conditions) in moduleBuilder.module.dependencies { + for case .product(let productRef, var conditions) in moduleBuilder.module.dependencies { if let package = productRef.package, prebuilts[.plain(package)]?[productRef.name] != nil { - // See if we're using a prebuilt instead - if moduleBuilder.module.type == .macro { - continue - } else if moduleBuilder.module.type == .test { - // use prebuilt if this is a test that depends a macro target - // these are guaranteed built for host - if moduleBuilder.module.dependencies.contains(where: { dep in - guard let module = dep.module else { - return false - } - return module.type == .macro - }) { - continue - } - } + // Only use the dependency if not on host + conditions.append(.host(.init(isHost: false))) } // Find the product in this package's dependency products. diff --git a/Sources/PackageGraph/Resolution/ResolvedModule.swift b/Sources/PackageGraph/Resolution/ResolvedModule.swift index 786a61b7c28..23d89ce3d11 100644 --- a/Sources/PackageGraph/Resolution/ResolvedModule.swift +++ b/Sources/PackageGraph/Resolution/ResolvedModule.swift @@ -288,7 +288,12 @@ extension ResolvedModule: Identifiable { public var targetName: String { self.moduleName } public let moduleName: String - let packageIdentity: PackageIdentity + public let packageIdentity: PackageIdentity + + public init(moduleName: String, packageIdentity: PackageIdentity) { + self.moduleName = moduleName + self.packageIdentity = packageIdentity + } } public var id: ID { diff --git a/Sources/PackageLoading/PackageBuilder.swift b/Sources/PackageLoading/PackageBuilder.swift index 08535c82807..2943ef8bd80 100644 --- a/Sources/PackageLoading/PackageBuilder.swift +++ b/Sources/PackageLoading/PackageBuilder.swift @@ -1407,40 +1407,39 @@ public final class PackageBuilder { table.add(assignment, for: .SWIFT_ACTIVE_COMPILATION_CONDITIONS) } - // Add in flags for prebuilts if the target is a macro or a macro test. - // Currently we only support prebuilts for macros. - if target.type == .macro || target.isMacroTest(in: manifest) { - let prebuiltLibraries: [String: PrebuiltLibrary] = target.dependencies.reduce(into: .init()) { - guard case let .product(name: name, package: package, moduleAliases: _, condition: _) = $1, - let package = package, - let prebuilt = prebuilts[.plain(package)]?[name] - else { - return - } - - $0[prebuilt.libraryName] = prebuilt + // Add in flags for prebuilts on host + let prebuiltLibraries: [String: PrebuiltLibrary] = target.dependencies.reduce(into: .init()) { + guard case let .product(name: name, package: package, moduleAliases: _, condition: _) = $1, + let package = package, + let prebuilt = prebuilts[.plain(package)]?[name] + else { + return } - for prebuilt in prebuiltLibraries.values { - let lib = prebuilt.path.appending(components: ["lib", "lib\(prebuilt.libraryName).a"]).pathString - var ldFlagsAssignment = BuildSettings.Assignment() - ldFlagsAssignment.values = [lib] - table.add(ldFlagsAssignment, for: .OTHER_LDFLAGS) + $0[prebuilt.libraryName] = prebuilt + } - var includeDirs: [AbsolutePath] = [prebuilt.path.appending(component: "Modules")] - if let checkoutPath = prebuilt.checkoutPath, let includePath = prebuilt.includePath { - for includeDir in includePath { - includeDirs.append(checkoutPath.appending(includeDir)) - } - } else { - for cModule in prebuilt.cModules { - includeDirs.append(prebuilt.path.appending(components: "include", cModule)) - } + for prebuilt in prebuiltLibraries.values { + let lib = prebuilt.path.appending(components: ["lib", "lib\(prebuilt.libraryName).a"]).pathString + var ldFlagsAssignment = BuildSettings.Assignment() + ldFlagsAssignment.values = [lib] + ldFlagsAssignment.conditions = [.host(.init(isHost: true))] + table.add(ldFlagsAssignment, for: .OTHER_LDFLAGS) + + var includeDirs: [AbsolutePath] = [prebuilt.path.appending(component: "Modules")] + if let checkoutPath = prebuilt.checkoutPath, let includePath = prebuilt.includePath { + for includeDir in includePath { + includeDirs.append(checkoutPath.appending(includeDir)) + } + } else { + for cModule in prebuilt.cModules { + includeDirs.append(prebuilt.path.appending(components: "include", cModule)) } - var includeAssignment = BuildSettings.Assignment() - includeAssignment.values = includeDirs.map({ "-I\($0.pathString)" }) - table.add(includeAssignment, for: .OTHER_SWIFT_FLAGS) } + var includeAssignment = BuildSettings.Assignment() + includeAssignment.values = includeDirs.map({ "-I\($0.pathString)" }) + includeAssignment.conditions = [.host(.init(isHost: true))] + table.add(includeAssignment, for: .OTHER_SWIFT_FLAGS) } return table diff --git a/Sources/PackageModel/BuildEnvironment.swift b/Sources/PackageModel/BuildEnvironment.swift index d6545c46166..d55c05bdc6f 100644 --- a/Sources/PackageModel/BuildEnvironment.swift +++ b/Sources/PackageModel/BuildEnvironment.swift @@ -13,10 +13,12 @@ /// A build environment with which to evaluate conditions. public struct BuildEnvironment { public let platform: Platform + public let isHost: Bool public let configuration: BuildConfiguration? - public init(platform: Platform, configuration: BuildConfiguration? = nil) { + public init(platform: Platform, isHost: Bool, configuration: BuildConfiguration? = nil) { self.platform = platform self.configuration = configuration + self.isHost = isHost } } diff --git a/Sources/PackageModel/Manifest/PackageConditionDescription.swift b/Sources/PackageModel/Manifest/PackageConditionDescription.swift index b8257bc5650..04930e1dba9 100644 --- a/Sources/PackageModel/Manifest/PackageConditionDescription.swift +++ b/Sources/PackageModel/Manifest/PackageConditionDescription.swift @@ -30,6 +30,7 @@ public enum PackageCondition: Hashable, Sendable { case platforms(PlatformsCondition) case configuration(ConfigurationCondition) case traits(TraitCondition) + case host(HostCondition) public func satisfies(_ environment: BuildEnvironment) -> Bool { switch self { @@ -39,6 +40,8 @@ public enum PackageCondition: Hashable, Sendable { return platforms.satisfies(environment) case .traits(let traits): return traits.satisfies(environment) + case .host(let host): + return host.satisfies(environment) } } @@ -107,9 +110,7 @@ public struct ConfigurationCondition: Hashable, Sendable { } } - -/// A configuration condition implies that an assignment is valid on -/// a particular build configuration. +/// A traits condition implies that an assignment is valid in the given build environment public struct TraitCondition: Hashable, Sendable { public let traits: Set @@ -122,3 +123,15 @@ public struct TraitCondition: Hashable, Sendable { } } +/// A host condition determines whether the build environment is for host +public struct HostCondition: Hashable, Sendable { + public let isHost: Bool + + public init(isHost: Bool) { + self.isHost = isHost + } + + public func satisfies(_ environment: BuildEnvironment) -> Bool { + environment.isHost == isHost + } +} diff --git a/Sources/SPMBuildCore/BuildParameters/BuildParameters.swift b/Sources/SPMBuildCore/BuildParameters/BuildParameters.swift index 6bd5b8804c1..e7ab8fa743c 100644 --- a/Sources/SPMBuildCore/BuildParameters/BuildParameters.swift +++ b/Sources/SPMBuildCore/BuildParameters/BuildParameters.swift @@ -90,7 +90,7 @@ public struct BuildParameters: Encodable { /// The current build environment. public var buildEnvironment: BuildEnvironment { - BuildEnvironment(platform: currentPlatform, configuration: configuration) + BuildEnvironment(platform: currentPlatform, isHost: destination == .host, configuration: configuration) } /// The current platform we're building for. diff --git a/Sources/SwiftBuildSupport/PackagePIFBuilder+Helpers.swift b/Sources/SwiftBuildSupport/PackagePIFBuilder+Helpers.swift index b409518837d..e6ac743d571 100644 --- a/Sources/SwiftBuildSupport/PackagePIFBuilder+Helpers.swift +++ b/Sources/SwiftBuildSupport/PackagePIFBuilder+Helpers.swift @@ -28,6 +28,7 @@ import enum PackageModel.BuildConfiguration import enum PackageModel.BuildSettings import class PackageModel.ClangModule import struct PackageModel.ConfigurationCondition +import struct PackageModel.HostCondition import class PackageModel.Manifest import class PackageModel.Module import enum PackageModel.ModuleMapType @@ -255,12 +256,14 @@ extension Sequence { var platformConditions: [PackageModel.PlatformsCondition] = [] var configurationConditions: [PackageModel.ConfigurationCondition] = [] var traitConditions: [PackageModel.TraitCondition] = [] + var hostConditions: [PackageModel.HostCondition] = [] for packageCondition in self { switch packageCondition { case .platforms(let condition): platformConditions.append(condition) case .configuration(let condition): configurationConditions.append(condition) case .traits(let condition): traitConditions.append(condition) + case .host(let condition): hostConditions.append(condition) } } diff --git a/Tests/BuildTests/BuildPlanTests.swift b/Tests/BuildTests/BuildPlanTests.swift index a27d2f178f0..4abe77b13d9 100644 --- a/Tests/BuildTests/BuildPlanTests.swift +++ b/Tests/BuildTests/BuildPlanTests.swift @@ -957,6 +957,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase { let plan = try await mockBuildPlan( environment: BuildEnvironment( platform: .linux, + isHost: true, configuration: .release ), graph: graph, @@ -999,6 +1000,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase { let plan = try await mockBuildPlan( environment: BuildEnvironment( platform: .macOS, + isHost: true, configuration: .debug ), graph: graph, @@ -1507,6 +1509,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase { let result = try await BuildPlanResult(plan: mockBuildPlan( environment: BuildEnvironment( platform: .linux, + isHost: true, configuration: .release ), graph: graph, @@ -1526,6 +1529,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase { let result = try await BuildPlanResult(plan: mockBuildPlan( environment: BuildEnvironment( platform: .macOS, + isHost: true, configuration: .debug ), graph: graph, @@ -2106,6 +2110,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase { let plan = try await mockBuildPlan( environment: BuildEnvironment( platform: .linux, + isHost: true, configuration: .release ), graph: graph, @@ -3568,7 +3573,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase { let graphResult = PackageGraphResultXCTest(graph) do { - let linuxDebug = BuildEnvironment(platform: .linux, configuration: .debug) + let linuxDebug = BuildEnvironment(platform: .linux, isHost: true, configuration: .debug) try graphResult.check(reachableBuildProducts: "aexec", "BLibrary1", "BLibrary2", in: linuxDebug) try graphResult.check(reachableBuildTargets: "ATarget", "BTarget1", "BTarget2", in: linuxDebug) @@ -3583,7 +3588,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase { } do { - let macosDebug = BuildEnvironment(platform: .macOS, configuration: .debug) + let macosDebug = BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) try graphResult.check(reachableBuildProducts: "aexec", "BLibrary2", in: macosDebug) try graphResult.check(reachableBuildTargets: "ATarget", "BTarget2", "BTarget3", in: macosDebug) @@ -3598,7 +3603,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase { } do { - let androidRelease = BuildEnvironment(platform: .android, configuration: .release) + let androidRelease = BuildEnvironment(platform: .android, isHost: false, configuration: .release) try graphResult.check(reachableBuildProducts: "aexec", "CLibrary", in: androidRelease) try graphResult.check(reachableBuildTargets: "ATarget", "CTarget", in: androidRelease) @@ -4905,7 +4910,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase { // Test debug configuration do { let result = try await BuildPlanResult(plan: mockBuildPlan( - environment: BuildEnvironment(platform: .macOS, configuration: .debug), + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug), graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -4927,7 +4932,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase { // Test release configuration do { let result = try await BuildPlanResult(plan: mockBuildPlan( - environment: BuildEnvironment(platform: .macOS, configuration: .release), + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release), graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -4993,7 +4998,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase { // Test debug configuration do { let result = try await BuildPlanResult(plan: mockBuildPlan( - environment: BuildEnvironment(platform: .macOS, configuration: .debug), + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug), graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -5011,7 +5016,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase { // Test release configuration do { let result = try await BuildPlanResult(plan: mockBuildPlan( - environment: BuildEnvironment(platform: .macOS, configuration: .release), + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release), graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -5131,7 +5136,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase { // Test debug configuration do { let result = try await BuildPlanResult(plan: mockBuildPlan( - environment: BuildEnvironment(platform: .macOS, configuration: .debug), + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug), graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -5162,7 +5167,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase { // Test release configuration do { let result = try await BuildPlanResult(plan: mockBuildPlan( - environment: BuildEnvironment(platform: .macOS, configuration: .release), + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release), graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -7235,6 +7240,7 @@ class BuildPlanTestCase: BuildSystemProviderTestCase { let result = try await BuildPlanResult(plan: mockBuildPlan( environment: BuildEnvironment( platform: .linux, + isHost: true, configuration: .release ), graph: graph, diff --git a/Tests/BuildTests/LLBuildManifestBuilderTests.swift b/Tests/BuildTests/LLBuildManifestBuilderTests.swift index f2bf17e5663..dea4261abdc 100644 --- a/Tests/BuildTests/LLBuildManifestBuilderTests.swift +++ b/Tests/BuildTests/LLBuildManifestBuilderTests.swift @@ -56,6 +56,7 @@ struct LLBuildManifestBuilderTests { var plan = try await mockBuildPlan( environment: BuildEnvironment( platform: .macOS, + isHost: true, configuration: .release ), graph: graph, @@ -86,6 +87,7 @@ struct LLBuildManifestBuilderTests { plan = try await mockBuildPlan( environment: BuildEnvironment( platform: .macOS, + isHost: true, configuration: .debug ), graph: graph, @@ -129,6 +131,7 @@ struct LLBuildManifestBuilderTests { plan = try await mockBuildPlan( environment: BuildEnvironment( platform: .linux, + isHost: true, configuration: .release ), graph: graph, @@ -155,6 +158,7 @@ struct LLBuildManifestBuilderTests { plan = try await mockBuildPlan( environment: BuildEnvironment( platform: .linux, + isHost: true, configuration: .debug ), graph: graph, diff --git a/Tests/BuildTests/PluginInvocationTests.swift b/Tests/BuildTests/PluginInvocationTests.swift index 7569ed86851..b49bbac7c60 100644 --- a/Tests/BuildTests/PluginInvocationTests.swift +++ b/Tests/BuildTests/PluginInvocationTests.swift @@ -233,7 +233,7 @@ final class PluginInvocationTests: XCTestCase { let pluginRunner = MockPluginScriptRunner() let buildParameters = mockBuildParameters( destination: .host, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) let results = try await invokeBuildToolPlugins( @@ -960,7 +960,7 @@ final class PluginInvocationTests: XCTestCase { let outputDir = packageDir.appending(".build") let buildParameters = mockBuildParameters( destination: .host, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) let result = try await invokeBuildToolPlugins( @@ -1102,7 +1102,7 @@ final class PluginInvocationTests: XCTestCase { let outputDir = packageDir.appending(".build") let buildParameters = mockBuildParameters( destination: .host, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) let result = try await invokeBuildToolPlugins( @@ -1456,7 +1456,7 @@ final class PluginInvocationTests: XCTestCase { let outputDir = packageDir.appending(".build") let buildParameters = mockBuildParameters( destination: .host, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) return try await invokeBuildToolPlugins( diff --git a/Tests/BuildTests/ProductBuildDescriptionTests.swift b/Tests/BuildTests/ProductBuildDescriptionTests.swift index 5674142e10d..d24e4962811 100644 --- a/Tests/BuildTests/ProductBuildDescriptionTests.swift +++ b/Tests/BuildTests/ProductBuildDescriptionTests.swift @@ -63,7 +63,7 @@ final class ProductBuildDescriptionTests: XCTestCase { package: package, product: product, toolsVersion: .v5_9, - buildParameters: mockBuildParameters(destination: .target, environment: .init(platform: .macOS)), + buildParameters: mockBuildParameters(destination: .target, environment: .init(platform: .macOS, isHost: true)), fileSystem: fs, observabilityScope: observability.topScope ) diff --git a/Tests/FunctionalTests/PluginTests.swift b/Tests/FunctionalTests/PluginTests.swift index 03f4af842b8..5d35a77b6a8 100644 --- a/Tests/FunctionalTests/PluginTests.swift +++ b/Tests/FunctionalTests/PluginTests.swift @@ -806,7 +806,7 @@ final class PluginTests { let success = try await withCheckedThrowingContinuation { continuation in plugin.invoke( action: .performCommand(package: package, arguments: arguments), - buildEnvironment: BuildEnvironment(platform: .macOS, configuration: .debug), + buildEnvironment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug), scriptRunner: scriptRunner, workingDirectory: package.path, outputDirectory: pluginDir.appending("output"), @@ -1101,7 +1101,7 @@ final class PluginTests { try await withTaskCancellationHandler { _ = try await plugin.invoke( action: .performCommand(package: package, arguments: []), - buildEnvironment: BuildEnvironment(platform: .macOS, configuration: .debug), + buildEnvironment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug), scriptRunner: scriptRunner, workingDirectory: package.path, outputDirectory: pluginDir.appending("output"), diff --git a/Tests/PackageGraphTests/ModulesGraphTests.swift b/Tests/PackageGraphTests/ModulesGraphTests.swift index 55699e5c739..2baf5bf092a 100644 --- a/Tests/PackageGraphTests/ModulesGraphTests.swift +++ b/Tests/PackageGraphTests/ModulesGraphTests.swift @@ -2369,20 +2369,20 @@ struct ModulesGraphTests { try result.checkTarget("Foo") { result in result.check(dependencies: "Bar", "Baz", "Biz") try result.checkDependency("Bar") { result in - result.checkConditions(satisfy: .init(platform: .linux, configuration: .debug)) - result.checkConditions(satisfy: .init(platform: .linux, configuration: .release)) - result.checkConditions(dontSatisfy: .init(platform: .macOS, configuration: .release)) + result.checkConditions(satisfy: .init(platform: .linux, isHost: true, configuration: .debug)) + result.checkConditions(satisfy: .init(platform: .linux, isHost: true, configuration: .release)) + result.checkConditions(dontSatisfy: .init(platform: .macOS, isHost: true, configuration: .release)) } try result.checkDependency("Baz") { result in - result.checkConditions(satisfy: .init(platform: .watchOS, configuration: .debug)) - result.checkConditions(satisfy: .init(platform: .tvOS, configuration: .debug)) - result.checkConditions(dontSatisfy: .init(platform: .tvOS, configuration: .release)) + result.checkConditions(satisfy: .init(platform: .watchOS, isHost: true, configuration: .debug)) + result.checkConditions(satisfy: .init(platform: .tvOS, isHost: true, configuration: .debug)) + result.checkConditions(dontSatisfy: .init(platform: .tvOS, isHost: true, configuration: .release)) } try result.checkDependency("Biz") { result in - result.checkConditions(satisfy: .init(platform: .watchOS, configuration: .release)) - result.checkConditions(satisfy: .init(platform: .iOS, configuration: .release)) - result.checkConditions(dontSatisfy: .init(platform: .iOS, configuration: .debug)) - result.checkConditions(dontSatisfy: .init(platform: .macOS, configuration: .release)) + result.checkConditions(satisfy: .init(platform: .watchOS, isHost: true, configuration: .release)) + result.checkConditions(satisfy: .init(platform: .iOS, isHost: true, configuration: .release)) + result.checkConditions(dontSatisfy: .init(platform: .iOS, isHost: true, configuration: .debug)) + result.checkConditions(dontSatisfy: .init(platform: .macOS, isHost: true, configuration: .release)) } } } diff --git a/Tests/PackageLoadingTests/PackageBuilderTests.swift b/Tests/PackageLoadingTests/PackageBuilderTests.swift index c7c685ecab9..be41b4c31c7 100644 --- a/Tests/PackageLoadingTests/PackageBuilderTests.swift +++ b/Tests/PackageLoadingTests/PackageBuilderTests.swift @@ -2631,7 +2631,7 @@ struct PackageBuilderTests { try package.checkModule("cbar") { package in let scope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) #expect(scope.evaluate(.GCC_PREPROCESSOR_DEFINITIONS) == ["CCC=2", "CXX"]) #expect(scope.evaluate(.HEADER_SEARCH_PATHS) == ["Sources/headers", "Sources/cppheaders"]) @@ -2640,7 +2640,7 @@ struct PackageBuilderTests { let releaseScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .release) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release) ) #expect(releaseScope.evaluate(.GCC_PREPROCESSOR_DEFINITIONS) == ["CCC=2", "CXX", "RCXX"]) } @@ -2648,20 +2648,20 @@ struct PackageBuilderTests { try package.checkModule("bar") { package in let scope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .linux, configuration: .debug) + environment: BuildEnvironment(platform: .linux, isHost: true, configuration: .debug) ) #expect(scope.evaluate(.SWIFT_ACTIVE_COMPILATION_CONDITIONS) == ["SOMETHING", "LINUX"]) #expect(scope.evaluate(.OTHER_SWIFT_FLAGS) == ["-Isfoo", "-L", "sbar"]) let rscope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .linux, configuration: .release) + environment: BuildEnvironment(platform: .linux, isHost: true, configuration: .release) ) #expect(rscope.evaluate(.SWIFT_ACTIVE_COMPILATION_CONDITIONS) == ["SOMETHING", "LINUX", "RLINUX"]) let mscope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) #expect(mscope.evaluate(.SWIFT_ACTIVE_COMPILATION_CONDITIONS) == ["SOMETHING", "DMACOS"]) } @@ -2669,7 +2669,7 @@ struct PackageBuilderTests { try package.checkModule("exe") { package in let scope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .linux, configuration: .debug) + environment: BuildEnvironment(platform: .linux, isHost: true, configuration: .debug) ) #expect(scope.evaluate(.LINK_LIBRARIES) == ["sqlite3"]) #expect(scope.evaluate(.OTHER_LDFLAGS) == ["-Ilfoo", "-L", "lbar"]) @@ -2680,7 +2680,7 @@ struct PackageBuilderTests { let mscope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .iOS, configuration: .debug) + environment: BuildEnvironment(platform: .iOS, isHost: false, configuration: .debug) ) #expect(mscope.evaluate(.LINK_LIBRARIES) == ["sqlite3"]) #expect(mscope.evaluate(.LINK_FRAMEWORKS) == ["CoreData"]) @@ -2728,7 +2728,7 @@ struct PackageBuilderTests { try package.checkModule("foo") { package in let macosDebugScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) #expect(macosDebugScope.evaluate(.OTHER_CFLAGS) == []) #expect(macosDebugScope.evaluate(.OTHER_CPLUSPLUSFLAGS) == []) @@ -2736,7 +2736,7 @@ struct PackageBuilderTests { let macosReleaseScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .release) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release) ) #expect(macosReleaseScope.evaluate(.OTHER_CFLAGS) == []) #expect(macosReleaseScope.evaluate(.OTHER_CPLUSPLUSFLAGS) == []) @@ -2746,21 +2746,21 @@ struct PackageBuilderTests { try package.checkModule("bar") { package in let linuxDebugScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .linux, configuration: .debug) + environment: BuildEnvironment(platform: .linux, isHost: true, configuration: .debug) ) #expect(linuxDebugScope.evaluate(.OTHER_SWIFT_FLAGS) == []) #expect(linuxDebugScope.evaluate(.OTHER_LDFLAGS) == []) let linuxReleaseScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .linux, configuration: .release) + environment: BuildEnvironment(platform: .linux, isHost: true, configuration: .release) ) #expect(linuxReleaseScope.evaluate(.OTHER_SWIFT_FLAGS) == []) #expect(linuxReleaseScope.evaluate(.OTHER_LDFLAGS) == []) let macosDebugScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) #expect(macosDebugScope.evaluate(.OTHER_SWIFT_FLAGS) == []) #expect(macosDebugScope.evaluate(.OTHER_LDFLAGS) == []) @@ -2928,22 +2928,22 @@ struct PackageBuilderTests { target.check(dependencies: ["Bar", "Baz", "Biz"]) target.checkDependency("Bar") { result in - result.checkConditions(satisfy: .init(platform: .macOS, configuration: .debug)) - result.checkConditions(satisfy: .init(platform: .macOS, configuration: .release)) - result.checkConditions(dontSatisfy: .init(platform: .watchOS, configuration: .release)) + result.checkConditions(satisfy: .init(platform: .macOS, isHost: true, configuration: .debug)) + result.checkConditions(satisfy: .init(platform: .macOS, isHost: true, configuration: .release)) + result.checkConditions(dontSatisfy: .init(platform: .watchOS, isHost: false, configuration: .release)) } target.checkDependency("Baz") { result in - result.checkConditions(satisfy: .init(platform: .macOS, configuration: .debug)) - result.checkConditions(satisfy: .init(platform: .linux, configuration: .debug)) - result.checkConditions(dontSatisfy: .init(platform: .linux, configuration: .release)) + result.checkConditions(satisfy: .init(platform: .macOS, isHost: true, configuration: .debug)) + result.checkConditions(satisfy: .init(platform: .linux, isHost: true, configuration: .debug)) + result.checkConditions(dontSatisfy: .init(platform: .linux, isHost: true, configuration: .release)) } target.checkDependency("Biz") { result in - result.checkConditions(satisfy: .init(platform: .watchOS, configuration: .release)) - result.checkConditions(satisfy: .init(platform: .iOS, configuration: .release)) - result.checkConditions(dontSatisfy: .init(platform: .linux, configuration: .release)) - result.checkConditions(dontSatisfy: .init(platform: .iOS, configuration: .debug)) + result.checkConditions(satisfy: .init(platform: .watchOS, isHost: false, configuration: .release)) + result.checkConditions(satisfy: .init(platform: .iOS, isHost: false, configuration: .release)) + result.checkConditions(dontSatisfy: .init(platform: .linux, isHost: false, configuration: .release)) + result.checkConditions(dontSatisfy: .init(platform: .iOS, isHost: false, configuration: .debug)) } } } @@ -3234,13 +3234,13 @@ struct PackageBuilderTests { try package.checkModule("foo") { package in let macosDebugScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) #expect(macosDebugScope.evaluate(.SWIFT_VERSION) == ["5"]) let macosReleaseScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .release) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release) ) #expect(macosReleaseScope.evaluate(.SWIFT_VERSION) == ["5"]) } @@ -3248,19 +3248,19 @@ struct PackageBuilderTests { try package.checkModule("bar") { package in let linuxDebugScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .linux, configuration: .debug) + environment: BuildEnvironment(platform: .linux, isHost: true, configuration: .debug) ) #expect(linuxDebugScope.evaluate(.SWIFT_VERSION) == ["3"]) let macosDebugScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) #expect(macosDebugScope.evaluate(.SWIFT_VERSION) == ["4"]) let macosReleaseScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .release) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release) ) #expect(macosReleaseScope.evaluate(.SWIFT_VERSION) == ["5"]) } @@ -3293,7 +3293,7 @@ struct PackageBuilderTests { try package.checkModule("foo") { package in let macosDebugScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) #expect( macosDebugScope.evaluate(.OTHER_SWIFT_FLAGS) == @@ -3302,7 +3302,7 @@ struct PackageBuilderTests { let macosReleaseScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .release) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release) ) #expect( macosReleaseScope.evaluate(.OTHER_SWIFT_FLAGS) == @@ -3339,7 +3339,7 @@ struct PackageBuilderTests { try package.checkModule("cfoo") { package in let macosDebugScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) #expect( macosDebugScope.evaluate(.OTHER_CFLAGS) == @@ -3348,7 +3348,7 @@ struct PackageBuilderTests { let macosReleaseScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .release) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release) ) #expect( macosReleaseScope.evaluate(.OTHER_CFLAGS) == @@ -3385,7 +3385,7 @@ struct PackageBuilderTests { try package.checkModule("cxxfoo") { package in let macosDebugScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) #expect( macosDebugScope.evaluate(.OTHER_CPLUSPLUSFLAGS) == @@ -3394,7 +3394,7 @@ struct PackageBuilderTests { let macosReleaseScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .release) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release) ) #expect( macosReleaseScope.evaluate(.OTHER_CPLUSPLUSFLAGS) == @@ -3429,7 +3429,7 @@ struct PackageBuilderTests { try package.checkModule("cfoo") { package in let macosDebugScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) #expect( macosDebugScope.evaluate(.OTHER_CFLAGS) == @@ -3438,7 +3438,7 @@ struct PackageBuilderTests { let macosReleaseScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .release) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release) ) #expect( macosReleaseScope.evaluate(.OTHER_CFLAGS) == @@ -3473,7 +3473,7 @@ struct PackageBuilderTests { try package.checkModule("cxxfoo") { package in let macosDebugScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) #expect( macosDebugScope.evaluate(.OTHER_CPLUSPLUSFLAGS) == @@ -3482,7 +3482,7 @@ struct PackageBuilderTests { let macosReleaseScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .release) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release) ) #expect( macosReleaseScope.evaluate(.OTHER_CPLUSPLUSFLAGS) == @@ -3523,14 +3523,14 @@ struct PackageBuilderTests { try package.checkModule("A") { package in let macosDebugScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) #expect(macosDebugScope.evaluate(.OTHER_SWIFT_FLAGS).contains("-default-isolation")) #expect(macosDebugScope.evaluate(.OTHER_SWIFT_FLAGS).contains("MainActor")) let macosReleaseScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .release) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release) ) #expect(macosReleaseScope.evaluate(.OTHER_SWIFT_FLAGS).contains("-default-isolation")) #expect(macosReleaseScope.evaluate(.OTHER_SWIFT_FLAGS).contains("MainActor")) @@ -3540,21 +3540,21 @@ struct PackageBuilderTests { try package.checkModule("B") { package in let linuxDebugScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .linux, configuration: .debug) + environment: BuildEnvironment(platform: .linux, isHost: true, configuration: .debug) ) #expect(linuxDebugScope.evaluate(.OTHER_SWIFT_FLAGS).contains("-default-isolation")) #expect(linuxDebugScope.evaluate(.OTHER_SWIFT_FLAGS).contains("nonisolated")) let macosDebugScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .debug) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .debug) ) #expect(macosDebugScope.evaluate(.OTHER_SWIFT_FLAGS).contains("-default-isolation")) #expect(macosDebugScope.evaluate(.OTHER_SWIFT_FLAGS).contains("MainActor")) let macosReleaseScope = BuildSettings.Scope( package.target.buildSettings, - environment: BuildEnvironment(platform: .macOS, configuration: .release) + environment: BuildEnvironment(platform: .macOS, isHost: true, configuration: .release) ) #expect(!macosReleaseScope.evaluate(.OTHER_SWIFT_FLAGS).contains("-default-isolation") || !macosReleaseScope.evaluate(.OTHER_SWIFT_FLAGS).contains("MainActor")) diff --git a/Tests/SPMBuildCoreTests/BuildParametersTests.swift b/Tests/SPMBuildCoreTests/BuildParametersTests.swift index cf79703fe9b..51d4f40eb30 100644 --- a/Tests/SPMBuildCoreTests/BuildParametersTests.swift +++ b/Tests/SPMBuildCoreTests/BuildParametersTests.swift @@ -21,7 +21,7 @@ struct BuildParametersTests { func configurationDependentProperties() throws { var parameters = mockBuildParameters( destination: .host, - environment: BuildEnvironment(platform: .linux, configuration: .debug) + environment: BuildEnvironment(platform: .linux, isHost: true, configuration: .debug) ) #expect(parameters.enableTestability) parameters.configuration = .release diff --git a/Tests/WorkspaceTests/PrebuiltsTests.swift b/Tests/WorkspaceTests/PrebuiltsTests.swift index 759e94c3721..c701b1f9573 100644 --- a/Tests/WorkspaceTests/PrebuiltsTests.swift +++ b/Tests/WorkspaceTests/PrebuiltsTests.swift @@ -26,6 +26,8 @@ import _InternalTestSupport final class PrebuiltsTests: XCTestCase { let swiftVersion = "\(SwiftVersion.current.major).\(SwiftVersion.current.minor)" + let host = BuildEnvironment(platform: .macOS, isHost: true) + let dest = BuildEnvironment(platform: .linux, isHost: false) func with( fileSystem: FileSystem, @@ -96,11 +98,19 @@ final class PrebuiltsTests: XCTestCase { let rootPackage = try MockPackage( name: "Foo", targets: [ + MockTarget( + name: "SwiftSyntaxExtras", + dependencies: [ + .product(name: "SwiftSyntaxMacros", package: "swift-syntax"), + .product(name: "SwiftCompilerPlugin", package: "swift-syntax"), + ] + ), MockTarget( name: "FooMacros", dependencies: [ .product(name: "SwiftSyntaxMacros", package: "swift-syntax"), .product(name: "SwiftCompilerPlugin", package: "swift-syntax"), + "SwiftSyntaxExtras", ], type: .macro ), @@ -113,6 +123,13 @@ final class PrebuiltsTests: XCTestCase { dependencies: ["Foo"], type: .executable ), + MockTarget( + name: "ExtrasClient", + dependencies: [ + "SwiftSyntaxExtras", + ], + type: .executable + ), MockTarget( name: "FooTests", dependencies: [ @@ -150,17 +167,37 @@ final class PrebuiltsTests: XCTestCase { } } - func checkSettings(_ rootPackage: ResolvedPackage, _ targetName: String, usePrebuilt: Bool) throws { - let target = try XCTUnwrap(rootPackage.underlying.modules.first(where: { $0.name == targetName })) + func checkSettings(_ rootPackage: ResolvedPackage, _ targetName: String, env: BuildEnvironment, usePrebuilt: Bool) throws { + let target = try XCTUnwrap(rootPackage.modules[ResolvedModule.ID(moduleName: targetName, packageIdentity: rootPackage.identity)]) + + let swiftFlags = (target.underlying.buildSettings.assignments[.OTHER_SWIFT_FLAGS] ?? []).filter({ + $0.conditions.allSatisfy({ $0.satisfies(env) }) + }).flatMap({ $0.values }) + + let ldFlags = (target.underlying.buildSettings.assignments[.OTHER_LDFLAGS] ?? []).filter({ + $0.conditions.allSatisfy({ $0.satisfies(env) }) + }).flatMap({ $0.values }) + + let deps = target.dependencies.filter({ $0.conditions.allSatisfy({ $0.satisfies(env) })}) + let ssDeps = deps.filter({ + guard case .product(let product, conditions: _) = $0 else { + return false + } + return product.packageIdentity == .plain("swift-syntax") + }) + if usePrebuilt { - let swiftFlags = try XCTUnwrap(target.buildSettings.assignments[.OTHER_SWIFT_FLAGS]).flatMap({ $0.values }) XCTAssertTrue(swiftFlags.contains("-I/tmp/ws/.build/prebuilts/swift-syntax/600.0.1/\(self.swiftVersion)-MacroSupport-macos_aarch64/Modules".fixwin)) XCTAssertTrue(swiftFlags.contains("-I/tmp/ws/.build/prebuilts/swift-syntax/600.0.1/\(self.swiftVersion)-MacroSupport-macos_aarch64/include/_SwiftSyntaxCShims".fixwin)) - let ldFlags = try XCTUnwrap(target.buildSettings.assignments[.OTHER_LDFLAGS]).flatMap({ $0.values }) + XCTAssertTrue(ldFlags.contains("/tmp/ws/.build/prebuilts/swift-syntax/600.0.1/\(self.swiftVersion)-MacroSupport-macos_aarch64/lib/libMacroSupport.a".fixwin)) + + XCTAssertTrue(ssDeps.isEmpty) } else { - XCTAssertNil(target.buildSettings.assignments[.OTHER_SWIFT_FLAGS]) - XCTAssertNil(target.buildSettings.assignments[.OTHER_LDFLAGS]) + XCTAssertTrue(swiftFlags.isEmpty) + XCTAssertTrue(ldFlags.isEmpty) + + XCTAssertFalse(ssDeps.isEmpty) } } @@ -216,10 +253,10 @@ final class PrebuiltsTests: XCTestCase { try await workspace.checkPackageGraph(roots: ["Foo"]) { modulesGraph, diagnostics in XCTAssertTrue(diagnostics.filter({ $0.severity == .error || $0.severity == .warning }).isEmpty) let rootPackage = try XCTUnwrap(modulesGraph.rootPackages.first) - try checkSettings(rootPackage, "FooMacros", usePrebuilt: true) - try checkSettings(rootPackage, "FooTests", usePrebuilt: true) - try checkSettings(rootPackage, "Foo", usePrebuilt: false) - try checkSettings(rootPackage, "FooClient", usePrebuilt: false) + try checkSettings(rootPackage, "FooMacros", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "FooTests", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: dest, usePrebuilt: false) } } } @@ -280,10 +317,10 @@ final class PrebuiltsTests: XCTestCase { try await workspace.checkPackageGraph(roots: [rootPackage.name]) { modulesGraph, diagnostics in XCTAssertTrue(diagnostics.filter({ $0.severity == .error || $0.severity == .warning }).isEmpty) let rootPackage = try XCTUnwrap(modulesGraph.rootPackages.first) - try checkSettings(rootPackage, "FooMacros", usePrebuilt: true) - try checkSettings(rootPackage, "FooTests", usePrebuilt: true) - try checkSettings(rootPackage, "Foo", usePrebuilt: false) - try checkSettings(rootPackage, "FooClient", usePrebuilt: false) + try checkSettings(rootPackage, "FooMacros", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "FooTests", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: dest, usePrebuilt: false) } // Change the version of swift syntax to one that doesn't have prebuilts @@ -310,10 +347,10 @@ final class PrebuiltsTests: XCTestCase { try await workspace.checkPackageGraph(roots: [rootPackage.name]) { modulesGraph, diagnostics in XCTAssertTrue(diagnostics.filter({ $0.severity == .error || $0.severity == .warning }).isEmpty) let rootPackage = try XCTUnwrap(modulesGraph.rootPackages.first) - try checkSettings(rootPackage, "FooMacros", usePrebuilt: false) - try checkSettings(rootPackage, "FooTests", usePrebuilt: false) - try checkSettings(rootPackage, "Foo", usePrebuilt: false) - try checkSettings(rootPackage, "FooClient", usePrebuilt: false) + try checkSettings(rootPackage, "FooMacros", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "FooTests", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: dest, usePrebuilt: false) } // Change it back @@ -323,10 +360,10 @@ final class PrebuiltsTests: XCTestCase { try await workspace.checkPackageGraph(roots: [rootPackage.name]) { modulesGraph, diagnostics in XCTAssertTrue(diagnostics.filter({ $0.severity == .error || $0.severity == .warning }).isEmpty) let rootPackage = try XCTUnwrap(modulesGraph.rootPackages.first) - try checkSettings(rootPackage, "FooMacros", usePrebuilt: true) - try checkSettings(rootPackage, "FooTests", usePrebuilt: true) - try checkSettings(rootPackage, "Foo", usePrebuilt: false) - try checkSettings(rootPackage, "FooClient", usePrebuilt: false) + try checkSettings(rootPackage, "FooMacros", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "FooTests", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: dest, usePrebuilt: false) } } } @@ -385,10 +422,10 @@ final class PrebuiltsTests: XCTestCase { try await workspace.checkPackageGraph(roots: ["Foo"]) { modulesGraph, diagnostics in XCTAssertTrue(diagnostics.filter({ $0.severity == .error }).isEmpty) let rootPackage = try XCTUnwrap(modulesGraph.rootPackages.first) - try checkSettings(rootPackage, "FooMacros", usePrebuilt: true) - try checkSettings(rootPackage, "FooTests", usePrebuilt: true) - try checkSettings(rootPackage, "Foo", usePrebuilt: false) - try checkSettings(rootPackage, "FooClient", usePrebuilt: false) + try checkSettings(rootPackage, "FooMacros", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "FooTests", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: dest, usePrebuilt: false) } } } @@ -447,10 +484,10 @@ final class PrebuiltsTests: XCTestCase { try await workspace.checkPackageGraph(roots: ["Foo"]) { modulesGraph, diagnostics in XCTAssertTrue(diagnostics.filter({ $0.severity == .error }).isEmpty) let rootPackage = try XCTUnwrap(modulesGraph.rootPackages.first) - try checkSettings(rootPackage, "FooMacros", usePrebuilt: true) - try checkSettings(rootPackage, "FooTests", usePrebuilt: true) - try checkSettings(rootPackage, "Foo", usePrebuilt: false) - try checkSettings(rootPackage, "FooClient", usePrebuilt: false) + try checkSettings(rootPackage, "FooMacros", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "FooTests", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: dest, usePrebuilt: false) } } } @@ -509,10 +546,10 @@ final class PrebuiltsTests: XCTestCase { try await workspace.checkPackageGraph(roots: ["Foo"]) { modulesGraph, diagnostics in XCTAssertTrue(diagnostics.filter({ $0.severity == .error }).isEmpty) let rootPackage = try XCTUnwrap(modulesGraph.rootPackages.first) - try checkSettings(rootPackage, "FooMacros", usePrebuilt: true) - try checkSettings(rootPackage, "FooTests", usePrebuilt: true) - try checkSettings(rootPackage, "Foo", usePrebuilt: false) - try checkSettings(rootPackage, "FooClient", usePrebuilt: false) + try checkSettings(rootPackage, "FooMacros", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "FooTests", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: dest, usePrebuilt: false) } } } @@ -561,10 +598,10 @@ final class PrebuiltsTests: XCTestCase { try await workspace.checkPackageGraph(roots: ["Foo"]) { modulesGraph, diagnostics in XCTAssertTrue(diagnostics.filter({ $0.severity == .error }).isEmpty) let rootPackage = try XCTUnwrap(modulesGraph.rootPackages.first) - try checkSettings(rootPackage, "FooMacros", usePrebuilt: false) - try checkSettings(rootPackage, "FooTests", usePrebuilt: false) - try checkSettings(rootPackage, "Foo", usePrebuilt: false) - try checkSettings(rootPackage, "FooClient", usePrebuilt: false) + try checkSettings(rootPackage, "FooMacros", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "FooTests", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: dest, usePrebuilt: false) } await secondFetch.set(true) @@ -572,10 +609,10 @@ final class PrebuiltsTests: XCTestCase { try await workspace.checkPackageGraph(roots: ["Foo"]) { modulesGraph, diagnostics in XCTAssertTrue(diagnostics.filter({ $0.severity == .error }).isEmpty) let rootPackage = try XCTUnwrap(modulesGraph.rootPackages.first) - try checkSettings(rootPackage, "FooMacros", usePrebuilt: false) - try checkSettings(rootPackage, "FooTests", usePrebuilt: false) - try checkSettings(rootPackage, "Foo", usePrebuilt: false) - try checkSettings(rootPackage, "FooClient", usePrebuilt: false) + try checkSettings(rootPackage, "FooMacros", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "FooTests", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: dest, usePrebuilt: false) } } } @@ -628,10 +665,10 @@ final class PrebuiltsTests: XCTestCase { try await workspace.checkPackageGraph(roots: ["Foo"]) { modulesGraph, diagnostics in XCTAssertTrue(diagnostics.filter({ $0.severity == .error }).isEmpty) let rootPackage = try XCTUnwrap(modulesGraph.rootPackages.first) - try checkSettings(rootPackage, "FooMacros", usePrebuilt: false) - try checkSettings(rootPackage, "FooTests", usePrebuilt: false) - try checkSettings(rootPackage, "Foo", usePrebuilt: false) - try checkSettings(rootPackage, "FooClient", usePrebuilt: false) + try checkSettings(rootPackage, "FooMacros", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "FooTests", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: dest, usePrebuilt: false) } } } @@ -677,10 +714,10 @@ final class PrebuiltsTests: XCTestCase { try await workspace.checkPackageGraph(roots: ["Foo"]) { modulesGraph, diagnostics in XCTAssertTrue(diagnostics.filter({ $0.severity == .error }).isEmpty) let rootPackage = try XCTUnwrap(modulesGraph.rootPackages.first) - try checkSettings(rootPackage, "FooMacros", usePrebuilt: false) - try checkSettings(rootPackage, "FooTests", usePrebuilt: false) - try checkSettings(rootPackage, "Foo", usePrebuilt: false) - try checkSettings(rootPackage, "FooClient", usePrebuilt: false) + try checkSettings(rootPackage, "FooMacros", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "FooTests", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: dest, usePrebuilt: false) } } } @@ -748,10 +785,10 @@ final class PrebuiltsTests: XCTestCase { XCTAssertTrue(diagnostics.filter({ $0.severity == .error }).isEmpty) XCTAssertTrue(diagnostics.contains(where: { $0.message == "Failed to decode prebuilt manifest: invalidSignature" })) let rootPackage = try XCTUnwrap(modulesGraph.rootPackages.first) - try checkSettings(rootPackage, "FooMacros", usePrebuilt: false) - try checkSettings(rootPackage, "FooTests", usePrebuilt: false) - try checkSettings(rootPackage, "Foo", usePrebuilt: false) - try checkSettings(rootPackage, "FooClient", usePrebuilt: false) + try checkSettings(rootPackage, "FooMacros", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "FooTests", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: dest, usePrebuilt: false) } } } @@ -809,10 +846,10 @@ final class PrebuiltsTests: XCTestCase { try await workspace.checkPackageGraph(roots: ["Foo"]) { modulesGraph, diagnostics in XCTAssertTrue(diagnostics.filter({ $0.severity == .error }).isEmpty) let rootPackage = try XCTUnwrap(modulesGraph.rootPackages.first) - try checkSettings(rootPackage, "FooMacros", usePrebuilt: false) - try checkSettings(rootPackage, "FooTests", usePrebuilt: false) - try checkSettings(rootPackage, "Foo", usePrebuilt: false) - try checkSettings(rootPackage, "FooClient", usePrebuilt: false) + try checkSettings(rootPackage, "FooMacros", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "FooTests", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: dest, usePrebuilt: false) } } } @@ -873,10 +910,10 @@ final class PrebuiltsTests: XCTestCase { try await workspace.checkPackageGraph(roots: ["Foo"]) { modulesGraph, diagnostics in XCTAssertTrue(diagnostics.filter({ $0.severity == .error }).isEmpty) let rootPackage = try XCTUnwrap(modulesGraph.rootPackages.first) - try checkSettings(rootPackage, "FooMacros", usePrebuilt: true) - try checkSettings(rootPackage, "FooTests", usePrebuilt: true) - try checkSettings(rootPackage, "Foo", usePrebuilt: false) - try checkSettings(rootPackage, "FooClient", usePrebuilt: false) + try checkSettings(rootPackage, "FooMacros", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "FooTests", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: host, usePrebuilt: true) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: dest, usePrebuilt: false) } } } @@ -928,10 +965,10 @@ final class PrebuiltsTests: XCTestCase { try await workspace.checkPackageGraph(roots: ["Foo"]) { modulesGraph, diagnostics in XCTAssertTrue(diagnostics.filter({ $0.severity == .error }).isEmpty) let rootPackage = try XCTUnwrap(modulesGraph.rootPackages.first) - try checkSettings(rootPackage, "FooMacros", usePrebuilt: false) - try checkSettings(rootPackage, "FooTests", usePrebuilt: false) - try checkSettings(rootPackage, "Foo", usePrebuilt: false) - try checkSettings(rootPackage, "FooClient", usePrebuilt: false) + try checkSettings(rootPackage, "FooMacros", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "FooTests", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: dest, usePrebuilt: false) } } } @@ -956,10 +993,10 @@ final class PrebuiltsTests: XCTestCase { try await workspace.checkPackageGraph(roots: ["Foo"]) { modulesGraph, diagnostics in XCTAssertTrue(diagnostics.filter({ $0.severity == .error }).isEmpty) let rootPackage = try XCTUnwrap(modulesGraph.rootPackages.first) - try checkSettings(rootPackage, "FooMacros", usePrebuilt: false) - try checkSettings(rootPackage, "FooTests", usePrebuilt: false) - try checkSettings(rootPackage, "Foo", usePrebuilt: false) - try checkSettings(rootPackage, "FooClient", usePrebuilt: false) + try checkSettings(rootPackage, "FooMacros", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "FooTests", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: host, usePrebuilt: false) + try checkSettings(rootPackage, "SwiftSyntaxExtras", env: dest, usePrebuilt: false) } } }