aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal
diff options
context:
space:
mode:
Diffstat (limited to 'internal')
-rw-r--r--internal/rosa/llvm.go113
1 files changed, 113 insertions, 0 deletions
diff --git a/internal/rosa/llvm.go b/internal/rosa/llvm.go
index e3eccc80..15fcdc26 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
+}