xref: /llvm-project/llvm/utils/release/build_llvm_release.bat (revision b55c52c047a167f42abbde9a33356cfb96b82c7f)
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