186e23c4eSPierrick Bouvier@echo off 2df7c5772SCarlos Alberto Encisosetlocal enabledelayedexpansion 3b2719349SHans Wennborg 4b2719349SHans Wennborggoto begin 5b2719349SHans Wennborg 6b2719349SHans Wennborg:usage 7b2719349SHans Wennborgecho Script for building the LLVM installer on Windows, 8b2719349SHans Wennborgecho used for the releases at https://github.com/llvm/llvm-project/releases 9b2719349SHans Wennborgecho. 10b7c81c1fSAlexandre Ganeaecho Usage: build_llvm_release.bat --version ^<version^> [--x86,--x64, --arm64] [--skip-checkout] [--local-python] 11b2719349SHans Wennborgecho. 12d7d05ffaSPierrick Bouvierecho Options: 13d7d05ffaSPierrick Bouvierecho --version: [required] version to build 14d7d05ffaSPierrick Bouvierecho --help: display this help 15d7d05ffaSPierrick Bouvierecho --x86: build and test x86 variant 16d7d05ffaSPierrick Bouvierecho --x64: build and test x64 variant 17c5e1000bSPierrick Bouvierecho --arm64: build and test arm64 variant 18b7c81c1fSAlexandre Ganeaecho --skip-checkout: use local git checkout instead of downloading src.zip 19b7c81c1fSAlexandre Ganeaecho --local-python: use installed Python and does not try to use a specific version (3.10) 20b2719349SHans Wennborgecho. 21d7d05ffaSPierrick Bouvierecho Note: At least one variant to build is required. 22d7d05ffaSPierrick Bouvierecho. 23d7d05ffaSPierrick Bouvierecho Example: build_llvm_release.bat --version 15.0.0 --x86 --x64 2483e92256SCarlos Alberto Encisoexit /b 1 25b2719349SHans Wennborg 26b2719349SHans Wennborg:begin 27b2719349SHans Wennborg 28d7d05ffaSPierrick Bouvier::============================================================================== 29d7d05ffaSPierrick Bouvier:: parse args 30d7d05ffaSPierrick Bouvierset version= 31d7d05ffaSPierrick Bouvierset help= 32d7d05ffaSPierrick Bouvierset x86= 33d7d05ffaSPierrick Bouvierset x64= 34c5e1000bSPierrick Bouvierset arm64= 35b7c81c1fSAlexandre Ganeaset skip-checkout= 36b7c81c1fSAlexandre Ganeaset local-python= 37d7d05ffaSPierrick Bouviercall :parse_args %* 38d7d05ffaSPierrick Bouvier 39d7d05ffaSPierrick Bouvierif "%help%" NEQ "" goto usage 40d7d05ffaSPierrick Bouvier 41d7d05ffaSPierrick Bouvierif "%version%" == "" ( 42d7d05ffaSPierrick Bouvier echo --version option is required 43d7d05ffaSPierrick Bouvier echo ============================= 44d7d05ffaSPierrick Bouvier goto usage 45d7d05ffaSPierrick Bouvier) 46d7d05ffaSPierrick Bouvier 47c5e1000bSPierrick Bouvierif "%arm64%" == "" if "%x64%" == "" if "%x86%" == "" ( 48d7d05ffaSPierrick Bouvier echo nothing to build! 49c5e1000bSPierrick Bouvier echo choose one or several variants from: --x86 --x64 --arm64 50d7d05ffaSPierrick Bouvier exit /b 1 51d7d05ffaSPierrick Bouvier) 52d7d05ffaSPierrick Bouvier 53d7d05ffaSPierrick Bouvier::============================================================================== 54d7d05ffaSPierrick Bouvier:: check prerequisites 55df7c5772SCarlos Alberto EncisoREM Note: 56df7c5772SCarlos Alberto EncisoREM 7zip versions 21.x and higher will try to extract the symlinks in 57df7c5772SCarlos Alberto EncisoREM llvm's git archive, which requires running as administrator. 58df7c5772SCarlos Alberto Enciso 59df7c5772SCarlos Alberto EncisoREM Check 7-zip version and/or administrator permissions. 60d7d05ffaSPierrick Bouvierfor /f "delims=" %%i in ('7z.exe ^| findstr /r "2[1-9].[0-9][0-9]"') do set version_7z=%%i 61d7d05ffaSPierrick Bouvierif not "%version_7z%"=="" ( 62df7c5772SCarlos Alberto Enciso REM Unique temporary filename to use by the 'mklink' command. 63df7c5772SCarlos Alberto Enciso set "link_name=%temp%\%username%_%random%_%random%.tmp" 64df7c5772SCarlos Alberto Enciso 65df7c5772SCarlos Alberto Enciso REM As the 'mklink' requires elevated permissions, the symbolic link 66df7c5772SCarlos Alberto Enciso REM creation will fail if the script is not running as administrator. 67df7c5772SCarlos Alberto Enciso mklink /d "!link_name!" . 1>nul 2>nul 68df7c5772SCarlos Alberto Enciso if errorlevel 1 ( 69df7c5772SCarlos Alberto Enciso echo. 70df7c5772SCarlos Alberto Enciso echo Script requires administrator permissions, or a 7-zip version 20.x or older. 71d7d05ffaSPierrick Bouvier echo Current version is "%version_7z%" 7283e92256SCarlos Alberto Enciso exit /b 1 73df7c5772SCarlos Alberto Enciso ) else ( 74df7c5772SCarlos Alberto Enciso REM Remove the temporary symbolic link. 75df7c5772SCarlos Alberto Enciso rd "!link_name!" 76df7c5772SCarlos Alberto Enciso ) 77df7c5772SCarlos Alberto Enciso) 78df7c5772SCarlos Alberto Enciso 79b2719349SHans WennborgREM Prerequisites: 80b2719349SHans WennborgREM 81b2719349SHans WennborgREM Visual Studio 2019, CMake, Ninja, GNUWin32, SWIG, Python 3, 82b2719349SHans WennborgREM NSIS with the strlen_8192 patch, 83b2719349SHans WennborgREM Perl (for the OpenMP run-time). 84b2719349SHans WennborgREM 85b2719349SHans WennborgREM 86277a7e8eSHans WennborgREM For LLDB, SWIG version 4.1.1 should be used. 87d7d05ffaSPierrick BouvierREM 88b2719349SHans Wennborg 89d7d05ffaSPierrick Bouvier:: Detect Visual Studio 90b1e5e81eSPierrick Bouvierset vsinstall= 91b1e5e81eSPierrick Bouvierset vswhere=%ProgramFiles(x86)%\Microsoft Visual Studio\Installer\vswhere.exe 92b1e5e81eSPierrick Bouvier 93b1e5e81eSPierrick Bouvierif "%VSINSTALLDIR%" NEQ "" ( 94b1e5e81eSPierrick Bouvier echo using enabled Visual Studio installation 95b1e5e81eSPierrick Bouvier set "vsinstall=%VSINSTALLDIR%" 96b1e5e81eSPierrick Bouvier) else ( 97b1e5e81eSPierrick Bouvier echo using vswhere to detect Visual Studio installation 98b1e5e81eSPierrick Bouvier FOR /F "delims=" %%r IN ('^""%vswhere%" -nologo -latest -products "*" -all -property installationPath^"') DO set vsinstall=%%r 99b1e5e81eSPierrick Bouvier) 100b1e5e81eSPierrick Bouvierset "vsdevcmd=%vsinstall%\Common7\Tools\VsDevCmd.bat" 101b1e5e81eSPierrick Bouvier 10286e23c4eSPierrick Bouvierif not exist "%vsdevcmd%" ( 10386e23c4eSPierrick Bouvier echo Can't find any installation of Visual Studio 10486e23c4eSPierrick Bouvier exit /b 1 10586e23c4eSPierrick Bouvier) 10686e23c4eSPierrick Bouvierecho Using VS devcmd: %vsdevcmd% 107b2719349SHans Wennborg 108d7d05ffaSPierrick Bouvier::============================================================================== 10986e23c4eSPierrick Bouvier:: start echoing what we do 11086e23c4eSPierrick Bouvier@echo on 111d7d05ffaSPierrick Bouvier 112b2719349SHans Wennborgset python32_dir=C:\Users\%USERNAME%\AppData\Local\Programs\Python\Python310-32 113b2719349SHans Wennborgset python64_dir=C:\Users\%USERNAME%\AppData\Local\Programs\Python\Python310 114c5e1000bSPierrick Bouvierset pythonarm64_dir=C:\Users\%USERNAME%\AppData\Local\Programs\Python\Python311-arm64 115b2719349SHans Wennborg 116d7d05ffaSPierrick Bouvierset revision=llvmorg-%version% 117d7d05ffaSPierrick Bouvierset package_version=%version% 11883e92256SCarlos Alberto Encisoset build_dir=%cd%\llvm_package_%package_version% 119b2719349SHans Wennborg 120b2719349SHans Wennborgecho Revision: %revision% 121b2719349SHans Wennborgecho Package version: %package_version% 122b2719349SHans Wennborgecho Build dir: %build_dir% 123b2719349SHans Wennborgecho. 124b2719349SHans Wennborg 12583e92256SCarlos Alberto Encisoif exist %build_dir% ( 12683e92256SCarlos Alberto Enciso echo Build directory already exists: %build_dir% 12783e92256SCarlos Alberto Enciso exit /b 1 12883e92256SCarlos Alberto Enciso) 129b2719349SHans Wennborgmkdir %build_dir% 13044073d31SPierrick Bouviercd %build_dir% || exit /b 1 131b2719349SHans Wennborg 132b7c81c1fSAlexandre Ganeaif "%skip-checkout%" == "true" ( 133b7c81c1fSAlexandre Ganea echo Using local source 134b7c81c1fSAlexandre Ganea set llvm_src=%~dp0..\..\.. 135b7c81c1fSAlexandre Ganea) else ( 136b2719349SHans Wennborg echo Checking out %revision% 13783e92256SCarlos Alberto Enciso curl -L https://github.com/llvm/llvm-project/archive/%revision%.zip -o src.zip || exit /b 1 13883e92256SCarlos Alberto Enciso 7z x src.zip || exit /b 1 13983e92256SCarlos Alberto Enciso mv llvm-project-* llvm-project || exit /b 1 140b7c81c1fSAlexandre Ganea set llvm_src=%build_dir%\llvm-project 141b7c81c1fSAlexandre Ganea) 14283e92256SCarlos Alberto Enciso 14383e92256SCarlos Alberto Encisocurl -O https://gitlab.gnome.org/GNOME/libxml2/-/archive/v2.9.12/libxml2-v2.9.12.tar.gz || exit /b 1 14483e92256SCarlos Alberto Encisotar zxf libxml2-v2.9.12.tar.gz 145b2719349SHans Wennborg 146b2719349SHans WennborgREM Setting CMAKE_CL_SHOWINCLUDES_PREFIX to work around PR27226. 147c5e1000bSPierrick BouvierREM Common flags for all builds. 148b7c81c1fSAlexandre Ganeaset common_compiler_flags=-DLIBXML_STATIC 14983e92256SCarlos Alberto Encisoset common_cmake_flags=^ 150b2719349SHans Wennborg -DCMAKE_BUILD_TYPE=Release ^ 151b2719349SHans Wennborg -DLLVM_ENABLE_ASSERTIONS=OFF ^ 152b2719349SHans Wennborg -DLLVM_INSTALL_TOOLCHAIN_ONLY=ON ^ 1532a28df66SHans -DLLVM_TARGETS_TO_BUILD="AArch64;ARM;X86" ^ 154b2719349SHans Wennborg -DLLVM_BUILD_LLVM_C_DYLIB=ON ^ 155b2719349SHans Wennborg -DCMAKE_INSTALL_UCRT_LIBRARIES=ON ^ 156b2719349SHans Wennborg -DPython3_FIND_REGISTRY=NEVER ^ 157b2719349SHans Wennborg -DPACKAGE_VERSION=%package_version% ^ 158b2719349SHans Wennborg -DLLDB_RELOCATABLE_PYTHON=1 ^ 159b2719349SHans Wennborg -DLLDB_EMBED_PYTHON_HOME=OFF ^ 160b2719349SHans Wennborg -DCMAKE_CL_SHOWINCLUDES_PREFIX="Note: including file: " ^ 161145835caSHans Wennborg -DLLVM_ENABLE_LIBXML2=FORCE_ON ^ 162145835caSHans Wennborg -DLLDB_ENABLE_LIBXML2=OFF ^ 163beb339c0SHans Wennborg -DCLANG_ENABLE_LIBXML2=OFF ^ 164b7c81c1fSAlexandre Ganea -DCMAKE_C_FLAGS="%common_compiler_flags%" ^ 165b7c81c1fSAlexandre Ganea -DCMAKE_CXX_FLAGS="%common_compiler_flags%" ^ 16667226badSAlexandre Ganea -DLLVM_ENABLE_RPMALLOC=ON ^ 167b2719349SHans Wennborg -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;lld;compiler-rt;lldb;openmp" 168b2719349SHans Wennborg 169b7c81c1fSAlexandre Ganeaset cmake_profile_flags="" 170060af269SHans 17183e92256SCarlos Alberto EncisoREM Preserve original path 172b2719349SHans Wennborgset OLDPATH=%PATH% 173b2719349SHans Wennborg 17483e92256SCarlos Alberto EncisoREM Build the 32-bits and/or 64-bits binaries. 175d7d05ffaSPierrick Bouvierif "%x86%" == "true" call :do_build_32 || exit /b 1 176d7d05ffaSPierrick Bouvierif "%x64%" == "true" call :do_build_64 || exit /b 1 177c5e1000bSPierrick Bouvierif "%arm64%" == "true" call :do_build_arm64 || exit /b 1 17883e92256SCarlos Alberto Encisoexit /b 0 179145835caSHans Wennborg 18083e92256SCarlos Alberto Enciso::============================================================================== 18183e92256SCarlos Alberto Enciso:: Build 32-bits binaries. 18283e92256SCarlos Alberto Enciso::============================================================================== 18383e92256SCarlos Alberto Enciso:do_build_32 184c5e1000bSPierrick Bouviercall :set_environment %python32_dir% || exit /b 1 18544073d31SPierrick Bouviercall "%vsdevcmd%" -arch=x86 || exit /b 1 18644073d31SPierrick Bouvier@echo on 187b2719349SHans Wennborgmkdir build32_stage0 188b2719349SHans Wennborgcd build32_stage0 189c5e1000bSPierrick Bouviercall :do_build_libxml || exit /b 1 190145835caSHans Wennborg 19183e92256SCarlos Alberto EncisoREM Stage0 binaries directory; used in stage1. 19283e92256SCarlos Alberto Encisoset "stage0_bin_dir=%build_dir%/build32_stage0/bin" 19383e92256SCarlos Alberto Encisoset cmake_flags=^ 19483e92256SCarlos Alberto Enciso %common_cmake_flags% ^ 195*ef26afcbSHans -DLLVM_ENABLE_RPMALLOC=OFF ^ 19683e92256SCarlos Alberto Enciso -DLLDB_TEST_COMPILER=%stage0_bin_dir%/clang.exe ^ 19783e92256SCarlos Alberto Enciso -DPYTHON_HOME=%PYTHONHOME% ^ 19883e92256SCarlos Alberto Enciso -DPython3_ROOT_DIR=%PYTHONHOME% ^ 1998fe376f5SAlexandre Ganea -DLIBXML2_INCLUDE_DIR=%libxmldir%/include/libxml2 ^ 20083e92256SCarlos Alberto Enciso -DLIBXML2_LIBRARIES=%libxmldir%/lib/libxml2s.lib 201145835caSHans Wennborg 202b7c81c1fSAlexandre Ganeacmake -GNinja %cmake_flags% %llvm_src%\llvm || exit /b 1 20383e92256SCarlos Alberto Encisoninja || ninja || ninja || exit /b 1 20483e92256SCarlos Alberto EncisoREM ninja check-llvm || ninja check-llvm || ninja check-llvm || exit /b 1 20583e92256SCarlos Alberto EncisoREM ninja check-clang || ninja check-clang || ninja check-clang || exit /b 1 20683e92256SCarlos Alberto Encisoninja check-lld || ninja check-lld || ninja check-lld || exit /b 1 20783e92256SCarlos Alberto Encisoninja check-sanitizer || ninja check-sanitizer || ninja check-sanitizer || exit /b 1 20883e92256SCarlos Alberto EncisoREM ninja check-clang-tools || ninja check-clang-tools || ninja check-clang-tools || exit /b 1 209b2719349SHans Wennborgcd.. 210b2719349SHans Wennborg 21183e92256SCarlos Alberto EncisoREM CMake expects the paths that specifies the compiler and linker to be 21283e92256SCarlos Alberto EncisoREM with forward slash. 21383e92256SCarlos Alberto Encisoset all_cmake_flags=^ 21483e92256SCarlos Alberto Enciso %cmake_flags% ^ 21583e92256SCarlos Alberto Enciso -DCMAKE_C_COMPILER=%stage0_bin_dir%/clang-cl.exe ^ 216c96ddd70SCarlos Alberto Enciso -DCMAKE_CXX_COMPILER=%stage0_bin_dir%/clang-cl.exe ^ 217c96ddd70SCarlos Alberto Enciso -DCMAKE_LINKER=%stage0_bin_dir%/lld-link.exe ^ 218c96ddd70SCarlos Alberto Enciso -DCMAKE_AR=%stage0_bin_dir%/llvm-lib.exe ^ 219c96ddd70SCarlos Alberto Enciso -DCMAKE_RC=%stage0_bin_dir%/llvm-windres.exe 22083e92256SCarlos Alberto Encisoset cmake_flags=%all_cmake_flags:\=/% 22183e92256SCarlos Alberto Enciso 222b2719349SHans Wennborgmkdir build32 223b2719349SHans Wennborgcd build32 224b7c81c1fSAlexandre Ganeacmake -GNinja %cmake_flags% %llvm_src%\llvm || exit /b 1 22583e92256SCarlos Alberto Encisoninja || ninja || ninja || exit /b 1 22683e92256SCarlos Alberto EncisoREM ninja check-llvm || ninja check-llvm || ninja check-llvm || exit /b 1 22783e92256SCarlos Alberto EncisoREM ninja check-clang || ninja check-clang || ninja check-clang || exit /b 1 22883e92256SCarlos Alberto Encisoninja check-lld || ninja check-lld || ninja check-lld || exit /b 1 22983e92256SCarlos Alberto Encisoninja check-sanitizer || ninja check-sanitizer || ninja check-sanitizer || exit /b 1 23083e92256SCarlos Alberto EncisoREM ninja check-clang-tools || ninja check-clang-tools || ninja check-clang-tools || exit /b 1 23183e92256SCarlos Alberto Encisoninja package || exit /b 1 232b2719349SHans Wennborgcd .. 233b2719349SHans Wennborg 23483e92256SCarlos Alberto Encisoexit /b 0 23583e92256SCarlos Alberto Enciso::============================================================================== 23683e92256SCarlos Alberto Enciso 23783e92256SCarlos Alberto Enciso::============================================================================== 23883e92256SCarlos Alberto Enciso:: Build 64-bits binaries. 23983e92256SCarlos Alberto Enciso::============================================================================== 24083e92256SCarlos Alberto Enciso:do_build_64 241c5e1000bSPierrick Bouviercall :set_environment %python64_dir% || exit /b 1 24244073d31SPierrick Bouviercall "%vsdevcmd%" -arch=amd64 || exit /b 1 24344073d31SPierrick Bouvier@echo on 244b2719349SHans Wennborgmkdir build64_stage0 245b2719349SHans Wennborgcd build64_stage0 246c5e1000bSPierrick Bouviercall :do_build_libxml || exit /b 1 247145835caSHans Wennborg 24883e92256SCarlos Alberto EncisoREM Stage0 binaries directory; used in stage1. 24983e92256SCarlos Alberto Encisoset "stage0_bin_dir=%build_dir%/build64_stage0/bin" 25083e92256SCarlos Alberto Encisoset cmake_flags=^ 25183e92256SCarlos Alberto Enciso %common_cmake_flags% ^ 25283e92256SCarlos Alberto Enciso -DLLDB_TEST_COMPILER=%stage0_bin_dir%/clang.exe ^ 25383e92256SCarlos Alberto Enciso -DPYTHON_HOME=%PYTHONHOME% ^ 25483e92256SCarlos Alberto Enciso -DPython3_ROOT_DIR=%PYTHONHOME% ^ 2558fe376f5SAlexandre Ganea -DLIBXML2_INCLUDE_DIR=%libxmldir%/include/libxml2 ^ 25683e92256SCarlos Alberto Enciso -DLIBXML2_LIBRARIES=%libxmldir%/lib/libxml2s.lib 25783e92256SCarlos Alberto Enciso 258b7c81c1fSAlexandre Ganeacmake -GNinja %cmake_flags% %llvm_src%\llvm || exit /b 1 25983e92256SCarlos Alberto Encisoninja || ninja || ninja || exit /b 1 26083e92256SCarlos Alberto Encisoninja check-llvm || ninja check-llvm || ninja check-llvm || exit /b 1 26183e92256SCarlos Alberto Encisoninja check-clang || ninja check-clang || ninja check-clang || exit /b 1 26283e92256SCarlos Alberto Encisoninja check-lld || ninja check-lld || ninja check-lld || exit /b 1 26383e92256SCarlos Alberto Encisoninja check-sanitizer || ninja check-sanitizer || ninja check-sanitizer || exit /b 1 26483e92256SCarlos Alberto Encisoninja check-clang-tools || ninja check-clang-tools || ninja check-clang-tools || exit /b 1 26583e92256SCarlos Alberto Encisoninja check-clangd || ninja check-clangd || ninja check-clangd || exit /b 1 266b2719349SHans Wennborgcd.. 267b2719349SHans Wennborg 26883e92256SCarlos Alberto EncisoREM CMake expects the paths that specifies the compiler and linker to be 26983e92256SCarlos Alberto EncisoREM with forward slash. 27083e92256SCarlos Alberto Encisoset all_cmake_flags=^ 27183e92256SCarlos Alberto Enciso %cmake_flags% ^ 27283e92256SCarlos Alberto Enciso -DCMAKE_C_COMPILER=%stage0_bin_dir%/clang-cl.exe ^ 273c96ddd70SCarlos Alberto Enciso -DCMAKE_CXX_COMPILER=%stage0_bin_dir%/clang-cl.exe ^ 274c96ddd70SCarlos Alberto Enciso -DCMAKE_LINKER=%stage0_bin_dir%/lld-link.exe ^ 275c96ddd70SCarlos Alberto Enciso -DCMAKE_AR=%stage0_bin_dir%/llvm-lib.exe ^ 276c96ddd70SCarlos Alberto Enciso -DCMAKE_RC=%stage0_bin_dir%/llvm-windres.exe 27783e92256SCarlos Alberto Encisoset cmake_flags=%all_cmake_flags:\=/% 27883e92256SCarlos Alberto Enciso 279060af269SHans 280b2719349SHans Wennborgmkdir build64 281b2719349SHans Wennborgcd build64 282060af269SHanscall :do_generate_profile || exit /b 1 283b7c81c1fSAlexandre Ganeacmake -GNinja %cmake_flags% %cmake_profile_flags% %llvm_src%\llvm || exit /b 1 28483e92256SCarlos Alberto Encisoninja || ninja || ninja || exit /b 1 28583e92256SCarlos Alberto Encisoninja check-llvm || ninja check-llvm || ninja check-llvm || exit /b 1 28683e92256SCarlos Alberto Encisoninja check-clang || ninja check-clang || ninja check-clang || exit /b 1 28783e92256SCarlos Alberto Encisoninja check-lld || ninja check-lld || ninja check-lld || exit /b 1 28883e92256SCarlos Alberto Encisoninja check-sanitizer || ninja check-sanitizer || ninja check-sanitizer || exit /b 1 28983e92256SCarlos Alberto Encisoninja check-clang-tools || ninja check-clang-tools || ninja check-clang-tools || exit /b 1 29083e92256SCarlos Alberto Encisoninja check-clangd || ninja check-clangd || ninja check-clangd || exit /b 1 29183e92256SCarlos Alberto Encisoninja package || exit /b 1 29252ada07eSBenoît Amiaux 29352ada07eSBenoît Amiaux:: generate tarball with install toolchain only off 29452ada07eSBenoît Amiauxset filename=clang+llvm-%version%-x86_64-pc-windows-msvc 29552ada07eSBenoît Amiauxcmake -GNinja %cmake_flags% %cmake_profile_flags% -DLLVM_INSTALL_TOOLCHAIN_ONLY=OFF ^ 29652ada07eSBenoît Amiaux -DCMAKE_INSTALL_PREFIX=%build_dir%/%filename% ..\llvm-project\llvm || exit /b 1 29752ada07eSBenoît Amiauxninja install || exit /b 1 29852ada07eSBenoît Amiaux:: check llvm_config is present & returns something 29952ada07eSBenoît Amiaux%build_dir%/%filename%/bin/llvm-config.exe --bindir || exit /b 1 300b2719349SHans Wennborgcd .. 30152ada07eSBenoît Amiaux7z a -ttar -so %filename%.tar %filename% | 7z a -txz -si %filename%.tar.xz 30283e92256SCarlos Alberto Enciso 30383e92256SCarlos Alberto Encisoexit /b 0 30483e92256SCarlos Alberto Enciso::============================================================================== 305f671eb17SCarlos Alberto Enciso 306c5e1000bSPierrick Bouvier::============================================================================== 307c5e1000bSPierrick Bouvier:: Build arm64 binaries. 308c5e1000bSPierrick Bouvier::============================================================================== 309c5e1000bSPierrick Bouvier:do_build_arm64 310c5e1000bSPierrick Bouviercall :set_environment %pythonarm64_dir% || exit /b 1 311c5e1000bSPierrick Bouviercall "%vsdevcmd%" -host_arch=x64 -arch=arm64 || exit /b 1 312c5e1000bSPierrick Bouvier@echo on 313c5e1000bSPierrick Bouviermkdir build_arm64_stage0 314c5e1000bSPierrick Bouviercd build_arm64_stage0 315c5e1000bSPierrick Bouviercall :do_build_libxml || exit /b 1 316c5e1000bSPierrick Bouvier 317c5e1000bSPierrick BouvierREM Stage0 binaries directory; used in stage1. 318c5e1000bSPierrick Bouvierset "stage0_bin_dir=%build_dir%/build_arm64_stage0/bin" 319c5e1000bSPierrick Bouvierset cmake_flags=^ 320c5e1000bSPierrick Bouvier %common_cmake_flags% ^ 321c5e1000bSPierrick Bouvier -DCLANG_DEFAULT_LINKER=lld ^ 3228fe376f5SAlexandre Ganea -DLIBXML2_INCLUDE_DIR=%libxmldir%/include/libxml2 ^ 323c5e1000bSPierrick Bouvier -DLIBXML2_LIBRARIES=%libxmldir%/lib/libxml2s.lib ^ 324c5e1000bSPierrick Bouvier -DPython3_ROOT_DIR=%PYTHONHOME% ^ 325c5e1000bSPierrick Bouvier -DCOMPILER_RT_BUILD_PROFILE=OFF ^ 326c5e1000bSPierrick Bouvier -DCOMPILER_RT_BUILD_SANITIZERS=OFF 327c5e1000bSPierrick Bouvier 328c5e1000bSPierrick BouvierREM We need to build stage0 compiler-rt with clang-cl (msvc lacks some builtins). 329c5e1000bSPierrick Bouviercmake -GNinja %cmake_flags% ^ 330c5e1000bSPierrick Bouvier -DCMAKE_C_COMPILER=clang-cl.exe ^ 331c5e1000bSPierrick Bouvier -DCMAKE_CXX_COMPILER=clang-cl.exe ^ 332b7c81c1fSAlexandre Ganea %llvm_src%\llvm || exit /b 1 333c5e1000bSPierrick Bouvierninja || exit /b 1 334c5e1000bSPierrick Bouvier::ninja check-llvm || exit /b 1 335c5e1000bSPierrick Bouvier::ninja check-clang || exit /b 1 336c5e1000bSPierrick Bouvier::ninja check-lld || exit /b 1 337c5e1000bSPierrick Bouvier::ninja check-sanitizer || exit /b 1 338c5e1000bSPierrick Bouvier::ninja check-clang-tools || exit /b 1 339c5e1000bSPierrick Bouvier::ninja check-clangd || exit /b 1 340c5e1000bSPierrick Bouviercd.. 341c5e1000bSPierrick Bouvier 342c5e1000bSPierrick BouvierREM CMake expects the paths that specifies the compiler and linker to be 343c5e1000bSPierrick BouvierREM with forward slash. 344c5e1000bSPierrick BouvierREM CPACK_SYSTEM_NAME is set to have a correct name for installer generated. 345c5e1000bSPierrick Bouvierset all_cmake_flags=^ 346c5e1000bSPierrick Bouvier %cmake_flags% ^ 347c5e1000bSPierrick Bouvier -DCMAKE_C_COMPILER=%stage0_bin_dir%/clang-cl.exe ^ 348c5e1000bSPierrick Bouvier -DCMAKE_CXX_COMPILER=%stage0_bin_dir%/clang-cl.exe ^ 349c5e1000bSPierrick Bouvier -DCMAKE_LINKER=%stage0_bin_dir%/lld-link.exe ^ 350c5e1000bSPierrick Bouvier -DCMAKE_AR=%stage0_bin_dir%/llvm-lib.exe ^ 351c5e1000bSPierrick Bouvier -DCMAKE_RC=%stage0_bin_dir%/llvm-windres.exe ^ 352c5e1000bSPierrick Bouvier -DCPACK_SYSTEM_NAME=woa64 353c5e1000bSPierrick Bouvierset cmake_flags=%all_cmake_flags:\=/% 354c5e1000bSPierrick Bouvier 355c5e1000bSPierrick Bouviermkdir build_arm64 356c5e1000bSPierrick Bouviercd build_arm64 357b7c81c1fSAlexandre Ganeacmake -GNinja %cmake_flags% %llvm_src%\llvm || exit /b 1 358c5e1000bSPierrick Bouvierninja || exit /b 1 359c5e1000bSPierrick BouvierREM Check but do not fail on errors. 360c5e1000bSPierrick Bouvierninja check-lldb 361c5e1000bSPierrick Bouvier::ninja check-llvm || exit /b 1 362c5e1000bSPierrick Bouvier::ninja check-clang || exit /b 1 363c5e1000bSPierrick Bouvier::ninja check-lld || exit /b 1 364c5e1000bSPierrick Bouvier::ninja check-sanitizer || exit /b 1 365c5e1000bSPierrick Bouvier::ninja check-clang-tools || exit /b 1 366c5e1000bSPierrick Bouvier::ninja check-clangd || exit /b 1 367c5e1000bSPierrick Bouvierninja package || exit /b 1 368c5e1000bSPierrick Bouviercd .. 369c5e1000bSPierrick Bouvier 370c5e1000bSPierrick Bouvierexit /b 0 371c5e1000bSPierrick Bouvier::============================================================================== 372c5e1000bSPierrick Bouvier:: 373c5e1000bSPierrick Bouvier::============================================================================== 374c5e1000bSPierrick Bouvier:: Set PATH and some environment variables. 375c5e1000bSPierrick Bouvier::============================================================================== 376c5e1000bSPierrick Bouvier:set_environment 377c5e1000bSPierrick BouvierREM Restore original path 378c5e1000bSPierrick Bouvierset PATH=%OLDPATH% 379c5e1000bSPierrick Bouvier 380c5e1000bSPierrick Bouvierset python_dir=%1 381c5e1000bSPierrick Bouvier 382c5e1000bSPierrick BouvierREM Set Python environment 383b7c81c1fSAlexandre Ganeaif "%local-python%" == "true" ( 384b7c81c1fSAlexandre Ganea FOR /F "delims=" %%i IN ('where python.exe ^| head -1') DO set python_exe=%%i 385b7c81c1fSAlexandre Ganea set PYTHONHOME=!python_exe:~0,-11! 386b7c81c1fSAlexandre Ganea) else ( 387c5e1000bSPierrick Bouvier %python_dir%/python.exe --version || exit /b 1 388c5e1000bSPierrick Bouvier set PYTHONHOME=%python_dir% 389b7c81c1fSAlexandre Ganea) 390c5e1000bSPierrick Bouvierset PATH=%PYTHONHOME%;%PATH% 391c5e1000bSPierrick Bouvier 392c5e1000bSPierrick Bouvierset "VSCMD_START_DIR=%build_dir%" 393c5e1000bSPierrick Bouvier 394c5e1000bSPierrick Bouvierexit /b 0 395c5e1000bSPierrick Bouvier 396c5e1000bSPierrick Bouvier::============================================================================= 397c5e1000bSPierrick Bouvier 398c5e1000bSPierrick Bouvier::============================================================================== 399c5e1000bSPierrick Bouvier:: Build libxml. 400c5e1000bSPierrick Bouvier::============================================================================== 401c5e1000bSPierrick Bouvier:do_build_libxml 402c5e1000bSPierrick Bouviermkdir libxmlbuild 403c5e1000bSPierrick Bouviercd libxmlbuild 404c5e1000bSPierrick Bouviercmake -GNinja -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=install ^ 405c5e1000bSPierrick Bouvier -DBUILD_SHARED_LIBS=OFF -DLIBXML2_WITH_C14N=OFF -DLIBXML2_WITH_CATALOG=OFF ^ 406c5e1000bSPierrick Bouvier -DLIBXML2_WITH_DEBUG=OFF -DLIBXML2_WITH_DOCB=OFF -DLIBXML2_WITH_FTP=OFF ^ 407c5e1000bSPierrick Bouvier -DLIBXML2_WITH_HTML=OFF -DLIBXML2_WITH_HTTP=OFF -DLIBXML2_WITH_ICONV=OFF ^ 408c5e1000bSPierrick Bouvier -DLIBXML2_WITH_ICU=OFF -DLIBXML2_WITH_ISO8859X=OFF -DLIBXML2_WITH_LEGACY=OFF ^ 409c5e1000bSPierrick Bouvier -DLIBXML2_WITH_LZMA=OFF -DLIBXML2_WITH_MEM_DEBUG=OFF -DLIBXML2_WITH_MODULES=OFF ^ 410c5e1000bSPierrick Bouvier -DLIBXML2_WITH_OUTPUT=ON -DLIBXML2_WITH_PATTERN=OFF -DLIBXML2_WITH_PROGRAMS=OFF ^ 411c5e1000bSPierrick Bouvier -DLIBXML2_WITH_PUSH=OFF -DLIBXML2_WITH_PYTHON=OFF -DLIBXML2_WITH_READER=OFF ^ 412c5e1000bSPierrick Bouvier -DLIBXML2_WITH_REGEXPS=OFF -DLIBXML2_WITH_RUN_DEBUG=OFF -DLIBXML2_WITH_SAX1=OFF ^ 413c5e1000bSPierrick Bouvier -DLIBXML2_WITH_SCHEMAS=OFF -DLIBXML2_WITH_SCHEMATRON=OFF -DLIBXML2_WITH_TESTS=OFF ^ 414c5e1000bSPierrick Bouvier -DLIBXML2_WITH_THREADS=ON -DLIBXML2_WITH_THREAD_ALLOC=OFF -DLIBXML2_WITH_TREE=ON ^ 415c5e1000bSPierrick Bouvier -DLIBXML2_WITH_VALID=OFF -DLIBXML2_WITH_WRITER=OFF -DLIBXML2_WITH_XINCLUDE=OFF ^ 416c5e1000bSPierrick Bouvier -DLIBXML2_WITH_XPATH=OFF -DLIBXML2_WITH_XPTR=OFF -DLIBXML2_WITH_ZLIB=OFF ^ 41767226badSAlexandre Ganea -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded ^ 418c5e1000bSPierrick Bouvier ../../libxml2-v2.9.12 || exit /b 1 419c5e1000bSPierrick Bouvierninja install || exit /b 1 420c5e1000bSPierrick Bouvierset libxmldir=%cd%\install 421c5e1000bSPierrick Bouvierset "libxmldir=%libxmldir:\=/%" 422c5e1000bSPierrick Bouviercd .. 423c5e1000bSPierrick Bouvierexit /b 0 424060af269SHans 425060af269SHans::============================================================================== 426060af269SHans:: Generate a PGO profile. 427060af269SHans::============================================================================== 428060af269SHans:do_generate_profile 429060af269SHansREM Build Clang with instrumentation. 430060af269SHansmkdir instrument 431060af269SHanscd instrument 432060af269SHanscmake -GNinja %cmake_flags% -DLLVM_TARGETS_TO_BUILD=Native ^ 433b7c81c1fSAlexandre Ganea -DLLVM_BUILD_INSTRUMENTED=IR %llvm_src%\llvm || exit /b 1 434060af269SHansninja clang || ninja clang || ninja clang || exit /b 1 435060af269SHansset instrumented_clang=%cd:\=/%/bin/clang-cl.exe 436060af269SHanscd .. 437060af269SHansREM Use that to build part of llvm to generate a profile. 438060af269SHansmkdir train 439060af269SHanscd train 440060af269SHanscmake -GNinja %cmake_flags% ^ 441060af269SHans -DCMAKE_C_COMPILER=%instrumented_clang% ^ 442060af269SHans -DCMAKE_CXX_COMPILER=%instrumented_clang% ^ 443060af269SHans -DLLVM_ENABLE_PROJECTS=clang ^ 444060af269SHans -DLLVM_TARGETS_TO_BUILD=Native ^ 445b7c81c1fSAlexandre Ganea %llvm_src%\llvm || exit /b 1 446060af269SHansREM Drop profiles generated from running cmake; those are not representative. 447060af269SHansdel ..\instrument\profiles\*.profraw 448060af269SHansninja tools/clang/lib/Sema/CMakeFiles/obj.clangSema.dir/Sema.cpp.obj 449060af269SHanscd .. 450060af269SHansset profile=%cd:\=/%/profile.profdata 451060af269SHans%stage0_bin_dir%\llvm-profdata merge -output=%profile% instrument\profiles\*.profraw || exit /b 1 452b7c81c1fSAlexandre Ganeaset common_compiler_flags=%common_compiler_flags% -Wno-backend-plugin 453b7c81c1fSAlexandre Ganeaset cmake_profile_flags=-DLLVM_PROFDATA_FILE=%profile% ^ 454b7c81c1fSAlexandre Ganea -DCMAKE_C_FLAGS="%common_compiler_flags%" ^ 455b7c81c1fSAlexandre Ganea -DCMAKE_CXX_FLAGS="%common_compiler_flags%" 456060af269SHansexit /b 0 457060af269SHans 458f671eb17SCarlos Alberto Enciso::============================================================================= 459f671eb17SCarlos Alberto Enciso:: Parse command line arguments. 460f671eb17SCarlos Alberto Enciso:: The format for the arguments is: 461f671eb17SCarlos Alberto Enciso:: Boolean: --option 462f671eb17SCarlos Alberto Enciso:: Value: --option<separator>value 463f671eb17SCarlos Alberto Enciso:: with <separator> being: space, colon, semicolon or equal sign 464f671eb17SCarlos Alberto Enciso:: 465f671eb17SCarlos Alberto Enciso:: Command line usage example: 466f671eb17SCarlos Alberto Enciso:: my-batch-file.bat --build --type=release --version 123 467f671eb17SCarlos Alberto Enciso:: It will create 3 variables: 468f671eb17SCarlos Alberto Enciso:: 'build' with the value 'true' 469f671eb17SCarlos Alberto Enciso:: 'type' with the value 'release' 470f671eb17SCarlos Alberto Enciso:: 'version' with the value '123' 471f671eb17SCarlos Alberto Enciso:: 472f671eb17SCarlos Alberto Enciso:: Usage: 473f671eb17SCarlos Alberto Enciso:: set "build=" 474f671eb17SCarlos Alberto Enciso:: set "type=" 475f671eb17SCarlos Alberto Enciso:: set "version=" 476f671eb17SCarlos Alberto Enciso:: 477f671eb17SCarlos Alberto Enciso:: REM Parse arguments. 478f671eb17SCarlos Alberto Enciso:: call :parse_args %* 479f671eb17SCarlos Alberto Enciso:: 480f671eb17SCarlos Alberto Enciso:: if defined build ( 481f671eb17SCarlos Alberto Enciso:: ... 482f671eb17SCarlos Alberto Enciso:: ) 483f671eb17SCarlos Alberto Enciso:: if %type%=='release' ( 484f671eb17SCarlos Alberto Enciso:: ... 485f671eb17SCarlos Alberto Enciso:: ) 486f671eb17SCarlos Alberto Enciso:: if %version%=='123' ( 487f671eb17SCarlos Alberto Enciso:: ... 488f671eb17SCarlos Alberto Enciso:: ) 489f671eb17SCarlos Alberto Enciso::============================================================================= 490f671eb17SCarlos Alberto Enciso:parse_args 491f671eb17SCarlos Alberto Enciso set "arg_name=" 492f671eb17SCarlos Alberto Enciso :parse_args_start 493f671eb17SCarlos Alberto Enciso if "%1" == "" ( 494f671eb17SCarlos Alberto Enciso :: Set a seen boolean argument. 495f671eb17SCarlos Alberto Enciso if "%arg_name%" neq "" ( 496f671eb17SCarlos Alberto Enciso set "%arg_name%=true" 497f671eb17SCarlos Alberto Enciso ) 498f671eb17SCarlos Alberto Enciso goto :parse_args_done 499f671eb17SCarlos Alberto Enciso ) 500f671eb17SCarlos Alberto Enciso set aux=%1 501f671eb17SCarlos Alberto Enciso if "%aux:~0,2%" == "--" ( 502f671eb17SCarlos Alberto Enciso :: Set a seen boolean argument. 503f671eb17SCarlos Alberto Enciso if "%arg_name%" neq "" ( 504f671eb17SCarlos Alberto Enciso set "%arg_name%=true" 505f671eb17SCarlos Alberto Enciso ) 506f671eb17SCarlos Alberto Enciso set "arg_name=%aux:~2,250%" 507f671eb17SCarlos Alberto Enciso ) else ( 508f671eb17SCarlos Alberto Enciso set "%arg_name%=%1" 509f671eb17SCarlos Alberto Enciso set "arg_name=" 510f671eb17SCarlos Alberto Enciso ) 511f671eb17SCarlos Alberto Enciso shift 512f671eb17SCarlos Alberto Enciso goto :parse_args_start 513f671eb17SCarlos Alberto Enciso 514f671eb17SCarlos Alberto Enciso:parse_args_done 515f671eb17SCarlos Alberto Encisoexit /b 0 516