internal/rosa: llvm bootstrap artifacts
All checks were successful
Test / Create distribution (push) Successful in 50s
Test / Sandbox (push) Successful in 3m2s
Test / ShareFS (push) Successful in 5m10s
Test / Sandbox (race detector) (push) Successful in 5m37s
Test / Hpkg (push) Successful in 5m40s
Test / Hakurei (push) Successful in 6m9s
Test / Hakurei (race detector) (push) Successful in 8m16s
Test / Flake checks (push) Successful in 2m0s

This bootstraps the LLVM toolchain across multiple artifacts.

Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
2026-01-19 02:39:27 +09:00
parent 7f3d1d6375
commit ff98c9ded9

View File

@@ -1,6 +1,7 @@
package rosa package rosa
import ( import (
"runtime"
"slices" "slices"
"strconv" "strconv"
"strings" "strings"
@@ -189,3 +190,115 @@ cp -r /system/include /usr/include && rm -rf /system/include
ScriptEarly: scriptEarly, Script: script + attr.script, 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
}