Skip to content
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

Documentation: Update CMake.md to use the ABI entry point #828

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
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
21 changes: 14 additions & 7 deletions Documentation/CMake.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,21 +59,28 @@ endif()
## Add an entry point

You must include a source file in your test executable target with a
`@main` entry point. The following example uses the SwiftPM entry point:
`@main` entry point.

```swift
import Testing
import Foundation
@_spi(ForToolsIntegrationOnly) import Testing
Copy link
Contributor

@grynspan grynspan Nov 18, 2024

Choose a reason for hiding this comment

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

So, yes-and-no. As we talked about in Slack, it's a bug that any @_spi content is available in the Swift toolchain right now and it's going to get removed in the future.

For the moment, code should either use dlsym()/GetProcAddress() or, if a little more adventurous, use the experimental @_extern(c) to call swt_abiv0_getEntryPoint(), then load the SwiftCC entry point from there. (@_silgen_name could be used too, but technically the calling conventions are incompatible, so caveat codor.)

We're still looking at how to expose these symbols in a way that makes it easy for test tools/harness authors but doesn't make the symbols visible to test authors by default. We're looking at adding a dedicated target in the package (if we can do so without requiring building the whole library from source) or creating a separate swift-testing-tools-support package, among other options.


@main struct Runner {
static func main() async {
await Testing.__swiftPMEntryPoint() as Never
static func main() async throws {
let configurationJSON: UnsafeRawBufferPointer? = nil
Copy link
Contributor

Choose a reason for hiding this comment

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

You can leave this line out and just pass nil if you're not actually going to use it. :)

let recordHandler: @Sendable (UnsafeRawBufferPointer) -> Void = { _ in }

if try await ABIv0.entryPoint(configurationJSON, recordHandler) {
exit(EXIT_SUCCESS)
} else {
exit(EXIT_FAILURE)
}
}
}
```

> [!WARNING]
> The entry point is expected to change to an entry point designed for other
> build systems prior to the initial stable release of Swift Testing.
For more information on the input configuration and output records of the ABI entry
point, refer to the [ABI documentation](ABI/JSON.md)

## Integrate with CTest

Expand Down