@echo off | |
setlocal enabledelayedexpansion | |
if "%1"=="" goto usage | |
goto begin | |
:usage | |
echo Script for building the LLVM installer on Windows, | |
echo used for the releases at https://github.com/llvm/llvm-project/releases | |
echo. | |
echo Usage: build_llvm_release.bat ^<version^> | |
echo. | |
echo Example: build_llvm_release.bat 14.0.4 | |
echo. | |
exit /b 1 | |
:begin | |
REM Note: | |
REM 7zip versions 21.x and higher will try to extract the symlinks in | |
REM llvm's git archive, which requires running as administrator. | |
REM Check 7-zip version and/or administrator permissions. | |
for /f "delims=" %%i in ('7z.exe ^| findstr /r "2[1-9].[0-9][0-9]"') do set version=%%i | |
if not "%version%"=="" ( | |
REM Unique temporary filename to use by the 'mklink' command. | |
set "link_name=%temp%\%username%_%random%_%random%.tmp" | |
REM As the 'mklink' requires elevated permissions, the symbolic link | |
REM creation will fail if the script is not running as administrator. | |
mklink /d "!link_name!" . 1>nul 2>nul | |
if errorlevel 1 ( | |
echo. | |
echo Script requires administrator permissions, or a 7-zip version 20.x or older. | |
echo Current version is "%version%" | |
exit /b 1 | |
) else ( | |
REM Remove the temporary symbolic link. | |
rd "!link_name!" | |
) | |
) | |
REM Prerequisites: | |
REM | |
REM Visual Studio 2019, CMake, Ninja, GNUWin32, SWIG, Python 3, | |
REM NSIS with the strlen_8192 patch, | |
REM Visual Studio 2019 SDK and Nuget (for the clang-format plugin), | |
REM Perl (for the OpenMP run-time). | |
REM | |
REM | |
REM For LLDB, SWIG version <= 3.0.8 needs to be used to work around | |
REM https://github.com/swig/swig/issues/769 | |
REM You need to modify the paths below: | |
set vsdevcmd=C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\Common7\Tools\VsDevCmd.bat | |
set python32_dir=C:\Users\%USERNAME%\AppData\Local\Programs\Python\Python310-32 | |
set python64_dir=C:\Users\%USERNAME%\AppData\Local\Programs\Python\Python310 | |
set revision=llvmorg-%1 | |
set package_version=%1 | |
set build_dir=%cd%\llvm_package_%package_version% | |
echo Revision: %revision% | |
echo Package version: %package_version% | |
echo Build dir: %build_dir% | |
echo. | |
pause | |
if exist %build_dir% ( | |
echo Build directory already exists: %build_dir% | |
exit /b 1 | |
) | |
mkdir %build_dir% | |
cd %build_dir% | |
echo Checking out %revision% | |
curl -L https://github.com/llvm/llvm-project/archive/%revision%.zip -o src.zip || exit /b 1 | |
7z x src.zip || exit /b 1 | |
mv llvm-project-* llvm-project || exit /b 1 | |
curl -O https://gitlab.gnome.org/GNOME/libxml2/-/archive/v2.9.12/libxml2-v2.9.12.tar.gz || exit /b 1 | |
tar zxf libxml2-v2.9.12.tar.gz | |
REM Setting CMAKE_CL_SHOWINCLUDES_PREFIX to work around PR27226. | |
REM Common flags for both 32/64 builds. | |
set common_cmake_flags=^ | |
-DCMAKE_BUILD_TYPE=Release ^ | |
-DLLVM_ENABLE_ASSERTIONS=OFF ^ | |
-DLLVM_INSTALL_TOOLCHAIN_ONLY=ON ^ | |
-DLLVM_BUILD_LLVM_C_DYLIB=ON ^ | |
-DCMAKE_INSTALL_UCRT_LIBRARIES=ON ^ | |
-DPython3_FIND_REGISTRY=NEVER ^ | |
-DPACKAGE_VERSION=%package_version% ^ | |
-DLLDB_RELOCATABLE_PYTHON=1 ^ | |
-DLLDB_EMBED_PYTHON_HOME=OFF ^ | |
-DCMAKE_CL_SHOWINCLUDES_PREFIX="Note: including file: " ^ | |
-DLLVM_ENABLE_LIBXML2=FORCE_ON ^ | |
-DLLDB_ENABLE_LIBXML2=OFF ^ | |
-DCMAKE_C_FLAGS="-DLIBXML_STATIC" ^ | |
-DCMAKE_CXX_FLAGS="-DLIBXML_STATIC" ^ | |
-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;compiler-rt;lldb;openmp" | |
REM Preserve original path | |
set OLDPATH=%PATH% | |
REM Build the 32-bits and/or 64-bits binaries. | |
call :do_build_32 || exit /b 1 | |
call :do_build_64 || exit /b 1 | |
exit /b 0 | |
::============================================================================== | |
:: Build 32-bits binaries. | |
::============================================================================== | |
:do_build_32 | |
REM Restore original path | |
set PATH=%OLDPATH% | |
REM TODO: Run the "check-all" tests. | |
REM Set Python environment | |
set PYTHONHOME=%python32_dir% | |
set PATH=%PYTHONHOME%;%PATH% | |
set "VSCMD_START_DIR=%build_dir%" | |
call "%vsdevcmd%" -arch=x86 | |
mkdir build32_stage0 | |
cd build32_stage0 | |
mkdir libxmlbuild | |
cd libxmlbuild | |
cmake -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -DBUILD_SHARED_LIBS=OFF -DLIBXML2_WITH_C14N=OFF -DLIBXML2_WITH_CATALOG=OFF -DLIBXML2_WITH_DEBUG=OFF -DLIBXML2_WITH_DOCB=OFF -DLIBXML2_WITH_FTP=OFF -DLIBXML2_WITH_HTML=OFF -DLIBXML2_WITH_HTTP=OFF -DLIBXML2_WITH_ICONV=OFF -DLIBXML2_WITH_ICU=OFF -DLIBXML2_WITH_ISO8859X=OFF -DLIBXML2_WITH_LEGACY=OFF -DLIBXML2_WITH_LZMA=OFF -DLIBXML2_WITH_MEM_DEBUG=OFF -DLIBXML2_WITH_MODULES=OFF -DLIBXML2_WITH_OUTPUT=ON -DLIBXML2_WITH_PATTERN=OFF -DLIBXML2_WITH_PROGRAMS=OFF -DLIBXML2_WITH_PUSH=OFF -DLIBXML2_WITH_PYTHON=OFF -DLIBXML2_WITH_READER=OFF -DLIBXML2_WITH_REGEXPS=OFF -DLIBXML2_WITH_RUN_DEBUG=OFF -DLIBXML2_WITH_SAX1=OFF -DLIBXML2_WITH_SCHEMAS=OFF -DLIBXML2_WITH_SCHEMATRON=OFF -DLIBXML2_WITH_TESTS=OFF -DLIBXML2_WITH_THREADS=ON -DLIBXML2_WITH_THREAD_ALLOC=OFF -DLIBXML2_WITH_TREE=ON -DLIBXML2_WITH_VALID=OFF -DLIBXML2_WITH_WRITER=OFF -DLIBXML2_WITH_XINCLUDE=OFF -DLIBXML2_WITH_XPATH=OFF -DLIBXML2_WITH_XPTR=OFF -DLIBXML2_WITH_ZLIB=OFF ../../libxml2-v2.9.12 || exit /b 1 | |
ninja install || exit /b 1 | |
set libxmldir=%cd%\install | |
set "libxmldir=%libxmldir:\=/%" | |
cd .. | |
REM Stage0 binaries directory; used in stage1. | |
set "stage0_bin_dir=%build_dir%/build32_stage0/bin" | |
set cmake_flags=^ | |
%common_cmake_flags% ^ | |
-DLLDB_TEST_COMPILER=%stage0_bin_dir%/clang.exe ^ | |
-DPYTHON_HOME=%PYTHONHOME% ^ | |
-DPython3_ROOT_DIR=%PYTHONHOME% ^ | |
-DLIBXML2_INCLUDE_DIRS=%libxmldir%/include/libxml2 ^ | |
-DLIBXML2_LIBRARIES=%libxmldir%/lib/libxml2s.lib | |
cmake -GNinja %cmake_flags% ..\llvm-project\llvm || exit /b 1 | |
ninja || ninja || ninja || exit /b 1 | |
REM ninja check-llvm || ninja check-llvm || ninja check-llvm || exit /b 1 | |
REM ninja check-clang || ninja check-clang || ninja check-clang || exit /b 1 | |
ninja check-lld || ninja check-lld || ninja check-lld || exit /b 1 | |
ninja check-sanitizer || ninja check-sanitizer || ninja check-sanitizer || exit /b 1 | |
REM ninja check-clang-tools || ninja check-clang-tools || ninja check-clang-tools || exit /b 1 | |
cd.. | |
REM CMake expects the paths that specifies the compiler and linker to be | |
REM with forward slash. | |
set all_cmake_flags=^ | |
%cmake_flags% ^ | |
-DCMAKE_C_COMPILER=%stage0_bin_dir%/clang-cl.exe ^ | |
-DCMAKE_CXX_COMPILER=%stage0_bin_dir%/clang-cl.exe ^ | |
-DCMAKE_LINKER=%stage0_bin_dir%/lld-link.exe ^ | |
-DCMAKE_AR=%stage0_bin_dir%/llvm-lib.exe ^ | |
-DCMAKE_RC=%stage0_bin_dir%/llvm-windres.exe | |
set cmake_flags=%all_cmake_flags:\=/% | |
mkdir build32 | |
cd build32 | |
cmake -GNinja %cmake_flags% ..\llvm-project\llvm || exit /b 1 | |
ninja || ninja || ninja || exit /b 1 | |
REM ninja check-llvm || ninja check-llvm || ninja check-llvm || exit /b 1 | |
REM ninja check-clang || ninja check-clang || ninja check-clang || exit /b 1 | |
ninja check-lld || ninja check-lld || ninja check-lld || exit /b 1 | |
ninja check-sanitizer || ninja check-sanitizer || ninja check-sanitizer || exit /b 1 | |
REM ninja check-clang-tools || ninja check-clang-tools || ninja check-clang-tools || exit /b 1 | |
ninja package || exit /b 1 | |
cd .. | |
exit /b 0 | |
::============================================================================== | |
::============================================================================== | |
:: Build 64-bits binaries. | |
::============================================================================== | |
:do_build_64 | |
REM Restore original path | |
set PATH=%OLDPATH% | |
REM Set Python environment | |
set PYTHONHOME=%python64_dir% | |
set PATH=%PYTHONHOME%;%PATH% | |
set "VSCMD_START_DIR=%build_dir%" | |
call "%vsdevcmd%" -arch=amd64 | |
mkdir build64_stage0 | |
cd build64_stage0 | |
mkdir libxmlbuild | |
cd libxmlbuild | |
cmake -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install -DBUILD_SHARED_LIBS=OFF -DLIBXML2_WITH_C14N=OFF -DLIBXML2_WITH_CATALOG=OFF -DLIBXML2_WITH_DEBUG=OFF -DLIBXML2_WITH_DOCB=OFF -DLIBXML2_WITH_FTP=OFF -DLIBXML2_WITH_HTML=OFF -DLIBXML2_WITH_HTTP=OFF -DLIBXML2_WITH_ICONV=OFF -DLIBXML2_WITH_ICU=OFF -DLIBXML2_WITH_ISO8859X=OFF -DLIBXML2_WITH_LEGACY=OFF -DLIBXML2_WITH_LZMA=OFF -DLIBXML2_WITH_MEM_DEBUG=OFF -DLIBXML2_WITH_MODULES=OFF -DLIBXML2_WITH_OUTPUT=ON -DLIBXML2_WITH_PATTERN=OFF -DLIBXML2_WITH_PROGRAMS=OFF -DLIBXML2_WITH_PUSH=OFF -DLIBXML2_WITH_PYTHON=OFF -DLIBXML2_WITH_READER=OFF -DLIBXML2_WITH_REGEXPS=OFF -DLIBXML2_WITH_RUN_DEBUG=OFF -DLIBXML2_WITH_SAX1=OFF -DLIBXML2_WITH_SCHEMAS=OFF -DLIBXML2_WITH_SCHEMATRON=OFF -DLIBXML2_WITH_TESTS=OFF -DLIBXML2_WITH_THREADS=ON -DLIBXML2_WITH_THREAD_ALLOC=OFF -DLIBXML2_WITH_TREE=ON -DLIBXML2_WITH_VALID=OFF -DLIBXML2_WITH_WRITER=OFF -DLIBXML2_WITH_XINCLUDE=OFF -DLIBXML2_WITH_XPATH=OFF -DLIBXML2_WITH_XPTR=OFF -DLIBXML2_WITH_ZLIB=OFF ../../libxml2-v2.9.12 || exit /b 1 | |
ninja install || exit /b 1 | |
set libxmldir=%cd%\install | |
set "libxmldir=%libxmldir:\=/%" | |
cd .. | |
REM Stage0 binaries directory; used in stage1. | |
set "stage0_bin_dir=%build_dir%/build64_stage0/bin" | |
set cmake_flags=^ | |
%common_cmake_flags% ^ | |
-DLLDB_TEST_COMPILER=%stage0_bin_dir%/clang.exe ^ | |
-DPYTHON_HOME=%PYTHONHOME% ^ | |
-DPython3_ROOT_DIR=%PYTHONHOME% ^ | |
-DLIBXML2_INCLUDE_DIRS=%libxmldir%/include/libxml2 ^ | |
-DLIBXML2_LIBRARIES=%libxmldir%/lib/libxml2s.lib | |
cmake -GNinja %cmake_flags% ..\llvm-project\llvm || exit /b 1 | |
ninja || ninja || ninja || exit /b 1 | |
ninja check-llvm || ninja check-llvm || ninja check-llvm || exit /b 1 | |
ninja check-clang || ninja check-clang || ninja check-clang || exit /b 1 | |
ninja check-lld || ninja check-lld || ninja check-lld || exit /b 1 | |
ninja check-sanitizer || ninja check-sanitizer || ninja check-sanitizer || exit /b 1 | |
ninja check-clang-tools || ninja check-clang-tools || ninja check-clang-tools || exit /b 1 | |
ninja check-clangd || ninja check-clangd || ninja check-clangd || exit /b 1 | |
cd.. | |
REM CMake expects the paths that specifies the compiler and linker to be | |
REM with forward slash. | |
set all_cmake_flags=^ | |
%cmake_flags% ^ | |
-DCMAKE_C_COMPILER=%stage0_bin_dir%/clang-cl.exe ^ | |
-DCMAKE_CXX_COMPILER=%stage0_bin_dir%/clang-cl.exe ^ | |
-DCMAKE_LINKER=%stage0_bin_dir%/lld-link.exe ^ | |
-DCMAKE_AR=%stage0_bin_dir%/llvm-lib.exe ^ | |
-DCMAKE_RC=%stage0_bin_dir%/llvm-windres.exe | |
set cmake_flags=%all_cmake_flags:\=/% | |
mkdir build64 | |
cd build64 | |
cmake -GNinja %cmake_flags% ..\llvm-project\llvm || exit /b 1 | |
ninja || ninja || ninja || exit /b 1 | |
ninja check-llvm || ninja check-llvm || ninja check-llvm || exit /b 1 | |
ninja check-clang || ninja check-clang || ninja check-clang || exit /b 1 | |
ninja check-lld || ninja check-lld || ninja check-lld || exit /b 1 | |
ninja check-sanitizer || ninja check-sanitizer || ninja check-sanitizer || exit /b 1 | |
ninja check-clang-tools || ninja check-clang-tools || ninja check-clang-tools || exit /b 1 | |
ninja check-clangd || ninja check-clangd || ninja check-clangd || exit /b 1 | |
ninja package || exit /b 1 | |
cd .. | |
exit /b 0 | |
::============================================================================== |