Notes from the SPM break-out on August 28, 2026.
Attendees: Owen Voorhees, Dave Inglis, Doug Schaefer (Apple); Saleem Abdulrasool and Kelly Chan (BCNY).
Gaps are grouped into themes to bring to the Swift Build and Packaging Workgroup. Each theme can be split into subtasks. Use the Swift Open Source Slack workspace on channels #windows or #apple-bcny for quick questions or discussions.
Explicit linkage control: Windows needs an upfront static vs. dynamic declaration, and the -static flag is serialized into the swift module. Direction: phase out the products concept, let targets declare linkage, possibly dual static and dynamic module builds. Breaking changes acceptable. Open: who owns the design proposal.
Related issues: SwiftPM #9412, SwiftPM #5597, SwiftPM #9276, Swift Build #611.
Testable executables: entry-point renaming does not work on Windows. Decision needed: fix, scope separately, or mark unsupported (across all platforms).
Historical issues: SwiftPM #6367 (closed as completed), SwiftPM #6083 (closed as duplicate). Revalidate before opening a new issue.
Multi-toolchain runtime support: no rpath, so side-by-side installs need a manifest embedded per binary. Strict sequence: build, embed manifest, code sign. CMake already does this and is a reference.
Related issues: SwiftPM #10079 (manifests), SwiftPM #10080 (resources), Installer #302, Swift #84182. Partial coverage of the end-to-end signing sequence.
SDK and toolchain discovery: currently relies on SDKROOT environment variable or -sdk parameter to the frontend. tcrun heuristics are about to break; COM and Windows Installer enumeration is the long-term fix. Define how tooling enumerates and auto-selects installed SDKs and toolchains.
Related issue: Installer #379.
Swiftly Windows backend: should Swiftly absorb this discovery via a dedicated Windows backend. Scoping with Mishal on Sept 10
Related issue: Swiftly #151.
COM interop: registry-free COM needs embedded metadata; registered COM needs post-build registration plus unregister on rebuild or clean. Analogous to Darwin launch services (though that is closer to SCM - Service Control Manager).
Related issues: Swift #84056 (interop umbrella), SwiftPM #10079, SwiftPM #10080. Partial coverage; no direct registration-lifecycle tracker found.
NuGet and external packages: NuGet is the canonical Windows distribution channel, and WinRT bindings need a large external metadata file. The old NuGet provider was never productionized. Doug is building an external package concept to overlay binary deps and inject build settings. SDL may be a good model.
Related issues: SwiftPM #9316, SwiftPM #4369 (NuGet), SwiftPM #9273 (external manifests), SwiftPM #10358 (Windows DLL artifact copying).
SPM is much slower on Windows, likely path handling and file I/O in swift-build. Needs profiling. Although this type of slow down does not appear with CMake + Ninja.
Related issue: SwiftPM #8265.
File system APIs are awkward with Windows paths. Move to URL-based path handling.
Related issues: SwiftPM #6994, SwiftPM #8044. Historical Windows plugin tracker: SwiftPM #9927 (closed).
Tests run in GitHub Actions and Jenkins but not the main PR path. Root cause: process and concurrency hangs; fix is migrating to swift-subprocess, once CI builders are updated. Tests also rebuild from scratch, making runs slow.
Related issues: SwiftPM #8895, SwiftPM #9288, SwiftPM #8389, SwiftPM #10259.