commit: f6700f7900d8c7b1aad3efa4319b732a96a9679d
Author: Florian Albrechtskirchinger <falbrechtskirchinger <AT> gmail <DOT>
com>
AuthorDate: Mon Jul 21 15:18:56 2025 +0000
Commit: David Roman <davidroman96 <AT> gmail <DOT> com>
CommitDate: Mon Jul 21 16:25:26 2025 +0000
URL: https://gitweb.gentoo.org/repo/proj/guru.git/commit/?id=f6700f79
sys-devel/clang-bloomberg-p2996: new package, add 9999
Adds a monolithic ebuild for the experimental clang fork by Bloomberg
implementing P2996 (Reflection for C++26).
It is cobbled together — somewhat arbitrarily — from the various split
ebuilds in the main portage tree and builds clang, libc++, and
libc++abi, which are installed into
/usr/lib/{clang,llvm}/bloomberg-p2996.
Two patches address compiler warnings that trigger QA notices. The
remaining QA notices are likely false positives.
Signed-off-by: Florian Albrechtskirchinger <falbrechtskirchinger <AT> gmail.com>
.../clang-bloomberg-p2996-9999.ebuild | 234 +++++++++++++++++++++
.../files/enable-reflection-latest.patch | 13 ++
.../files/uninitialized.patch | 13 ++
.../files/unknown-reflection.patch | 12 ++
sys-devel/clang-bloomberg-p2996/metadata.xml | 14 ++
5 files changed, 286 insertions(+)
diff --git a/sys-devel/clang-bloomberg-p2996/clang-bloomberg-p2996-9999.ebuild
b/sys-devel/clang-bloomberg-p2996/clang-bloomberg-p2996-9999.ebuild
new file mode 100644
index 0000000000..83a1b2a15d
--- /dev/null
+++ b/sys-devel/clang-bloomberg-p2996/clang-bloomberg-p2996-9999.ebuild
@@ -0,0 +1,234 @@
+# Copyright 2025 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+inherit cmake git-r3 prefix python-utils-r1
+
+DESCRIPTION="Clang fork implementing experimental support for P2996
(Reflection for C++26)"
+HOMEPAGE="https://github.com/bloomberg/clang-p2996"
+
+LICENSE="Apache-2.0-with-LLVM-exceptions UoI-NCSA BSD MIT public-domain rc"
+SLOT="0"
+KEYWORDS=""
+
+EGIT_REPO_URI="https://github.com/bloomberg/clang-p2996.git"
+EGIT_BRANCH="p2996"
+
+ALL_LLVM_TARGETS="AArch64 AMDGPU ARC ARM AVR BPF CSKY DirectX Hexagon Lanai
LoongArch M68k MSP430 Mips NVPTX PowerPC RISCV SPIRV Sparc SystemZ VE
WebAssembly +X86 XCore Xtensa"
+IUSE="+debug +default-reflection-latest-on +pie"
+for target in ${ALL_LLVM_TARGETS}; do
+ IUSE+=" ${target%${target#+}}llvm_targets_${target#+}"
+done
+
+# TODO
+RDEPEND="sys-libs/zlib:0="
+DEPEND="${RDEPEND}"
+
+PATCHES=(
+ "${FILESDIR}/unknown-reflection.patch"
+ "${FILESDIR}/uninitialized.patch"
+)
+
+CMAKE_USE_DIR="$S/llvm"
+
+src_prepare() {
+ # create extra parent dir for relative CLANG_RESOURCE_DIR access
+ mkdir -p x/y || die
+ BUILD_DIR=${WORKDIR}/x/y/clang
+
+ use default-reflection-latest-on && eapply
"${FILESDIR}/enable-reflection-latest.patch"
+
+ cmake_src_prepare
+
+ # add Gentoo Portage Prefix for Darwin (see prefix-dirs.patch)
+ eprefixify \
+ clang/lib/Lex/InitHeaderSearch.cpp \
+ clang/lib/Driver/ToolChains/Darwin.cpp || die
+
+ if ! use prefix-guest && [[ -n ${EPREFIX} ]]; then
+ sed -i "/LibDir.*Loader/s@return \"\/\"@return
\"${EPREFIX}/\"@" clang/lib/Driver/ToolChains/Linux.cpp || die
+ fi
+}
+
+src_configure() {
+ local targets=()
+ for target in ${ALL_LLVM_TARGETS}; do
+ use llvm_targets_${target#+} && targets+=("${target#+}")
+ done
+ if [ ${#targets[@]} -eq 0 ]; then
+ die "At least one LLVM target must be enabled"
+ fi
+
+ local libdir=$(get_libdir)
+ local mycmakeargs=(
+ -DDEFAULT_SYSROOT=$(usex prefix-guest "" "${EPREFIX}")
+ -DCMAKE_CXX_COMPILER_TARGET="${CHOST}"
+ -DCMAKE_INSTALL_PREFIX="${EPREFIX}/usr/lib/llvm/bloomberg-p2996"
+ -DLLVM_LIBDIR_SUFFIX=${libdir#lib}
+
+ -DBUILD_SHARED_LIBS=OFF
+ -DLLVM_HOST_TRIPLE="${CHOST}"
+ -DLLVM_BUILD_LLVM_DYLIB=ON
+ -DLLVM_LINK_LLVM_DYLIB=ON
+ -DLLVM_ENABLE_PROJECTS="clang"
+ -DLLVM_ENABLE_RUNTIMES="libcxxabi;libcxx"
+ -DLLVM_TARGETS_TO_BUILD="$(IFS=';' ; echo "${targets[*]}")"
+ -DLLVM_INCLUDE_BENCHMARKS=OFF
+ -DLLVM_INCLUDE_TESTS=OFF
+ -DLLVM_BUILD_TESTS=OFF
+ -DLLVM_INSTALL_GTEST=OFF
+
+ -DLLVM_ENABLE_ASSERTIONS=$(usex debug)
+ -DLLVM_ENABLE_EH=ON
+ -DLLVM_ENABLE_RTTI=ON
+ -DLLVM_ENABLE_ZLIB=FORCE_ON
+
+ -DLIBCXX_ENABLE_SHARED=ON
+ -DLIBCXX_ENABLE_STATIC=OFF
+ -DLIBCXX_CXX_ABI=libcxxabi
+ -DLIBCXX_USE_COMPILER_RT=OFF
+ -DLIBCXX_HAS_GCC_S_LIB=OFF
+ -DLIBCXX_INCLUDE_BENCHMARKS=OFF
+ -DLIBCXX_INCLUDE_TESTS=OFF
+ -DLIBCXXABI_LIBUNWIND_INCLUDES="${EPREFIX}"/usr/include
+ -DLIBCXXABI_USE_LLVM_UNWINDER=OFF
+
+
-DCLANG_CONFIG_FILE_SYSTEM_DIR="${EPREFIX}/etc/clang/bloomberg-p2996"
+ -DCLANG_CONFIG_FILE_USER_DIR="~/.config/clang-bloomberg-p2996"
+ # relative to bindir
+ -DCLANG_RESOURCE_DIR="../../../../lib/clang/bloomberg-p2996"
+ -DCLANG_LINK_CLANG_DYLIB=ON
+ -DCLANG_INCLUDE_TESTS=OFF
+
+ -DCLANG_DEFAULT_OPENMP_RUNTIME=libomp
+ -DCLANG_DEFAULT_PIE_ON_LINUX=$(usex pie)
+
+ -DPython3_EXECUTABLE="${PYTHON}"
+
+ -DOCAMLFIND=NO
+ )
+
+ use debug || local -x CPPFLAGS="${CPPFLAGS} -DNDEBUG"
+ cmake_src_configure
+}
+
+src_compile() {
+ cmake_src_compile
+}
+
+_doclang_cfg() {
+ local triple="${1}"
+
+ local tool
+ for tool in clang{,++,-cpp}; do
+ newins - "${triple}-${tool}.cfg" <<-EOF
+ # This configuration file is used by ${triple}-${tool}
driver.
+ @../${triple}-${tool}.cfg
+ @gentoo-plugins.cfg
+ @gentoo-runtimes.cfg
+ EOF
+
+ if [[ ! -f
"${ED}/etc/clang/bloomberg-p2996/bloomberg-p2996-${tool}.cfg" ]]; then
+ dosym "${triple}-${tool}.cfg"
"/etc/clang/bloomberg-p2996/bloomberg-p2996-${tool}.cfg"
+ fi
+ done
+
+ # Install symlinks for triples with other vendor strings since some
+ # programs insist on mangling the triple.
+ local vendor
+ for vendor in gentoo pc unknown; do
+ local vendor_triple="${triple%%-*}-${vendor}-${triple#*-*-}"
+ for tool in clang{,++,-cpp}; do
+ if [[ ! -f
"${ED}/etc/clang/bloomberg-p2996/${vendor_triple}-${tool}.cfg" ]]; then
+ dosym "${triple}-${tool}.cfg"
"/etc/clang/bloomberg-p2996/${vendor_triple}-${tool}.cfg"
+ fi
+ done
+ done
+}
+
+doclang_cfg() {
+ #local triple=$(get_abi_CHOST "${abi}")
+ local triple=${CHOST}
+
+ _doclang_cfg ${triple}
+
+ # LLVM may have different arch names in some cases. For example in x86
+ # profiles the triple uses i686, but llvm will prefer i386 if invoked
+ # with "clang" on x86 or "clang -m32" on x86_64. The gentoo triple will
+ # be used if invoked through ${CHOST}-clang{,++,-cpp} though.
+ #
+ # To make sure the correct triples are installed,
+ # see Triple::getArchTypeName() in llvm/lib/TargetParser/Triple.cpp
+ # and compare with CHOST values in profiles.
+
+ local abi=${triple%%-*}
+ case ${abi} in
+ armv4l|armv4t|armv5tel|armv6j|armv7a)
+ _doclang_cfg ${triple/${abi}/arm}
+ ;;
+ i686)
+ _doclang_cfg ${triple/${abi}/i386}
+ ;;
+ sparc)
+ _doclang_cfg ${triple/${abi}/sparcel}
+ ;;
+ sparc64)
+ _doclang_cfg ${triple/${abi}/sparcv9}
+ ;;
+ esac
+}
+
+src_install() {
+ cmake_src_install
+
+ # Rename programs and update symlinks
+ cd "${D}/usr/lib/llvm/bloomberg-p2996/bin" || die
+ for file in *; do
+ if [[ -f "${file}" && -x "${file}" && ! -L "${file}" ]]; then
+ # Rename regular, executable files
+ mv "${file}" "bloomberg-p2996-${file}" || die "Failed
to rename ${file}"
+ elif [[ -L "${file}" ]]; then
+ # Update symlink to point to renamed target
+ local target
+ target=$(readlink "${file}") || die "Failed to read
symlink ${file}"
+ ln -sf "bloomberg-p2996-${target}"
"bloomberg-p2996-${file}" || die "Failed to update symlink ${file}"
+ rm "${file}" || die "Failed to remove original symlink
${file}"
+ fi
+ done
+
+ local ldpath="${EPREFIX}/usr/lib/llvm/bloomberg-p2996/$(get_libdir)"
+ newenvd - "60llvm-bloomberg-p2996" <<-_EOF_
+ PATH="${EPREFIX}/usr/lib/llvm/bloomberg-p2996/bin"
+ # we need to duplicate it in ROOTPATH for Portage to respect...
+ ROOTPATH="${EPREFIX}/usr/lib/llvm/bloomberg-p2996/bin"
+ LDPATH="${ldpath}:${ldpath}/${CHOST}"
+ _EOF_
+
+ insinto "/etc/clang/bloomberg-p2996"
+ newins - gentoo-runtimes.cfg <<-EOF
+ # This file is initially generated by
sys-devel/clang-bloomberg-p2996::guru.
+ # It is used to control the default runtimes using by clang.
+
+ --rtlib=libgcc
+ --unwindlib=libgcc
+ --stdlib=libc++
+ -fuse-ld=bfd
+ -L${ldpath}/${CHOST}
+ EOF
+ newins - gentoo-plugins.cfg <<-EOF
+ # This file is used to load optional LLVM plugins.
+ EOF
+
+ doclang_cfg
+
+ rm -r "${D}/usr/share/man" || die
+}
+
+pkg_postinst() {
+ elog "Binaries are installed with a 'bloomberg-p2996-' prefix,"
+ elog "e.g., bloomberg-p2996-clang++."
+ use default-reflection-latest-on && \
+ elog "Pass -fno-reflection-latest to disable reflection
support." || \
+ elog "Pass -freflection-latest to enable reflection support."
+}
diff --git
a/sys-devel/clang-bloomberg-p2996/files/enable-reflection-latest.patch
b/sys-devel/clang-bloomberg-p2996/files/enable-reflection-latest.patch
new file mode 100644
index 0000000000..0ff01b18d7
--- /dev/null
+++ b/sys-devel/clang-bloomberg-p2996/files/enable-reflection-latest.patch
@@ -0,0 +1,13 @@
+diff --git a/clang/lib/Driver/ToolChains/Clang.cpp
b/clang/lib/Driver/ToolChains/Clang.cpp
+index a7af861541b8..d372914dfaaf 100644
+--- a/clang/lib/Driver/ToolChains/Clang.cpp
++++ b/clang/lib/Driver/ToolChains/Clang.cpp
+@@ -7066,7 +7066,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction
&JA,
+ Args.AddLastArg(CmdArgs, options::OPT_fapinotes_swift_version);
+
+ if (Args.hasFlag(options::OPT_freflection_latest,
+- options::OPT_fno_reflection_latest, false)) {
++ options::OPT_fno_reflection_latest, true)) {
+ CmdArgs.push_back("-freflection");
+ CmdArgs.push_back("-fparameter-reflection");
+ CmdArgs.push_back("-fannotation-attributes");
diff --git a/sys-devel/clang-bloomberg-p2996/files/uninitialized.patch
b/sys-devel/clang-bloomberg-p2996/files/uninitialized.patch
new file mode 100644
index 0000000000..11f3736234
--- /dev/null
+++ b/sys-devel/clang-bloomberg-p2996/files/uninitialized.patch
@@ -0,0 +1,13 @@
+diff --git a/llvm/include/llvm/ObjectYAML/ELFYAML.h
b/llvm/include/llvm/ObjectYAML/ELFYAML.h
+index e883f2f3e144..1089feab39ea 100644
+--- a/llvm/include/llvm/ObjectYAML/ELFYAML.h
++++ b/llvm/include/llvm/ObjectYAML/ELFYAML.h
+@@ -275,7 +275,7 @@ struct Section : public Chunk {
+ std::optional<llvm::yaml::Hex64> Size;
+
+ // Holds the original section index.
+- unsigned OriginalSecNdx;
++ unsigned OriginalSecNdx = 0;
+
+ Section(ChunkKind Kind, bool IsImplicit = false) : Chunk(Kind, IsImplicit)
{}
+
diff --git a/sys-devel/clang-bloomberg-p2996/files/unknown-reflection.patch
b/sys-devel/clang-bloomberg-p2996/files/unknown-reflection.patch
new file mode 100644
index 0000000000..de9181de05
--- /dev/null
+++ b/sys-devel/clang-bloomberg-p2996/files/unknown-reflection.patch
@@ -0,0 +1,12 @@
+diff --git a/clang/lib/AST/ExprConstantMeta.cpp
b/clang/lib/AST/ExprConstantMeta.cpp
+index 0808f3124833..bc23ad41dbe5 100644
+--- a/clang/lib/AST/ExprConstantMeta.cpp
++++ b/clang/lib/AST/ExprConstantMeta.cpp
+@@ -1664,6 +1664,7 @@ StringRef DescriptionOf(APValue RV, bool Granular =
true) {
+ return "an annotation";
+ }
+ }
++ llvm_unreachable("unknown reflection");
+ }
+
+ bool DiagnoseReflectionKind(DiagFn Diagnoser, SourceRange Range,
diff --git a/sys-devel/clang-bloomberg-p2996/metadata.xml
b/sys-devel/clang-bloomberg-p2996/metadata.xml
new file mode 100644
index 0000000000..aedbaba09c
--- /dev/null
+++ b/sys-devel/clang-bloomberg-p2996/metadata.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE pkgmetadata SYSTEM "https://www.gentoo.org/dtd/metadata.dtd">
+<pkgmetadata>
+ <maintainer type="person">
+ <email>[email protected]</email>
+ <name>Florian Albrechtskirchinger</name>
+ </maintainer>
+ <use>
+ <flag name="default-reflection-latest-on">Defaults -freflection-latest to
on.</flag>
+ </use>
+ <upstream>
+ <remote-id type="github">bloomberg/clang-p2996</remote-id>
+ </upstream>
+</pkgmetadata>