This document describes how to build Swift for Windows natively. See the Windows doc for more about what is possible with Swift on Windows.
There are two supported ways to build Swift on Windows, they are
clang-clclang-cl is recommended over MSVC for building Swift on Windows.
Although it is possible to build the compiler and the standard library with MSVC and to use those built products to compile a Swift program, it won't be possible to run the binary without separately obtaining the Swift runtime. On the other hand, clang-cl is able to build the runtime, which makes it possible to build and run all the components required for Swift natively on Windows.
clang should be 7.0 or newer. Visual Studio 2017 is needed in all cases as it provides some of the needed headers and libraries.
clang-clapple/swift-cmark into a folder named cmarkapple/swift-clang into a folder named clangapple/swift-llvm into a folder named llvmapple/swift-compiler-rt into a folder named compiler-rtapple/swift into a folder named swiftapple/swift-corelibs-libdispatch into a folder named swift-corelibs-libdispatchapple/swift-corelibs-foundation into a folder name swift-corelibs-foundationIf your sources live else where, you can create a substitution for this:
subst S: <path to sources>
git config --global core.autocrlf input S: git clone https://github.com/apple/swift-cmark cmark git clone https://github.com/apple/swift-clang clang git clone https://github.com/apple/swift-llvm llvm git clone https://github.com/apple/swift-compiler-rt compiler-rt git clone https://github.com/apple/swift git clone https://github.com/apple/swift-corelibs-libdispatch git clone https://github.com/apple/swift-corelibs-foundation
bin64 folder to your Path environment variable.VsDevCmd -arch=amd64
If instead you're compiling for a 32-bit Windows target, adapt the arch argument to x86 and run
VsDevCmd -arch=x86
Decide whether you want to build a release or debug version of Swift on Windows and replace the CMAKE_BUILD_TYPE parameter in the build steps below with the correct value (Debug, RelWithDebInfoAssert or Release) to avoid conflicts between the debug and non-debug version of the MSCRT library.
Set up the ucrt, visualc, and WinSDK modules by copying ucrt.modulemap located at swift/stdlib/public/Platform/ucrt.modulemap into ${UniversalCRTSdkDir}/Include/${UCRTVersion}/ucrt as module.modulemap, copying visualc.modulemap located at swift/stdlib/public/Platform/visualc.modulemap into ${VCToolsInstallDir}/include as module.modulemap, and copying winsdk.modulemap located at swift/stdlib/public/Platform/winsdk.modulemap into ${UniversalCRTSdkDir}/Include/${UCRTVersion}/um and setup the visualc.apinotes located at swift/stdlib/public/Platform/visualc.apinotes into ${VCToolsInstallDir}/include as visualc.apinotes
mklink %UniversalCRTSdkDir%\Include\%UCRTVersion%\ucrt\module.modulemap S:\swift\stdlib\public\Platform\ucrt.modulemap mklink %VCToolsInstallDir%\include\module.modulemap S:\swift\stdlib\public\Platform\visualc.modulemap mklink %VCToolsInstallDir%\include\visualc.apinotes S:\swift\stdlib\public\Platform\visualc.apinotes mklink %UniversalCRTSdkDir%\Include\%UCRTVersion%\um\module.modulemap S:\swift\stdlib\public\Platform\winsdk.modulemap
mkdir S:\build\Ninja-DebugAssert\cmark-windows-amd64" pushd S:\build\Ninja-DebugAssert\cmark-windows-amd64" "S:\cmark" cmake -G Ninja^ -DCMAKE_BUILD_TYPE=Debug^ -DCMAKE_C_COMPILER=cl^ -DCMAKE_CXX_COMPIELR=cl^ S:\cmark popd cmake --build "S:\build\Ninja-DebugAssert\cmark-windows-amd64"
Debug, Release, RelWithDebInfoAssert) for LLVM/Clang matches the build type for Swift.mkdir "S:\build\Ninja-DebugAssert\llvm-windows-amd64" pushd "S:\build\Ninja-DebugAssert\llvm-windows-amd64" cmake -G "Ninja"^ -DCMAKE_BUILD_TYPE=Debug^ -DCMAKE_C_COMPILER=cl^ -DCMAKE_CXX_COMPILER=cl^ -DLLVM_DEFAULT_TARGET_TRIPLE=x86_64-unknown-windows-msvc^ -DLLVM_ENABLE_ASSERTIONS=TRUE^ -DLLVM_ENABLE_PROJECTS=clang^ -DLLVM_TARGETS_TO_BUILD=X86^ "S:\llvm" popd cmake --build "S:\build\Ninja-DebugAssert\llvm-windows-amd64"
set PATH=%PATH%;S:\build\Ninja-DebugAssert\llvm-windows-amd64\bin
SWIFT_WINDOWS_LIB_DIRECTORY parameter depending on your target platform or Windows SDK version.mkdir "S:\build\Ninja-DebugAssert\swift-windows-amd64" pushd "S:\build\inja-DebugAssert\swift-windows-amd64" cmake -G "Ninja"^ -DCMAKE_BUILD_TYPE=Debug^ -DCMAKE_C_COMPILER=clang-cl^ -DCMAKE_CXX_COMPILER=clang-cl^ -DSWIFT_PATH_TO_CMARK_SOURCE="S:\cmark"^ -DCMAKE_CXX_FLAGS="-Wno-c++98-compat -Wno-c++98-compat-pedantic"^ -DCMAKE_EXE_LINKER_FLAGS:STRING="/INCREMENTAL:NO"^ -DCMAKE_SHARED_LINKER_FLAGS="/INCREMENTAL:NO"^ -DSWIFT_INCLUDE_DOCS=NO^ -DSWIFT_PATH_TO_LLVM_SOURCE="S:\llvm"^ -DSWIFT_PATH_TO_CLANG_SOURCE="S:\clang"^ -DSWIFT_PATH_TO_LIBDISPATCH_SOURCE="S:\swift-corelibs-libdispatch"^ -DSWIFT_PATH_TO_LLVM_BUILD="S:\build\Ninja-DebugAssert\llvm-windows-amd64"^ -DSWIFT_PATH_TO_CLANG_BUILD="S:\build\Ninja-DebugAssert\llvm-windows-amd64"^ -DSWIFT_PATH_TO_CMARK_BUILD="S:\build\Ninja-DebugAssert\cmark-windows-amd64"^ -DSWIFT_WINDOWS_x86_64_ICU_UC_INCLUDE="S:\icu\include"^ -DSWIFT_WINDOWS_x86_64_ICU_UC="S:\icu\lib64\icuuc.lib"^ -DSWIFT_WINDOWS_x86_64_ICU_I18N_INCLUDE="S:\icu\include"^ -DSWIFT_WINDOWS_x86_64_ICU_I18N="S:\icu\lib64\icuin.lib"^ -DCMAKE_INSTALL_PREFIX="C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr"^ "S:\swift" popd cmake --build "S:\build\Ninja-DebugAssert\swift-windows-amd64"
swift project due to an MSBuild limitation that file paths cannot exceed 260 characters. These can be ignored, as they occur after the build when writing the last build status to a file.cmake -G "Visual Studio 2017" "S:\swift" -DCMAKE_GENERATOR_PLATFORM="x64"^ ...
mkdir "S:/build/Ninja-DebugAssert/lldb-windows-amd64" pushd "S:/build/Ninja-DebugAssert/lldb-windows-amd64" cmake -G "Ninja" "S:/lldb"^ -DCMAKE_BUILD_TYPE=Debug^ -DLLDB_PATH_TO_CMARK_SOURCE="S:/cmark"^ -DLLDB_PATH_TO_LLVM_SOURCE="S:/llvm"^ -DLLDB_PATH_TO_CLANG_SOURCE="S:/clang"^ -DLLDB_PATH_TO_SWIFT_SOURCE="S:/swift"^ -DLLDB_PATH_TO_CMARK_BUILD="S:/build/Ninja-DebugAssert/cmark-windows-amd64"^ -DLLDB_PATH_TO_CLANG_BUILD="S:/build/Ninja-DebugAssert/llvm-windows-amd64"^ -DLLDB_PATH_TO_LLVM_BUILD="S:/build/Ninja-DebugAssert/llvm-windows-amd64"^ -DLLDB_PATH_TO_SWIFT_BUILD="S:/build/Ninja-DebugAssert/swift-windows-amd64"^ -DLLVM_ENABLE_ASSERTIONS=YES popd cmake --build "S:/build/Ninja-DebugAssert/lldb-windows-amd64"
Running the testsuite on Windows has additional external dependencies. You must have a subset of the GNUWin32 programs installed and available in your path. The following packages are currently required:
ninja -C "S:/build/Ninja-DebugAssert/swift-windows-amd64" check-swift
mkdir "S:/build/Ninja-DebugAssert/swift-corelibs-libdispatch-windows-amd64" pushd "S:/build/Ninja-DebugAssert/swift-corelibs-libdispatch-windows-amd64" cmake -G "Ninja"^ -DCMAKE_BUILD_TYPE=Debug^ -DCMAKE_C_COMPILER="S:/build/Ninja-DebugAssert/llvm-windows-amd64/bin/clang-cl.exe"^ -DCMAKE_CXX_COMPILER="S:/build/Ninja-DebugAssert/llvm-windows-amd64/bin/clang-cl.exe"^ -DCMAKE_SWIFT_COMPILER="S:/build/Ninja-DebugAssert/swift-windows-amd64/bin/swiftc.exe"^ -DSwift_DIR="S:/build/Ninja-DebugAssert/swift-windows-amd64/lib/cmake/swift"^ -DENABLE_SWIFT=YES^ -DENABLE_TESTING=NO^ S:/swift-corelibs-libdispatch popd cmake --build
mkdir "S:/build/Ninja-DebugAssert/swift-corelibs-foundation-windows-amd64" pushd "S:/build/Ninja-DebugAssert/swift-corelibs-foundation-windows-amd64" cmake -G "Ninja"^ -DCMAKE_BUILD_TYPE=Debug^ -DCMAKE_C_COMPILER="S:/build/Ninja-DebugAssert/llvm-windows-amd64/bin/clang-cl.exe"^ -DCMAKE_SWIFT_COMPILER="S:/build/Ninja-DebugAssert/swift-windows-amd64/bin/swiftc.exe"^ -DCURL_LIBRARY="S:/curl/builds/libcurl-VS15-x64-release-static-ipv6-sspi-winssl/lib/libcurl_a.lib"^ -DCURL_INCLUDE_DIR="S:/curl/builds/libcurl-VS15-x64-release-static-ipv6-sspi-winssl/include"^ -DICU_ROOT="S:/thirdparty/icu4c-63_1-Win64-MSVC2017"^ -DLIBXML2_LIBRARY="S:/libxml2/win32/bin.msvc/libxml2_a.lib"^ -DLIBXML2_INCLUDE_DIR="S:/libxml2/include"^ -DFOUNDATION_PATH_TO_LIBDISPATCH_SOURCE="S:/swift-corelibs-libdispatch"^ -DFOUNDATION_PATH_TO_LIBDISPATCH_BUILD="S:/build/Ninja-DebugAssert/swift-corelibs-libdispatch-windows-amd64"^ "S:/swift-corelibs-foundation" cmake --build "S:/build/Ninja-DebugAssert/swift-corelibs-foundation-windows-amd64"
ninja -C "S:/build/Ninja-DebugAssert/swift-windows-amd64" install
C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr\bin) to the PATH environment variable.To use cl instead, just replace the -DCMAKE_C_COMPILER and -DCMAKE_CXX_COMPILER parameters to the cmake invocations.