I haven't tested this in a while, but I did have a working WSL -> Windows SwiftPM cross-compilation setup working a few months ago. What's below is all from memory and notes I've taken so forgive me it's a little vague.
I had copied the lib directory for the target into the Linux Swift /usr/lib (i.e. to /usr/lib/swift/windows), avoiding having to pass the -sdk
. My destination JSON file looked like this:
{
"version": 1,
"sdk": "/mnt/c/Users/troug/Documents/swift-toolchain/usr/bin/swiftc",
"toolchain-bin-dir": "/mnt/c/Users/troug/Documents/swift-toolchain/usr/bin",
"target": "x86_64-unknown-windows-msvc",
"dynamic-library-extension": "lib",
"extra-cc-flags": [
"-DUNICODE=1",
"-isystem",
"/mnt/c/Users/troug/Documents/swift-toolchain/usr/lib/clang/7.0.0/include",
"-isystem",
"/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.24.28314/include",
"-isystem",
"/mnt/c/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt",
"-isystem",
"/mnt/c/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/um",
"-isystem",
"/mnt/c/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/shared"
],
"extra-swiftc-flags": [
"-use-ld=lld",
"-Xcc",
"-isystem",
"-Xcc",
"/mnt/c/Users/troug/Documents/swift-toolchain/usr/lib/clang/7.0.0/include",
"-Xcc",
"-isystem",
"-Xcc",
"/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.24.28314/include",
"-Xcc",
"-isystem",
"-Xcc",
"/mnt/c/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/ucrt",
"-Xcc",
"-isystem",
"-Xcc",
"/mnt/c/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/um",
"-Xcc",
"-isystem",
"-Xcc",
"/mnt/c/Program Files (x86)/Windows Kits/10/Include/10.0.18362.0/shared",
"-L/mnt/c/Users/troug/Documents/swift-toolchain/usr/lib/swift/windows",
"-L/mnt/c/Users/troug/Documents/swift-toolchain/usr/lib/swift/windows/x86_64",
"-L/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.24.28314/ATLMFC/lib/x64",
"-L/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.24.28314/lib/x64",
"-L/mnt/c/Program Files (x86)/Windows Kits/NETFXSDK/4.8/lib/um/x64",
"-L/mnt/c/Program Files (x86)/Windows Kits/10/lib/10.0.18362.0/ucrt/x64",
"-L/mnt/c/Program Files (x86)/Windows Kits/10/lib/10.0.18362.0/um/x64",
"-L/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.24.28314/ATLMFC/lib/x86",
"-L/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.24.28314/lib/x86",
"-L/mnt/c/Program Files (x86)/Windows Kits/NETFXSDK/4.8/lib/um/x86",
"-L/mnt/c/Program Files (x86)/Windows Kits/10/lib/10.0.18362.0/ucrt/x86",
"-L/mnt/c/Program Files (x86)/Windows Kits/10/lib/10.0.18362.0/um/x86"
],
"extra-cpp-flags": [
],
}
I used swift build --destination WindowsDest.json -Xlinker "/mnt/c/Program Files (x86)/Windows Kits/10/Lib/10.0.18362.0/um/x64/Ole32.Lib" -Xlinker "/mnt/c/Program Files (x86)/Windows Kits/10/Lib/10.0.18362.0/um/x64/shell32.lib"
as the invocation; I think the only reason those linker flags are on the command line was because I was testing things and didn't bother to add them to the JSON file.
The order of the includes is important; in particular, you need to make sure the Clang overlays are included before the Windows headers.