Visual Studio 2017 or newer is needed to build swift on Windows.
apple/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 named swift-corelibs-foundationapple/swift-corelibs-xctest into a folder name swift-corelibs-xctestapple/swift-lldb into a folder named lldbapple/swift-llbuild into a folder named llbuildapple/swift-package-manager info a folder named swift-package-managercurl into a folder named curllibxml2 into a folder named libxml2This guide assumes your sources live at the root of S:. If your sources live elsewhere, you can create a substitution for this:
subst S: <path to sources>
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 -c core.autocrlf=input -c core.symlinks=true https://github.com/apple/swift git clone https://github.com/apple/swift-corelibs-libdispatch git clone https://github.com/apple/swift-corelibs-foundation git clone https://github.com/apple/swift-corelibs-xctest git clone https://github.com/apple/swift-lldb lldb git clone https://github.com/apple/swift-llbuild llbuild git clone -c core.autocrlf=input https://github.com/apple/swift-package-manager git clone https://github.com/curl/curl.git git clone https://gitlab.gnome.org/GNOME/libxml2.git
thirdparty. In other words, there should be a folder S:\thirdparty\icu4c-64_2-Win64-MSVC2017 with the ICU.bin64 folder to your Path environment variable.PATH S:\thirdparty\icu4c-64_2-Win64-MSVC2017\bin64;%PATH%
(New-Object System.Net.WebClient).DownloadFile("https://www.sqlite.org/2019/sqlite-amalgamation-3270200.zip", "S:\sqlite-amalgamation-3270200.zip") Add-Type -A System.IO.Compression.FileSystem [IO.Compression.ZipFile]::ExtractToDirectory("S:\sqlite-amalgamation-3270200.zip", "S:\")
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 "%UniversalCRTSdkDir%\Include\%UCRTVersion%\um\module.modulemap" S:\swift\stdlib\public\Platform\winsdk.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
Warning: Creating the above links usually requires administrator privileges. The quick and easy way to do this is to open a second developer prompt by right clicking whatever shortcut you used to open the first one, choosing Run As Administrator, and pasting the above commands into the resulting window. You can then close the privileged prompt; this is the only step which requires elevation.
Debug or some variant of Release (e.g. Release, RelWithDebInfo).md "S:\b\llvm" cd "S:\b\llvm" cmake -G Ninja^ -DCMAKE_BUILD_TYPE=Release^ -DCMAKE_C_COMPILER=cl^ -DCMAKE_CXX_COMPILER=cl^ -DLLVM_DEFAULT_TARGET_TRIPLE=x86_64-unknown-windows-msvc^ -DLLVM_ENABLE_ASSERTIONS=ON^ -DLLVM_ENABLE_PDB=YES^ -DLLVM_ENABLE_PROJECTS=clang^ -DLLVM_TARGETS_TO_BUILD="AArch64;ARM;X86"^ S:/llvm ninja
path S:\b\llvm\bin;%PATH%
md "S:\b\cmark" cd "S:\b\cmark" cmake -G Ninja^ -DCMAKE_BUILD_TYPE=RelWithDebInfo^ -DCMAKE_C_COMPILER=cl^ -DCMAKE_CXX_COMPILER=cl^ S:\cmark ninja
C:\Python27 and a 64-bit python in C:\Python27amd64. You may use either one based on your installation.md "S:\b\swift" cd "S:\b\swift" cmake -G Ninja^ -DCMAKE_BUILD_TYPE=RelWithDebInfo^ -DCMAKE_C_COMPILER=cl^ -DCMAKE_CXX_COMPILER=cl^ -DCMAKE_EXE_LINKER_FLAGS:STRING="/INCREMENTAL:NO"^ -DCMAKE_SHARED_LINKER_FLAGS:STRING="/INCREMENTAL:NO"^ -DSWIFT_INCLUDE_DOCS=OFF^ -DSWIFT_PATH_TO_CMARK_SOURCE="S:\cmark"^ -DSWIFT_PATH_TO_CMARK_BUILD="S:\b\cmark"^ -DLLVM_DIR=S:\b\llvm\lib\cmake\llvm^ -DClang_DIR=S:\b\llvm\lib\cmake\clang^ -DSWIFT_PATH_TO_LIBDISPATCH_SOURCE="S:\swift-corelibs-libdispatch"^ -DSWIFT_WINDOWS_x86_64_ICU_UC_INCLUDE="S:/thirdparty/icu4c-64_2-Win64-MSVC2017/include"^ -DSWIFT_WINDOWS_x86_64_ICU_UC="S:/thirdparty/icu4c-64_2-Win64-MSVC2017/lib64/icuuc.lib"^ -DSWIFT_WINDOWS_x86_64_ICU_I18N_INCLUDE="S:/thirdparty/icu4c-64_2-Win64-MSVC2017/include"^ -DSWIFT_WINDOWS_x86_64_ICU_I18N="S:/thirdparty/icu4c-64_2-Win64-MSVC2017/lib64/icuin.lib"^ -DCMAKE_INSTALL_PREFIX="C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr"^ -DPYTHON_EXECUTABLE=C:\Python27\python.exe^ S:\swift ninja
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" -A x64 -T "host=x64"^ ...
md "S:\b\lldb" cd "S:\b\lldb" cmake -G Ninja^ -DLLVM_DIR="S:/b/llvm/lib/cmake/llvm"^ -DClang_DIR="S:/b/llvm/lib/cmake/clang"^ -DSwift_DIR="S:/b/swift/lib/cmake/swift"^ -DCMAKE_BUILD_TYPE=RelWithDebInfo^ -DLLDB_ALLOW_STATIC_BINDINGS=YES^ -DLLVM_ENABLE_ASSERTIONS=ON^ -DPYTHON_HOME="%ProgramFiles(x86)%\Microsoft Visual Studio\Shared\Python37_64"^ S:\lldb ninja
Running the testsuite on Windows has additional external dependencies.
path S:\thirdparty\icu4c-64_2-Win64-MSVC2017\bin64;S:\b\swift\bin;S:\b\swift\libdispatch-prefix\bin;%PATH%;%ProgramFiles%\Git\usr\bin ninja -C S:\b\swift check-swift
md "S:\b\libdispatch" cd "S:\b\libdispatch" cmake -G Ninja^ -DCMAKE_BUILD_TYPE=RelWithDebInfo^ -DCMAKE_C_COMPILER=clang-cl^ -DCMAKE_CXX_COMPILER=clang-cl^ -DCMAKE_SWIFT_COMPILER=S:\b\swift\bin\swiftc.exe^ -DENABLE_SWIFT=ON^ -DENABLE_TESTING=OFF^ S:\swift-corelibs-libdispatch ninja
path S:\b\libdispatch;S:\b\libdispatch\src;%PATH%
cd "S:\curl" .\buildconf.bat cd winbuild nmake /f Makefile.vc mode=static VC=15 MACHINE=x64
cd "S:\libxml2\win32" cscript //E:jscript configure.js iconv=no nmake /f Makefile.msvc
md "S:\b\foundation" cd "S:\b\foundation cmake -G Ninja^ -DCMAKE_BUILD_TYPE=RelWithDebInfo^ -DCMAKE_C_COMPILER=clang-cl^ -DCMAKE_SWIFT_COMPILER=S:\b\swift\bin\swiftc.exe^ -DCURL_LIBRARY="S:/curl/builds/libcurl-vc15-x64-release-static-ipv6-sspi-winssl/lib/libcurl_a.lib"^ -DCURL_INCLUDE_DIR="S:/curl/builds/libcurl-vc15-x64-release-static-ipv6-sspi-winssl/include"^ -DENABLE_TESTING=NO^ -DICU_ROOT="S:/thirdparty/icu4c-64_2-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:\b\libdispatch^ S:\swift-corelibs-foundation ninja
path S:\b\foundation;%PATH%
md "S:\b\xctest" cd "S:\b\xctest" cmake -G Ninja^ -DBUILD_SHARED_LIBS=YES^ -DCMAKE_BUILD_TYPE=RelWithDebInfo^ -DCMAKE_SWIFT_COMPILER=S:\b\swift\bin\swiftc.exe^ -DXCTEST_PATH_TO_FOUNDATION_BUILD=S:\b\foundation^ -DXCTEST_PATH_TO_LIBDISPATCH_SOURCE=S:\swift-corelibs-libdispatch^ -DXCTEST_PATH_TO_LIBDISPATCH_BUILD=S:\b\libdispatch^ -DLIT_COMMAND=S:\llvm\utils\lit\lit.py^ -DPYTHON_EXECUTABLE=C:\Python27\python.exe^ S:\swift-corelibs-xctest ninja
path S:\b\xctest;%PATH%
ninja -C S:\b\xctest check-xctest
cd "S:\b\foundation cmake -G Ninja^ -DCMAKE_BUILD_TYPE=RelWithDebInfo^ -DCMAKE_C_COMPILER=clang-cl^ -DCMAKE_SWIFT_COMPILER=S:\b\swift\bin\swiftc.exe^ -DCURL_LIBRARY="S:/curl/builds/libcurl-vc15-x64-release-static-ipv6-sspi-winssl/lib/libcurl_a.lib"^ -DCURL_INCLUDE_DIR="S:/curl/builds/libcurl-vc15-x64-release-static-ipv6-sspi-winssl/include"^ -DENABLE_TESTING=YES^ -DICU_ROOT="S:/thirdparty/icu4c-64_2-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:\b\libdispatch^ -DFOUNDATION_PATH_TO_XCTEST_BUILD=S:\b\xctest^ S:\swift-corelibs-foundation ninja
cmake --build S:\b\foundation ninja -C S:\b\foundation test
md S:\b\sqlite cd S:\b\sqlite cl /MD /Ox /Zi /LD /DSQLITE_API=__declspec(dllexport) S:\sqlite-amalgamation-3270200\sqlite3.c
path S:\b\sqlite;%PATH%
md S:\b\llbuild cd S:\b\llbuild set AR=llvm-ar cmake -G Ninja^ -DCMAKE_BUILD_TYPE=RelWithDebInfo^ -DCMAKE_C_COMPILER=cl^ -DCMAKE_CXX_COMPILER=cl^ -DFOUNDATION_BUILD_DIR=S:\b\foundation^ -DLIBDISPATCH_BUILD_DIR=S:\b\libdispatch^ -DLIBDISPATCH_SOURCE_DIR=S:\swift-corelibs-libdispatch^ -DSQLite3_INCLUDE_DIR=S:\sqlite-amalgamation-3270200^ -DSQLite3_LIBRARY=S:\b\sqlite\sqlite3.lib^ -DLLBUILD_SUPPORT_BINDINGS=Swift^ S:\llbuild ninja
path S:\b\llbuild\bin;%PATH%
md S:\b\spm cd S:\b\spm C:\Python27\python.exe S:\swift-package-manager\Utilities\bootstrap --foundation S:\b\foundation --libdispatch-build-dir S:\b\libdispatch --libdispatch-source-dir S:\swift-corelibs-libdispatch --llbuild-build-dir S:\b\llbuild --llbuild-source-dir S:\llbuild --sqlite-build-dir S:\b\sqlite --sqlite-source-dir S:\sqlite-amalgamation-3270200
ninja -C S:\b\swift install
C:\Library\Developer\Toolchains\unknown-Asserts-development.xctoolchain\usr\bin) to the PATH environment variable.If you resume development from a new shell, the path will need to be readjusted. The following will add the correct search order to the path:
path S:\thirdparty\icu4c-63_1-Win64-MSVC2017\bin64;S:\b\llvm\bin;S:\b\swift\bin;S:\b\libdispatch;S:\b\libdispatch\src;S:\b\foundation;S:\b\xctest;S:\b\llbuild\bin;S:\b\sqlite;%PATH%;%ProgramFiles%\Git\usr\bin