aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/rosa/llvm.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-10-22 01:56:23 +0900
committerOphestra <cat@gensokyo.uk>2026-10-22 11:10:01 +0900
commit9dfbf95db02054204defbe422099c02b790a19fc (patch)
treef8c318ebfc5c824b2eb5e7a8aac3b835ee05a4ed /internal/rosa/llvm.go
parent29f86b3446c9fe35d2a359df45471abdaa35cea4 (diff)
internal/rosa: initial cross-compilation support
This successfully cross-compiles the toolchain. More work is needed to support cross-compilation on all native helpers and existing packages. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/rosa/llvm.go')
-rw-r--r--internal/rosa/llvm.go129
1 files changed, 95 insertions, 34 deletions
diff --git a/internal/rosa/llvm.go b/internal/rosa/llvm.go
index d9ca83e1..4d3e4b21 100644
--- a/internal/rosa/llvm.go
+++ b/internal/rosa/llvm.go
@@ -75,53 +75,112 @@ func init() {
target := t.triple()
cache := []KV{
- {"ENABLE_LINKER_BUILD_ID", "ON"},
- {"COMPILER_RT_USE_BUILTINS_LIBRARY", "ON"},
- {"COMPILER_RT_DEFAULT_TARGET_ONLY", "ON"},
- {"COMPILER_RT_BUILD_GWP_ASAN", "OFF"},
- {"LIBCXX_CXX_ABI", "libcxxabi"},
- {"LIBCXX_USE_COMPILER_RT", "ON"},
- {"LIBCXX_ENABLE_STATIC_ABI_LIBRARY", "OFF"},
- {"LIBCXX_HAS_MUSL_LIBC", "ON"},
- {"LIBCXX_HARDENING_MODE", "fast"},
- {"LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY", "ON"},
- {"LIBCXXABI_USE_LLVM_UNWINDER", "ON"},
- {"LIBCXXABI_ENABLE_STATIC_UNWINDER", "ON"},
- {"LIBCXXABI_USE_COMPILER_RT", "ON"},
- {"LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY", "ON"},
+ {"LLVM_HOST_TRIPLE", "'" + target + "'"},
+ {"LLVM_ENABLE_PROJECTS", "'" + strings.Join([]string{
+ "clang",
+ "lld",
+ }, ";") + "'"},
+ {"LLVM_ENABLE_RUNTIMES", "'" + strings.Join([]string{
+ "compiler-rt",
+ "libcxx",
+ "libcxxabi",
+ "libunwind",
+ }, ";") + "'"},
+
+ {"LLVM_ENABLE_LLD", "ON"},
{"LLVM_INSTALL_BINUTILS_SYMLINKS", "ON"},
{"LLVM_INSTALL_UTILS", "ON"},
+
+ {"CLANG_DEFAULT_RTLIB", "compiler-rt"},
+ {"CLANG_DEFAULT_UNWINDLIB", "libunwind"},
+ {"CLANG_DEFAULT_CXX_STDLIB", "libc++"},
+ {"CLANG_CONFIG_FILE_SYSTEM_DIR", "/system/etc/clang"},
+ }
+
+ common := []KV{
+ {"CMAKE_POSITION_INDEPENDENT_CODE", "ON"},
+
{"LLVM_BUILD_LLVM_DYLIB", "ON"},
{"LLVM_LINK_LLVM_DYLIB", "ON"},
{"LLVM_APPEND_VC_REV", "OFF"},
+ {"LLVM_ENABLE_PER_TARGET_RUNTIME_DIR", "ON"},
+ {"LLVM_INCLUDE_BENCHMARKS", "OFF"},
{"LLVM_ENABLE_RTTI", "ON"},
{"LLVM_ENABLE_ZLIB", "FORCE_ON"},
{"LLVM_ENABLE_ZSTD", "FORCE_ON"},
- {"LLVM_ENABLE_PER_TARGET_RUNTIME_DIR", "ON"},
- {"LLVM_INCLUDE_BENCHMARKS", "OFF"},
- {"CLANG_DEFAULT_RTLIB", "compiler-rt"},
- {"CLANG_DEFAULT_UNWINDLIB", "libunwind"},
- {"CLANG_DEFAULT_CXX_STDLIB", "libc++"},
- {"CLANG_CONFIG_FILE_SYSTEM_DIR", "/system/etc/clang"},
{"LLVM_ENABLE_FFI", "OFF"},
{"LLVM_ENABLE_LIBXML2", "OFF"},
{"LLVM_ENABLE_LIBCXX", "ON"},
- {"LLVM_ENABLE_LLD", "ON"},
+
+ {"COMPILER_RT_USE_BUILTINS_LIBRARY", "ON"},
+ {"COMPILER_RT_DEFAULT_TARGET_ONLY", "ON"},
+ {"COMPILER_RT_BUILD_GWP_ASAN", "OFF"},
+ // symbols: clock_gettime, mallopt
+ {"COMPILER_RT_INCLUDE_TESTS", "OFF"},
+
{"LIBUNWIND_ENABLE_ASSERTIONS", "OFF"},
{"LIBUNWIND_USE_COMPILER_RT", "ON"},
- {"LLVM_HOST_TRIPLE", "'" + target + "'"},
- {"LLVM_ENABLE_PROJECTS", "'" + strings.Join([]string{
- "clang",
- "lld",
- }, ";") + "'"},
- {"LLVM_ENABLE_RUNTIMES", "'" + strings.Join([]string{
- "compiler-rt",
- "libcxx",
- "libcxxabi",
- "libunwind",
- }, ";") + "'"},
+ {"LIBCXX_CXX_ABI", "libcxxabi"},
+ {"LIBCXX_USE_COMPILER_RT", "ON"},
+ {"LIBCXX_ENABLE_STATIC_ABI_LIBRARY", "OFF"},
+ {"LIBCXX_HAS_MUSL_LIBC", "ON"},
+ {"LIBCXX_HARDENING_MODE", "fast"},
+ {"LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY", "ON"},
+
+ {"LIBCXXABI_USE_LLVM_UNWINDER", "ON"},
+ {"LIBCXXABI_ENABLE_STATIC_UNWINDER", "ON"},
+ {"LIBCXXABI_USE_COMPILER_RT", "ON"},
+ {"LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY", "ON"},
+ }
+ cache = append(cache, common...)
+
+ var (
+ triples []string
+ paths []pkg.ExecPath
+ )
+ for _, arch := range []string{
+ "amd64",
+ "arm64",
+ "riscv64",
+ } {
+ _triple := triple(arch)
+ triples = append(triples, _triple)
+ if t.stage.isStage0() {
+ continue
+ }
+
+ if arch != t.Arch() {
+ sysroot := AbsSystem.Append(arch)
+ ct := t.native()
+ if ct.Arch() != arch {
+ ct = t.NewCross(arch).New(t.stage)
+ }
+ paths = append(paths, pkg.Path(
+ sysroot, true, ct.Append(nil,
+ _musl,
+ _kernelHeaders,
+ )...,
+ ))
+ cache = append(cache, []KV{
+ {"BUILTINS_" + _triple + "_CMAKE_SYSROOT", sysroot.String()},
+ {"RUNTIMES_" + _triple + "_CMAKE_SYSROOT", sysroot.String()},
+ {"RUNTIMES_" + _triple + "_LLVM_INCLUDE_TESTS", "OFF"},
+ }...)
+ }
+
+ cache = append(cache, []KV{
+ {"BUILTINS_" + _triple + "_CMAKE_BUILD_TYPE", "Release"},
+ {"RUNTIMES_" + _triple + "_CMAKE_BUILD_TYPE", "Release"},
+ {"RUNTIMES_" + _triple + "_CXX_SUPPORTS_FNO_EXCEPTIONS_FLAG", "ON"},
+ {"RUNTIMES_" + _triple + "_CXX_SUPPORTS_FUNWIND_TABLES_FLAG", "ON"},
+ }...)
+ for _, p := range common {
+ p[0] = "RUNTIMES_" + _triple + "_" + p[0]
+ cache = append(cache, p)
+ }
}
+ targets := strings.Join(triples, ";")
if !t.stage.isStage0() {
skipChecks := []string{
@@ -181,9 +240,10 @@ func init() {
}
cache = append(cache, []KV{
- // symbols: clock_gettime, mallopt
- {"COMPILER_RT_INCLUDE_TESTS", "OFF"},
+ {"CLANG_VENDOR", "'Rosa OS'"},
+ {"LLVM_BUILTIN_TARGETS", "'" + targets + "'"},
+ {"LLVM_RUNTIME_TARGETS", "'" + targets + "'"},
{"LLVM_BUILD_TESTS", "ON"},
{"LLVM_LIT_ARGS", litArgs(true, skipChecks...)},
}...)
@@ -198,6 +258,7 @@ func init() {
"tr",
"awk",
},
+ Paths: paths,
ScriptEarly: `
rm -f /system/bin/clang++.cfg