diff --git a/Sources/Build/BuildDescription/PluginDescription.swift b/Sources/Build/BuildDescription/PluginDescription.swift index ed6f648ef0c..e7259ec3d45 100644 --- a/Sources/Build/BuildDescription/PluginDescription.swift +++ b/Sources/Build/BuildDescription/PluginDescription.swift @@ -29,6 +29,9 @@ public final class PluginDescription: Codable { /// the plugin). public let targetName: String + /// The language-level target name. + public let targetC99Name: String + /// The names of any plugin products in that package that vend the plugin /// to other packages. public let productNames: [String] @@ -56,6 +59,7 @@ public final class PluginDescription: Codable { self.package = package.identity self.targetName = target.name + self.targetC99Name = target.c99name self.productNames = products.map(\.name) self.toolsVersion = toolsVersion self.sources = target.sources diff --git a/Sources/Build/BuildDescription/ResolvedModule+BuildDescription.swift b/Sources/Build/BuildDescription/ResolvedModule+BuildDescription.swift index 59e5e2abacd..7701ea32e28 100644 --- a/Sources/Build/BuildDescription/ResolvedModule+BuildDescription.swift +++ b/Sources/Build/BuildDescription/ResolvedModule+BuildDescription.swift @@ -17,7 +17,7 @@ import SPMBuildCore extension ResolvedModule { func tempsPath(_ buildParameters: BuildParameters) -> AbsolutePath { - let suffix = buildParameters.suffix(triple: self.buildTriple) + let suffix = buildParameters.suffix return buildParameters.buildPath.appending(component: "\(self.c99name)\(suffix).build") } } diff --git a/Sources/Build/BuildDescription/SwiftTargetBuildDescription.swift b/Sources/Build/BuildDescription/SwiftTargetBuildDescription.swift index f86d1dd1a42..0d188b60136 100644 --- a/Sources/Build/BuildDescription/SwiftTargetBuildDescription.swift +++ b/Sources/Build/BuildDescription/SwiftTargetBuildDescription.swift @@ -44,10 +44,7 @@ public final class SwiftTargetBuildDescription { public let toolsVersion: ToolsVersion /// The build parameters for this target. - let defaultBuildParameters: BuildParameters - - /// The build parameters for build tools. - let toolsBuildParameters: BuildParameters + let buildParameters: BuildParameters /// Path to the temporary directory for this target. let tempsPath: AbsolutePath @@ -66,8 +63,8 @@ public final class SwiftTargetBuildDescription { /// Path to the bundle generated for this module (if any). var bundlePath: AbsolutePath? { if let bundleName = target.underlying.potentialBundleName, needsResourceBundle { - let suffix = self.defaultBuildParameters.suffix(triple: self.target.buildTriple) - return self.defaultBuildParameters.bundlePath(named: bundleName + suffix) + let suffix = self.buildParameters.suffix + return self.buildParameters.bundlePath(named: bundleName + suffix) } else { return nil } @@ -102,7 +99,7 @@ public final class SwiftTargetBuildDescription { let relativeSources = self.target.sources.relativePaths + self.derivedSources.relativePaths + self.pluginDerivedSources.relativePaths - let ltoEnabled = self.defaultBuildParameters.linkingParameters.linkTimeOptimizationMode != nil + let ltoEnabled = self.buildParameters.linkingParameters.linkTimeOptimizationMode != nil let objectFileExtension = ltoEnabled ? "bc" : "o" return try relativeSources.map { try AbsolutePath( @@ -113,14 +110,14 @@ public final class SwiftTargetBuildDescription { } var modulesPath: AbsolutePath { - let suffix = self.defaultBuildParameters.suffix(triple: self.target.buildTriple) - return self.defaultBuildParameters.buildPath.appending(component: "Modules\(suffix)") + let suffix = self.buildParameters.suffix + return self.buildParameters.buildPath.appending(component: "Modules\(suffix)") } /// The path to the swiftmodule file after compilation. public var moduleOutputPath: AbsolutePath { // note: needs to be public because of sourcekit-lsp // If we're an executable and we're not allowing test targets to link against us, we hide the module. - let triple = defaultBuildParameters.triple + let triple = buildParameters.triple let allowLinkingAgainstExecutables = (triple.isDarwin() || triple.isLinux() || triple.isWindows()) && self.toolsVersion >= .v5_5 let dirPath = (target.type == .executable && !allowLinkingAgainstExecutables) ? self.tempsPath : self.modulesPath return dirPath.appending(component: "\(self.target.c99name).swiftmodule") @@ -235,7 +232,7 @@ public final class SwiftTargetBuildDescription { public let prebuildCommandResults: [PrebuildCommandResult] /// Any macro products that this target requires to build. - public let requiredMacroProducts: [ResolvedProduct] + public let requiredMacroProducts: [ProductBuildDescription] /// ObservabilityScope with which to emit diagnostics private let observabilityScope: ObservabilityScope @@ -252,11 +249,10 @@ public final class SwiftTargetBuildDescription { target: ResolvedModule, toolsVersion: ToolsVersion, additionalFileRules: [FileRuleDescription] = [], - destinationBuildParameters: BuildParameters, - toolsBuildParameters: BuildParameters, + buildParameters: BuildParameters, buildToolPluginInvocationResults: [BuildToolPluginInvocationResult] = [], prebuildCommandResults: [PrebuildCommandResult] = [], - requiredMacroProducts: [ResolvedProduct] = [], + requiredMacroProducts: [ProductBuildDescription] = [], testTargetRole: TestTargetRole? = nil, shouldGenerateTestObservation: Bool = false, shouldDisableSandbox: Bool, @@ -271,8 +267,7 @@ public final class SwiftTargetBuildDescription { self.package = package self.target = target self.toolsVersion = toolsVersion - self.defaultBuildParameters = destinationBuildParameters - self.toolsBuildParameters = toolsBuildParameters + self.buildParameters = buildParameters // Unless mentioned explicitly, use the target type to determine if this is a test target. if let testTargetRole { @@ -283,7 +278,7 @@ public final class SwiftTargetBuildDescription { self.testTargetRole = nil } - self.tempsPath = target.tempsPath(destinationBuildParameters) + self.tempsPath = target.tempsPath(self.buildParameters) self.derivedSources = Sources(paths: [], root: self.tempsPath.appending("DerivedSources")) self.buildToolPluginInvocationResults = buildToolPluginInvocationResults self.prebuildCommandResults = prebuildCommandResults @@ -297,7 +292,7 @@ public final class SwiftTargetBuildDescription { target: target, toolsVersion: toolsVersion, additionalFileRules: additionalFileRules, - buildParameters: destinationBuildParameters, + buildParameters: self.buildParameters, buildToolPluginInvocationResults: buildToolPluginInvocationResults, prebuildCommandResults: prebuildCommandResults, observabilityScope: observabilityScope @@ -335,13 +330,13 @@ public final class SwiftTargetBuildDescription { } guard - self.defaultBuildParameters.triple.isDarwin() && - self.defaultBuildParameters.testingParameters.experimentalTestOutput + self.buildParameters.triple.isDarwin() && + self.buildParameters.testingParameters.experimentalTestOutput else { return } - let content = generateTestObservationCode(buildParameters: self.defaultBuildParameters) + let content = generateTestObservationCode(buildParameters: self.buildParameters) // FIXME: We should generate this file during the actual build. self.derivedSources.relativePaths.append(subpath) @@ -382,7 +377,7 @@ public final class SwiftTargetBuildDescription { guard let bundlePath else { return } let mainPathSubstitution: String - if self.defaultBuildParameters.triple.isWASI() { + if self.buildParameters.triple.isWASI() { // We prefer compile-time evaluation of the bundle path here for WASI. There's no benefit in evaluating this // at runtime, especially as `Bundle` support in WASI Foundation is partial. We expect all resource paths to // evaluate to `/\(resourceBundleName)/\(resourcePath)`, which allows us to pass this path to JS APIs like @@ -439,15 +434,15 @@ public final class SwiftTargetBuildDescription { #if BUILD_MACROS_AS_DYLIBS self.requiredMacroProducts.forEach { macro in - args += ["-Xfrontend", "-load-plugin-library", "-Xfrontend", self.toolsBuildParameters.binaryPath(for: macro).pathString] + args += ["-Xfrontend", "-load-plugin-library", "-Xfrontend", macro.binaryPath.pathString] } #else try self.requiredMacroProducts.forEach { macro in - if let macroTarget = macro.targets.first { - let executablePath = try self.toolsBuildParameters.binaryPath(for: macro).pathString + if let macroTarget = macro.product.targets.first { + let executablePath = try macro.binaryPath.pathString args += ["-Xfrontend", "-load-plugin-executable", "-Xfrontend", "\(executablePath)#\(macroTarget.c99name)"] } else { - throw InternalError("macro product \(macro.name) has no targets") // earlier validation should normally catch this + throw InternalError("macro product \(macro.product.name) has no targets") // earlier validation should normally catch this } } #endif @@ -455,7 +450,7 @@ public final class SwiftTargetBuildDescription { if self.shouldDisableSandbox { let toolchainSupportsDisablingSandbox = DriverSupport.checkSupportedFrontendFlags( flags: ["-disable-sandbox"], - toolchain: self.defaultBuildParameters.toolchain, + toolchain: self.buildParameters.toolchain, fileSystem: fileSystem ) if toolchainSupportsDisablingSandbox { @@ -474,10 +469,10 @@ public final class SwiftTargetBuildDescription { /// The arguments needed to compile this target. public func compileArguments() throws -> [String] { var args = [String]() - args += try self.defaultBuildParameters.tripleArgs(for: self.target) + args += try self.buildParameters.tripleArgs(for: self.target) // pass `-v` during verbose builds. - if self.defaultBuildParameters.outputParameters.isVerbose { + if self.buildParameters.outputParameters.isVerbose { args += ["-v"] } @@ -485,22 +480,22 @@ public final class SwiftTargetBuildDescription { // // Technically, it should be enabled whenever WMO is off but we // don't currently make that distinction in SwiftPM - switch self.defaultBuildParameters.configuration { + switch self.buildParameters.configuration { case .debug: args += ["-enable-batch-mode"] case .release: break } - args += self.defaultBuildParameters.indexStoreArguments(for: self.target) + args += self.buildParameters.indexStoreArguments(for: self.target) args += self.optimizationArguments args += self.testingArguments - args += ["-j\(self.defaultBuildParameters.workers)"] + args += ["-j\(self.buildParameters.workers)"] args += self.activeCompilationConditions args += self.additionalFlags args += try self.moduleCacheArgs args += self.stdlibArguments - args += self.defaultBuildParameters.sanitizers.compileSwiftFlags() + args += self.buildParameters.sanitizers.compileSwiftFlags() args += ["-parseable-output"] // If we're compiling the main module of an executable other than the one that @@ -520,8 +515,8 @@ public final class SwiftTargetBuildDescription { // we can rename the symbol unconditionally. // No `-` for these flags because the set of Strings in driver.supportedFrontendFlags do // not have a leading `-` - if self.defaultBuildParameters.driverParameters.canRenameEntrypointFunctionName, - self.defaultBuildParameters.linkerFlagsForRenamingMainFunction(of: self.target) != nil + if self.buildParameters.driverParameters.canRenameEntrypointFunctionName, + self.buildParameters.linkerFlagsForRenamingMainFunction(of: self.target) != nil { args += ["-Xfrontend", "-entry-point-function-name", "-Xfrontend", "\(self.target.c99name)_main"] } @@ -534,7 +529,7 @@ public final class SwiftTargetBuildDescription { // Only add the build path to the framework search path if there are binary frameworks to link against. if !self.libraryBinaryPaths.isEmpty { - args += ["-F", self.defaultBuildParameters.buildPath.pathString] + args += ["-F", self.buildParameters.buildPath.pathString] } // Emit the ObjC compatibility header if enabled. @@ -543,12 +538,12 @@ public final class SwiftTargetBuildDescription { } // Add arguments needed for code coverage if it is enabled. - if self.defaultBuildParameters.testingParameters.enableCodeCoverage { + if self.buildParameters.testingParameters.enableCodeCoverage { args += ["-profile-coverage-mapping", "-profile-generate"] } // Add arguments to colorize output if stdout is tty - if self.defaultBuildParameters.outputParameters.isColorized { + if self.buildParameters.outputParameters.isColorized { args += ["-color-diagnostics"] } @@ -558,7 +553,7 @@ public final class SwiftTargetBuildDescription { switch testTargetRole { case .discovery, .entryPoint: for dependency in try self.target.recursiveTargetDependencies() { - let dependencyScope = self.defaultBuildParameters.createScope(for: dependency) + let dependencyScope = self.buildParameters.createScope(for: dependency) let dependencySwiftFlags = dependencyScope.evaluate(.OTHER_SWIFT_FLAGS) if let interopModeFlag = dependencySwiftFlags.first(where: { $0.hasPrefix("-cxx-interoperability-mode=") }) { args += [interopModeFlag] @@ -578,17 +573,17 @@ public final class SwiftTargetBuildDescription { // Add the output for the `.swiftinterface`, if requested or if library evolution has been enabled some other // way. - if self.defaultBuildParameters.driverParameters.enableParseableModuleInterfaces || args.contains("-enable-library-evolution") { + if self.buildParameters.driverParameters.enableParseableModuleInterfaces || args.contains("-enable-library-evolution") { args += ["-emit-module-interface-path", self.parseableModuleInterfaceOutputPath.pathString] } - args += self.defaultBuildParameters.toolchain.extraFlags.swiftCompilerFlags + args += self.buildParameters.toolchain.extraFlags.swiftCompilerFlags // User arguments (from -Xswiftc) should follow generated arguments to allow user overrides - args += self.defaultBuildParameters.flags.swiftCompilerFlags + args += self.buildParameters.flags.swiftCompilerFlags - args += self.defaultBuildParameters.toolchain.extraFlags.cCompilerFlags.asSwiftcCCompilerFlags() + args += self.buildParameters.toolchain.extraFlags.cCompilerFlags.asSwiftcCCompilerFlags() // User arguments (from -Xcc) should follow generated arguments to allow user overrides - args += self.defaultBuildParameters.flags.cCompilerFlags.asSwiftcCCompilerFlags() + args += self.buildParameters.flags.cCompilerFlags.asSwiftcCCompilerFlags() // TODO: Pass -Xcxx flags to swiftc (#6491) // Uncomment when downstream support arrives. @@ -597,7 +592,7 @@ public final class SwiftTargetBuildDescription { // args += self.buildParameters.flags.cxxCompilerFlags.asSwiftcCXXCompilerFlags() // Enable the correct LTO mode if requested. - switch self.defaultBuildParameters.linkingParameters.linkTimeOptimizationMode { + switch self.buildParameters.linkingParameters.linkTimeOptimizationMode { case nil: break case .full: @@ -607,7 +602,7 @@ public final class SwiftTargetBuildDescription { } // Pass default include paths from the toolchain. - for includeSearchPath in self.defaultBuildParameters.toolchain.includeSearchPaths { + for includeSearchPath in self.buildParameters.toolchain.includeSearchPaths { args += ["-I", includeSearchPath.pathString] } @@ -627,14 +622,14 @@ public final class SwiftTargetBuildDescription { args += self.package.packageNameArgument( target: self.target, - isPackageNameSupported: self.defaultBuildParameters.driverParameters.isPackageAccessModifierSupported + isPackageNameSupported: self.buildParameters.driverParameters.isPackageAccessModifierSupported ) args += try self.macroArguments() // rdar://117578677 // Pass -fno-omit-frame-pointer to support backtraces // this can be removed once the backtracer uses DWARF instead of frame pointers - if let omitFramePointers = self.defaultBuildParameters.debuggingParameters.omitFramePointers { + if let omitFramePointers = self.buildParameters.debuggingParameters.omitFramePointers { if omitFramePointers { args += ["-Xcc", "-fomit-frame-pointer"] } else { @@ -649,14 +644,14 @@ public final class SwiftTargetBuildDescription { /// such as emitting a module or supplementary outputs. public func emitCommandLine(scanInvocation: Bool = false) throws -> [String] { var result: [String] = [] - result.append(self.defaultBuildParameters.toolchain.swiftCompilerPath.pathString) + result.append(self.buildParameters.toolchain.swiftCompilerPath.pathString) result.append("-module-name") result.append(self.target.c99name) result.append( contentsOf: self.package.packageNameArgument( target: self.target, - isPackageNameSupported: self.defaultBuildParameters.driverParameters.isPackageAccessModifierSupported + isPackageNameSupported: self.buildParameters.driverParameters.isPackageAccessModifierSupported ) ) if !scanInvocation { @@ -672,7 +667,7 @@ public final class SwiftTargetBuildDescription { result.append(try self.writeOutputFileMap().pathString) } - if self.defaultBuildParameters.useWholeModuleOptimization { + if self.buildParameters.useWholeModuleOptimization { result.append("-whole-module-optimization") result.append("-num-threads") result.append(String(ProcessInfo.processInfo.activeProcessorCount)) @@ -692,7 +687,7 @@ public final class SwiftTargetBuildDescription { /// Returns true if ObjC compatibility header should be emitted. private var shouldEmitObjCCompatibilityHeader: Bool { - self.defaultBuildParameters.triple.isDarwin() && self.target.type == .library + self.buildParameters.triple.isDarwin() && self.target.type == .library } func writeOutputFileMap() throws -> AbsolutePath { @@ -706,7 +701,7 @@ public final class SwiftTargetBuildDescription { """# - if self.defaultBuildParameters.useWholeModuleOptimization { + if self.buildParameters.useWholeModuleOptimization { let moduleName = self.target.c99name content += #""" @@ -737,7 +732,7 @@ public final class SwiftTargetBuildDescription { // Write out the entries for each source file. let sources = self.sources let objects = try self.objects - let ltoEnabled = self.defaultBuildParameters.linkingParameters.linkTimeOptimizationMode != nil + let ltoEnabled = self.buildParameters.linkingParameters.linkTimeOptimizationMode != nil let objectKey = ltoEnabled ? "llvm-bc" : "object" for idx in 0.. [String] { - let scope = self.defaultBuildParameters.createScope(for: self.target) + let scope = self.buildParameters.createScope(for: self.target) var flags: [String] = [] // A custom swift version. @@ -855,7 +850,7 @@ public final class SwiftTargetBuildDescription { private var activeCompilationConditions: [String] { var compilationConditions = ["-DSWIFT_PACKAGE"] - switch self.defaultBuildParameters.configuration { + switch self.buildParameters.configuration { case .debug: compilationConditions += ["-DDEBUG"] case .release: @@ -867,7 +862,7 @@ public final class SwiftTargetBuildDescription { /// Optimization arguments according to the build configuration. private var optimizationArguments: [String] { - switch self.defaultBuildParameters.configuration { + switch self.buildParameters.configuration { case .debug: return ["-Onone"] case .release: @@ -881,7 +876,7 @@ public final class SwiftTargetBuildDescription { // test targets must be built with -enable-testing // since its required for test discovery (the non objective-c reflection kind) return ["-enable-testing"] - } else if self.defaultBuildParameters.testingParameters.enableTestability { + } else if self.buildParameters.testingParameters.enableTestability { return ["-enable-testing"] } else { return [] @@ -891,20 +886,20 @@ public final class SwiftTargetBuildDescription { /// Module cache arguments. private var moduleCacheArgs: [String] { get throws { - ["-module-cache-path", try self.defaultBuildParameters.moduleCache.pathString] + ["-module-cache-path", try self.buildParameters.moduleCache.pathString] } } private var stdlibArguments: [String] { var arguments: [String] = [] - let isLinkingStaticStdlib = self.defaultBuildParameters.linkingParameters.shouldLinkStaticSwiftStdlib - && self.defaultBuildParameters.triple.isSupportingStaticStdlib + let isLinkingStaticStdlib = self.buildParameters.linkingParameters.shouldLinkStaticSwiftStdlib + && self.buildParameters.triple.isSupportingStaticStdlib if isLinkingStaticStdlib { arguments += ["-static-stdlib"] } - if let resourcesPath = self.defaultBuildParameters.toolchain.swiftResourcesPath(isStatic: isLinkingStaticStdlib) { + if let resourcesPath = self.buildParameters.toolchain.swiftResourcesPath(isStatic: isLinkingStaticStdlib) { arguments += ["-resource-dir", "\(resourcesPath)"] } diff --git a/Sources/Build/BuildDescription/TargetBuildDescription.swift b/Sources/Build/BuildDescription/TargetBuildDescription.swift index 3c6ace54221..4ddda8dec70 100644 --- a/Sources/Build/BuildDescription/TargetBuildDescription.swift +++ b/Sources/Build/BuildDescription/TargetBuildDescription.swift @@ -101,7 +101,7 @@ public enum TargetBuildDescription { var buildParameters: BuildParameters { switch self { case .swift(let swiftTargetBuildDescription): - return swiftTargetBuildDescription.defaultBuildParameters + return swiftTargetBuildDescription.buildParameters case .clang(let clangTargetBuildDescription): return clangTargetBuildDescription.buildParameters } diff --git a/Sources/Build/BuildManifest/LLBuildManifestBuilder+Clang.swift b/Sources/Build/BuildManifest/LLBuildManifestBuilder+Clang.swift index e6ddfc1a4fb..3f23cf1cbc3 100644 --- a/Sources/Build/BuildManifest/LLBuildManifestBuilder+Clang.swift +++ b/Sources/Build/BuildManifest/LLBuildManifestBuilder+Clang.swift @@ -93,7 +93,7 @@ extension LLBuildManifestBuilder { let additionalInputs = try addBuildToolPlugins(.clang(target)) // Create a phony node to represent the entire target. - let targetName = target.target.getLLBuildTargetName(buildParameters: target.buildParameters) + let targetName = target.llbuildTargetName let output: Node = .virtual(targetName) self.manifest.addNode(output, toTarget: targetName) diff --git a/Sources/Build/BuildManifest/LLBuildManifestBuilder+Product.swift b/Sources/Build/BuildManifest/LLBuildManifestBuilder+Product.swift index cf8a797ed9c..d95e5b46662 100644 --- a/Sources/Build/BuildManifest/LLBuildManifestBuilder+Product.swift +++ b/Sources/Build/BuildManifest/LLBuildManifestBuilder+Product.swift @@ -11,11 +11,14 @@ //===----------------------------------------------------------------------===// import struct Basics.AbsolutePath +import struct Basics.InternalError import struct LLBuildManifest.Node +import struct SPMBuildCore.BuildParameters +import struct PackageGraph.ResolvedProduct extension LLBuildManifestBuilder { func createProductCommand(_ buildProduct: ProductBuildDescription) throws { - let cmdName = try buildProduct.product.getCommandName(buildParameters: buildProduct.buildParameters) + let cmdName = try buildProduct.commandName // Add dependency on Info.plist generation on Darwin platforms. let testInputs: [AbsolutePath] @@ -34,7 +37,7 @@ extension LLBuildManifestBuilder { } // Create a phony node to represent the entire target. - let targetName = try buildProduct.product.getLLBuildTargetName(buildParameters: buildProduct.buildParameters) + let targetName = try buildProduct.llbuildTargetName let output: Node = .virtual(targetName) let finalProductNode: Node @@ -85,7 +88,7 @@ extension LLBuildManifestBuilder { outputPath: plistPath ) - let cmdName = try buildProduct.product.getCommandName(buildParameters: buildProduct.buildParameters) + let cmdName = try buildProduct.commandName let codeSigningOutput = Node.virtual(targetName + "-CodeSigning") try self.manifest.addShellCmd( name: "\(cmdName)-entitlements", @@ -120,3 +123,48 @@ extension LLBuildManifestBuilder { ) } } + +extension ProductBuildDescription { + package var llbuildTargetName: String { + get throws { + try self.product.getLLBuildTargetName(buildParameters: self.buildParameters) + } + } + + package var commandName: String { + get throws { + try "C.\(self.llbuildTargetName)\(self.buildParameters.suffix)" + } + } +} + +extension ResolvedProduct { + public func getLLBuildTargetName(buildParameters: BuildParameters) throws -> String { + let triple = buildParameters.triple.tripleString + let config = buildParameters.buildConfig + let suffix = buildParameters.suffix + let potentialExecutableTargetName = "\(name)-\(triple)-\(config)\(suffix).exe" + let potentialLibraryTargetName = "\(name)-\(triple)-\(config)\(suffix).dylib" + + switch type { + case .library(.dynamic): + return potentialLibraryTargetName + case .test: + return "\(name)-\(triple)-\(config)\(suffix).test" + case .library(.static): + return "\(name)-\(triple)-\(config)\(suffix).a" + case .library(.automatic): + throw InternalError("automatic library not supported") + case .executable, .snippet: + return potentialExecutableTargetName + case .macro: + #if BUILD_MACROS_AS_DYLIBS + return potentialLibraryTargetName + #else + return potentialExecutableTargetName + #endif + case .plugin: + throw InternalError("unexpectedly asked for the llbuild target name of a plugin product") + } + } +} diff --git a/Sources/Build/BuildManifest/LLBuildManifestBuilder+Resources.swift b/Sources/Build/BuildManifest/LLBuildManifestBuilder+Resources.swift index df561d46b8b..79917f4eb43 100644 --- a/Sources/Build/BuildManifest/LLBuildManifestBuilder+Resources.swift +++ b/Sources/Build/BuildManifest/LLBuildManifestBuilder+Resources.swift @@ -45,7 +45,7 @@ extension LLBuildManifestBuilder { outputs.append(output) } - let cmdName = target.target.getLLBuildResourcesCmdName(buildParameters: target.buildParameters) + let cmdName = target.llbuildResourcesCmdName self.manifest.addPhonyCmd(name: cmdName, inputs: outputs, outputs: [.virtual(cmdName)]) return .virtual(cmdName) diff --git a/Sources/Build/BuildManifest/LLBuildManifestBuilder+Swift.swift b/Sources/Build/BuildManifest/LLBuildManifestBuilder+Swift.swift index 9c2ac318631..e674439ca23 100644 --- a/Sources/Build/BuildManifest/LLBuildManifestBuilder+Swift.swift +++ b/Sources/Build/BuildManifest/LLBuildManifestBuilder+Swift.swift @@ -45,7 +45,7 @@ extension LLBuildManifestBuilder { let moduleNode = Node.file(target.moduleOutputPath) let cmdOutputs = objectNodes + [moduleNode] - if target.defaultBuildParameters.driverParameters.useIntegratedSwiftDriver { + if target.buildParameters.driverParameters.useIntegratedSwiftDriver { try self.addSwiftCmdsViaIntegratedDriver( target, inputs: inputs, @@ -68,7 +68,7 @@ extension LLBuildManifestBuilder { // jobs needed to build this Swift target. var commandLine = try target.emitCommandLine() commandLine.append("-driver-use-frontend-path") - commandLine.append(target.defaultBuildParameters.toolchain.swiftCompilerPath.pathString) + commandLine.append(target.buildParameters.toolchain.swiftCompilerPath.pathString) // FIXME: At some point SwiftPM should provide its own executor for // running jobs/launching processes during planning let resolver = try ArgsResolver(fileSystem: target.fileSystem) @@ -132,7 +132,7 @@ extension LLBuildManifestBuilder { // common intermediate dependency modules, such dependencies can lead // to cycles in the resulting manifest. var manifestNodeInputs: [Node] = [] - if targetDescription.defaultBuildParameters.driverParameters.useExplicitModuleBuild && !isMainModule(job) { + if targetDescription.buildParameters.driverParameters.useExplicitModuleBuild && !isMainModule(job) { manifestNodeInputs = jobInputs } else { manifestNodeInputs = (inputs + jobInputs).uniqued() @@ -191,11 +191,8 @@ extension LLBuildManifestBuilder { public func addTargetsToExplicitBuildManifest() throws { // Sort the product targets in topological order in order to collect and "bubble up" // their respective dependency graphs to the depending targets. - let nodes: [ResolvedModule.Dependency] = try self.plan.targetMap.keys.compactMap { - guard let target = self.plan.graph.allTargets[$0] else { - throw InternalError("unknown target \($0)") - } - return ResolvedModule.Dependency.target(target, conditions: []) + let nodes = self.plan.targets.compactMap { + ResolvedModule.Dependency.target($0.target, conditions: []) } let allPackageDependencies = try topologicalSort(nodes, successors: { $0.dependencies }) // Instantiate the inter-module dependency oracle which will cache commonly-scanned @@ -287,7 +284,7 @@ extension LLBuildManifestBuilder { // jobs needed to build this Swift target. var commandLine = try targetDescription.emitCommandLine() commandLine.append("-driver-use-frontend-path") - commandLine.append(targetDescription.defaultBuildParameters.toolchain.swiftCompilerPath.pathString) + commandLine.append(targetDescription.buildParameters.toolchain.swiftCompilerPath.pathString) commandLine.append("-experimental-explicit-module-build") let resolver = try ArgsResolver(fileSystem: self.fileSystem) let executor = SPMSwiftDriverExecutor( @@ -378,14 +375,14 @@ extension LLBuildManifestBuilder { cmdOutputs: [Node] ) throws { let isLibrary = target.target.type == .library || target.target.type == .test - let cmdName = target.target.getCommandName(buildParameters: target.defaultBuildParameters) + let cmdName = target.getCommandName() self.manifest.addWriteSourcesFileListCommand(sources: target.sources, sourcesFileListPath: target.sourcesFileListPath) self.manifest.addSwiftCmd( name: cmdName, inputs: inputs + [Node.file(target.sourcesFileListPath)], outputs: cmdOutputs, - executable: target.defaultBuildParameters.toolchain.swiftCompilerPath, + executable: target.buildParameters.toolchain.swiftCompilerPath, moduleName: target.target.c99name, moduleAliases: target.target.moduleAliases, moduleOutputPath: target.moduleOutputPath, @@ -396,7 +393,7 @@ extension LLBuildManifestBuilder { sources: target.sources, fileList: target.sourcesFileListPath, isLibrary: isLibrary, - wholeModuleOptimization: target.defaultBuildParameters.configuration == .release, + wholeModuleOptimization: target.buildParameters.configuration == .release, outputFileMapPath: try target.writeOutputFileMap() // FIXME: Eliminate side effect. ) } @@ -406,7 +403,7 @@ extension LLBuildManifestBuilder { ) throws -> [Node] { var inputs = target.sources.map(Node.file) - let swiftVersionFilePath = addSwiftGetVersionCommand(buildParameters: target.defaultBuildParameters) + let swiftVersionFilePath = addSwiftGetVersionCommand(buildParameters: target.buildParameters) inputs.append(.file(swiftVersionFilePath)) // Add resources node as the input to the target. This isn't great because we @@ -430,14 +427,10 @@ extension LLBuildManifestBuilder { // Depend on the binary for executable targets. if target.type == .executable { // FIXME: Optimize. - let product = try plan.graph.allProducts.first { - try $0.type == .executable && $0.executableTarget.id == target.id - } - if let product { - guard let planProduct = plan.productMap[product.id] else { - throw InternalError("unknown product \(product)") - } - try inputs.append(file: planProduct.binaryPath) + if let productDescription = try plan.productMap.values.first(where: { + try $0.product.type == .executable && $0.product.executableTarget.id == target.id + }) { + try inputs.append(file: productDescription.binaryPath) } return } @@ -454,7 +447,7 @@ extension LLBuildManifestBuilder { } } - for dependency in target.target.dependencies(satisfying: target.defaultBuildParameters.buildEnvironment) { + for dependency in target.target.dependencies(satisfying: target.buildParameters.buildEnvironment) { switch dependency { case .target(let target, _): try addStaticTargetInputs(target) @@ -481,7 +474,7 @@ extension LLBuildManifestBuilder { } for binaryPath in target.libraryBinaryPaths { - let path = target.defaultBuildParameters.destinationPath(forBinaryAt: binaryPath) + let path = target.buildParameters.destinationPath(forBinaryAt: binaryPath) if self.fileSystem.isDirectory(binaryPath) { inputs.append(directory: path) } else { @@ -493,7 +486,7 @@ extension LLBuildManifestBuilder { // Depend on any required macro product's output. try target.requiredMacroProducts.forEach { macro in - try inputs.append(.virtual(macro.getLLBuildTargetName(buildParameters: target.defaultBuildParameters))) + try inputs.append(.virtual(macro.llbuildTargetName)) } return inputs + additionalInputs @@ -502,7 +495,7 @@ extension LLBuildManifestBuilder { /// Adds a top-level phony command that builds the entire target. private func addTargetCmd(_ target: SwiftTargetBuildDescription, cmdOutputs: [Node]) { // Create a phony node to represent the entire target. - let targetName = target.target.getLLBuildTargetName(buildParameters: target.defaultBuildParameters) + let targetName = target.getLLBuildTargetName() let targetOutput: Node = .virtual(targetName) self.manifest.addNode(targetOutput, toTarget: targetName) @@ -511,7 +504,7 @@ extension LLBuildManifestBuilder { inputs: cmdOutputs, outputs: [targetOutput] ) - if self.plan.graph.isInRootPackages(target.target, satisfying: target.defaultBuildParameters.buildEnvironment) { + if self.plan.graph.isInRootPackages(target.target, satisfying: target.buildParameters.buildEnvironment) { if !target.isTestTarget { self.addNode(targetOutput, toTarget: .main) } @@ -521,13 +514,13 @@ extension LLBuildManifestBuilder { private func addModuleWrapCmd(_ target: SwiftTargetBuildDescription) throws { // Add commands to perform the module wrapping Swift modules when debugging strategy is `modulewrap`. - guard target.defaultBuildParameters.debuggingStrategy == .modulewrap else { return } + guard target.buildParameters.debuggingStrategy == .modulewrap else { return } var moduleWrapArgs = [ - target.defaultBuildParameters.toolchain.swiftCompilerPath.pathString, + target.buildParameters.toolchain.swiftCompilerPath.pathString, "-modulewrap", target.moduleOutputPath.pathString, "-o", target.wrappedModuleOutputPath.pathString, ] - moduleWrapArgs += try target.defaultBuildParameters.tripleArgs(for: target.target) + moduleWrapArgs += try target.buildParameters.tripleArgs(for: target.target) self.manifest.addShellCmd( name: target.wrappedModuleOutputPath.pathString, description: "Wrapping AST for \(target.target.name) for debugging", @@ -608,3 +601,13 @@ extension Driver { } } } + +extension SwiftTargetBuildDescription { + public func getCommandName() -> String { + "C." + self.getLLBuildTargetName() + } + + public func getLLBuildTargetName() -> String { + self.target.getLLBuildTargetName(buildParameters: self.buildParameters) + } +} diff --git a/Sources/Build/BuildManifest/LLBuildManifestBuilder.swift b/Sources/Build/BuildManifest/LLBuildManifestBuilder.swift index d1bf1f5f7c3..61f8ee4c805 100644 --- a/Sources/Build/BuildManifest/LLBuildManifestBuilder.swift +++ b/Sources/Build/BuildManifest/LLBuildManifestBuilder.swift @@ -316,52 +316,21 @@ extension TargetBuildDescription { } } -extension ResolvedModule { - public func getCommandName(buildParameters: BuildParameters) -> String { - "C." + self.getLLBuildTargetName(buildParameters: buildParameters) - } - - public func getLLBuildTargetName(buildParameters: BuildParameters) -> String { - "\(self.name)-\(buildParameters.triple.tripleString)-\(buildParameters.buildConfig)\(buildParameters.suffix(triple: self.buildTriple)).module" - } - - public func getLLBuildResourcesCmdName(buildParameters: BuildParameters) -> String { - "\(self.name)-\(buildParameters.triple.tripleString)-\(buildParameters.buildConfig)\(buildParameters.suffix(triple: self.buildTriple)).module-resources" +extension TargetBuildDescription { + package var llbuildResourcesCmdName: String { + "\(self.target.name)-\(self.buildParameters.triple.tripleString)-\(self.buildParameters.buildConfig)\(self.buildParameters.suffix).module-resources" } } -extension ResolvedProduct { - public func getLLBuildTargetName(buildParameters: BuildParameters) throws -> String { - let triple = buildParameters.triple.tripleString - let config = buildParameters.buildConfig - let suffix = buildParameters.suffix(triple: self.buildTriple) - let potentialExecutableTargetName = "\(name)-\(triple)-\(config)\(suffix).exe" - let potentialLibraryTargetName = "\(name)-\(triple)-\(config)\(suffix).dylib" - - switch type { - case .library(.dynamic): - return potentialLibraryTargetName - case .test: - return "\(name)-\(triple)-\(config)\(suffix).test" - case .library(.static): - return "\(name)-\(triple)-\(config)\(suffix).a" - case .library(.automatic): - throw InternalError("automatic library not supported") - case .executable, .snippet: - return potentialExecutableTargetName - case .macro: - #if BUILD_MACROS_AS_DYLIBS - return potentialLibraryTargetName - #else - return potentialExecutableTargetName - #endif - case .plugin: - throw InternalError("unexpectedly asked for the llbuild target name of a plugin product") - } +extension ClangTargetBuildDescription { + package var llbuildTargetName: String { + self.target.getLLBuildTargetName(buildParameters: self.buildParameters) } +} - public func getCommandName(buildParameters: BuildParameters) throws -> String { - try "C.\(self.getLLBuildTargetName(buildParameters: buildParameters))\(buildParameters.suffix(triple: self.buildTriple))" +extension ResolvedModule { + public func getLLBuildTargetName(buildParameters: BuildParameters) -> String { + "\(self.name)-\(buildParameters.triple.tripleString)-\(buildParameters.buildConfig)\(buildParameters.suffix).module" } } diff --git a/Sources/Build/BuildOperation.swift b/Sources/Build/BuildOperation.swift index 0d4eab3a17b..348083252b9 100644 --- a/Sources/Build/BuildOperation.swift +++ b/Sources/Build/BuildOperation.swift @@ -378,9 +378,9 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS let subsetDescriptor: String? switch subset { - case .product(let productName): + case .product(let productName, _): subsetDescriptor = "product '\(productName)'" - case .target(let targetName): + case .target(let targetName, _): subsetDescriptor = "target: '\(targetName)'" case .allExcludingTests, .allIncludingTests: subsetDescriptor = nil @@ -433,10 +433,10 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS case .allExcludingTests, .allIncludingTests: pluginsToCompile = allPlugins continueBuilding = true - case .product(let productName): + case .product(let productName, _): pluginsToCompile = allPlugins.filter{ $0.productNames.contains(productName) } continueBuilding = pluginsToCompile.isEmpty - case .target(let targetName): + case .target(let targetName, _): pluginsToCompile = allPlugins.filter{ $0.targetName == targetName } continueBuilding = pluginsToCompile.isEmpty } @@ -522,17 +522,79 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS return LLBuildManifestBuilder.TargetKind.main.targetName case .allIncludingTests: return LLBuildManifestBuilder.TargetKind.test.targetName - default: + case .product(let productName, let destination): // FIXME: This is super unfortunate that we might need to load the package graph. let graph = try getPackageGraph() - if let result = subset.llbuildTargetName( - for: graph, - buildParameters: self.productsBuildParameters, - observabilityScope: self.observabilityScope - ) { - return result + + var product = graph.product( + for: productName, + destination: destination == .host ? .tools : .destination + ) + + var buildParameters = if destination == .host { + self.toolsBuildParameters + } else { + self.productsBuildParameters } - throw Diagnostics.fatalError + + // It's possible to request a build of a macro or a plugin via `swift build` + // which won't have the right destination set because it's impossible to indicate it. + if product == nil && destination == .target { + if let toolsProduct = graph.product(for: productName, destination: .tools), + toolsProduct.type == .macro || toolsProduct.type == .plugin + { + product = toolsProduct + buildParameters = self.toolsBuildParameters + } + } + + guard let product else { + observabilityScope.emit(error: "no product named '\(productName)'") + throw Diagnostics.fatalError + } + + // If the product is automatic, we build the main target because automatic products + // do not produce a binary right now. + if product.type == .library(.automatic) { + observabilityScope.emit( + warning: + "'--product' cannot be used with the automatic product '\(productName)'; building the default target instead" + ) + return LLBuildManifestBuilder.TargetKind.main.targetName + } + return try product.getLLBuildTargetName(buildParameters: buildParameters) + case .target(let targetName, let destination): + // FIXME: This is super unfortunate that we might need to load the package graph. + let graph = try getPackageGraph() + + var target = graph.target( + for: targetName, + destination: destination == .host ? .tools : .destination + ) + + var buildParameters = if destination == .host { + self.toolsBuildParameters + } else { + self.productsBuildParameters + } + + // It's possible to request a build of a macro or a plugin via `swift build` + // which won't have the right destination because it's impossible to indicate it. + if target == nil && destination == .target { + if let toolsTarget = graph.target(for: targetName, destination: .tools), + toolsTarget.type == .macro || toolsTarget.type == .plugin + { + target = toolsTarget + buildParameters = self.toolsBuildParameters + } + } + + guard let target else { + observabilityScope.emit(error: "no target named '\(targetName)'") + throw Diagnostics.fatalError + } + + return target.getLLBuildTargetName(buildParameters: buildParameters) } } @@ -550,15 +612,15 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS // done, which makes it hard to realign them all at once. var pluginsBuildParameters = self.toolsBuildParameters pluginsBuildParameters.dataPath = pluginsBuildParameters.dataPath.parentDirectory.appending(components: ["plugins", "tools"]) - var buildToolsGraph = graph - try buildToolsGraph.updateBuildTripleRecursively(.tools) + + var targetBuildParameters = pluginsBuildParameters + targetBuildParameters.destination = .target let buildOperationForPluginDependencies = BuildOperation( - // FIXME: this doesn't maintain the products/tools split cleanly - productsBuildParameters: pluginsBuildParameters, + productsBuildParameters: targetBuildParameters, toolsBuildParameters: pluginsBuildParameters, cacheBuildManifest: false, - packageGraphLoader: { buildToolsGraph }, + packageGraphLoader: { graph }, scratchDirectory: pluginsBuildParameters.dataPath, additionalFileRules: self.additionalFileRules, pkgConfigDirectories: self.pkgConfigDirectories, @@ -569,7 +631,8 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS fileSystem: self.fileSystem, observabilityScope: self.observabilityScope ) - buildToolPluginInvocationResults = try buildToolsGraph.invokeBuildToolPlugins( + + buildToolPluginInvocationResults = try graph.invokeBuildToolPlugins( outputDir: pluginConfiguration.workDirectory.appending("outputs"), buildParameters: pluginsBuildParameters, additionalFileRules: self.additionalFileRules, @@ -579,8 +642,10 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS observabilityScope: self.observabilityScope, fileSystem: self.fileSystem ) { name, path in - try buildOperationForPluginDependencies.build(subset: .product(name)) - if let builtTool = try buildOperationForPluginDependencies.buildPlan.buildProducts.first(where: { $0.product.name == name}) { + try buildOperationForPluginDependencies.build(subset: .product(name, for: .host)) + if let builtTool = try buildOperationForPluginDependencies.buildPlan.buildProducts.first(where: { + $0.product.name == name && $0.buildParameters.destination == .host + }) { return try builtTool.binaryPath } else { return nil @@ -893,57 +958,26 @@ extension BuildSubset { return Array(graph.reachableTargets) case .allExcludingTests: return graph.reachableTargets.filter { $0.type != .test } - case .product(let productName): - guard let product = graph.allProducts.first(where: { $0.name == productName }) else { + case .product(let productName, let destination): + guard let product = graph.product( + for: productName, + destination: destination == .host ? .tools : .destination + ) else { observabilityScope.emit(error: "no product named '\(productName)'") return nil } return try product.recursiveTargetDependencies() - case .target(let targetName): - guard let target = graph.allTargets.first(where: { $0.name == targetName }) else { + case .target(let targetName, let destination): + guard let target = graph.target( + for: targetName, + destination: destination == .host ? .tools : .destination + ) else { observabilityScope.emit(error: "no target named '\(targetName)'") return nil } return try target.recursiveTargetDependencies() } } - - /// Returns the name of the llbuild target that corresponds to the build subset. - func llbuildTargetName( - for graph: ModulesGraph, - buildParameters: BuildParameters, - observabilityScope: ObservabilityScope - ) -> String? { - switch self { - case .allExcludingTests: - return LLBuildManifestBuilder.TargetKind.main.targetName - case .allIncludingTests: - return LLBuildManifestBuilder.TargetKind.test.targetName - case .product(let productName): - guard let product = graph.allProducts.first(where: { $0.name == productName }) else { - observabilityScope.emit(error: "no product named '\(productName)'") - return nil - } - // If the product is automatic, we build the main target because automatic products - // do not produce a binary right now. - if product.type == .library(.automatic) { - observabilityScope.emit( - warning: - "'--product' cannot be used with the automatic product '\(productName)'; building the default target instead" - ) - return LLBuildManifestBuilder.TargetKind.main.targetName - } - return observabilityScope.trap { - try product.getLLBuildTargetName(buildParameters: buildParameters) - } - case .target(let targetName): - guard let target = graph.allTargets.first(where: { $0.name == targetName }) else { - observabilityScope.emit(error: "no target named '\(targetName)'") - return nil - } - return target.getLLBuildTargetName(buildParameters: buildParameters) - } - } } extension Basics.Diagnostic.Severity { diff --git a/Sources/Build/BuildOperationBuildSystemDelegateHandler.swift b/Sources/Build/BuildOperationBuildSystemDelegateHandler.swift index a9fc96beb0f..2eac1548dd7 100644 --- a/Sources/Build/BuildOperationBuildSystemDelegateHandler.swift +++ b/Sources/Build/BuildOperationBuildSystemDelegateHandler.swift @@ -383,29 +383,29 @@ public struct BuildDescription: Codable { .explicitTargetDependencyImportCheckingMode self.targetDependencyMap = try plan.targets.reduce(into: [TargetName: [TargetName]]()) { partial, targetBuildDescription in let deps = try targetBuildDescription.target.recursiveDependencies( - satisfying: plan.buildParameters(for: targetBuildDescription.target).buildEnvironment + satisfying: targetBuildDescription.buildParameters.buildEnvironment ) .compactMap(\.target).map(\.c99name) partial[targetBuildDescription.target.c99name] = deps } var targetCommandLines: [TargetName: [CommandLineFlag]] = [:] var generatedSourceTargets: [TargetName] = [] - for (targetID, description) in plan.targetMap { - guard case .swift(let desc) = description, let target = plan.graph.allTargets[targetID] else { + for description in plan.targets { + guard case .swift(let desc) = description else { continue } - let buildParameters = plan.buildParameters(for: target) - targetCommandLines[target.c99name] = + let buildParameters = description.buildParameters + targetCommandLines[desc.target.c99name] = try desc.emitCommandLine(scanInvocation: true) + [ "-driver-use-frontend-path", buildParameters.toolchain.swiftCompilerPath.pathString ] if case .discovery = desc.testTargetRole { - generatedSourceTargets.append(target.c99name) + generatedSourceTargets.append(desc.target.c99name) } } generatedSourceTargets.append( - contentsOf: plan.graph.allTargets.filter { $0.type == .plugin } - .map(\.c99name) + contentsOf: plan.pluginDescriptions + .map(\.targetC99Name) ) self.swiftTargetScanArgs = targetCommandLines self.generatedSourceTargetSet = Set(generatedSourceTargets) diff --git a/Sources/Build/BuildPlan/BuildPlan+Swift.swift b/Sources/Build/BuildPlan/BuildPlan+Swift.swift index dadb3c776e8..079fce95e72 100644 --- a/Sources/Build/BuildPlan/BuildPlan+Swift.swift +++ b/Sources/Build/BuildPlan/BuildPlan+Swift.swift @@ -20,7 +20,7 @@ extension BuildPlan { func plan(swiftTarget: SwiftTargetBuildDescription) throws { // We need to iterate recursive dependencies because Swift compiler needs to see all the targets a target // depends on. - let environment = swiftTarget.defaultBuildParameters.buildEnvironment + let environment = swiftTarget.buildParameters.buildEnvironment for case .target(let dependency, _) in try swiftTarget.target.recursiveDependencies(satisfying: environment) { switch dependency.underlying { case let underlyingTarget as ClangTarget where underlyingTarget.type == .library: @@ -41,7 +41,7 @@ extension BuildPlan { swiftTarget.additionalFlags += try pkgConfig(for: target).cFlags case let target as BinaryTarget: if case .xcframework = target.kind { - let libraries = try self.parseXCFramework(for: target, triple: swiftTarget.defaultBuildParameters.triple) + let libraries = try self.parseXCFramework(for: target, triple: swiftTarget.buildParameters.triple) for library in libraries { library.headersPaths.forEach { swiftTarget.additionalFlags += ["-I", $0.pathString, "-Xcc", "-I", "-Xcc", $0.pathString] diff --git a/Sources/Build/BuildPlan/BuildPlan+Test.swift b/Sources/Build/BuildPlan/BuildPlan+Test.swift index b82828608f1..33b4cc140d6 100644 --- a/Sources/Build/BuildPlan/BuildPlan+Test.swift +++ b/Sources/Build/BuildPlan/BuildPlan+Test.swift @@ -16,6 +16,7 @@ import struct Basics.AbsolutePath import struct LLBuildManifest.TestDiscoveryTool import struct LLBuildManifest.TestEntryPointTool import struct PackageGraph.ModulesGraph +import struct PackageGraph.ResolvedPackage import struct PackageGraph.ResolvedProduct import struct PackageGraph.ResolvedModule import struct PackageModel.Sources @@ -26,9 +27,9 @@ import protocol TSCBasic.FileSystem extension BuildPlan { static func makeDerivedTestTargets( + testProducts: [(product: ResolvedProduct, buildDescription: ProductBuildDescription)], destinationBuildParameters: BuildParameters, toolsBuildParameters: BuildParameters, - _ graph: ModulesGraph, shouldDisableSandbox: Bool, _ fileSystem: FileSystem, _ observabilityScope: ObservabilityScope @@ -44,15 +45,14 @@ extension BuildPlan { var isDiscoveryEnabledRedundantly = explicitlyEnabledDiscovery && !isEntryPointPathSpecifiedExplicitly var result: [(ResolvedProduct, SwiftTargetBuildDescription?, SwiftTargetBuildDescription)] = [] - for testProduct in graph.allProducts where testProduct.type == .test { - guard let package = graph.package(for: testProduct) else { - throw InternalError("package not found for \(testProduct)") - } + for (testProduct, testBuildDescription) in testProducts { + let package = testBuildDescription.package + isDiscoveryEnabledRedundantly = isDiscoveryEnabledRedundantly && nil == testProduct.testEntryPointTarget // If a non-explicitly specified test entry point file exists, prefer that over test discovery. // This is designed as an escape hatch when test discovery is not appropriate and for backwards // compatibility for projects that have existing test entry point files (e.g. XCTMain.swift, LinuxMain.swift). - let toolsVersion = graph.package(for: testProduct)?.manifest.toolsVersion ?? .v5_5 + let toolsVersion = package.manifest.toolsVersion // If `testProduct.testEntryPointTarget` is non-nil, it may either represent an `XCTMain.swift` (formerly `LinuxMain.swift`) file // if such a file is located in the package, or it may represent a test entry point file at a path specified by the option @@ -93,21 +93,13 @@ extension BuildPlan { supportedPlatforms: testProduct.supportedPlatforms, platformVersionProvider: testProduct.platformVersionProvider ) - discoveryResolvedTarget.buildTriple = testProduct.buildTriple - let discoveryTargetBuildParameters: BuildParameters - switch discoveryResolvedTarget.buildTriple { - case .tools: - discoveryTargetBuildParameters = toolsBuildParameters - case .destination: - discoveryTargetBuildParameters = destinationBuildParameters - } + let discoveryTargetBuildDescription = try SwiftTargetBuildDescription( package: package, target: discoveryResolvedTarget, toolsVersion: toolsVersion, - destinationBuildParameters: discoveryTargetBuildParameters, - toolsBuildParameters: toolsBuildParameters, + buildParameters: testBuildDescription.buildParameters, testTargetRole: .discovery, shouldDisableSandbox: shouldDisableSandbox, fileSystem: fileSystem, @@ -144,20 +136,12 @@ extension BuildPlan { platformVersionProvider: testProduct.platformVersionProvider ) entryPointResolvedTarget.buildTriple = testProduct.buildTriple - let entryPointBuildParameters: BuildParameters - switch entryPointResolvedTarget.buildTriple { - case .tools: - entryPointBuildParameters = toolsBuildParameters - case .destination: - entryPointBuildParameters = destinationBuildParameters - } return try SwiftTargetBuildDescription( package: package, target: entryPointResolvedTarget, toolsVersion: toolsVersion, - destinationBuildParameters: entryPointBuildParameters, - toolsBuildParameters: toolsBuildParameters, + buildParameters: testBuildDescription.buildParameters, testTargetRole: .entryPoint(isSynthesized: true), shouldDisableSandbox: shouldDisableSandbox, fileSystem: fileSystem, @@ -202,8 +186,7 @@ extension BuildPlan { package: package, target: entryPointResolvedTarget, toolsVersion: toolsVersion, - destinationBuildParameters: destinationBuildParameters, - toolsBuildParameters: toolsBuildParameters, + buildParameters: destinationBuildParameters, testTargetRole: .entryPoint(isSynthesized: false), shouldDisableSandbox: shouldDisableSandbox, fileSystem: fileSystem, @@ -225,8 +208,7 @@ extension BuildPlan { package: package, target: entryPointResolvedTarget, toolsVersion: toolsVersion, - destinationBuildParameters: destinationBuildParameters, - toolsBuildParameters: toolsBuildParameters, + buildParameters: destinationBuildParameters, testTargetRole: .entryPoint(isSynthesized: false), shouldDisableSandbox: shouldDisableSandbox, fileSystem: fileSystem, diff --git a/Sources/Build/BuildPlan/BuildPlan.swift b/Sources/Build/BuildPlan/BuildPlan.swift index 7c2d854cf9a..e76b4347be7 100644 --- a/Sources/Build/BuildPlan/BuildPlan.swift +++ b/Sources/Build/BuildPlan/BuildPlan.swift @@ -237,28 +237,6 @@ public class BuildPlan: SPMBuildCore.BuildPlan { /// ObservabilityScope with which to emit diagnostics let observabilityScope: ObservabilityScope - @available(*, deprecated, renamed: "init(destinationBuildParameters:toolsBuildParameters:graph:)") - public convenience init( - buildParameters: BuildParameters, - graph: ModulesGraph, - additionalFileRules: [FileRuleDescription] = [], - buildToolPluginInvocationResults: [ResolvedModule.ID: [BuildToolPluginInvocationResult]] = [:], - prebuildCommandResults: [ResolvedModule.ID: [PrebuildCommandResult]] = [:], - fileSystem: any FileSystem, - observabilityScope: ObservabilityScope - ) throws { - try self.init( - destinationBuildParameters: buildParameters, - toolsBuildParameters: buildParameters, - graph: graph, - additionalFileRules: additionalFileRules, - buildToolPluginInvocationResults: buildToolPluginInvocationResults, - prebuildCommandResults: prebuildCommandResults, - fileSystem: fileSystem, - observabilityScope: observabilityScope - ) - } - @available(*, deprecated, renamed: "init(destinationBuildParameters:toolsBuildParameters:graph:fileSystem:observabilityScope:)") public convenience init( productsBuildParameters: BuildParameters, @@ -380,7 +358,15 @@ public class BuildPlan: SPMBuildCore.BuildPlan { let requiredMacroProducts = try target.recursiveTargetDependencies() .filter { $0.underlying.type == .macro } - .compactMap { macroProductsByTarget[$0.id] } + .compactMap { + guard let product = macroProductsByTarget[$0.id], + let description = productMap[product.id] else + { + throw InternalError("macro product not found for \($0)") + } + + return description.buildDescription + } var generateTestObservation = false if target.type == .test && shouldGenerateTestObservation { @@ -394,8 +380,7 @@ public class BuildPlan: SPMBuildCore.BuildPlan { target: target, toolsVersion: toolsVersion, additionalFileRules: additionalFileRules, - destinationBuildParameters: buildParameters, - toolsBuildParameters: toolsBuildParameters, + buildParameters: buildParameters, buildToolPluginInvocationResults: buildToolPluginInvocationResults[target.id] ?? [], prebuildCommandResults: prebuildCommandResults[target.id] ?? [], requiredMacroProducts: requiredMacroProducts, @@ -454,9 +439,11 @@ public class BuildPlan: SPMBuildCore.BuildPlan { // Plan the derived test targets, if necessary. if destinationBuildParameters.testingParameters.testProductStyle.requiresAdditionalDerivedTestTargets { let derivedTestTargets = try Self.makeDerivedTestTargets( + testProducts: productMap.values.filter { + $0.product.type == .test + }, destinationBuildParameters: destinationBuildParameters, toolsBuildParameters: toolsBuildParameters, - graph, shouldDisableSandbox: self.shouldDisableSandbox, self.fileSystem, self.observabilityScope @@ -595,7 +582,7 @@ public class BuildPlan: SPMBuildCore.BuildPlan { arguments.append("-l" + replProductName) // The graph should have the REPL product. - assert(self.graph.allProducts.first(where: { $0.name == replProductName }) != nil) + assert(self.graph.product(for: replProductName, destination: .destination) != nil) // Add the search path to the directory containing the modulemap file. for target in self.targets { diff --git a/Sources/Commands/PackageCommands/DumpCommands.swift b/Sources/Commands/PackageCommands/DumpCommands.swift index 0d080d7d3c3..81b5e5ac3ba 100644 --- a/Sources/Commands/PackageCommands/DumpCommands.swift +++ b/Sources/Commands/PackageCommands/DumpCommands.swift @@ -72,6 +72,7 @@ struct DumpSymbolGraph: SwiftCommand { let result = try symbolGraphExtractor.extractSymbolGraph( module: target, buildPlan: buildPlan, + buildParameters: buildPlan.destinationBuildParameters, outputRedirection: .collect(redirectStderr: true), outputDirectory: symbolGraphDirectory, verboseOutput: swiftCommandState.logLevel <= .info diff --git a/Sources/Commands/PackageCommands/PluginCommand.swift b/Sources/Commands/PackageCommands/PluginCommand.swift index 02d935e0ee1..fedf4df39d6 100644 --- a/Sources/Commands/PackageCommands/PluginCommand.swift +++ b/Sources/Commands/PackageCommands/PluginCommand.swift @@ -317,30 +317,27 @@ struct PluginCommand: SwiftCommand { let toolSearchDirs = [try swiftCommandState.getTargetToolchain().swiftCompilerPath.parentDirectory] + getEnvSearchPaths(pathString: ProcessEnv.path, currentWorkingDirectory: .none) - var buildToolsGraph = packageGraph - try buildToolsGraph.updateBuildTripleRecursively(.tools) - let buildParameters = try swiftCommandState.toolsBuildParameters // Build or bring up-to-date any executable host-side tools on which this plugin depends. Add them and any binary dependencies to the tool-names-to-path map. let buildSystem = try swiftCommandState.createBuildSystem( explicitBuildSystem: .native, cacheBuildManifest: false, - // Force all dependencies to be built for the host, to work around the fact that BuildOperation.plan - // knows to compile build tool plugin dependencies for the host but does not do the same for command - // plugins. - productsBuildParameters: buildParameters, - packageGraphLoader: { buildToolsGraph } + productsBuildParameters: swiftCommandState.productsBuildParameters, + toolsBuildParameters: buildParameters, + packageGraphLoader: { packageGraph } ) let accessibleTools = try plugin.processAccessibleTools( - packageGraph: buildToolsGraph, + packageGraph: packageGraph, fileSystem: swiftCommandState.fileSystem, environment: buildParameters.buildEnvironment, for: try pluginScriptRunner.hostTriple ) { name, _ in // Build the product referenced by the tool, and add the executable to the tool map. Product dependencies are not supported within a package, so if the tool happens to be from the same package, we instead find the executable that corresponds to the product. There is always one, because of autogeneration of implicit executables with the same name as the target if there isn't an explicit one. - try buildSystem.build(subset: .product(name)) - if let builtTool = try buildSystem.buildPlan.buildProducts.first(where: { $0.product.name == name }) { + try buildSystem.build(subset: .product(name, for: .host)) + if let builtTool = try buildSystem.buildPlan.buildProducts.first(where: { + $0.product.name == name && $0.buildParameters.destination == .host + }) { return try builtTool.binaryPath } else { return nil diff --git a/Sources/Commands/Snippets/Cards/SnippetCard.swift b/Sources/Commands/Snippets/Cards/SnippetCard.swift index 72f1afa1017..05e8f7dac06 100644 --- a/Sources/Commands/Snippets/Cards/SnippetCard.swift +++ b/Sources/Commands/Snippets/Cards/SnippetCard.swift @@ -96,7 +96,7 @@ struct SnippetCard: Card { let buildSystem = try swiftCommandState.createBuildSystem(explicitProduct: snippet.name) try buildSystem.build(subset: .product(snippet.name)) let executablePath = try swiftCommandState.productsBuildParameters.buildPath.appending(component: snippet.name) - if let exampleTarget = try buildSystem.getPackageGraph().allTargets.first(where: { $0.name == snippet.name }) { + if let exampleTarget = try buildSystem.getPackageGraph().target(for: snippet.name, destination: .destination) { try ProcessEnv.chdir(exampleTarget.sources.paths[0].parentDirectory) } try exec(path: executablePath.pathString, args: []) diff --git a/Sources/Commands/SwiftRunCommand.swift b/Sources/Commands/SwiftRunCommand.swift index 145bfd93af4..eeec6f315c1 100644 --- a/Sources/Commands/SwiftRunCommand.swift +++ b/Sources/Commands/SwiftRunCommand.swift @@ -218,8 +218,11 @@ public struct SwiftRunCommand: AsyncSwiftCommand { /// Returns the path to the correct executable based on options. private func findProductName(in graph: ModulesGraph) throws -> String { if let executable = options.executable { - let executableExists = graph.allProducts.contains { ($0.type == .executable || $0.type == .snippet) && $0.name == executable } - guard executableExists else { + // There should be only one product with the given name in the graph + // and it should be executable or snippet. + guard let product = graph.product(for: executable, destination: .destination), + product.type == .executable || product.type == .snippet + else { throw RunError.executableNotFound(executable) } return executable diff --git a/Sources/Commands/SwiftTestCommand.swift b/Sources/Commands/SwiftTestCommand.swift index fa2e7acb8f8..c3daf48ec5b 100644 --- a/Sources/Commands/SwiftTestCommand.swift +++ b/Sources/Commands/SwiftTestCommand.swift @@ -1381,7 +1381,12 @@ private func buildTestsIfNeeded( toolsBuildParameters: toolsBuildParameters ) - let subset = testProduct.map(BuildSubset.product) ?? .allIncludingTests + let subset: BuildSubset = if let testProduct { + .product(testProduct) + } else { + .allIncludingTests + } + try buildSystem.build(subset: subset) // Find the test product. diff --git a/Sources/Commands/Utilities/PluginDelegate.swift b/Sources/Commands/Utilities/PluginDelegate.swift index 91ff33dcaec..b30bac6b245 100644 --- a/Sources/Commands/Utilities/PluginDelegate.swift +++ b/Sources/Commands/Utilities/PluginDelegate.swift @@ -385,7 +385,7 @@ final class PluginDelegate: PluginInvocationDelegate { // Find the target in the build operation's package graph; it's an error if we don't find it. let packageGraph = try buildSystem.getPackageGraph() - guard let target = packageGraph.allTargets.first(where: { $0.name == targetName }) else { + guard let target = packageGraph.target(for: targetName, destination: .destination) else { throw StringError("could not find a target named “\(targetName)”") } @@ -430,6 +430,7 @@ final class PluginDelegate: PluginInvocationDelegate { let result = try symbolGraphExtractor.extractSymbolGraph( module: target, buildPlan: try buildSystem.buildPlan, + buildParameters: buildSystem.buildPlan.destinationBuildParameters, outputRedirection: .collect, outputDirectory: outputDir, verboseOutput: self.swiftCommandState.logLevel <= .info diff --git a/Sources/Commands/Utilities/SymbolGraphExtract.swift b/Sources/Commands/Utilities/SymbolGraphExtract.swift index aa968653269..6b8774078ea 100644 --- a/Sources/Commands/Utilities/SymbolGraphExtract.swift +++ b/Sources/Commands/Utilities/SymbolGraphExtract.swift @@ -56,11 +56,11 @@ public struct SymbolGraphExtract { public func extractSymbolGraph( module: ResolvedModule, buildPlan: BuildPlan, + buildParameters: BuildParameters, outputRedirection: TSCBasic.Process.OutputRedirection = .none, outputDirectory: AbsolutePath, verboseOutput: Bool ) throws -> ProcessResult { - let buildParameters = buildPlan.buildParameters(for: module) try self.fileSystem.createDirectory(outputDirectory, recursive: true) // Construct arguments for extracting symbols for a single target. diff --git a/Sources/CoreCommands/SwiftCommandState.swift b/Sources/CoreCommands/SwiftCommandState.swift index 3a2025f21da..8b34df7f806 100644 --- a/Sources/CoreCommands/SwiftCommandState.swift +++ b/Sources/CoreCommands/SwiftCommandState.swift @@ -725,7 +725,10 @@ public final class SwiftCommandState { when building on macOS. """ - private func _buildParams(toolchain: UserToolchain) throws -> BuildParameters { + private func _buildParams( + toolchain: UserToolchain, + destination: BuildParameters.Destination + ) throws -> BuildParameters { let triple = toolchain.targetTriple let dataPath = self.scratchDirectory.appending( @@ -737,6 +740,7 @@ public final class SwiftCommandState { } return try BuildParameters( + destination: destination, dataPath: dataPath, configuration: options.build.configuration, toolchain: toolchain, @@ -796,7 +800,7 @@ public final class SwiftCommandState { private lazy var _toolsBuildParameters: Result = { Result(catching: { - try _buildParams(toolchain: self.getHostToolchain()) + try _buildParams(toolchain: self.getHostToolchain(), destination: .host) }) }() @@ -808,7 +812,7 @@ public final class SwiftCommandState { private lazy var _productsBuildParameters: Result = { Result(catching: { - try _buildParams(toolchain: self.getTargetToolchain()) + try _buildParams(toolchain: self.getTargetToolchain(), destination: .target) }) }() diff --git a/Sources/PackageGraph/BuildTriple.swift b/Sources/PackageGraph/BuildTriple.swift index 87d2daf21f1..a930d8255c0 100644 --- a/Sources/PackageGraph/BuildTriple.swift +++ b/Sources/PackageGraph/BuildTriple.swift @@ -16,12 +16,12 @@ import class PackageModel.Product /// Triple for which code should be compiled for. /// > Note: We're not using "host" and "target" triple terminology in this enum, as that clashes with build /// > system "targets" and can lead to confusion in this context. -public enum BuildTriple { +public enum BuildTriple: String { /// Triple for which build tools are compiled (the host triple). - case tools + case tools = "tools" /// Triple of the destination platform for which end products are compiled (the target triple). - case destination + case destination = "destination" } extension Target { diff --git a/Sources/PackageGraph/ModulesGraph.swift b/Sources/PackageGraph/ModulesGraph.swift index d65e767e128..3b0133d6247 100644 --- a/Sources/PackageGraph/ModulesGraph.swift +++ b/Sources/PackageGraph/ModulesGraph.swift @@ -166,6 +166,14 @@ public struct ModulesGraph { package.dependencies.compactMap { self.package(for: $0) } } + public func product(for name: String, destination: BuildTriple) -> ResolvedProduct? { + self.allProducts.first { $0.name == name && $0.buildTriple == destination } + } + + public func target(for name: String, destination: BuildTriple) -> ResolvedModule? { + self.allTargets.first { $0.name == name && $0.buildTriple == destination } + } + /// All root and root dependency packages provided as input to the graph. public let inputPackages: [ResolvedPackage] @@ -212,6 +220,38 @@ public struct ModulesGraph { } } } + + // Create a new executable product if plugin depends on an executable target. + // This is necessary, even though PackageBuilder creates one already, because + // that product is going to be built for `destination`, and this one has to + // be built for `tools`. + if target.underlying is PluginTarget { + for dependency in target.dependencies { + switch dependency { + case .product(_, conditions: _): + break + + case .target(let target, conditions: _): + if target.type != .executable { + continue + } + + var product = try ResolvedProduct( + packageIdentity: target.packageIdentity, + product: .init( + package: target.packageIdentity, + name: target.name, + type: .executable, + targets: [target.underlying] + ), + targets: IdentifiableSet([target]) + ) + product.buildTriple = .tools + + allProducts.insert(product) + } + } + } } if rootPackages.contains(id: package.id) { @@ -235,30 +275,6 @@ public struct ModulesGraph { self.allProducts = allProducts } - package mutating func updateBuildTripleRecursively(_ buildTriple: BuildTriple) throws { - self.reachableTargets = IdentifiableSet(self.reachableTargets.map { - var target = $0 - target.buildTriple = buildTriple - return target - }) - self.reachableProducts = IdentifiableSet(self.reachableProducts.map { - var product = $0 - product.buildTriple = buildTriple - return product - }) - - self.allTargets = IdentifiableSet(self.allTargets.map { - var target = $0 - target.buildTriple = buildTriple - return target - }) - self.allProducts = IdentifiableSet(self.allProducts.map { - var product = $0 - product.buildTriple = buildTriple - return product - }) - } - /// Computes a map from each executable target in any of the root packages to the corresponding test targets. @_spi(SwiftPMInternal) public func computeTestTargetsForExecutableTargets() throws -> [ResolvedModule.ID: [ResolvedModule]] { diff --git a/Sources/SPMBuildCore/BuildParameters/BuildParameters.swift b/Sources/SPMBuildCore/BuildParameters/BuildParameters.swift index baf1e966d1a..4d51ec354c5 100644 --- a/Sources/SPMBuildCore/BuildParameters/BuildParameters.swift +++ b/Sources/SPMBuildCore/BuildParameters/BuildParameters.swift @@ -26,6 +26,18 @@ public struct BuildParameters: Encodable { case auto } + /// The destination for which code should be compiled for. + public enum Destination: Encodable { + /// The destination for which build tools are compiled. + case host + + /// The destination for which end products are compiled. + case target + } + + /// The destination these parameters are going to be used for. + public var destination: Destination + /// The path to the data directory. public var dataPath: AbsolutePath @@ -118,6 +130,7 @@ public struct BuildParameters: Encodable { public var testingParameters: Testing public init( + destination: Destination, dataPath: AbsolutePath, configuration: BuildConfiguration, toolchain: Toolchain, @@ -144,6 +157,7 @@ public struct BuildParameters: Encodable { omitFramePointers: nil ) + self.destination = destination self.dataPath = dataPath self.configuration = configuration self._toolchain = _Toolchain(toolchain: toolchain) @@ -243,18 +257,18 @@ public struct BuildParameters: Encodable { /// Returns the path to the dynamic library of a product for the current build parameters. func potentialDynamicLibraryPath(for product: ResolvedProduct) throws -> RelativePath { - try RelativePath(validating: "\(self.triple.dynamicLibraryPrefix)\(product.name)\(self.suffix(triple: product.buildTriple))\(self.triple.dynamicLibraryExtension)") + try RelativePath(validating: "\(self.triple.dynamicLibraryPrefix)\(product.name)\(self.suffix)\(self.triple.dynamicLibraryExtension)") } /// Returns the path to the binary of a product for the current build parameters, relative to the build directory. public func binaryRelativePath(for product: ResolvedProduct) throws -> RelativePath { - let potentialExecutablePath = try RelativePath(validating: "\(product.name)\(self.suffix(triple: product.buildTriple))\(self.triple.executableExtension)") + let potentialExecutablePath = try RelativePath(validating: "\(product.name)\(self.suffix)\(self.triple.executableExtension)") switch product.type { case .executable, .snippet: return potentialExecutablePath case .library(.static): - return try RelativePath(validating: "lib\(product.name)\(self.suffix(triple: product.buildTriple))\(self.triple.staticLibraryExtension)") + return try RelativePath(validating: "lib\(product.name)\(self.suffix)\(self.triple.staticLibraryExtension)") case .library(.dynamic): return try potentialDynamicLibraryPath(for: product) case .library(.automatic), .plugin: @@ -333,7 +347,7 @@ extension Triple { extension BuildParameters { /// Suffix appended to build manifest nodes to distinguish nodes created for tools from nodes created for /// end products, i.e. nodes for host vs target triples. - package func suffix(triple: BuildTriple) -> String { - if triple == .tools { "-tool" } else { "" } + package var suffix: String { + if destination == .host { "-tool" } else { "" } } } diff --git a/Sources/SPMBuildCore/BuildSystem/BuildSystem.swift b/Sources/SPMBuildCore/BuildSystem/BuildSystem.swift index 5bdd8a35470..280d7f1954a 100644 --- a/Sources/SPMBuildCore/BuildSystem/BuildSystem.swift +++ b/Sources/SPMBuildCore/BuildSystem/BuildSystem.swift @@ -25,10 +25,10 @@ public enum BuildSubset { case allIncludingTests /// Represents a specific product. - case product(String) + case product(String, for: BuildParameters.Destination = .target) /// Represents a specific target. - case target(String) + case target(String, for: BuildParameters.Destination = .target) } /// A protocol that represents a build system used by SwiftPM for all build operations. This allows factoring out the @@ -92,28 +92,6 @@ public protocol BuildPlan { func createREPLArguments() throws -> [String] } -extension BuildPlan { - /// Parameters used for building a given target. - public func buildParameters(for target: ResolvedModule) -> BuildParameters { - switch target.buildTriple { - case .tools: - return self.toolsBuildParameters - case .destination: - return self.destinationBuildParameters - } - } - - /// Parameters used for building a given product. - public func buildParameters(for product: ResolvedProduct) -> BuildParameters { - switch product.buildTriple { - case .tools: - return self.toolsBuildParameters - case .destination: - return self.destinationBuildParameters - } - } -} - public protocol BuildSystemFactory { func makeBuildSystem( explicitProduct: String?, diff --git a/Sources/SPMBuildCore/Plugins/PluginInvocation.swift b/Sources/SPMBuildCore/Plugins/PluginInvocation.swift index 3ab08cd47d5..4c194395370 100644 --- a/Sources/SPMBuildCore/Plugins/PluginInvocation.swift +++ b/Sources/SPMBuildCore/Plugins/PluginInvocation.swift @@ -452,7 +452,7 @@ extension ModulesGraph { let toolPaths = accessibleTools.values.map { $0.path }.sorted() // Assign a plugin working directory based on the package, target, and plugin. - let pluginOutputDir = outputDir.appending(components: package.identity.description, target.name, pluginTarget.name) + let pluginOutputDir = outputDir.appending(components: package.identity.description, target.name, target.buildTriple.rawValue, pluginTarget.name) // Determine the set of directories under which plugins are allowed to write. We always include just the output directory, and for now there is no possibility of opting into others. let writableDirectories = [outputDir] @@ -597,9 +597,7 @@ extension ModulesGraph { } // Associate the list of results with the target. The list will have one entry for each plugin used by the target. - var targetID = target.id - targetID.buildTriple = .destination - pluginResultsByTarget[targetID] = (target, buildToolPluginResults) + pluginResultsByTarget[target.id] = (target, buildToolPluginResults) } return pluginResultsByTarget } @@ -677,7 +675,7 @@ public extension PluginTarget { executableOrBinaryTarget = target case .product(let productRef, _): guard - let product = packageGraph.allProducts.first(where: { $0.name == productRef.name }), + let product = packageGraph.product(for: productRef.name, destination: .tools), let executableTarget = product.targets.map({ $0.underlying }).executables.spm_only else { throw StringError("no product named \(productRef.name)") diff --git a/Sources/SPMTestSupport/MockBuildTestHelper.swift b/Sources/SPMTestSupport/MockBuildTestHelper.swift index 438a29f98db..1ff6888465f 100644 --- a/Sources/SPMTestSupport/MockBuildTestHelper.swift +++ b/Sources/SPMTestSupport/MockBuildTestHelper.swift @@ -15,6 +15,7 @@ import Basics @_spi(SwiftPMInternal) import Build +import struct PackageGraph.ModulesGraph import struct PackageGraph.ResolvedModule import struct PackageGraph.ResolvedProduct import PackageModel @@ -75,6 +76,7 @@ public let defaultTargetTriple: String = hostTriple.tripleString #endif public func mockBuildParameters( + destination: BuildParameters.Destination, buildPath: AbsolutePath? = nil, config: BuildConfiguration = .debug, toolchain: PackageModel.Toolchain = MockToolchain(), @@ -90,6 +92,7 @@ public func mockBuildParameters( omitFramePointers: Bool? = nil ) -> BuildParameters { try! BuildParameters( + destination: destination, dataPath: buildPath ?? AbsolutePath("/path/to/build").appending(triple.tripleString), configuration: config, toolchain: toolchain, @@ -116,7 +119,10 @@ public func mockBuildParameters( ) } -public func mockBuildParameters(environment: BuildEnvironment) -> BuildParameters { +public func mockBuildParameters( + destination: BuildParameters.Destination, + environment: BuildEnvironment +) -> BuildParameters { let triple: Basics.Triple switch environment.platform { case .macOS: @@ -131,9 +137,121 @@ public func mockBuildParameters(environment: BuildEnvironment) -> BuildParameter fatalError("unsupported platform in tests") } - return mockBuildParameters(config: environment.configuration ?? .debug, triple: triple) + return mockBuildParameters( + destination: destination, + config: environment.configuration ?? .debug, + triple: triple + ) } +public func mockBuildPlan( + buildPath: AbsolutePath? = nil, + environment: BuildEnvironment, + toolchain: PackageModel.Toolchain = MockToolchain(), + graph: ModulesGraph, + commonFlags: PackageModel.BuildFlags = .init(), + indexStoreMode: BuildParameters.IndexStoreMode = .off, + omitFramePointers: Bool? = nil, + driverParameters: BuildParameters.Driver = .init(), + linkingParameters: BuildParameters.Linking = .init(), + targetSanitizers: EnabledSanitizers = .init(), + fileSystem fs: any FileSystem, + observabilityScope: ObservabilityScope +) throws -> Build.BuildPlan { + try mockBuildPlan( + buildPath: buildPath, + config: environment.configuration ?? .debug, + platform: environment.platform, + toolchain: toolchain, + graph: graph, + commonFlags: commonFlags, + indexStoreMode: indexStoreMode, + omitFramePointers: omitFramePointers, + driverParameters: driverParameters, + linkingParameters: linkingParameters, + targetSanitizers: targetSanitizers, + fileSystem: fs, + observabilityScope: observabilityScope + ) +} + +public func mockBuildPlan( + buildPath: AbsolutePath? = nil, + config: BuildConfiguration = .debug, + triple: Basics.Triple? = nil, + platform: PackageModel.Platform? = nil, + toolchain: PackageModel.Toolchain = MockToolchain(), + graph: ModulesGraph, + commonFlags: PackageModel.BuildFlags = .init(), + indexStoreMode: BuildParameters.IndexStoreMode = .off, + omitFramePointers: Bool? = nil, + driverParameters: BuildParameters.Driver = .init(), + linkingParameters: BuildParameters.Linking = .init(), + targetSanitizers: EnabledSanitizers = .init(), + fileSystem fs: any FileSystem, + observabilityScope: ObservabilityScope +) throws -> Build.BuildPlan { + let inferredTriple: Basics.Triple + if let platform { + precondition(triple == nil) + + inferredTriple = switch platform { + case .macOS: + Triple.x86_64MacOS + case .linux: + Triple.arm64Linux + case .android: + Triple.arm64Android + case .windows: + Triple.windows + default: + fatalError("unsupported platform in tests") + } + } else { + inferredTriple = triple ?? hostTriple + } + + let commonDebuggingParameters = BuildParameters.Debugging( + triple: inferredTriple, + shouldEnableDebuggingEntitlement: config == .debug, + omitFramePointers: omitFramePointers + ) + + var destinationParameters = mockBuildParameters( + destination: .target, + buildPath: buildPath, + config: config, + toolchain: toolchain, + flags: commonFlags, + triple: inferredTriple, + indexStoreMode: indexStoreMode + ) + destinationParameters.debuggingParameters = commonDebuggingParameters + destinationParameters.driverParameters = driverParameters + destinationParameters.linkingParameters = linkingParameters + destinationParameters.sanitizers = targetSanitizers + + var hostParameters = mockBuildParameters( + destination: .host, + buildPath: buildPath, + config: config, + toolchain: toolchain, + flags: commonFlags, + triple: inferredTriple, + indexStoreMode: indexStoreMode + ) + hostParameters.debuggingParameters = commonDebuggingParameters + hostParameters.driverParameters = driverParameters + hostParameters.linkingParameters = linkingParameters + + return try BuildPlan( + destinationBuildParameters: destinationParameters, + toolsBuildParameters: hostParameters, + graph: graph, + fileSystem: fs, + observabilityScope: observabilityScope + ) +} enum BuildError: Swift.Error { case error(String) } diff --git a/Sources/SPMTestSupport/PackageGraphTester.swift b/Sources/SPMTestSupport/PackageGraphTester.swift index 3e1e91e46f1..2c993a5f3cd 100644 --- a/Sources/SPMTestSupport/PackageGraphTester.swift +++ b/Sources/SPMTestSupport/PackageGraphTester.swift @@ -88,19 +88,18 @@ public final class PackageGraphResult { public func checkTarget( _ name: String, + destination: BuildTriple = .destination, file: StaticString = #file, line: UInt = #line, body: (ResolvedTargetResult) -> Void ) { - let targets = find(target: name) + let target = graph.target(for: name, destination: destination) - guard targets.count > 0 else { + guard let target else { return XCTFail("Target \(name) not found", file: file, line: line) } - guard targets.count == 1 else { - return XCTFail("More than a single target with name \(name) found", file: file, line: line) - } - body(ResolvedTargetResult(targets[0])) + + body(ResolvedTargetResult(target)) } package func checkTargets( @@ -114,20 +113,18 @@ public final class PackageGraphResult { public func checkProduct( _ name: String, + destination: BuildTriple = .destination, file: StaticString = #file, line: UInt = #line, body: (ResolvedProductResult) -> Void ) { - let products = find(product: name) + let product = graph.product(for: name, destination: destination) - guard products.count > 0 else { + guard let product else { return XCTFail("Product \(name) not found", file: file, line: line) } - guard products.count == 1 else { - return XCTFail("More than a single product with name \(name) found", file: file, line: line) - } - body(ResolvedProductResult(products[0])) + body(ResolvedProductResult(product)) } public func check(testModules: String..., file: StaticString = #file, line: UInt = #line) { @@ -138,14 +135,6 @@ public final class PackageGraphResult { .sorted(), testModules.sorted(), file: file, line: line) } - public func find(target: String) -> [ResolvedModule] { - return graph.allTargets.filter { $0.name == target } - } - - public func find(product: String) -> [ResolvedProduct] { - return graph.allProducts.filter { $0.name == product } - } - public func find(package: PackageIdentity) -> ResolvedPackage? { return graph.package(for: package) } diff --git a/Sources/XCBuildSupport/XcodeBuildSystem.swift b/Sources/XCBuildSupport/XcodeBuildSystem.swift index c47613725f6..c86f3f75b44 100644 --- a/Sources/XCBuildSupport/XcodeBuildSystem.swift +++ b/Sources/XCBuildSupport/XcodeBuildSystem.swift @@ -382,9 +382,9 @@ extension PIFBuilderParameters { extension BuildSubset { var pifTargetName: String { switch self { - case .product(let name): + case .product(let name, _): PackagePIFProjectBuilder.targetName(for: name) - case .target(let name): + case .target(let name, _): name case .allExcludingTests: PIFBuilder.allExcludingTestsTargetName diff --git a/Sources/swift-bootstrap/main.swift b/Sources/swift-bootstrap/main.swift index 267dbc4463b..a31aba3a982 100644 --- a/Sources/swift-bootstrap/main.swift +++ b/Sources/swift-bootstrap/main.swift @@ -282,6 +282,7 @@ struct SwiftBootstrapBuildTool: ParsableCommand { ) let buildParameters = try BuildParameters( + destination: .target, dataPath: dataPath, configuration: configuration, toolchain: self.targetToolchain, diff --git a/Tests/BuildTests/BuildOperationTests.swift b/Tests/BuildTests/BuildOperationTests.swift index 458f1b7ec8e..2bda5b99775 100644 --- a/Tests/BuildTests/BuildOperationTests.swift +++ b/Tests/BuildTests/BuildOperationTests.swift @@ -54,20 +54,21 @@ final class BuildOperationTests: XCTestCase { func testDetectUnexpressedDependencies() throws { let scratchDirectory = AbsolutePath("/path/to/build") let triple = hostTriple - let buildParameters = mockBuildParameters( + let targetBuildParameters = mockBuildParameters( + destination: .target, buildPath: scratchDirectory.appending(triple.tripleString), shouldDisableLocalRpath: false, triple: triple ) let fs = InMemoryFileSystem(files: [ - "\(buildParameters.dataPath)/debug/Lunch.build/Lunch.d" : "/Best.framework" + "\(targetBuildParameters.dataPath)/debug/Lunch.build/Lunch.d" : "/Best.framework" ]) let observability = ObservabilitySystem.makeForTesting() let buildOp = mockBuildOperation( - productsBuildParameters: buildParameters, - toolsBuildParameters: buildParameters, + productsBuildParameters: targetBuildParameters, + toolsBuildParameters: mockBuildParameters(destination: .host, shouldDisableLocalRpath: false), scratchDirectory: scratchDirectory, fs: fs, observabilityScope: observability.topScope ) @@ -120,14 +121,15 @@ final class BuildOperationTests: XCTestCase { // Perform initial builds for each triple for triple in triples { - let buildParameters = mockBuildParameters( + let targetBuildParameters = mockBuildParameters( + destination: .target, buildPath: scratchDirectory.appending(triple.tripleString), config: .debug, triple: triple ) let buildOp = mockBuildOperation( - productsBuildParameters: buildParameters, - toolsBuildParameters: buildParameters, + productsBuildParameters: targetBuildParameters, + toolsBuildParameters: mockBuildParameters(destination: .host), cacheBuildManifest: false, packageGraphLoader: { packageGraph }, scratchDirectory: scratchDirectory, @@ -136,7 +138,7 @@ final class BuildOperationTests: XCTestCase { // Generate initial llbuild manifest let _ = try buildOp.getBuildDescription() // Record the initial llbuild manifest as expected one - llbuildManifestByTriple[triple.tripleString] = try fs.readFileContents(buildParameters.llbuildManifest) + llbuildManifestByTriple[triple.tripleString] = try fs.readFileContents(targetBuildParameters.llbuildManifest) } XCTAssertTrue(fs.exists(scratchDirectory.appending("debug.yaml"))) @@ -152,14 +154,15 @@ final class BuildOperationTests: XCTestCase { // Perform incremental build several times and switch triple for each time for _ in 0..<4 { for triple in triples { - let buildParameters = mockBuildParameters( + let targetBuildParameters = mockBuildParameters( + destination: .target, buildPath: scratchDirectory.appending(triple.tripleString), config: .debug, triple: triple ) let buildOp = mockBuildOperation( - productsBuildParameters: buildParameters, - toolsBuildParameters: buildParameters, + productsBuildParameters: targetBuildParameters, + toolsBuildParameters: mockBuildParameters(destination: .host), cacheBuildManifest: true, packageGraphLoader: { packageGraph }, scratchDirectory: scratchDirectory, @@ -169,7 +172,7 @@ final class BuildOperationTests: XCTestCase { let _ = try buildOp.getBuildDescription() // Ensure that llbuild manifest is updated to the expected one - let actualManifest: String = try fs.readFileContents(buildParameters.llbuildManifest) + let actualManifest: String = try fs.readFileContents(targetBuildParameters.llbuildManifest) let expectedManifest = try XCTUnwrap(llbuildManifestByTriple[triple.tripleString]) XCTAssertEqual(actualManifest, expectedManifest) } diff --git a/Tests/BuildTests/BuildPlanTests.swift b/Tests/BuildTests/BuildPlanTests.swift index 7f5d2782166..3b7eef17c81 100644 --- a/Tests/BuildTests/BuildPlanTests.swift +++ b/Tests/BuildTests/BuildPlanTests.swift @@ -43,29 +43,6 @@ extension Build.BuildPlan { .configuration == .release ? "release" : "debug" return buildParameters.dataPath.appending(components: buildConfigurationComponent) } - - /// Create a build plan with a package graph and same build parameters for products and tools. Provided for - /// testing purposes only. - convenience init( - buildParameters: BuildParameters, - graph: ModulesGraph, - additionalFileRules: [FileRuleDescription] = [], - buildToolPluginInvocationResults: [ResolvedModule.ID: [BuildToolPluginInvocationResult]] = [:], - prebuildCommandResults: [ResolvedModule.ID: [PrebuildCommandResult]] = [:], - fileSystem: any FileSystem, - observabilityScope: ObservabilityScope - ) throws { - try self.init( - destinationBuildParameters: buildParameters, - toolsBuildParameters: buildParameters, - graph: graph, - additionalFileRules: additionalFileRules, - buildToolPluginInvocationResults: buildToolPluginInvocationResults, - prebuildCommandResults: prebuildCommandResults, - fileSystem: fileSystem, - observabilityScope: observabilityScope - ) - } } final class BuildPlanTests: XCTestCase { @@ -193,9 +170,11 @@ final class BuildPlanTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -316,9 +295,11 @@ final class BuildPlanTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -409,9 +390,11 @@ final class BuildPlanTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -484,9 +467,11 @@ final class BuildPlanTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -615,9 +600,11 @@ final class BuildPlanTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -758,9 +745,11 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let plan = try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let plan = try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope ) @@ -924,15 +913,14 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) do { - let plan = try BuildPlan( - buildParameters: mockBuildParameters( - buildPath: buildDirPath, - config: .release, - toolchain: UserToolchain.default, - triple: UserToolchain.default.targetTriple, + let plan = try mockBuildPlan( + config: .release, + triple: UserToolchain.default.targetTriple, + toolchain: UserToolchain.default, + graph: graph, + driverParameters: .init( useExplicitModuleBuild: true ), - graph: graph, fileSystem: fs, observabilityScope: observability.topScope ) @@ -1035,11 +1023,11 @@ final class BuildPlanTests: XCTestCase { XCTAssertNoDiagnostics(observability.diagnostics) do { - let plan = try BuildPlan( - buildParameters: mockBuildParameters(environment: BuildEnvironment( + let plan = try mockBuildPlan( + environment: BuildEnvironment( platform: .linux, configuration: .release - )), + ), graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -1077,11 +1065,11 @@ final class BuildPlanTests: XCTestCase { } do { - let plan = try BuildPlan( - buildParameters: mockBuildParameters(environment: BuildEnvironment( + let plan = try mockBuildPlan( + environment: BuildEnvironment( platform: .macOS, configuration: .debug - )), + ), graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -1152,8 +1140,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, fileSystem: fileSystem, observabilityScope: observability.topScope @@ -1195,8 +1182,8 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(config: .release), + let result = try BuildPlanResult(plan: mockBuildPlan( + config: .release, graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -1286,9 +1273,12 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(config: .release, linkerDeadStrip: false), + let result = try BuildPlanResult(plan: mockBuildPlan( + config: .release, graph: graph, + linkingParameters: .init( + linkerDeadStrip: false + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -1399,8 +1389,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -1580,11 +1569,11 @@ final class BuildPlanTests: XCTestCase { XCTAssertNoDiagnostics(observability.diagnostics) do { - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(environment: BuildEnvironment( + let result = try BuildPlanResult(plan: mockBuildPlan( + environment: BuildEnvironment( platform: .linux, configuration: .release - )), + ), graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -1599,11 +1588,11 @@ final class BuildPlanTests: XCTestCase { } do { - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(environment: BuildEnvironment( + let result = try BuildPlanResult(plan: mockBuildPlan( + environment: BuildEnvironment( platform: .macOS, configuration: .debug - )), + ), graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -1655,8 +1644,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let plan = try BuildPlan( - buildParameters: mockBuildParameters(), + let plan = try mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -1763,9 +1751,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let buildParameters = mockBuildParameters() - let plan = try BuildPlan( - buildParameters: buildParameters, + let plan = try mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -1837,7 +1823,7 @@ final class BuildPlanTests: XCTestCase { "@\(buildPath.appending(components: "exe.product", "Objects.LinkFileList"))", "-Xlinker", "-rpath", "-Xlinker", "/fake/path/lib/swift-5.5/macosx", "-target", defaultTargetTriple, - "-Xlinker", "-add_ast_path", "-Xlinker", "/path/to/build/\(buildParameters.triple)/debug/exe.build/exe.swiftmodule", + "-Xlinker", "-add_ast_path", "-Xlinker", "/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/exe.build/exe.swiftmodule", "-g", ]) #elseif os(Windows) @@ -1893,9 +1879,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let buildParameters = mockBuildParameters() - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: buildParameters, + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -1905,8 +1889,8 @@ final class BuildPlanTests: XCTestCase { let lib = try result.target(for: "lib").clangTarget() XCTAssertEqual(try lib.objects, [ - AbsolutePath("/path/to/build/\(buildParameters.triple)/debug/lib.build/lib.S.o"), - AbsolutePath("/path/to/build/\(buildParameters.triple)/debug/lib.build/lib.c.o"), + AbsolutePath("/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/lib.build/lib.S.o"), + AbsolutePath("/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/lib.build/lib.c.o"), ]) } @@ -1957,8 +1941,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let plan = try BuildPlan( - buildParameters: mockBuildParameters(), + let plan = try mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -2009,8 +1992,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -2145,8 +2127,8 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(config: .release), + let result = try BuildPlanResult(plan: mockBuildPlan( + config: .release, graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -2402,9 +2384,11 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -2510,8 +2494,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -2606,8 +2589,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - var result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(), + var result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -2623,8 +2605,8 @@ final class BuildPlanTests: XCTestCase { #endif // Verify that `-lstdc++` is passed instead of `-lc++` when cross-compiling to Linux. - result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(triple: .arm64Linux), + result = try BuildPlanResult(plan: mockBuildPlan( + triple: .arm64Linux, graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -2672,8 +2654,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: g, fileSystem: fs, observabilityScope: observability.topScope @@ -2808,8 +2789,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -2932,8 +2912,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -3152,8 +3131,7 @@ final class BuildPlanTests: XCTestCase { graphResult.check(targets: "ATarget", "BTarget1", "BTarget2", "CTarget") #endif - let planResult = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(), + let planResult = try BuildPlanResult(plan: mockBuildPlan( graph: graph, fileSystem: fileSystem, observabilityScope: observability.topScope @@ -3249,8 +3227,8 @@ final class BuildPlanTests: XCTestCase { try graphResult.check(reachableBuildProducts: "aexec", "BLibrary1", "BLibrary2", in: linuxDebug) try graphResult.check(reachableBuildTargets: "ATarget", "BTarget1", "BTarget2", in: linuxDebug) - let planResult = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(environment: linuxDebug), + let planResult = try BuildPlanResult(plan: mockBuildPlan( + environment: linuxDebug, graph: graph, fileSystem: fileSystem, observabilityScope: observability.topScope @@ -3264,8 +3242,8 @@ final class BuildPlanTests: XCTestCase { try graphResult.check(reachableBuildProducts: "aexec", "BLibrary2", in: macosDebug) try graphResult.check(reachableBuildTargets: "ATarget", "BTarget2", "BTarget3", in: macosDebug) - let planResult = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(environment: macosDebug), + let planResult = try BuildPlanResult(plan: mockBuildPlan( + environment: macosDebug, graph: graph, fileSystem: fileSystem, observabilityScope: observability.topScope @@ -3279,8 +3257,8 @@ final class BuildPlanTests: XCTestCase { try graphResult.check(reachableBuildProducts: "aexec", "CLibrary", in: androidRelease) try graphResult.check(reachableBuildTargets: "ATarget", "CTarget", in: androidRelease) - let planResult = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(environment: androidRelease), + let planResult = try BuildPlanResult(plan: mockBuildPlan( + environment: androidRelease, graph: graph, fileSystem: fileSystem, observabilityScope: observability.topScope @@ -3310,8 +3288,7 @@ final class BuildPlanTests: XCTestCase { XCTAssertNoDiagnostics(observability.diagnostics) XCTAssertThrows(BuildPlan.Error.noBuildableTarget) { - _ = try BuildPlan( - buildParameters: mockBuildParameters(), + _ = try mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -3351,8 +3328,7 @@ final class BuildPlanTests: XCTestCase { observabilityScope: observability.topScope ) - _ = try BuildPlan( - buildParameters: mockBuildParameters(), + _ = try mockBuildPlan( graph: graph, fileSystem: fileSystem, observabilityScope: observability.topScope @@ -3393,8 +3369,7 @@ final class BuildPlanTests: XCTestCase { observabilityScope: observability.topScope ) - _ = try BuildPlan( - buildParameters: mockBuildParameters(), + _ = try mockBuildPlan( graph: graph, fileSystem: fileSystem, observabilityScope: observability.topScope @@ -3434,8 +3409,8 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(triple: .windows), + let result = try BuildPlanResult(plan: mockBuildPlan( + triple: .windows, graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -3516,12 +3491,12 @@ final class BuildPlanTests: XCTestCase { ) func createResult(for triple: Basics.Triple) throws -> BuildPlanResult { - try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters( - canRenameEntrypointFunctionName: true, - triple: triple - ), + try BuildPlanResult(plan: mockBuildPlan( + triple: triple, graph: graph, + driverParameters: .init( + canRenameEntrypointFunctionName: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -3569,13 +3544,11 @@ final class BuildPlanTests: XCTestCase { XCTAssertNoDiagnostics(observability.diagnostics) func check(for mode: BuildParameters.IndexStoreMode, config: BuildConfiguration) throws { - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters( - config: config, - toolchain: try UserToolchain.default, - indexStoreMode: mode - ), + let result = try BuildPlanResult(plan: mockBuildPlan( + config: config, + toolchain: try UserToolchain.default, graph: graph, + indexStoreMode: mode, fileSystem: fs, observabilityScope: observability.topScope )) @@ -3641,8 +3614,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, fileSystem: fileSystem, observabilityScope: observability.topScope @@ -3715,8 +3687,8 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(triple: .init("arm64-apple-ios")), + let result = try BuildPlanResult(plan: mockBuildPlan( + triple: .init("arm64-apple-ios"), graph: graph, fileSystem: fileSystem, observabilityScope: observability.topScope @@ -3792,8 +3764,8 @@ final class BuildPlanTests: XCTestCase { // Therefore, we expect no error, as the iOS version // constraints above are valid. XCTAssertNoThrow( - _ = try BuildPlan( - buildParameters: mockBuildParameters(triple: .arm64iOS), + _ = try mockBuildPlan( + triple: .arm64iOS, graph: graph, fileSystem: fileSystem, observabilityScope: observability.topScope @@ -3802,8 +3774,8 @@ final class BuildPlanTests: XCTestCase { // For completeness, the invalid target should still throw an error. XCTAssertThrows(Diagnostics.fatalError) { - _ = try BuildPlan( - buildParameters: mockBuildParameters(triple: .x86_64MacOS), + _ = try mockBuildPlan( + triple: .x86_64MacOS, graph: graph, fileSystem: fileSystem, observabilityScope: observability.topScope @@ -3865,8 +3837,8 @@ final class BuildPlanTests: XCTestCase { XCTAssertNoDiagnostics(observability.diagnostics) XCTAssertThrows(Diagnostics.fatalError) { - _ = try BuildPlan( - buildParameters: mockBuildParameters(triple: .x86_64MacOS), + _ = try mockBuildPlan( + triple: .x86_64MacOS, graph: graph, fileSystem: fileSystem, observabilityScope: observability.topScope @@ -4031,8 +4003,8 @@ final class BuildPlanTests: XCTestCase { XCTAssertNoDiagnostics(observability.diagnostics) func createResult(for dest: Basics.Triple) throws -> BuildPlanResult { - try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(triple: dest), + try BuildPlanResult(plan: mockBuildPlan( + triple: dest, graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -4098,12 +4070,10 @@ final class BuildPlanTests: XCTestCase { // omit frame pointers explicitly set to true do { - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters( - triple: .x86_64Linux, - omitFramePointers: true - ), + let result = try BuildPlanResult(plan: mockBuildPlan( + triple: .x86_64Linux, graph: graph, + omitFramePointers: true, fileSystem: fs, observabilityScope: observability.topScope )) @@ -4155,12 +4125,10 @@ final class BuildPlanTests: XCTestCase { // omit frame pointers explicitly set to false do { - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters( - triple: .x86_64Linux, - omitFramePointers: false - ), + let result = try BuildPlanResult(plan: mockBuildPlan( + triple: .x86_64Linux, graph: graph, + omitFramePointers: false, fileSystem: fs, observabilityScope: observability.topScope )) @@ -4307,9 +4275,9 @@ final class BuildPlanTests: XCTestCase { var flags = BuildFlags() flags.linkerFlags = ["-L", "/path/to/foo", "-L/path/to/foo", "-rpath=foo", "-rpath", "foo"] - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(flags: flags), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, + commonFlags: flags, fileSystem: fs, observabilityScope: observability.topScope )) @@ -4371,16 +4339,15 @@ final class BuildPlanTests: XCTestCase { ) ) let mockToolchain = try UserToolchain(swiftSDK: userSwiftSDK) - let extraBuildParameters = mockBuildParameters( - toolchain: mockToolchain, - flags: BuildFlags( - cCompilerFlags: ["-clang-command-line-flag"], - swiftCompilerFlags: ["-swift-command-line-flag"] - ) + let commonFlags = BuildFlags( + cCompilerFlags: ["-clang-command-line-flag"], + swiftCompilerFlags: ["-swift-command-line-flag"] ) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: extraBuildParameters, + + let result = try BuildPlanResult(plan: mockBuildPlan( + toolchain: mockToolchain, graph: graph, + commonFlags: commonFlags, fileSystem: fs, observabilityScope: observability.topScope )) @@ -4429,16 +4396,14 @@ final class BuildPlanTests: XCTestCase { .anySequence, ]) - let staticBuildParameters = { - var copy = extraBuildParameters - copy.linkingParameters.shouldLinkStaticSwiftStdlib = true - // pick a triple with support for static linking - copy.triple = .x86_64Linux - return copy - }() - let staticResult = try BuildPlanResult(plan: BuildPlan( - buildParameters: staticBuildParameters, + let staticResult = try BuildPlanResult(plan: mockBuildPlan( + triple: .x86_64Linux, + toolchain: mockToolchain, graph: graph, + commonFlags: commonFlags, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -4513,19 +4478,16 @@ final class BuildPlanTests: XCTestCase { toolset: toolset ) let toolchain = try UserToolchain(swiftSDK: swiftSDK) - let buildParameters = mockBuildParameters( + let result = try BuildPlanResult(plan: mockBuildPlan( + triple: targetTriple, toolchain: toolchain, - flags: BuildFlags( + graph: graph, + commonFlags: BuildFlags( cCompilerFlags: [cliFlag(tool: .cCompiler)], cxxCompilerFlags: [cliFlag(tool: .cxxCompiler)], swiftCompilerFlags: [cliFlag(tool: .swiftCompiler)], linkerFlags: [cliFlag(tool: .linker)] ), - triple: targetTriple - ) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: buildParameters, - graph: graph, fileSystem: fileSystem, observabilityScope: observability.topScope )) @@ -4669,9 +4631,8 @@ final class BuildPlanTests: XCTestCase { ]) ) let toolchain = try UserToolchain(swiftSDK: swiftSDK) - let buildParameters = mockBuildParameters(toolchain: toolchain) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: buildParameters, + let result = try BuildPlanResult(plan: mockBuildPlan( + toolchain: toolchain, graph: graph, fileSystem: fileSystem, observabilityScope: observability.topScope @@ -4740,8 +4701,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let plan = try BuildPlan( - buildParameters: mockBuildParameters(), + let plan = try mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -4806,9 +4766,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let buildParameters = mockBuildParameters() - let plan = try BuildPlan( - buildParameters: buildParameters, + let plan = try mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -4824,7 +4782,7 @@ final class BuildPlanTests: XCTestCase { [ .anySequence, "-emit-objc-header", - "-emit-objc-header-path", "/path/to/build/\(buildParameters.triple)/debug/Foo.build/Foo-Swift.h", + "-emit-objc-header-path", "/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/Foo.build/Foo-Swift.h", .anySequence, ] ) @@ -4834,7 +4792,7 @@ final class BuildPlanTests: XCTestCase { [ .anySequence, "-emit-objc-header", - "-emit-objc-header-path", "/path/to/build/\(buildParameters.triple)/Foo.build/Foo-Swift.h", + "-emit-objc-header-path", "/path/to/build/\(result.plan.destinationBuildParameters.triple)/Foo.build/Foo-Swift.h", .anySequence, ] ) @@ -4844,12 +4802,12 @@ final class BuildPlanTests: XCTestCase { #if os(macOS) XCTAssertMatch( barTarget, - [.anySequence, "-fmodule-map-file=/path/to/build/\(buildParameters.triple)/debug/Foo.build/module.modulemap", .anySequence] + [.anySequence, "-fmodule-map-file=/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/Foo.build/module.modulemap", .anySequence] ) #else XCTAssertNoMatch( barTarget, - [.anySequence, "-fmodule-map-file=/path/to/build/\(buildParameters.triple)/debug/Foo.build/module.modulemap", .anySequence] + [.anySequence, "-fmodule-map-file=/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/Foo.build/module.modulemap", .anySequence] ) #endif @@ -4907,9 +4865,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let buildParameters = mockBuildParameters() - let plan = try BuildPlan( - buildParameters: buildParameters, + let plan = try mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -4926,7 +4882,7 @@ final class BuildPlanTests: XCTestCase { .anySequence, "-emit-objc-header", "-emit-objc-header-path", - "/path/to/build/\(buildParameters.triple)/debug/Foo.build/Foo-Swift.h", + "/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/Foo.build/Foo-Swift.h", .anySequence, ] ) @@ -4937,7 +4893,7 @@ final class BuildPlanTests: XCTestCase { .anySequence, "-emit-objc-header", "-emit-objc-header-path", - "/path/to/build/\(buildParameters.triple)/debug/Foo.build/Foo-Swift.h", + "/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/Foo.build/Foo-Swift.h", .anySequence, ] ) @@ -4949,7 +4905,7 @@ final class BuildPlanTests: XCTestCase { barTarget, [ .anySequence, - "-fmodule-map-file=/path/to/build/\(buildParameters.triple)/debug/Foo.build/module.modulemap", + "-fmodule-map-file=/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/Foo.build/module.modulemap", .anySequence, ] ) @@ -4958,7 +4914,7 @@ final class BuildPlanTests: XCTestCase { barTarget, [ .anySequence, - "-fmodule-map-file=/path/to/build/\(buildParameters.triple)/debug/Foo.build/module.modulemap", + "-fmodule-map-file=/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/Foo.build/module.modulemap", .anySequence, ] ) @@ -5018,9 +4974,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let buildParameters = mockBuildParameters() - let plan = try BuildPlan( - buildParameters: buildParameters, + let plan = try mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -5041,7 +4995,7 @@ final class BuildPlanTests: XCTestCase { .anySequence, "-emit-objc-header", "-emit-objc-header-path", - "/path/to/build/\(buildParameters.triple)/debug/Foo.build/Foo-Swift.h", + "/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/Foo.build/Foo-Swift.h", .anySequence, ] ) @@ -5052,7 +5006,7 @@ final class BuildPlanTests: XCTestCase { .anySequence, "-emit-objc-header", "-emit-objc-header-path", - "/path/to/build/\(buildParameters.triple)/debug/Foo.build/Foo-Swift.h", + "/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/Foo.build/Foo-Swift.h", .anySequence, ] ) @@ -5064,7 +5018,7 @@ final class BuildPlanTests: XCTestCase { barTarget, [ .anySequence, - "-fmodule-map-file=/path/to/build/\(buildParameters.triple)/debug/Foo.build/module.modulemap", + "-fmodule-map-file=/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/Foo.build/module.modulemap", .anySequence, ] ) @@ -5073,7 +5027,7 @@ final class BuildPlanTests: XCTestCase { barTarget, [ .anySequence, - "-fmodule-map-file=/path/to/build/\(buildParameters.triple)/debug/Foo.build/module.modulemap", + "-fmodule-map-file=/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/Foo.build/module.modulemap", .anySequence, ] ) @@ -5122,8 +5076,8 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(triple: .x86_64Linux), + let result = try BuildPlanResult(plan: mockBuildPlan( + triple: .x86_64Linux, graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -5207,8 +5161,7 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -5359,8 +5312,7 @@ final class BuildPlanTests: XCTestCase { XCTAssertNoDiagnostics(observability.diagnostics) - let plan = try BuildPlan( - buildParameters: mockBuildParameters(), + let plan = try mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -5427,8 +5379,8 @@ final class BuildPlanTests: XCTestCase { XCTAssertNoDiagnostics(observability.diagnostics) - let plan = try BuildPlan( - buildParameters: mockBuildParameters(triple: .wasi), + let plan = try mockBuildPlan( + triple: .wasi, graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -5494,8 +5446,7 @@ final class BuildPlanTests: XCTestCase { XCTAssertNoDiagnostics(observability.diagnostics) - let plan = try BuildPlan( - buildParameters: mockBuildParameters(), + let plan = try mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -5560,9 +5511,12 @@ final class BuildPlanTests: XCTestCase { let supportingTriples: [Basics.Triple] = [.x86_64Linux, .arm64Linux, .wasi] for triple in supportingTriples { - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true, triple: triple), + let result = try BuildPlanResult(plan: mockBuildPlan( + triple: triple, graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -5685,8 +5639,8 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(triple: targetTriple), + let result = try BuildPlanResult(plan: mockBuildPlan( + triple: targetTriple, graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -5814,8 +5768,8 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(triple: targetTriple), + let result = try BuildPlanResult(plan: mockBuildPlan( + triple: targetTriple, graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -5897,8 +5851,8 @@ final class BuildPlanTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let plan = try BuildPlan( - buildParameters: mockBuildParameters(buildPath: buildPath), + let plan = try mockBuildPlan( + buildPath: buildPath, graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -5951,15 +5905,15 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - // Unrealistic: we can't enable all of these at once on all platforms. - // This test codifies current behavior, not ideal behavior, and - // may need to be amended if we change it. - var parameters = mockBuildParameters(shouldLinkStaticSwiftStdlib: true) - parameters.sanitizers = EnabledSanitizers([sanitizer]) - - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: parameters, + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), + // Unrealistic: we can't enable all of these at once on all platforms. + // This test codifies current behavior, not ideal behavior, and + // may need to be amended if we change it. + targetSanitizers: EnabledSanitizers([sanitizer]), fileSystem: fs, observabilityScope: observability.topScope )) @@ -6005,13 +5959,12 @@ final class BuildPlanTests: XCTestCase { XCTAssertNoDiagnostics(observability.diagnostics) let toolchain = try UserToolchain.default - let buildParameters = mockBuildParameters( + let result = try BuildPlanResult(plan: mockBuildPlan( toolchain: toolchain, - linkTimeOptimizationMode: .full - ) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: buildParameters, graph: graph, + linkingParameters: .init( + linkTimeOptimizationMode: .full + ), fileSystem: fileSystem, observabilityScope: observability.topScope )) @@ -6078,11 +6031,11 @@ final class BuildPlanTests: XCTestCase { XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(environment: BuildEnvironment( + let result = try BuildPlanResult(plan: mockBuildPlan( + environment: BuildEnvironment( platform: .linux, configuration: .release - )), + ), graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -6128,9 +6081,11 @@ final class BuildPlanTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(shouldDisableLocalRpath: true), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldDisableLocalRpath: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -6242,9 +6197,11 @@ final class BuildPlanTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -6327,8 +6284,7 @@ final class BuildPlanTests: XCTestCase { XCTAssertNoDiagnostics(observability.diagnostics) - let plan = try BuildPlan( - buildParameters: mockBuildParameters(), + let plan = try mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -6402,8 +6358,7 @@ final class BuildPlanTests: XCTestCase { observabilityScope: observability.topScope ) - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: mockBuildParameters(), + let result = try BuildPlanResult(plan: mockBuildPlan( graph: graph, fileSystem: fs, observabilityScope: observability.topScope diff --git a/Tests/BuildTests/ClangTargetBuildDescriptionTests.swift b/Tests/BuildTests/ClangTargetBuildDescriptionTests.swift index 32b24c92fc4..6c14a23c7d1 100644 --- a/Tests/BuildTests/ClangTargetBuildDescriptionTests.swift +++ b/Tests/BuildTests/ClangTargetBuildDescriptionTests.swift @@ -28,9 +28,9 @@ final class ClangTargetBuildDescriptionTests: XCTestCase { func testSwiftCorelibsFoundationIncludeWorkaround() throws { let toolchain = MockToolchain(swiftResourcesPath: AbsolutePath("/fake/path/lib/swift")) - let macosParameters = mockBuildParameters(toolchain: toolchain, triple: .macOS) - let linuxParameters = mockBuildParameters(toolchain: toolchain, triple: .arm64Linux) - let androidParameters = mockBuildParameters(toolchain: toolchain, triple: .arm64Android) + let macosParameters = mockBuildParameters(destination: .target, toolchain: toolchain, triple: .macOS) + let linuxParameters = mockBuildParameters(destination: .target, toolchain: toolchain, triple: .arm64Linux) + let androidParameters = mockBuildParameters(destination: .target, toolchain: toolchain, triple: .arm64Android) let macDescription = try makeTargetBuildDescription("swift-corelibs-foundation", buildParameters: macosParameters) @@ -113,6 +113,7 @@ final class ClangTargetBuildDescriptionTests: XCTestCase { target: target, toolsVersion: .current, buildParameters: buildParameters ?? mockBuildParameters( + destination: .target, toolchain: try UserToolchain.default, indexStoreMode: .on ), diff --git a/Tests/BuildTests/CrossCompilationBuildPlanTests.swift b/Tests/BuildTests/CrossCompilationBuildPlanTests.swift index 5da96170453..8b0292cb76d 100644 --- a/Tests/BuildTests/CrossCompilationBuildPlanTests.swift +++ b/Tests/BuildTests/CrossCompilationBuildPlanTests.swift @@ -21,6 +21,7 @@ import enum PackageGraph.BuildTriple import class PackageModel.Manifest import struct PackageModel.TargetDescription import enum PackageModel.ProductType +import struct SPMBuildCore.BuildParameters import func SPMTestSupport.loadPackageGraph @_spi(SwiftPMInternal) @@ -30,6 +31,7 @@ import func SPMTestSupport.embeddedCxxInteropPackageGraph import func SPMTestSupport.macrosPackageGraph import func SPMTestSupport.macrosTestsPackageGraph import func SPMTestSupport.mockBuildParameters +import func SPMTestSupport.mockBuildPlan import func SPMTestSupport.toolsExplicitLibrariesGraph @_spi(SwiftPMInternal) @@ -47,11 +49,15 @@ final class CrossCompilationBuildPlanTests: XCTestCase { var (graph, fs, observabilityScope) = try trivialPackageGraph() let triple = try Triple("wasm32-unknown-none-wasm") - var parameters = mockBuildParameters(triple: triple) - parameters.linkingParameters.shouldLinkStaticSwiftStdlib = true - var result = try BuildPlanResult(plan: BuildPlan( - buildParameters: parameters, + + let linkingParameters = BuildParameters.Linking( + shouldLinkStaticSwiftStdlib: true + ) + + var result = try BuildPlanResult(plan: mockBuildPlan( + triple: triple, graph: graph, + linkingParameters: linkingParameters, fileSystem: fs, observabilityScope: observabilityScope )) @@ -77,9 +83,10 @@ final class CrossCompilationBuildPlanTests: XCTestCase { (graph, fs, observabilityScope) = try embeddedCxxInteropPackageGraph() - result = try BuildPlanResult(plan: BuildPlan( - buildParameters: parameters, + result = try BuildPlanResult(plan: mockBuildPlan( + triple: triple, graph: graph, + linkingParameters: linkingParameters, fileSystem: fs, observabilityScope: observabilityScope )) @@ -107,13 +114,14 @@ final class CrossCompilationBuildPlanTests: XCTestCase { func testWasmTargetRelease() throws { let (graph, fs, observabilityScope) = try trivialPackageGraph() - var parameters = mockBuildParameters( - config: .release, triple: .wasi, linkerDeadStrip: true - ) - parameters.linkingParameters.shouldLinkStaticSwiftStdlib = true - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: parameters, + let result = try BuildPlanResult(plan: mockBuildPlan( + config: .release, + triple: .wasi, graph: graph, + linkingParameters: .init( + linkerDeadStrip: true, + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observabilityScope )) @@ -140,11 +148,12 @@ final class CrossCompilationBuildPlanTests: XCTestCase { let (graph, fs, observabilityScope) = try trivialPackageGraph() - var parameters = mockBuildParameters(triple: .wasi) - parameters.linkingParameters.shouldLinkStaticSwiftStdlib = true - let result = try BuildPlanResult(plan: BuildPlan( - buildParameters: parameters, + let result = try BuildPlanResult(plan: mockBuildPlan( + triple: .wasi, graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observabilityScope )) @@ -226,8 +235,15 @@ final class CrossCompilationBuildPlanTests: XCTestCase { let destinationTriple = Triple.arm64Linux let toolsTriple = Triple.x86_64MacOS let plan = try BuildPlan( - destinationBuildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true, triple: destinationTriple), - toolsBuildParameters: mockBuildParameters(triple: toolsTriple), + destinationBuildParameters: mockBuildParameters( + destination: .target, + shouldLinkStaticSwiftStdlib: true, + triple: destinationTriple + ), + toolsBuildParameters: mockBuildParameters( + destination: .host, + triple: toolsTriple + ), graph: graph, fileSystem: fs, observabilityScope: scope @@ -271,8 +287,15 @@ final class CrossCompilationBuildPlanTests: XCTestCase { let destinationTriple = Triple.arm64Linux let toolsTriple = Triple.x86_64MacOS let plan = try BuildPlan( - destinationBuildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true, triple: destinationTriple), - toolsBuildParameters: mockBuildParameters(triple: toolsTriple), + destinationBuildParameters: mockBuildParameters( + destination: .target, + shouldLinkStaticSwiftStdlib: true, + triple: destinationTriple + ), + toolsBuildParameters: mockBuildParameters( + destination: .host, + triple: toolsTriple + ), graph: graph, fileSystem: fs, observabilityScope: scope @@ -319,8 +342,15 @@ final class CrossCompilationBuildPlanTests: XCTestCase { for (linkage, productFileName) in [(ProductType.LibraryType.static, "libSwiftSyntax-tool.a"), (.dynamic, "libSwiftSyntax-tool.dylib")] { let (graph, fs, scope) = try toolsExplicitLibrariesGraph(linkage: linkage) let plan = try BuildPlan( - destinationBuildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true, triple: destinationTriple), - toolsBuildParameters: mockBuildParameters(triple: toolsTriple), + destinationBuildParameters: mockBuildParameters( + destination: .target, + shouldLinkStaticSwiftStdlib: true, + triple: destinationTriple + ), + toolsBuildParameters: mockBuildParameters( + destination: .host, + triple: toolsTriple + ), graph: graph, fileSystem: fs, observabilityScope: scope diff --git a/Tests/BuildTests/LLBuildManifestBuilderTests.swift b/Tests/BuildTests/LLBuildManifestBuilderTests.swift index aa68775414c..2e51bc2cd8a 100644 --- a/Tests/BuildTests/LLBuildManifestBuilderTests.swift +++ b/Tests/BuildTests/LLBuildManifestBuilderTests.swift @@ -51,13 +51,11 @@ final class LLBuildManifestBuilderTests: XCTestCase { // macOS, release build - var buildParameters = mockBuildParameters(environment: BuildEnvironment( - platform: .macOS, - configuration: .release - )) - var plan = try BuildPlan( - destinationBuildParameters: buildParameters, - toolsBuildParameters: buildParameters, + var plan = try mockBuildPlan( + environment: BuildEnvironment( + platform: .macOS, + configuration: .release + ), graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -74,9 +72,9 @@ final class LLBuildManifestBuilderTests: XCTestCase { try llbuild.createProductCommand(buildProduct) var basicReleaseCommandNames = [ - AbsolutePath("/path/to/build/\(buildParameters.triple)/release/exe.product/Objects.LinkFileList").pathString, - "", - "C.exe-\(buildParameters.triple)-release.exe", + AbsolutePath("/path/to/build/\(plan.destinationBuildParameters.triple)/release/exe.product/Objects.LinkFileList").pathString, + "", + "C.exe-\(plan.destinationBuildParameters.triple)-release.exe", ] XCTAssertEqual( @@ -86,13 +84,11 @@ final class LLBuildManifestBuilderTests: XCTestCase { // macOS, debug build - buildParameters = mockBuildParameters(environment: BuildEnvironment( - platform: .macOS, - configuration: .debug - )) - plan = try BuildPlan( - destinationBuildParameters: buildParameters, - toolsBuildParameters: buildParameters, + plan = try mockBuildPlan( + environment: BuildEnvironment( + platform: .macOS, + configuration: .debug + ), graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -104,17 +100,17 @@ final class LLBuildManifestBuilderTests: XCTestCase { llbuild = LLBuildManifestBuilder(plan, fileSystem: fs, observabilityScope: observability.topScope) try llbuild.createProductCommand(buildProduct) - let entitlementsCommandName = "C.exe-\(buildParameters.triple)-debug.exe-entitlements" + let entitlementsCommandName = "C.exe-\(plan.destinationBuildParameters.triple)-debug.exe-entitlements" var basicDebugCommandNames = [ - AbsolutePath("/path/to/build/\(buildParameters.triple)/debug/exe.product/Objects.LinkFileList").pathString, - "", - "C.exe-\(buildParameters.triple)-debug.exe", + AbsolutePath("/path/to/build/\(plan.destinationBuildParameters.triple)/debug/exe.product/Objects.LinkFileList").pathString, + "", + "C.exe-\(plan.destinationBuildParameters.triple)-debug.exe", ] XCTAssertEqual( llbuild.manifest.commands.map(\.key).sorted(), (basicDebugCommandNames + [ - AbsolutePath("/path/to/build/\(buildParameters.triple)/debug/exe-entitlement.plist").pathString, + AbsolutePath("/path/to/build/\(plan.destinationBuildParameters.triple)/debug/exe-entitlement.plist").pathString, entitlementsCommandName, ]).sorted() ) @@ -127,26 +123,24 @@ final class LLBuildManifestBuilderTests: XCTestCase { XCTAssertEqual( entitlementsCommand.inputs, [ - .file("/path/to/build/\(buildParameters.triple)/debug/exe", isMutated: true), - .file("/path/to/build/\(buildParameters.triple)/debug/exe-entitlement.plist"), + .file("/path/to/build/\(plan.destinationBuildParameters.triple)/debug/exe", isMutated: true), + .file("/path/to/build/\(plan.destinationBuildParameters.triple)/debug/exe-entitlement.plist"), ] ) XCTAssertEqual( entitlementsCommand.outputs, [ - .virtual("exe-\(buildParameters.triple)-debug.exe-CodeSigning"), + .virtual("exe-\(plan.destinationBuildParameters.triple)-debug.exe-CodeSigning"), ] ) // Linux, release build - buildParameters = mockBuildParameters(environment: BuildEnvironment( - platform: .linux, - configuration: .release - )) - plan = try BuildPlan( - destinationBuildParameters: buildParameters, - toolsBuildParameters: buildParameters, + plan = try mockBuildPlan( + environment: BuildEnvironment( + platform: .linux, + configuration: .release + ), graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -159,9 +153,9 @@ final class LLBuildManifestBuilderTests: XCTestCase { try llbuild.createProductCommand(buildProduct) basicReleaseCommandNames = [ - AbsolutePath("/path/to/build/\(buildParameters.triple)/release/exe.product/Objects.LinkFileList").pathString, - "", - "C.exe-\(buildParameters.triple)-release.exe", + AbsolutePath("/path/to/build/\(plan.destinationBuildParameters.triple)/release/exe.product/Objects.LinkFileList").pathString, + "", + "C.exe-\(plan.destinationBuildParameters.triple)-release.exe", ] XCTAssertEqual( @@ -171,13 +165,11 @@ final class LLBuildManifestBuilderTests: XCTestCase { // Linux, debug build - buildParameters = mockBuildParameters(environment: BuildEnvironment( - platform: .linux, - configuration: .debug - )) - plan = try BuildPlan( - destinationBuildParameters: buildParameters, - toolsBuildParameters: buildParameters, + plan = try mockBuildPlan( + environment: BuildEnvironment( + platform: .linux, + configuration: .debug + ), graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -190,9 +182,9 @@ final class LLBuildManifestBuilderTests: XCTestCase { try llbuild.createProductCommand(buildProduct) basicDebugCommandNames = [ - AbsolutePath("/path/to/build/\(buildParameters.triple)/debug/exe.product/Objects.LinkFileList").pathString, - "", - "C.exe-\(buildParameters.triple)-debug.exe", + AbsolutePath("/path/to/build/\(plan.destinationBuildParameters.triple)/debug/exe.product/Objects.LinkFileList").pathString, + "", + "C.exe-\(plan.destinationBuildParameters.triple)-debug.exe", ] XCTAssertEqual( @@ -208,8 +200,15 @@ final class LLBuildManifestBuilderTests: XCTestCase { let toolsTriple = Triple.arm64Linux let plan = try BuildPlan( - destinationBuildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true, triple: productsTriple), - toolsBuildParameters: mockBuildParameters(triple: toolsTriple), + destinationBuildParameters: mockBuildParameters( + destination: .target, + shouldLinkStaticSwiftStdlib: true, + triple: productsTriple + ), + toolsBuildParameters: mockBuildParameters( + destination: .host, + triple: toolsTriple + ), graph: graph, fileSystem: fs, observabilityScope: scope diff --git a/Tests/BuildTests/ModuleAliasingBuildTests.swift b/Tests/BuildTests/ModuleAliasingBuildTests.swift index 355eee950e7..3167775f2de 100644 --- a/Tests/BuildTests/ModuleAliasingBuildTests.swift +++ b/Tests/BuildTests/ModuleAliasingBuildTests.swift @@ -189,9 +189,11 @@ final class ModuleAliasingBuildTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -391,9 +393,11 @@ final class ModuleAliasingBuildTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -475,9 +479,11 @@ final class ModuleAliasingBuildTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -601,9 +607,11 @@ final class ModuleAliasingBuildTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -697,10 +705,11 @@ final class ModuleAliasingBuildTests: XCTestCase { XCTAssertNoDiagnostics(observability.diagnostics) - let buildParameters = mockBuildParameters(shouldLinkStaticSwiftStdlib: true) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: buildParameters, + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -728,33 +737,33 @@ final class ModuleAliasingBuildTests: XCTestCase { XCTAssertMatch( fooLoggingArgs, [.anySequence, "-emit-objc-header", "-emit-objc-header-path", - "/path/to/build/\(buildParameters.triple)/debug/FooLogging.build/FooLogging-Swift.h", .anySequence] + "/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/FooLogging.build/FooLogging-Swift.h", .anySequence] ) XCTAssertMatch( barLoggingArgs, [.anySequence, "-emit-objc-header", "-emit-objc-header-path", - "/path/to/build/\(buildParameters.triple)/debug/BarLogging.build/BarLogging-Swift.h", .anySequence] + "/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/BarLogging.build/BarLogging-Swift.h", .anySequence] ) XCTAssertMatch( loggingArgs, [.anySequence, "-emit-objc-header", "-emit-objc-header-path", - "/path/to/build/\(buildParameters.triple)/debug/Logging.build/Logging-Swift.h", .anySequence] + "/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/Logging.build/Logging-Swift.h", .anySequence] ) #else XCTAssertNoMatch( fooLoggingArgs, [.anySequence, "-emit-objc-header", "-emit-objc-header-path", - "/path/to/build/\(buildParameters.triple)/debug/FooLogging.build/FooLogging-Swift.h", .anySequence] + "/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/FooLogging.build/FooLogging-Swift.h", .anySequence] ) XCTAssertNoMatch( barLoggingArgs, [.anySequence, "-emit-objc-header", "-emit-objc-header-path", - "/path/to/build/\(buildParameters.triple)/debug/BarLogging.build/BarLogging-Swift.h", .anySequence] + "/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/BarLogging.build/BarLogging-Swift.h", .anySequence] ) XCTAssertNoMatch( loggingArgs, [.anySequence, "-emit-objc-header", "-emit-objc-header-path", - "/path/to/build/\(buildParameters.triple)/debug/Logging.build/Logging-Swift.h", .anySequence] + "/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/Logging.build/Logging-Swift.h", .anySequence] ) #endif } @@ -816,10 +825,11 @@ final class ModuleAliasingBuildTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let buildParameters = mockBuildParameters(shouldLinkStaticSwiftStdlib: true) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: buildParameters, + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -847,23 +857,23 @@ final class ModuleAliasingBuildTests: XCTestCase { XCTAssertMatch( otherLoggingArgs, [.anySequence, "-emit-objc-header", "-emit-objc-header-path", - "/path/to/build/\(buildParameters.triple)/debug/OtherLogging.build/OtherLogging-Swift.h", .anySequence] + "/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/OtherLogging.build/OtherLogging-Swift.h", .anySequence] ) XCTAssertMatch( loggingArgs, [.anySequence, "-emit-objc-header", "-emit-objc-header-path", - "/path/to/build/\(buildParameters.triple)/debug/Logging.build/Logging-Swift.h", .anySequence] + "/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/Logging.build/Logging-Swift.h", .anySequence] ) #else XCTAssertNoMatch( otherLoggingArgs, [.anySequence, "-emit-objc-header", "-emit-objc-header-path", - "/path/to/build/\(buildParameters.triple)/debug/OtherLogging.build/OtherLogging-Swift.h", .anySequence] + "/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/OtherLogging.build/OtherLogging-Swift.h", .anySequence] ) XCTAssertNoMatch( loggingArgs, [.anySequence, "-emit-objc-header", "-emit-objc-header-path", - "/path/to/build/\(buildParameters.triple)/debug/Logging.build/Logging-Swift.h", .anySequence] + "/path/to/build/\(result.plan.destinationBuildParameters.triple)/debug/Logging.build/Logging-Swift.h", .anySequence] ) #endif } @@ -991,9 +1001,11 @@ final class ModuleAliasingBuildTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -1320,9 +1332,11 @@ final class ModuleAliasingBuildTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -1425,9 +1439,11 @@ final class ModuleAliasingBuildTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -1626,9 +1642,11 @@ final class ModuleAliasingBuildTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -1801,9 +1819,11 @@ final class ModuleAliasingBuildTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -2014,9 +2034,11 @@ final class ModuleAliasingBuildTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -2231,9 +2253,11 @@ final class ModuleAliasingBuildTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -2408,9 +2432,11 @@ final class ModuleAliasingBuildTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -2552,9 +2578,11 @@ final class ModuleAliasingBuildTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -2695,9 +2723,11 @@ final class ModuleAliasingBuildTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -2845,9 +2875,11 @@ final class ModuleAliasingBuildTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -2997,9 +3029,11 @@ final class ModuleAliasingBuildTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -3110,9 +3144,11 @@ final class ModuleAliasingBuildTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -3221,9 +3257,11 @@ final class ModuleAliasingBuildTests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -3299,9 +3337,11 @@ final class ModuleAliasingBuildTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -3445,9 +3485,11 @@ final class ModuleAliasingBuildTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -3619,9 +3661,11 @@ final class ModuleAliasingBuildTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -3752,9 +3796,11 @@ final class ModuleAliasingBuildTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -3880,9 +3926,11 @@ final class ModuleAliasingBuildTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -4021,9 +4069,11 @@ final class ModuleAliasingBuildTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -4193,9 +4243,11 @@ final class ModuleAliasingBuildTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -4363,9 +4415,11 @@ final class ModuleAliasingBuildTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -4530,9 +4584,11 @@ final class ModuleAliasingBuildTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) @@ -4625,9 +4681,11 @@ final class ModuleAliasingBuildTests: XCTestCase { observabilityScope: observability.topScope ) XCTAssertNoDiagnostics(observability.diagnostics) - let result = try BuildPlanResult(plan: try BuildPlan( - buildParameters: mockBuildParameters(shouldLinkStaticSwiftStdlib: true), + let result = try BuildPlanResult(plan: try mockBuildPlan( graph: graph, + linkingParameters: .init( + shouldLinkStaticSwiftStdlib: true + ), fileSystem: fs, observabilityScope: observability.topScope )) diff --git a/Tests/BuildTests/ProductBuildDescriptionTests.swift b/Tests/BuildTests/ProductBuildDescriptionTests.swift index a314782fdae..dd2f6b8a0f4 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(environment: .init(platform: .macOS)), + buildParameters: mockBuildParameters(destination: .target, environment: .init(platform: .macOS)), fileSystem: fs, observabilityScope: observability.topScope ) diff --git a/Tests/FunctionalTests/PluginTests.swift b/Tests/FunctionalTests/PluginTests.swift index d33a0c17da1..e22eef6f0c4 100644 --- a/Tests/FunctionalTests/PluginTests.swift +++ b/Tests/FunctionalTests/PluginTests.swift @@ -226,7 +226,7 @@ final class PluginTests: XCTestCase { try testWithTemporaryDirectory { tmpPath in let packageDir = tmpPath.appending(components: "MyPackage") - let pathOfGeneratedFile = packageDir.appending(components: [".build", "plugins", "outputs", "mypackage", "SomeTarget", "Plugin", "best.txt"]) + let pathOfGeneratedFile = packageDir.appending(components: [".build", "plugins", "outputs", "mypackage", "SomeTarget", "destination", "Plugin", "best.txt"]) try createPackageUnderTest(packageDir: packageDir, toolsVersion: .v5_9) let (_, stderr) = try executeSwiftBuild(packageDir, env: ["SWIFT_DRIVER_SWIFTSCAN_LIB" : "/this/is/a/bad/path"]) diff --git a/Tests/PackageGraphTests/CrossCompilationPackageGraphTests.swift b/Tests/PackageGraphTests/CrossCompilationPackageGraphTests.swift index ea8c081d24e..3bf6ffa9a54 100644 --- a/Tests/PackageGraphTests/CrossCompilationPackageGraphTests.swift +++ b/Tests/PackageGraphTests/CrossCompilationPackageGraphTests.swift @@ -119,7 +119,7 @@ final class CrossCompilationPackageGraphTests: XCTestCase { result.checkTargets("MMIOMacros") { results in XCTAssertEqual(results.count, 1) } - result.checkTarget("MMIOMacrosTests") { result in + result.checkTarget("MMIOMacrosTests", destination: .tools) { result in result.check(buildTriple: .tools) result.checkDependency("MMIOMacros") { result in result.checkTarget { result in diff --git a/Tests/PackageGraphTests/ModulesGraphTests.swift b/Tests/PackageGraphTests/ModulesGraphTests.swift index d86c5ef2bca..7b9c2314d34 100644 --- a/Tests/PackageGraphTests/ModulesGraphTests.swift +++ b/Tests/PackageGraphTests/ModulesGraphTests.swift @@ -84,12 +84,12 @@ final class ModulesGraphTests: XCTestCase { } let fooPackage = try XCTUnwrap(g.package(for: .plain("Foo"))) - let fooTarget = try XCTUnwrap(g.allTargets.first{ $0.name == "Foo" }) - let fooDepTarget = try XCTUnwrap(g.allTargets.first{ $0.name == "FooDep" }) + let fooTarget = try XCTUnwrap(g.target(for: "Foo", destination: .destination)) + let fooDepTarget = try XCTUnwrap(g.target(for: "FooDep", destination: .destination)) XCTAssertEqual(g.package(for: fooTarget)?.id, fooPackage.id) XCTAssertEqual(g.package(for: fooDepTarget)?.id, fooPackage.id) let barPackage = try XCTUnwrap(g.package(for: .plain("Bar"))) - let barTarget = try XCTUnwrap(g.allTargets.first{ $0.name == "Bar" }) + let barTarget = try XCTUnwrap(g.target(for: "Bar", destination: .destination)) XCTAssertEqual(g.package(for: barTarget)?.id, barPackage.id) } diff --git a/Tests/SPMBuildCoreTests/PluginInvocationTests.swift b/Tests/SPMBuildCoreTests/PluginInvocationTests.swift index eb9be4cd970..60a8e2a886b 100644 --- a/Tests/SPMBuildCoreTests/PluginInvocationTests.swift +++ b/Tests/SPMBuildCoreTests/PluginInvocationTests.swift @@ -36,6 +36,7 @@ final class PluginInvocationTests: XCTestCase { let fileSystem = InMemoryFileSystem(emptyFiles: "/Foo/Plugins/FooPlugin/source.swift", "/Foo/Sources/FooTool/source.swift", + "/Foo/Sources/FooToolLib/source.swift", "/Foo/Sources/Foo/source.swift", "/Foo/Sources/Foo/SomeFile.abc" ) @@ -67,9 +68,14 @@ final class PluginInvocationTests: XCTestCase { ), TargetDescription( name: "FooTool", - dependencies: [], + dependencies: ["FooToolLib"], type: .executable ), + TargetDescription( + name: "FooToolLib", + dependencies: [], + type: .regular + ), ] ) ], @@ -80,18 +86,24 @@ final class PluginInvocationTests: XCTestCase { XCTAssertNoDiagnostics(observability.diagnostics) PackageGraphTester(graph) { graph in graph.check(packages: "Foo") - // "FooTool" duplicated as it's present for both build tools and end products triples. - graph.check(targets: "Foo", "FooPlugin", "FooTool", "FooTool") + // "FooTool{Lib}" duplicated as it's present for both build tools and end products triples. + graph.check(targets: "Foo", "FooPlugin", "FooTool", "FooTool", "FooToolLib", "FooToolLib") graph.checkTarget("Foo") { target in target.check(dependencies: "FooPlugin") } - graph.checkTarget("FooPlugin") { target in + graph.checkTarget("FooPlugin", destination: .tools) { target in target.check(type: .plugin) target.check(dependencies: "FooTool") } - graph.checkTargets("FooTool") { targets in - for target in targets { + for destination: BuildTriple in [.tools, .destination] { + graph.checkTarget("FooTool", destination: destination) { target in target.check(type: .executable) + target.check(buildTriple: destination) + target.checkDependency("FooToolLib") { dependency in + dependency.checkTarget { + $0.check(buildTriple: destination) + } + } } } } @@ -199,6 +211,7 @@ final class PluginInvocationTests: XCTestCase { let outputDir = AbsolutePath("/Foo/.build") let pluginRunner = MockPluginScriptRunner() let buildParameters = mockBuildParameters( + destination: .host, environment: BuildEnvironment(platform: .macOS, configuration: .debug) ) let results = try graph.invokeBuildToolPlugins( @@ -898,6 +911,7 @@ final class PluginInvocationTests: XCTestCase { let result = try packageGraph.invokeBuildToolPlugins( outputDir: outputDir, buildParameters: mockBuildParameters( + destination: .host, environment: BuildEnvironment(platform: .macOS, configuration: .debug) ), additionalFileRules: [], @@ -1240,6 +1254,7 @@ final class PluginInvocationTests: XCTestCase { return try packageGraph.invokeBuildToolPlugins( outputDir: outputDir, buildParameters: mockBuildParameters( + destination: .host, environment: BuildEnvironment(platform: .macOS, configuration: .debug) ), additionalFileRules: [], diff --git a/Tests/SourceKitLSPAPITests/SourceKitLSPAPITests.swift b/Tests/SourceKitLSPAPITests/SourceKitLSPAPITests.swift index 92b275bab08..2520b3a2731 100644 --- a/Tests/SourceKitLSPAPITests/SourceKitLSPAPITests.swift +++ b/Tests/SourceKitLSPAPITests/SourceKitLSPAPITests.swift @@ -45,10 +45,15 @@ class SourceKitLSPAPITests: XCTestCase { ) XCTAssertNoDiagnostics(observability.diagnostics) - let buildParameters = mockBuildParameters(shouldLinkStaticSwiftStdlib: true) let plan = try BuildPlan( - destinationBuildParameters: buildParameters, - toolsBuildParameters: buildParameters, + destinationBuildParameters: mockBuildParameters( + destination: .target, + shouldLinkStaticSwiftStdlib: true + ), + toolsBuildParameters: mockBuildParameters( + destination: .host, + shouldLinkStaticSwiftStdlib: true + ), graph: graph, fileSystem: fs, observabilityScope: observability.topScope @@ -62,7 +67,7 @@ class SourceKitLSPAPITests: XCTestCase { "-module-name", "exe", "-emit-dependencies", "-emit-module", - "-emit-module-path", "/path/to/build/\(buildParameters.triple)/debug/exe.build/exe.swiftmodule" + "-emit-module-path", "/path/to/build/\(plan.destinationBuildParameters.triple)/debug/exe.build/exe.swiftmodule" ], isPartOfRootPackage: true ) @@ -73,7 +78,7 @@ class SourceKitLSPAPITests: XCTestCase { "-module-name", "lib", "-emit-dependencies", "-emit-module", - "-emit-module-path", "/path/to/build/\(buildParameters.triple)/debug/Modules/lib.swiftmodule" + "-emit-module-path", "/path/to/build/\(plan.destinationBuildParameters.triple)/debug/Modules/lib.swiftmodule" ], isPartOfRootPackage: true ) @@ -87,7 +92,7 @@ extension SourceKitLSPAPI.BuildDescription { partialArguments: [String], isPartOfRootPackage: Bool ) throws -> Bool { - let target = try XCTUnwrap(graph.allTargets.first(where: { $0.name == targetName })) + let target = try XCTUnwrap(graph.target(for: targetName, destination: .destination)) let buildTarget = try XCTUnwrap(self.getBuildTarget(for: target, in: graph)) guard let file = buildTarget.sources.first else {