From 2afeca44d79584d35a3f95d0ae656e87b686efee Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Wed, 24 Apr 2024 17:19:14 +0100 Subject: [PATCH 1/3] Include host triple targets in `ResolvedPackage` Modified `ResolvedModule` build triples were not reflected in `ResolvedPackage`, which meant those modules aren't included in the build graph. Verified with `swift-foundation` and `swift-testing` packages. Resolves https://github.com/apple/swift-package-manager/issues/7479. --- Sources/Basics/Errors.swift | 3 +-- .../SwiftTargetBuildDescription.swift | 5 +++-- .../LLBuildManifestBuilder+Resources.swift | 2 +- .../Build/BuildManifest/LLBuildManifestBuilder.swift | 4 ++-- Sources/Build/BuildPlan/BuildPlan.swift | 2 +- Sources/PackageGraph/ModulesGraph+Loading.swift | 12 ++++++++---- .../PackageGraph/Resolution/ResolvedPackage.swift | 4 ++-- 7 files changed, 18 insertions(+), 14 deletions(-) diff --git a/Sources/Basics/Errors.swift b/Sources/Basics/Errors.swift index c0900f565d7..f075978da86 100644 --- a/Sources/Basics/Errors.swift +++ b/Sources/Basics/Errors.swift @@ -21,8 +21,7 @@ public struct InternalError: Error { private let description: String public init(_ description: String) { assertionFailure(description) - self - .description = + self.description = "Internal error. Please file a bug at https://github.com/apple/swift-package-manager/issues with this info. \(description)" } } diff --git a/Sources/Build/BuildDescription/SwiftTargetBuildDescription.swift b/Sources/Build/BuildDescription/SwiftTargetBuildDescription.swift index 286e6307dbc..7c9c6ff0b35 100644 --- a/Sources/Build/BuildDescription/SwiftTargetBuildDescription.swift +++ b/Sources/Build/BuildDescription/SwiftTargetBuildDescription.swift @@ -65,9 +65,10 @@ package final class SwiftTargetBuildDescription { /// Path to the bundle generated for this module (if any). var bundlePath: AbsolutePath? { if let bundleName = target.underlying.potentialBundleName, needsResourceBundle { - return self.defaultBuildParameters.bundlePath(named: bundleName) + let suffix = self.defaultBuildParameters.suffix(triple: self.target.buildTriple) + return self.defaultBuildParameters.bundlePath(named: bundleName + suffix) } else { - return .none + return nil } } diff --git a/Sources/Build/BuildManifest/LLBuildManifestBuilder+Resources.swift b/Sources/Build/BuildManifest/LLBuildManifestBuilder+Resources.swift index 599c7c435d5..df561d46b8b 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(config: target.buildParameters.buildConfig) + let cmdName = target.target.getLLBuildResourcesCmdName(buildParameters: target.buildParameters) self.manifest.addPhonyCmd(name: cmdName, inputs: outputs, outputs: [.virtual(cmdName)]) return .virtual(cmdName) diff --git a/Sources/Build/BuildManifest/LLBuildManifestBuilder.swift b/Sources/Build/BuildManifest/LLBuildManifestBuilder.swift index e9c1070b21c..edf8415c123 100644 --- a/Sources/Build/BuildManifest/LLBuildManifestBuilder.swift +++ b/Sources/Build/BuildManifest/LLBuildManifestBuilder.swift @@ -325,8 +325,8 @@ extension ResolvedModule { "\(self.name)-\(buildParameters.buildConfig)\(buildParameters.suffix(triple: self.buildTriple)).module" } - package func getLLBuildResourcesCmdName(config: String) -> String { - "\(self.name)-\(config).module-resources" + package func getLLBuildResourcesCmdName(buildParameters: BuildParameters) -> String { + "\(self.name)-\(buildParameters.buildConfig)\(buildParameters.suffix(triple: self.buildTriple)).module-resources" } } diff --git a/Sources/Build/BuildPlan/BuildPlan.swift b/Sources/Build/BuildPlan/BuildPlan.swift index 0f4a9e06e8d..8f03a297328 100644 --- a/Sources/Build/BuildPlan/BuildPlan.swift +++ b/Sources/Build/BuildPlan/BuildPlan.swift @@ -699,7 +699,7 @@ extension Basics.Diagnostic { extension BuildParameters { /// Returns a named bundle's path inside the build directory. func bundlePath(named name: String) -> AbsolutePath { - buildPath.appending(component: name + self.triple.nsbundleExtension) + self.buildPath.appending(component: name + self.triple.nsbundleExtension) } } diff --git a/Sources/PackageGraph/ModulesGraph+Loading.swift b/Sources/PackageGraph/ModulesGraph+Loading.swift index 1079ad868b0..59687da73f3 100644 --- a/Sources/PackageGraph/ModulesGraph+Loading.swift +++ b/Sources/PackageGraph/ModulesGraph+Loading.swift @@ -1050,13 +1050,17 @@ private final class ResolvedPackageBuilder: ResolvedBuilder { } override func constructImpl() throws -> ResolvedPackage { - return ResolvedPackage( + let products = try self.products.map { try $0.construct() } + var targets = products.reduce(into: IdentifiableSet()) { $0.formUnion($1.targets) } + try targets.formUnion(self.targets.map { try $0.construct() }) + + return try ResolvedPackage( underlying: self.package, defaultLocalization: self.defaultLocalization, supportedPlatforms: self.supportedPlatforms, - dependencies: try self.dependencies.map{ try $0.construct() }, - targets: try self.targets.map{ try $0.construct() }, - products: try self.products.map{ try $0.construct() }, + dependencies: self.dependencies.map{ try $0.construct() }, + targets: targets, + products: products, registryMetadata: self.registryMetadata, platformVersionProvider: self.platformVersionProvider ) diff --git a/Sources/PackageGraph/Resolution/ResolvedPackage.swift b/Sources/PackageGraph/Resolution/ResolvedPackage.swift index 5506bcc15b1..78cd87c2345 100644 --- a/Sources/PackageGraph/Resolution/ResolvedPackage.swift +++ b/Sources/PackageGraph/Resolution/ResolvedPackage.swift @@ -34,7 +34,7 @@ public struct ResolvedPackage { public let underlying: Package /// The targets contained in the package. - public let targets: [ResolvedModule] + public let targets: IdentifiableSet /// The products produced by the package. public let products: [ResolvedProduct] @@ -58,7 +58,7 @@ public struct ResolvedPackage { defaultLocalization: String?, supportedPlatforms: [SupportedPlatform], dependencies: [ResolvedPackage], - targets: [ResolvedModule], + targets: IdentifiableSet, products: [ResolvedProduct], registryMetadata: RegistryReleaseMetadata?, platformVersionProvider: PlatformVersionProvider From 681603f76d019ea5e945431c80896635b0ca5800 Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Wed, 24 Apr 2024 17:56:29 +0100 Subject: [PATCH 2/3] Fix `ClangTargetBuildDescriptionTests.swift` --- Tests/BuildTests/ClangTargetBuildDescriptionTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/BuildTests/ClangTargetBuildDescriptionTests.swift b/Tests/BuildTests/ClangTargetBuildDescriptionTests.swift index f8361e473df..32b24c92fc4 100644 --- a/Tests/BuildTests/ClangTargetBuildDescriptionTests.swift +++ b/Tests/BuildTests/ClangTargetBuildDescriptionTests.swift @@ -106,7 +106,7 @@ final class ClangTargetBuildDescriptionTests: XCTestCase { defaultLocalization: nil, supportedPlatforms: [], dependencies: [], - targets: [target], + targets: .init([target]), products: [], registryMetadata: nil, platformVersionProvider: .init(implementation: .minimumDeploymentTargetDefault)), From e0dc6ebb658406c7532f0052eb63fa65b4f0f18e Mon Sep 17 00:00:00 2001 From: Max Desiatov Date: Wed, 24 Apr 2024 18:15:59 +0100 Subject: [PATCH 3/3] Fix `PackageCommandTests.testPluginAPIs` --- Tests/CommandsTests/PackageCommandTests.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Tests/CommandsTests/PackageCommandTests.swift b/Tests/CommandsTests/PackageCommandTests.swift index be29ac86dd5..43a71bcf1a7 100644 --- a/Tests/CommandsTests/PackageCommandTests.swift +++ b/Tests/CommandsTests/PackageCommandTests.swift @@ -3054,9 +3054,9 @@ final class PackageCommandTests: CommandsTestCase { let execProducts = context.package.products(ofType: ExecutableProduct.self) print("execProducts: \\(execProducts.map{ $0.name })") let swiftTargets = context.package.targets(ofType: SwiftSourceModuleTarget.self) - print("swiftTargets: \\(swiftTargets.map{ $0.name })") + print("swiftTargets: \\(swiftTargets.map{ $0.name }.sorted())") let swiftSources = swiftTargets.flatMap{ $0.sourceFiles(withSuffix: ".swift") } - print("swiftSources: \\(swiftSources.map{ $0.path.lastComponent })") + print("swiftSources: \\(swiftSources.map{ $0.path.lastComponent }.sorted())") if let target = target.sourceModule { print("Module kind of '\\(target.name)': \\(target.kind)") @@ -3120,8 +3120,8 @@ final class PackageCommandTests: CommandsTestCase { do { let (stdout, _) = try SwiftPM.Package.execute(["print-target-dependencies", "--target", "FifthTarget"], packagePath: packageDir) XCTAssertMatch(stdout, .contains("execProducts: [\"FifthTarget\"]")) - XCTAssertMatch(stdout, .contains("swiftTargets: [\"ThirdTarget\", \"TestTarget\", \"SecondTarget\", \"FourthTarget\", \"FirstTarget\", \"FifthTarget\"]")) - XCTAssertMatch(stdout, .contains("swiftSources: [\"library.swift\", \"tests.swift\", \"library.swift\", \"library.swift\", \"library.swift\", \"main.swift\"]")) + XCTAssertMatch(stdout, .contains("swiftTargets: [\"FifthTarget\", \"FirstTarget\", \"FourthTarget\", \"SecondTarget\", \"TestTarget\", \"ThirdTarget\"]")) + XCTAssertMatch(stdout, .contains("swiftSources: [\"library.swift\", \"library.swift\", \"library.swift\", \"library.swift\", \"main.swift\", \"tests.swift\"]")) XCTAssertMatch(stdout, .contains("Module kind of 'FifthTarget': executable")) }