Skip to content

Provide build settings for version-specific package manifests #1845

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Dec 3, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 20 additions & 7 deletions Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift
Original file line number Diff line number Diff line change
Expand Up @@ -537,16 +537,29 @@ package actor SwiftPMBuildSystem: BuiltInBuildSystem {
// (https://github.com/swiftlang/sourcekit-lsp/issues/1267)
for target in request.targets {
if target == .forPackageManifest {
let packageManifestName = #/^Package@swift-(\d+)(?:\.(\d+))?(?:\.(\d+))?.swift$/#
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like this is copy-pasted from SwiftPM, but I should note that .swift should be \.swift here. Would it be worth exposing the regex (or an API that returns all the manifests) from SwiftPM to ensure this remains up-to-date?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I copied it. I think threading it through from SwiftPM will be tricky (SwiftPM uses its own RegEx type IIRC) and I don’t expect it to change. So, I think copying is the best solution we have right now. And then, I’d also copy the regex as it’s written in SwiftPM, including the issue that it should really be \.swift.

let versionSpecificManifests = try? FileManager.default.contentsOfDirectory(
at: projectRoot,
includingPropertiesForKeys: nil
).compactMap { (url) -> SourceItem? in
guard (try? packageManifestName.wholeMatch(in: url.lastPathComponent)) != nil else {
return nil
}
return SourceItem(
uri: DocumentURI(url),
kind: .file,
generated: false
)
}
let packageManifest = SourceItem(
uri: DocumentURI(projectRoot.appendingPathComponent("Package.swift")),
kind: .file,
generated: false
)
result.append(
SourcesItem(
target: target,
sources: [
SourceItem(
uri: DocumentURI(projectRoot.appendingPathComponent("Package.swift")),
kind: .file,
generated: false
)
]
sources: [packageManifest] + (versionSpecificManifests ?? [])
)
)
}
Expand Down
45 changes: 45 additions & 0 deletions Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -1103,6 +1103,51 @@ final class SwiftPMBuildSystemTests: XCTestCase {
XCTAssertEqual(end.token, begin.token)
XCTAssertEqual(end.value, .end(WorkDoneProgressEnd()))
}

func testBuildSettingsForVersionSpecificPackageManifest() async throws {
try await withTestScratchDir { tempDir in
try FileManager.default.createFiles(
root: tempDir,
files: [
"pkg/Sources/lib/a.swift": "",
"pkg/Package.swift": """
// swift-tools-version:4.2
import PackageDescription
let package = Package(
name: "a",
targets: [.target(name: "lib")]
)
""",
"pkg/[email protected]": """
// swift-tools-version:4.2
import PackageDescription
let package = Package(
name: "a",
targets: [.target(name: "lib")]
)
""",
]
)
let packageRoot = try tempDir.appendingPathComponent("pkg").realpath
let versionSpecificManifestURL = packageRoot.appendingPathComponent("[email protected]")
let buildSystemManager = await BuildSystemManager(
buildSystemSpec: BuildSystemSpec(kind: .swiftPM, projectRoot: packageRoot),
toolchainRegistry: .forTesting,
options: SourceKitLSPOptions(),
connectionToClient: DummyBuildSystemManagerConnectionToClient(),
buildSystemTestHooks: BuildSystemTestHooks()
)
await buildSystemManager.waitForUpToDateBuildGraph()
let settings = await buildSystemManager.buildSettingsInferredFromMainFile(
for: DocumentURI(versionSpecificManifestURL),
language: .swift,
fallbackAfterTimeout: false
)
let compilerArgs = try XCTUnwrap(settings?.compilerArguments)
XCTAssert(compilerArgs.contains("-package-description-version"))
XCTAssert(compilerArgs.contains(try versionSpecificManifestURL.filePath))
}
}
}

private func assertArgumentsDoNotContain(
Expand Down