Cross‐compile from WSL to Windows with SwiftPM?

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.

1 Like