1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
# Copyright 1999-2025 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI=8
PYTHON_COMPAT=( python3_{10..13} )
inherit cmake crossdev flag-o-matic llvm.org llvm-utils python-any-r1
inherit toolchain-funcs
DESCRIPTION="Compiler runtime library for clang, compatible with libgcc_s"
HOMEPAGE="https://llvm.org/"
LICENSE="Apache-2.0-with-LLVM-exceptions || ( UoI-NCSA MIT )"
SLOT="0"
IUSE="debug test"
DEPEND="
~llvm-runtimes/libunwind-${PV}[static-libs]
"
RDEPEND="
${DEPEND}
!sys-devel/gcc
"
BDEPEND="
llvm-core/clang:${LLVM_MAJOR}
test? (
$(python_gen_any_dep ">=dev-python/lit-15[\${PYTHON_USEDEP}]")
=llvm-core/clang-${LLVM_VERSION}*:${LLVM_MAJOR}
)
!test? (
${PYTHON_DEPS}
)
"
LLVM_COMPONENTS=( compiler-rt cmake llvm/cmake llvm-libgcc )
LLVM_TEST_COMPONENTS=( llvm/include/llvm/TargetParser )
llvm.org_set_globals
python_check_deps() {
use test || return 0
python_has_version ">=dev-python/lit-15[${PYTHON_USEDEP}]"
}
pkg_setup() {
if target_is_not_host || tc-is-cross-compiler ; then
# strips vars like CFLAGS="-march=x86_64-v3" for non-x86 architectures
CHOST=${CTARGET} strip-unsupported-flags
# overrides host docs otherwise
DOCS=()
fi
python-any-r1_pkg_setup
}
src_configure() {
# We need to build a separate copy of compiler-rt, because we need to disable the
# COMPILER_RT_BUILTINS_HIDE_SYMBOLS option - compatibility with libgcc requires
# visibility of all symbols.
llvm_prepend_path "${LLVM_MAJOR}"
# LLVM_ENABLE_ASSERTIONS=NO does not guarantee this for us, #614844
use debug || local -x CPPFLAGS="${CPPFLAGS} -DNDEBUG"
export CC=${CTARGET}-clang CXX=${CTARGET}-clang++
strip-unsupported-flags
local mycmakeargs=(
-DCOMPILER_RT_INSTALL_PATH="${EPREFIX}/usr/lib/clang/${LLVM_MAJOR}"
-DCOMPILER_RT_INCLUDE_TESTS=$(usex test)
-DCOMPILER_RT_BUILD_CRT=OFF
-DCOMPILER_RT_BUILD_CTX_PROFILE=OFF
-DCOMPILER_RT_BUILD_LIBFUZZER=OFF
-DCOMPILER_RT_BUILD_MEMPROF=OFF
-DCOMPILER_RT_BUILD_ORC=OFF
-DCOMPILER_RT_BUILD_PROFILE=OFF
-DCOMPILER_RT_BUILD_SANITIZERS=OFF
-DCOMPILER_RT_BUILD_XRAY=OFF
-DCOMPILER_RT_BUILTINS_HIDE_SYMBOLS=OFF
-DPython3_EXECUTABLE="${PYTHON}"
)
# disable building non-native runtimes since we don't do multilib
if use amd64; then
mycmakeargs+=(
-DCAN_TARGET_i386=OFF
)
fi
if use test; then
mycmakeargs+=(
-DLLVM_EXTERNAL_LIT="${EPREFIX}/usr/bin/lit"
-DLLVM_LIT_ARGS="$(get_lit_flags)"
-DCOMPILER_RT_TEST_COMPILER="${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}/bin/clang"
-DCOMPILER_RT_TEST_CXX_COMPILER="${EPREFIX}/usr/lib/llvm/${LLVM_MAJOR}/bin/clang++"
)
fi
cmake_src_configure
}
src_compile() {
cmake_src_compile
local rtlib=$(
"${CC}" -rtlib=compiler-rt -resource-dir="${BUILD_DIR}" \
-print-libgcc-file-name || die
)
# Use the llvm-libgcc's version script to produce libgcc.{a,so}, which
# combines compiler-rt and libunwind into a libgcc replacement.
#
# What we do here is similar to what upstream does[0], with the following
# differences:
#
# * We build the local copy of compiler-rt manually, to have a full control
# over CMake options.
# * Upstream links the locally built copy of libunwind statically. We link the
# system-wide libunwind dynamically.
#
# [0] https://github.com/llvm/llvm-project/blob/llvmorg-19.1.7/llvm-libgcc/CMakeLists.txt#L102-L120
"${CC}" -E -xc \
"${WORKDIR}/llvm-libgcc/gcc_s.ver.in" \
-o gcc_s.ver || die
"${CC}" -nostdlib \
${LDFLAGS} \
-Wl,--version-script,gcc_s.ver \
-Wl,--undefined-version \
-Wl,--whole-archive \
"${rtlib}" \
-Wl,-soname,libgcc_s.so.1.0 \
-lc -lunwind -shared \
-o libgcc_s.so.1.0 || die
cp "${rtlib}" libgcc.a || die
}
src_test() {
# respect TMPDIR!
local -x LIT_PRESERVES_TMP=1
cmake_build check-builtins
}
src_install() {
local libdir=$(get_libdir)
dolib.so libgcc_s.so.1.0
dolib.a libgcc.a
dosym libgcc_s.so.1.0 "/usr/${libdir}/libgcc_s.so.1"
dosym libgcc_s.so.1 "/usr/${libdir}/libgcc_s.so"
dosym libunwind.a "/usr/${libdir}/libgcc_eh.a"
}
|