From ff98c9ded97f93348b0a754a551b07050f16a236 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Mon, 19 Jan 2026 02:39:27 +0900 Subject: [PATCH] internal/rosa: llvm bootstrap artifacts This bootstraps the LLVM toolchain across multiple artifacts. Signed-off-by: Ophestra --- internal/rosa/llvm.go | 113 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/internal/rosa/llvm.go b/internal/rosa/llvm.go index e3eccc8..15fcdc2 100644 --- a/internal/rosa/llvm.go +++ b/internal/rosa/llvm.go @@ -1,6 +1,7 @@ package rosa import ( + "runtime" "slices" "strconv" "strings" @@ -189,3 +190,115 @@ cp -r /system/include /usr/include && rm -rf /system/include ScriptEarly: scriptEarly, Script: script + attr.script, }) } + +// NewLLVM returns LLVM toolchain across multiple [pkg.Artifact]. +func (t Toolchain) NewLLVM() (musl, compilerRT, runtimes, clang pkg.Artifact) { + var target string + switch runtime.GOARCH { + case "386", "amd64": + target = "X86" + + default: + panic("unsupported target " + runtime.GOARCH) + } + + minimalDeps := [][2]string{ + {"LLVM_ENABLE_ZLIB", "OFF"}, + {"LLVM_ENABLE_ZSTD", "OFF"}, + {"LLVM_ENABLE_LIBXML2", "OFF"}, + } + + compilerRT = t.newLLVM("compiler-rt", &llvmAttr{ + env: []string{ + ldflags(false), + }, + cmake: [][2]string{ + // libc++ not yet available + {"CMAKE_CXX_COMPILER_TARGET", ""}, + + {"COMPILER_RT_BUILD_BUILTINS", "ON"}, + {"COMPILER_RT_DEFAULT_TARGET_ONLY", "ON"}, + {"LLVM_ENABLE_PER_TARGET_RUNTIME_DIR", "ON"}, + + // does not work without libunwind + {"COMPILER_RT_BUILD_CTX_PROFILE", "OFF"}, + {"COMPILER_RT_BUILD_LIBFUZZER", "OFF"}, + {"COMPILER_RT_BUILD_MEMPROF", "OFF"}, + {"COMPILER_RT_BUILD_PROFILE", "OFF"}, + {"COMPILER_RT_BUILD_SANITIZERS", "OFF"}, + {"COMPILER_RT_BUILD_XRAY", "OFF"}, + }, + append: []string{"compiler-rt"}, + extra: []pkg.Artifact{t.NewMusl(&MuslAttr{ + Headers: true, + Env: []string{ + "CC=clang", + }, + })}, + script: ` +mkdir -p "${ROSA_INSTALL_PREFIX}/lib/clang/21/lib/" +ln -s \ + "../../../${ROSA_TRIPLE}" \ + "${ROSA_INSTALL_PREFIX}/lib/clang/21/lib/" + +ln -s \ + "clang_rt.crtbegin-$(uname -m).o" \ + "${ROSA_INSTALL_PREFIX}/lib/${ROSA_TRIPLE}/crtbeginS.o" +ln -s \ + "clang_rt.crtend-$(uname -m).o" \ + "${ROSA_INSTALL_PREFIX}/lib/${ROSA_TRIPLE}/crtendS.o" +`, + }) + + musl = t.NewMusl(&MuslAttr{ + Extra: []pkg.Artifact{compilerRT}, + Env: []string{ + ldflags(false), + "CC=clang", + "LIBCC=/system/lib/clang/21/lib/" + + triplet() + "/libclang_rt.builtins.a", + "AR=ar", + "RANLIB=ranlib", + }, + }) + + runtimes = t.newLLVM("runtimes", &llvmAttr{ + env: []string{ + ldflags(false), + }, + flags: llvmRuntimeLibunwind | llvmRuntimeLibcxx | llvmRuntimeLibcxxABI, + cmake: slices.Concat([][2]string{ + // libc++ not yet available + {"CMAKE_CXX_COMPILER_WORKS", "ON"}, + + {"LIBCXX_HAS_ATOMIC_LIB", "OFF"}, + {"LIBCXXABI_HAS_CXA_THREAD_ATEXIT_IMPL", "OFF"}, + }, minimalDeps), + append: []string{"runtimes"}, + extra: []pkg.Artifact{ + compilerRT, + musl, + }, + }) + + clang = t.newLLVM("clang", &llvmAttr{ + flags: llvmProjectClang | llvmProjectLld, + env: []string{ + "CFLAGS=" + cflags, + "CXXFLAGS=" + cxxflags(), + ldflags(false), + }, + cmake: slices.Concat([][2]string{ + {"LLVM_TARGETS_TO_BUILD", target}, + {"CMAKE_CROSSCOMPILING", "OFF"}, + {"CXX_SUPPORTS_CUSTOM_LINKER", "ON"}, + }, minimalDeps), + extra: []pkg.Artifact{ + musl, + compilerRT, + runtimes, + }, + }) + + return +}