自分用のLLVM、Clang、lld、lldbをビルドしたいの巻

qemuは首尾よくビルドできたので、気をよくしてLLVMでもやりたい。
- https://llvm.org/docs/GettingStarted.html#getting-the-source-code-and-building-llvm
- https://llvm.org/docs/CMake.html
オプションを考える
完全なリストは https://llvm.org/docs/CMake.html#llvm-related-variables にある。
clangdはtools-extra https://github.com/llvm/llvm-project/tree/main/clang-tools-extra/clangd#building-and-testing-clangd かな。 -DLLVM_ENABLE_PROJECTS="lld;lldb;clang;clang-tools-extra"
余計なビルドは無効にする: -DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF
リンクの並列数は下げる: -DLLVM_PARALLEL_LINK_JOBS=2
まぁデバッグ情報のリンクが重いんで。。ELFならsplit DWARFできるんだけどねぇ。。
(Windowsのみ) rpmallocにする: -DLLVM_ENABLE_RPMALLOC=ON
ちなみにこのオプションでCRTもstatic linkされる。でも忘れそうなので -DLLVM_STATIC_LINK_CXX_STDLIB=ON
もしといた方が良いかな。。
ターゲットは悩みどころだな。。手元で使ってるマイコン類で言うと、 -DLLVM_TARGETS_TO_BUILD=AArch64;ARM;AVR;RISCV;WebAssembly;X86
かな。
Prefixはとりあえず -DCMAKE_INSTALL_PREFIX=/opt/yunibuild/llvm
。あとは -DCMAKE_BUILD_TYPE=RelWithDebInfo
くらいか。Windows版はexecutable相対でリロケーションできた。。はず。どうせsysrootは外から与えるし。
Windows版はクロスビルドするので -DLLVM_NATIVE_TOOL_DIR=/opt/yunibuild/llvm/bin
が必要になる。

1周目: ネイティブビルド
qemuのビルドでも使ったMinGW入りのコンテナに apk add g++
して使う。
cmake -S /srcs/llvm -B /build -G Ninja "-DLLVM_ENABLE_PROJECTS=lld;lldb;clang;clang-tools-extra" \
-DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_PARALLEL_LINK_JOBS=2 \
"-DLLVM_TARGETS_TO_BUILD=AArch64;ARM;AVR;RISCV;WebAssembly;X86" \
-DCMAKE_INSTALL_PREFIX=/opt/yunibuild/llvm -DCMAKE_BUILD_TYPE=RelWithDebInfo
In file included from /srcs/lldb/source/Plugins/Process/Linux/IntelPTSingleBufferTrace.h:12,
from /srcs/lldb/source/Plugins/Process/Linux/IntelPTMultiCoreTrace.h:13,
from /srcs/lldb/source/Plugins/Process/Linux/IntelPTCollector.h:12,
from /srcs/lldb/source/Plugins/Process/Linux/NativeProcessLinux.h:24,
from /srcs/lldb/tools/lldb-server/lldb-gdbserver.cpp:41:
/srcs/lldb/source/Plugins/Process/Linux/Perf.h:23:10: fatal error: linux/perf_event.h: No such file or directory
23 | #include <linux/perf_event.h>
| ^~~~~~~~~~~~~~~~~~~~
いや存在性くらい検出しろよ! apk add linux-headers
でカーネルヘッダを追加。
16GiBだとギリギリリンクを2並列にできない。。(clangdで11GiBの消費) -DLLVM_PARALLEL_LINK_JOBS=1

2周目: Windowsビルド
CMake Error at cmake/modules/AddLLVM.cmake:644 (add_library):
Target "LLVMSupport" links to item " -INCLUDE:malloc" which has leading or
trailing whitespace. This is now an error according to policy CMP0004.
Call Stack (most recent call first):
cmake/modules/AddLLVM.cmake:944 (llvm_add_library)
cmake/modules/AddLLVM.cmake:917 (add_llvm_library)
lib/Support/CMakeLists.txt:139 (add_llvm_component_library)
うーん。。?? とりあえず -DLLVM_ENABLE_RPMALLOC=OFF
、 -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded
cmake -S /srcs/llvm -B /buildwin -G Ninja "-DLLVM_ENABLE_PROJECTS=lld;lldb;clang;clang-tools-extra" \
-DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF -DLLVM_INCLUDE_TESTS=OFF -DLLVM_PARALLEL_LINK_JOBS=1 \
"-DLLVM_TARGETS_TO_BUILD=AArch64;AMDGPU;ARM;AVR;RISCV;WebAssembly;X86" \
-DLLVM_ENABLE_RPMALLOC=OFF -DLLVM_STATIC_LINK_CXX_STDLIB=ON -DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded\
-DLLVM_NATIVE_TOOL_DIR=/opt/yunibuild/llvm/bin \
-DCMAKE_INSTALL_PREFIX=/out/yunibuild/llvm -DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DCMAKE_SYSTEM_NAME=Windows -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_CXX_COMPILER=x86_64-w64-mingw32-c++ \
-DCMAKE_C_FLAGS=-mcrtdll=ucrt -DCMAKE_CXX_FLAGS=-mcrtdll=ucrt
なんか最近のClangはHLSLを受け入れるらしいのでGPUバックエンドとしてAMDGPUを足してみた ...けど、どう考えてもDXIL前提だよな。。
/usr/lib/gcc/x86_64-w64-mingw32/14.2.0/../../../../x86_64-w64-mingw32/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
謎エラーすぎる。。たぶん https://sourceware.org/bugzilla/show_bug.cgi?id=31929 と一緒で、出力がでかすぎるんじゃないかな。。流石にbinutilsをリビルドするのは面倒なのでMSVCに乗り換えですかねコレは。。

