Qt wiki will be updated on October 12th 2023 starting at 11:30 AM (EEST) and the maintenance will last around 2-3 hours. During the maintenance the site will be unavailable.
Build libclang on Windows
Configuring builds
MSVC (2015 and 2017) and MinGW
Can be configured with Qt Creator. It's enough to manually set CMAKE_INSTALL_PREFIX, CMAKE_BUILD_TYPE and LLVM_ENABLE_RTTI
For MinGW there are extra flags though to link libraries into libclang.dll statically (CMAKE_C_FLAGS and CMAKE_CXX_FLAGS): -static-libgcc -static-libstdc++ -static
Clang
Configurable with cmake: You need msvc command line and append PATH with bin directory of clang (set PATH=%PATH%;path\to\clang\bin)
cmake -G <Generator ("NMake Makefiles JOM" or "NMake Makefiles")> -DCMAKE_BUILD_TYPE=<Release|Debug> -DLLVM_ENABLE_RTTI=1 -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_INSTALL_PREFIX=path\to\install -DCMAKE_C_FLAGS="-fms-compatibility-version=19.0" -DCMAKE_CXX_FLAGS="-fms-compatibility-version=19.0" -DMSVC=1 -DCMAKE_CL_64=<1|0> path\to\llvm
Intel Compiler
Currently llvm requires some tweaks to compile with icl (https://software.intel.com/en-us/forums/intel-c-compiler/topic/759252 may solve some of them).
Build
In creator and command line you can just use "jom install" or use default step from Qt Creator
Profile-guided builds extra configuration
MSVC
* First build round: CMAKE_C_FLAGS and CMAKE_CXX_FLAGS: /GL CMAKE_EXE_LINKER_FLAGS and CMAKE_SHARED_LINKER_FLAGS: /LTCG and /GENPROFILE:PGD=pgd\files\path * Training Just run parsing/completion * Second build round: CMAKE_C_FLAGS and CMAKE_CXX_FLAGS: /GL CMAKE_EXE_LINKER_FLAGS and CMAKE_SHARED_LINKER_FLAGS: /LTCG and /USEPROFILE:PGD=same\pgd\files\path
MinGW
* First build round: CMAKE_C_FLAGS and CMAKE_CXX_FLAGS: -fprofile-generate=path\to\profile\files * Training Just run parsing/completion * Second build round: CMAKE_C_FLAGS and CMAKE_CXX_FLAGS: -fprofile-use=path\to\profile\files
Clang
Clang requires compiler-rt to build llvm with -fprofile-instr-generate flag Follow the https://compiler-rt.llvm.org/ to build it. You need additional configuration though: -DCMAKE_INSTALL_PREFIX=<path\to\llvm\install>\lib\clang\5.0.0 and a proper -DCMAKE_BUILD_TYPE
* First build round: cmake -G "NMake Makefiles JOM" -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_RTTI=1 -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_INSTALL_PREFIX=path\to\install -DCMAKE_C_FLAGS="-fms-compatibility-version=19.0 -fprofile-instr-generate=path\llvm-%p.profraw" -DCMAKE_CXX_FLAGS="-fms-compatibility-version=19.0 -fprofile-instr-generate=path\llvm-%p.profraw" -DMSVC=1 -DCMAKE_CL_64=<1|0> -DCMAKE_EXE_LINKER_FLAGS="<path\to\llvm\install>\lib\clang\5.0.0\lib\windows\clang_rt.profile-x86_64.lib /FORCE:MULTIPLE" path\to\llvm * Training * Merging train data llvm-profdata merge -output= llvm.profdata llvm-*.profraw * Second build round: cmake -G "NMake Makefiles JOM" -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_RTTI=1 -DCMAKE_C_COMPILER=clang-cl -DCMAKE_CXX_COMPILER=clang-cl -DCMAKE_INSTALL_PREFIX=path\to\install -DCMAKE_C_FLAGS="-fms-compatibility-version=19.0 -fprofile-instr-use=path\llvm.prodata" -DCMAKE_CXX_FLAGS="-fms-compatibility-version=19.0 -fprofile-instr-use=path\llvm.prodata" -DMSVC=1 -DCMAKE_CL_64=<1|0> path\to\llvm
Intel Compiler
* First build round: cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_RTTI=1 -DCMAKE_C_COMPILER=icl -DCMAKE_CXX_COMPILER=icl -DCMAKE_INSTALL_PREFIX=path\to\install -DLLVM_ENABLE_WARNINGS=0 -DCMAKE_CXX_FLAGS="/Qvc14.1 /Qprof-gen /Qprof-dirc:\icl_profiled" -DCMAKE_C_FLAGS="/Qvc14.1 /Qprof-gen /Qprof-dirc:\icl_profiled" path\to\llvm * Training * Second build round: cmake -G "Ninja" -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_RTTI=1 -DCMAKE_C_COMPILER=icl -DCMAKE_CXX_COMPILER=icl -DCMAKE_INSTALL_PREFIX=path\to\install -DLLVM_ENABLE_WARNINGS=0 -DCMAKE_CXX_FLAGS="/Qvc14.1 /Qprof-use /O2 /Qip /Qprof-dirc:\icl_profiled" -DCMAKE_C_FLAGS="/Qvc14.1 /Qprof-use /O2 /Qip /Qprof-dirc:\icl_profiled" path\to\llvm
Performance
We have measurements comparison between different llvm builds. The most important there are parse and re-parse times.
This is the comparison for sample file that was done for our llvm builds (all compilers are 64-bit):
action | LLVM 5.0 mingw PGO | LLVM 5.0 intel compiler PGO | LLVM 3.9 mingw PGO | LLVM 3.9 msvc2015 | LLVM 3.9 msvc2017 PGO | LLVM 3.9 clang PGO | LLVM 3.9 mingw | LLVM 3.9 clang | LLVM 3.9 msvc2017 |
Parsing | 1.306 | 1.5426 | 1.2874 | 2.7482 | 1.473 | 1.5015 | 1.5797 | 1.7486 | 1.8487 |
Reparsing | 1.9258 | 2.2318 | 2.3362 | 2.9665 | 2.5521 | 2.6727 | 3.183 | 2.8431 | 3.0255 |
That means that currently the fastest build is mingw with applied profile-guided optimization.