Memahami monorepo llvm-project (llvm/, clang/, lld/, mlir/), komponen build seperti TableGen, serta cara build LLVM dari source dengan CMake + Ninja untuk release, debug, atau assertions — dan kapan harus build dari source vs pakai prebuilt.

Setelah di episode 2 kita memahami anatomi pipeline kompilasi secara konseptual, pada episode ini kita masuk ke dunia nyata: bagaimana membangun LLVM dari source. Karena LLVM adalah proyek C++ besar dengan banyak komponen, memahami struktur repo dan cara build-nya adalah keterampilan fundamental — terutama jika kalian ingin menulis custom pass, menambahkan fitur ke Clang, atau membangun backend baru.
LLVM bukan satu direktori kecil — ia adalah monorepo besar yang membutuhkan waktu build signifikan. Memahami opsi build yang tepat akan menghemat waktu kalian berjam-jam.
Sejak tahun 2019, semua proyek ekosistem LLVM bergabung dalam satu monorepo: llvm/llvm-project. Strukturnya:
llvm-project/
├── llvm/ # Core LLVM: IR, optimizer, codegen, TableGen
├── clang/ # Front-end C/C++/ObjC
├── clang-tools-extra/ # clangd, clang-tidy, clang-format
├── lld/ # Linker cepat (LLD)
├── mlir/ # Multi-Level Intermediate Representation
├── compiler-rt/ # Runtime: sanitizer, profiling, builtins
├── libcxx/ # Implementasi C++ standard library
├── libunwind/ # Stack unwinding
├── polly/ # Loop optimizer polyhedral
└── openmp/ # OpenMP runtimeSetiap subdirektori adalah proyek mandiri dengan CMakeLists.txt sendiri, tetapi bisa dibangun bersama dalam satu build tree.
LLVM menggunakan bahasa TableGen (.td files) untuk mendeskripsikan register, instruction, dan scheduling model untuk setiap target architecture. TableGen menghasilkan kode C++ otomatis selama build — ini memastikan deskripsi target konsisten dengan kode yang sebenarnya dieksekusi.
def X86 : Target {
let Namespace = "X86";
def EAX : Register<32, [EBX, ECX, EDX, ...]>;
// ... ratusan definisi register
}Kita akan membahas TableGen secara mendalam di episode 16 saat membahas backend architecture.
sudo apt install git cmake ninja-build python3 gcc g++git clone --depth 1 https://github.com/llvm/llvm-project.git
cd llvm-projectKonfigurasi CMake dengan Ninja untuk build yang cepat:
cmake -S llvm -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_PROJECTS="clang;lld" \
-DLLVM_TARGETS_TO_BUILD="X86;AArch64" \
-DLLVM_ENABLE_ASSERTIONS=ON| Opsi | Keterangan |
|---|---|
-DCMAKE_BUILD_TYPE=Release | Build optimasi tanpa debug info (paling cepat) |
-DLLVM_ENABLE_PROJECTS | Proyek yang ikut dibangun |
-DLLVM_TARGETS_TO_BUILD | Target architecture (default semua) |
-DLLVM_ENABLE_ASSERTIONS=ON | Aktifkan assertions untuk development |
ninja -C build -j$(nproc)Waktu build tergantung hardware:
Untuk pengembangan pass dan debugging:
cmake -S llvm -B build-debug -G Ninja \
-DCMAKE_BUILD_TYPE=Debug \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DLLVM_TARGETS_TO_BUILD="X86"Build debug lebih lambat tetapi essential untuk men-debug IR dan pass.
| Skenario | Pilihan |
|---|---|
| Belajar LLVM, menulis kode LLVM API | Prebuilt dari distro atau releases.llvm.org |
| Menulis custom pass (out-of-tree) | Prebuilt sudah cukup |
| Modifikasi optimizer/codegen LLVM sendiri | Build dari source |
| Menulis backend baru (target custom) | Build dari source (wajib) |
| Plugin Clang AST (libTooling) | Build dari source untuk sinkronisasi versi API |
Tip
Gunakan ccache untuk mempercepat rebuild berikutnya: sudo apt install ccache lalu tambahkan -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ke konfigurasi CMake. Rebuild yang sebelumnya 30 menit bisa turun ke 5 menit.
Setelah build selesai, verifikasi:
./build/bin/clang --version
./build/bin/llvm-config --version
./build/bin/opt --versionPastikan versi yang dicetak sesuai dengan branch yang kalian clone.
Inti yang harus dibawa pulang:
-DLLVM_ENABLE_ASSERTIONS=ON untuk development.Di episode 4 selanjutnya kita akan memasuki LLVM IR: Fundamentals — RISC-like low-level ISA, SSA form, hierarki module → function → basic block → instruction, tipe data (integer, float, pointer, struct, vector), dan cara dump IR dari program C. Sampai jumpa di episode 4!