Zenn
Open5

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

okuokuokuoku

qemuは首尾よくビルドできたので、気をよくしてLLVMでもやりたい。

オプションを考える

完全なリストは 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 が必要になる。

okuokuokuoku

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

okuokuokuoku

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に乗り換えですかねコレは。。

okuokuokuoku

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必要なのかよ!

https://github.com/actions/runner-images/issues/9873

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/blob/96c723374a28c0f81e4a9512a48b784db0bf4cd0/clang/lib/Lex/UnicodeCharSets.h#L392-L400

いやぁ、そりゃぁ、まぁ。。。 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。下の非カラー版をとりあえずコピペ。

https://github.com/llvm/llvm-project/blob/c38befd94ffe84e7d0d01ae9af10e32319f3ef12/lldb/source/Utility/DiagnosticsRendering.cpp#L106-L111

okuokuokuoku

ビルドはできた

11GBとかバカみてぇだな。。

まぁSymlinkで済むものがコピーになるから仕方ないけど。

ログインするとコメントできます