2周目(やりなおし): Windows MSVC
execute_process(COMMAND
${CMAKE_COMMAND}
-S c:/srcs/llvm -B c:/build -G Ninja
"-DLLVM_ENABLE_PROJECTS=lld;lldb;clang;clang-tools-extra"
-DLLVM_INCLUDE_BENCHMARKS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF
-DLLVM_INCLUDE_TESTS=OFF -DLLVM_PARALLEL_LINK_JOBS=1
"-DLLVM_TARGETS_TO_BUILD=AArch64;AMDGPU;ARM;AVR;RISCV;WebAssembly;X86"
-DLLVM_ENABLE_RPMALLOC=OFF -DLLVM_STATIC_LINK_CXX_STDLIB=ON
-DCMAKE_MSVC_RUNTIME_LIBRARY=MultiThreaded
-DPython3_EXECUTABLE=c:/python3/python.exe
-DCMAKE_INSTALL_PREFIX=c:/yunibuild/llvm -DCMAKE_BUILD_TYPE=RelWithDebInfo)
さすがにコマンドプロンプトに長いコマンドを書くのは苦行なのでCMakeのスクリプトにした。
C:\srcs\llvm\include\llvm\DebugInfo\PDB\DIA\DIASupport.h(25): fatal error C1083: Cannot open include file: 'atlbase.h': No such file or directory
ATL必要なのかよ!
GitHubのrunnerにすら入ってないのに。。一旦 -DLLVM_ENABLE_DIA_SDK=OFF
というかこれMSVC専用だったのか。。元々 Microsoft.VisualStudio.Workload.VCTools
にはATLが入っているので、適切なバージョンを選択できないのはCMake側の問題。自前で検出してパスに追加するしかないかな。。
C:\srcs\clang\lib\Lex\UnicodeCharSets.h(399): error C2226: syntax error: unexpected type 'llvm::sys::UnicodeCharRange'
C:\srcs\clang\lib\Lex\UnicodeCharSets.h(399): error C2143: syntax error: missing ';' before '{'
C:\srcs\clang\lib\Lex\UnicodeCharSets.h(399): error C2447: '{': missing function header (old-style formal list?)
いやぁ、そりゃぁ、まぁ。。。 https://github.com/llvm/llvm-project/issues/60549#issuecomment-2323210260 の通りで、本来は明示的に指定する必要がある。これはプロジェクト側の問題(誰も困ってないの。。?) とりあえず手元では一旦コメント消した。
C:\srcs\lldb\source\Utility\DiagnosticsRendering.cpp(1): warning C4819: The file contains a character that cannot be represented in the current code page (932). Save the file in Unicode format to prevent data loss
C:\srcs\lldb\source\Utility\DiagnosticsRendering.cpp(106): error C2001: newline in constant
C:\srcs\lldb\source\Utility\DiagnosticsRendering.cpp(107): error C2146: syntax error: missing ';' before identifier 'underline'
C:\srcs\lldb\source\Utility\DiagnosticsRendering.cpp(107): error C2001: newline in constant
C:\srcs\lldb\source\Utility\DiagnosticsRendering.cpp(108): error C2146: syntax error: missing ';' before identifier 'vbar'
C:\srcs\lldb\source\Utility\DiagnosticsRendering.cpp(108): error C2001: newline in constant
C:\srcs\lldb\source\Utility\DiagnosticsRendering.cpp(109): error C2146: syntax error: missing ';' before identifier 'joint'
これもUnicode。下の非カラー版をとりあえずコピペ。

ビルドはできた
11GBとかバカみてぇだな。。
まぁSymlinkで済むものがコピーになるから仕方ないけど。