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-cl
clang-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-cl
apple/swift-cmark
into a folder named cmark
apple/swift-clang
into a folder named clang
apple/swift-llvm
into a folder named llvm
apple/swift-compiler-rt
into a folder named compiler-rt
apple/swift
into a folder named swift
apple/swift-corelibs-libdispatch
into a folder named swift-corelibs-libdispatch
apple/swift-corelibs-foundation
into a folder name swift-corelibs-foundation
If 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.