repo/gentoo:master commit in: www-client/chromium/

"Matt Jolly" <[email protected]>
Newsgroups gmane.linux.gentoo.cvs
Message-ID <1787042904.eb22b9e94827a50b03c7b401b4d1646f0065d691.kangie@gentoo>
commit:     eb22b9e94827a50b03c7b401b4d1646f0065d691
Author:     Emi <emi <AT> genchu <DOT> org>
AuthorDate: Thu Aug 13 08:43:00 2026 +0000
Commit:     Matt Jolly <kangie <AT> gentoo <DOT> org>
CommitDate: Tue Aug 18 08:48:24 2026 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=eb22b9e9

www-client/chromium: add 151.0.7922.137

Bug: https://bugs.gentoo.org/980799
Closes: https://bugs.gentoo.org/980645
Signed-off-by: Emi <emi <AT> genchu.org>
Part-of: https://github.com/gentoo/gentoo/pull/46681
Closes: https://github.com/gentoo/gentoo/pull/46681
Signed-off-by: Matt Jolly <kangie <AT> gentoo.org>

 www-client/chromium/Manifest                       |    1 +
 www-client/chromium/chromium-151.0.7922.137.ebuild | 1872 ++++++++++++++++++++
 2 files changed, 1873 insertions(+)

diff --git a/www-client/chromium/Manifest b/www-client/chromium/Manifest
index 15bbb495ce4b..ff889844659b 100644
--- a/www-client/chromium/Manifest
+++ b/www-client/chromium/Manifest
@@ -4,6 +4,7 @@ DIST chromium-150.0.7871.181-linux.tar.xz 1668476496 BLAKE2B 9d6fb2cc9a12c935f16
 DIST chromium-150.0.7871.186-linux.tar.xz 1668494832 BLAKE2B 8edda676c99dab33bab5ffe6c87bcb5bc3066ee9f7bb36d1a0d0aa7b58e4009f35f4d7e4776a9d80722b54429931d6c1720c77284f2877cf925a6275d38b9dd2 SHA512 e1ee5851277c5a32d89a021b8f20736dfeab1bd046f6dbfa8d22137ff5366119cc845cdb8f87ce42a26d48703734984db4181dfa219dba093a52915f5be9976f
 DIST chromium-151.0.7872.0-linux.tar.xz 1673299600 BLAKE2B 6a2b0da9238c03fba9360b2575def84c0efd90a110ce5d08b9f86eeb1027acf96902ba76e30329b4a871ad4dc9897159bc1920d615147253b7558af12dd2d4a7 SHA512 0afe87ad10b28b01974b8154edd50b735a96e692811fd7af66ca62cd5e74292f22bbbdcc5e7ff5310c6c1ab31d62a18dd4421ee9b0366c6a9c5170307e80acbc
 DIST chromium-151.0.7922.108-linux.tar.xz 1711846220 BLAKE2B c3cfc831e42469d3e8aa42c1d8709f34353d2964c94d06247418fd246bb4b5d6b68cb9266860f14947d1673ea922cd0868018b722a79a82538ad476004a45142 SHA512 b5e63e6ebd554a4f38889450bc42e2ff9bb60a5c85c98840b871e8efa498a4d0e96db18c8240d425d8883c00f3219346736a98c655fe3f3609cace079cc765d9
+DIST chromium-151.0.7922.137-linux.tar.xz 1711946116 BLAKE2B 2bb21793c3da2ea802485d2dae324a86eeca2f9fb3e7b77294f78e41097effd4e37febd37133123e85531c1c2f0f5499443f90adb7a754545765880a460011c2 SHA512 379dede0ca1ae3137e67776608a1b899ecdfa2c5c566df92841f63f1643dbe09d021df05a6a2d1fd853fb7d0fab95e2fea6a4568c18a94fdb84758e0f668f68b
 DIST chromium-clang-llvmorg-23-init-10931-g20b6ec66-11.tar.xz 69635068 BLAKE2B 5250889dac7ca048030266b9e5eb9b08a1288acb1023fff3513555ca361f787fdb273b04d5cb5cc9960d7d13e804604ca63e65b056d1873a8f5e1d56e8f59db8 SHA512 4a1f06bacfb5894e277f3957df3adcc937f262ec91927d6fd97a2e4b88b795e2559a8498be633d6b191dd4d52a5df52669f76c59c2939689f5f88fc7457cabae
 DIST chromium-clang-llvmorg-23-init-19482-g53d18800-1.tar.xz 59093892 BLAKE2B faf8c5011b0271903a9a09a4539002088030eac34ac01c4b84581a556f761f89eac035feda5b97be350679325968db99face036c201972b01dd081ced3468edc SHA512 5d88f1ed4901c80963b6740c9b15a28c33db397f8bf31503502b00caff172e17d37f7b946da31162e04794fee763e0b7456a9fc476827c8a19cdd1e737b9b68a
 DIST chromium-openpower-7aae8a84e3.tar.bz2 441026 BLAKE2B efceb75ba53899388398a4564ef29c9fe66427e160a3e7f3375fd3eec8d1ffef335ca14865c11510e9c3719daab11dfb0954ed4a7b847dee602773d51f5e1e0f SHA512 cbe75ae78226b784904a263f7eb01e44faab71efb4a35ca46ff551ff17c0c5f1cdd8f839313ad3bb678b6ca56e4d95899f7802a548ffe7bb90582d9df5614c21

diff --git a/www-client/chromium/chromium-151.0.7922.137.ebuild b/www-client/chromium/chromium-151.0.7922.137.ebuild
new file mode 100644
index 000000000000..7b7db328bbb1
--- /dev/null
+++ b/www-client/chromium/chromium-151.0.7922.137.ebuild
@@ -0,0 +1,1872 @@
+# Copyright 2009-2026 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+EAPI=8
+
+# PACKAGING NOTES
+
+# Upstream roll their bundled Clang every two weeks, and the bundled Rust
+# is rolled regularly and depends on that. While we do our best to build
+# with system Clang, we may eventually hit the point where we need to use
+# the bundled Clang due to the use of prerelease features.
+
+# USE=bundled-toolchain is intended for users who want to use the same toolchain
+# as the upstream releases. It's also a good fallback in case we fall behind
+# and need to get a release out quickly (less likely with `dev` in-tree).
+# We can't rely on it as a default since the toolchain is only shipped for x86-64;
+# other architectures will need to use system toolchain.
+
+# Since m133 we are using CI-generated tarballs from
+# https://github.com/chromium-linux-tarballs/chromium-tarballs/
+
+# These are bit-for-bit identical to the official releases, but are built
+# using an external CI system that we have some control over, in case
+# issues pop up again with official tarball generation.
+
+GN_MIN_VER=0.2374
+# chromium-tools/get-chromium-toolchain-strings.py (or just use Chromicler)
+# Node for M145+ should be 24.12.0 but that's not packaged in Gentoo yet. See #969145
+TEST_FONT="9c07d19d9c5ee1ff94f717e6fb17e0c8c354e6f9"
+BUNDLED_CLANG_VER="llvmorg-23-init-19482-g53d18800-1"
+BUNDLED_RUST_VER="b998449636a48e2c4a362809085b600a0174e1f2-2"
+RUST_SHORT_HASH=${BUNDLED_RUST_VER:0:10}-${BUNDLED_RUST_VER##*-}
+NODE_VER="24.16.0-r1"
+GO_MIN_VER="1.25.0"
+ESBUILD_VER="0.25.1"
+ROLLUP_VER="4.57.1" # currently manual.
+VIRTUALX_REQUIRED="pgo"
+
+CHROMIUM_LANGS="af am ar bg bn ca cs da de el en-GB es es-419 et fa fi fil fr gu he
+	hi hr hu id it ja kn ko lt lv ml mr ms nb nl pl pt-BR pt-PT ro ru sk sl sr
+	sv sw ta te th tr uk ur vi zh-CN zh-TW"
+
+LLVM_COMPAT=( 21 )
+PYTHON_COMPAT=( python3_{11..14} )
+PYTHON_REQ_USE="xml(+)"
+RUST_MIN_VER=1.91.0
+RUST_NEEDS_LLVM="yes please"
+RUST_OPTIONAL="yes" # Not actually optional, but we don't need system Rust (or LLVM) with USE=bundled-toolchain
+RUST_REQ_USE="rustfmt" # Upstream run rustfmt on bindgen output, so we need it to be available.
+
+inherit check-reqs chromium-2 desktop flag-o-matic llvm-r1 multiprocessing ninja-utils pax-utils
+inherit python-any-r1 readme.gentoo-r1 rust systemd toolchain-funcs virtualx xdg-utils
+
+DESCRIPTION="Open-source version of Google Chrome web browser"
+HOMEPAGE="https://www.chromium.org/"
+PPC64_HASH="7aae8a84e327fc2078ce1625c9c70bfda77d626f"
+PATCH_V="151-3"
+COPIUM_COMMIT="3c7e56fb4523b43b47595bb3a22f77178fc76293"
+SRC_URI="https://github.com/chromium-linux-tarballs/chromium-tarballs/releases/download/${PV}/chromium-${PV}-linux.tar.xz
+	https://deps.gentoo.zip/www-client/chromium/rollup-wasm-node-${ROLLUP_VER}.tgz
+	https://gitlab.com/Matt.Jolly/chromium-patches/-/archive/${PATCH_V}/chromium-patches-${PATCH_V}.tar.bz2
+	!bundled-toolchain? (
+		https://codeberg.org/selfisekai/copium/archive/${COPIUM_COMMIT}.tar.gz
+			-> chromium-patches-copium-${COPIUM_COMMIT:0:10}.tar.gz
+	)
+	bundled-toolchain? (
+		https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/clang-${BUNDLED_CLANG_VER}.tar.xz
+			-> chromium-clang-${BUNDLED_CLANG_VER}.tar.xz
+		https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64/rust-toolchain-${BUNDLED_RUST_VER}-${BUNDLED_CLANG_VER%-*}.tar.xz
+			-> chromium-rust-toolchain-${RUST_SHORT_HASH}-${BUNDLED_CLANG_VER%-*}.tar.xz
+	)
+	test? (
+		https://chromium-fonts.storage.googleapis.com/${TEST_FONT} -> chromium-testfonts-${TEST_FONT:0:10}.tar.gz
+	)
+	ppc64? (
+		https://gitlab.raptorengineering.com/raptor-engineering-public/chromium/openpower-patches/-/archive/${PPC64_HASH}/openpower-patches-${PPC64_HASH}.tar.bz2 -> chromium-openpower-${PPC64_HASH:0:10}.tar.bz2
+	)
+	pgo? ( https://github.com/elkablo/chromium-profiler/releases/download/v0.2/chromium-profiler-0.2.tar )"
+
+# https://gitweb.gentoo.org/proj/chromium-tools.git/tree/get-chromium-licences.py @ 145.0.7632.76
+LICENSE="Apache-2.0 Apache-2.0-with-LLVM-exceptions BSD BSD-2 Base64 Boost-1.0 CC-BY-3.0 CC-BY-4.0 Clear-BSD FFT2D FTL"
+LICENSE+=" IJG ISC LGPL-2 LGPL-2.1 MIT MPL-1.1 MPL-2.0 Ms-PL PSF-2 SGI-B-2.0 SSLeay SunSoft Unicode-3.0"
+LICENSE+=" Unicode-DFS-2015 Unlicense UoI-NCSA ZLIB libtiff openssl"
+LICENSE+=" rar? ( unRAR )"
+
+SLOT="stable"
+KEYWORDS="~amd64 ~arm64"
+
+IUSE_SYSTEM_LIBS="+system-harfbuzz +system-icu +system-zstd"
+IUSE="+X ${IUSE_SYSTEM_LIBS} bindist bundled-toolchain cups debug ffmpeg-chromium gtk4 +hangouts headless kerberos +official pax-kernel pgo"
+IUSE+=" +proprietary-codecs pulseaudio qt6 +rar +screencast selinux test +vaapi +wayland +widevine cpu_flags_ppc_vsx3"
+RESTRICT="
+	!bindist? ( bindist )
+	!test? ( test )
+	arm64? ( test )" # Tests require CFI, which requires LTO, which is broken on arm64 with LLVM 21.
+
+REQUIRED_USE="
+	!headless? ( || ( X wayland ) )
+	pgo? ( X !wayland )
+	screencast? ( wayland )
+	ffmpeg-chromium? ( bindist proprietary-codecs )
+"
+
+COMMON_X_DEPEND="
+	x11-libs/libXcomposite:=
+	x11-libs/libXcursor:=
+	x11-libs/libXdamage:=
+	x11-libs/libXfixes:=
+	>=x11-libs/libXi-1.6.0:=
+	x11-libs/libXrandr:=
+	x11-libs/libXrender:=
+	x11-libs/libXtst:=
+	x11-libs/libxshmfence:=
+"
+
+# sys-libs/zlib: https://bugs.gentoo.org/930365; -ng is not compatible.
+# We _could_ use the bundled minizip, but that's against policy.
+COMMON_SNAPSHOT_DEPEND="
+	system-icu? ( >=dev-libs/icu-73.0:= )
+	>=dev-libs/libxml2-2.12.4:=[icu]
+	dev-libs/nspr:=
+	>=dev-libs/nss-3.26:=
+	dev-libs/libxslt:=
+	media-libs/fontconfig:=
+	>=media-libs/freetype-2.11.0-r1:=
+	system-harfbuzz? ( >=media-libs/harfbuzz-3:0=[icu(-)] )
+	media-libs/libjpeg-turbo:=
+	system-zstd? ( >=app-arch/zstd-1.5.5:= )
+	>=media-libs/libwebp-0.4.0:=
+	media-libs/mesa:=[gbm(+)]
+	>=media-libs/openh264-2.6.0:=
+	sys-libs/zlib:=
+	!headless? (
+		dev-libs/glib:2
+		>=media-libs/alsa-lib-1.0.19:=
+		media-video/pipewire:=
+		pulseaudio? ( media-libs/libpulse:= )
+		sys-apps/pciutils:=
+		kerberos? ( virtual/krb5 )
+		vaapi? ( >=media-libs/libva-2.7:=[X?,wayland?] )
+		X? (
+			x11-base/xorg-proto:=
+			x11-libs/libX11:=
+			x11-libs/libxcb:=
+			x11-libs/libXext:=
+		)
+		x11-libs/libxkbcommon:=
+		wayland? (
+			screencast? ( media-video/pipewire:= )
+			dev-libs/libffi:=
+			dev-libs/wayland:=
+		)
+	)
+"
+
+COMMON_DEPEND="
+	${COMMON_SNAPSHOT_DEPEND}
+	app-arch/bzip2:=
+	dev-libs/expat:=
+	net-misc/curl[ssl]
+	sys-apps/dbus:=
+	media-libs/flac:=
+	sys-libs/zlib:=[minizip]
+	!headless? (
+		>=app-accessibility/at-spi2-core-2.46.0:2
+		media-libs/mesa:=[X?,wayland?]
+		virtual/udev
+		x11-libs/cairo:=
+		x11-libs/gdk-pixbuf:2
+		x11-libs/pango:=
+		cups? ( >=net-print/cups-1.3.11:= )
+		qt6? ( dev-qt/qtbase:6[gui,widgets] )
+		X? ( ${COMMON_X_DEPEND} )
+	)
+"
+RDEPEND="${COMMON_DEPEND}
+	!www-client/chromium:0
+	>=www-client/chromium-common-2
+	!headless? (
+		|| (
+			x11-libs/gtk+:3[X?,wayland?]
+			gui-libs/gtk:4[X?,wayland?]
+		)
+		qt6? ( dev-qt/qtbase:6[X?,wayland?] )
+	)
+	virtual/ttf-fonts
+	selinux? ( sec-policy/selinux-chromium )
+	bindist? (
+		!ffmpeg-chromium? ( >=media-video/ffmpeg-6.1-r1:0/58.60.60[chromium] )
+		ffmpeg-chromium? ( media-video/ffmpeg-chromium:${PV%%\.*} )
+	)
+"
+# For M149+ pipewire is a mandatory build-time dependency, but it's optional at runtime for most configurations.
+DEPEND="${COMMON_DEPEND}
+	!headless? (
+		media-video/pipewire
+		gtk4? ( gui-libs/gtk:4[X?,wayland?] )
+		!gtk4? ( x11-libs/gtk+:3[X?,wayland?] )
+	)
+"
+
+BDEPEND="
+	${COMMON_SNAPSHOT_DEPEND}
+	${PYTHON_DEPS}
+	$(python_gen_any_dep '
+		dev-python/setuptools[${PYTHON_USEDEP}]
+	')
+	>=app-arch/gzip-1.7
+	!headless? (
+		qt6? ( dev-qt/qtbase:6 )
+	)
+	!bundled-toolchain? ( $(llvm_gen_dep '
+		llvm-core/clang:${LLVM_SLOT}
+		llvm-core/llvm:${LLVM_SLOT}
+		official? (
+			!ppc64? ( llvm-runtimes/compiler-rt-sanitizers:${LLVM_SLOT}[cfi] )
+		) ')
+		|| (
+			$(llvm_gen_dep 'llvm-core/lld:${LLVM_SLOT}')
+			>=sys-devel/mold-2.41.0
+		)
+		!official? ( >=sys-devel/mold-2.41.0 )
+		${RUST_DEPEND}
+	)
+	pgo? (
+		>=dev-python/selenium-3.141.0
+		>=dev-util/web_page_replay_go-20220314
+	)
+	>=dev-util/bindgen-0.72.1
+	>=dev-build/gn-${GN_MIN_VER}
+	>=dev-lang/go-${GO_MIN_VER}
+	app-alternatives/ninja
+	dev-lang/perl
+	>=dev-util/gperf-3.2
+	dev-util/esbuild:${ESBUILD_VER}
+	dev-vcs/git
+	>=net-libs/nodejs-${NODE_VER}[inspector]
+	sys-apps/hwdata
+	>=sys-devel/bison-2.4.3
+	sys-devel/flex
+	virtual/pkgconfig
+	x11-misc/xdg-utils
+"
+
+if ! has chromium_pkg_die ${EBUILD_DEATH_HOOKS}; then
+	EBUILD_DEATH_HOOKS+=" chromium_pkg_die";
+fi
+
+DISABLE_AUTOFORMATTING="yes"
+DOC_CONTENTS="
+Some web pages may require additional fonts to display properly.
+Try installing some of the following packages if some characters
+are not displayed properly:
+- media-fonts/arphicfonts
+- media-fonts/droid
+- media-fonts/ipamonafont
+- media-fonts/noto
+- media-fonts/ja-ipafonts
+- media-fonts/takao-fonts
+- media-fonts/wqy-microhei
+- media-fonts/wqy-zenhei
+
+To fix broken icons on the Downloads page, you should install an icon
+theme that covers the appropriate MIME types, and configure this as your
+GTK+ icon theme.
+
+For native file dialogs in KDE, install kde-apps/kdialog.
+
+To make password storage work with your desktop environment you may
+have install one of the supported credentials management applications:
+- app-crypt/libsecret (GNOME)
+- kde-frameworks/kwallet (KDE)
+If you have one of above packages installed, but don't want to use
+them in Chromium, then add --password-store=basic to CHROMIUM_FLAGS
+in /etc/chromium/default.
+"
+
+python_check_deps() {
+	python_has_version "dev-python/setuptools[${PYTHON_USEDEP}]"
+}
+
+pre_build_checks() {
+	# Check build requirements: bugs #471810, #541816, #914220
+	# We're going to start doing maths here on the size of an unpacked source tarball,
+	# this should make updates easier as chromium continues to balloon in size.
+	# xz -l /var/cache/distfiles/chromium-${PV}*.tar.xz
+	local base_disk=9 # Round up
+	use test && base_disk=$((base_disk + 5))
+	local extra_disk=1 # Always include a little extra space
+	local memory=4
+	tc-is-cross-compiler && extra_disk=$((extra_disk * 2))
+	if tc-is-lto || use pgo; then
+		memory=$((memory * 2 + 1))
+		tc-is-cross-compiler && extra_disk=$((extra_disk * 2)) # Double the requirements
+		use pgo && extra_disk=$((extra_disk + 4))
+	fi
+	if is-flagq '-g?(gdb)?([1-9])'; then
+		if use custom-cflags; then
+			extra_disk=$((extra_disk + 5))
+		fi
+		memory=$((memory * 2))
+	fi
+	local CHECKREQS_MEMORY="${memory}G"
+	local CHECKREQS_DISK_BUILD="$((base_disk + extra_disk))G"
+	check-reqs_${EBUILD_PHASE_FUNC}
+}
+
+pkg_pretend() {
+	if [[ ${MERGE_TYPE} != binary ]]; then
+		# The pre_build_checks are all about compilation resources, no need to run it for a binpkg
+		pre_build_checks
+	fi
+
+	if use headless; then
+		local headless_unused_flags=("cups" "kerberos" "pulseaudio" "qt6" "vaapi" "wayland")
+		for myiuse in ${headless_unused_flags[@]}; do
+			use ${myiuse} && ewarn "Ignoring USE=${myiuse}, USE=headless is set."
+		done
+	fi
+
+	if ! use bindist && use ffmpeg-chromium; then
+		ewarn "Ignoring USE=ffmpeg-chromium, USE=bindist is not set."
+	fi
+}
+
+pkg_setup() {
+	if [[ ${MERGE_TYPE} != binary ]]; then
+		# The pre_build_checks are all about compilation resources, no need to run it for a binpkg
+		pre_build_checks
+
+		# We haven't massaged any CFLAGS yet, so we want to do this before we force CC/CXX to prevent warnings.
+		local want_lto="false"
+		tc-is-lto && want_lto="true"
+
+		# The linux:unbundle toolchain in GN grabs CC, CXX, CPP (etc) from the environment
+		# We'll set these to clang here then use llvm-utils functions to very explicitly set these
+		# to a sane value.
+		# This is effectively the 'force-clang' path if GCC support is re-added.
+		if use !bundled-toolchain; then
+			llvm-r1_pkg_setup
+			rust_pkg_setup
+
+			if tc-ld-is-mold; then
+				ewarn "Mold is currently not supported, it will not be used"
+			fi
+
+			# Forcing clang; respect llvm_slot_x to enable selection of impl via LLVM_COMPAT
+			AR=llvm-ar
+			CPP="${CHOST}-clang++-${LLVM_SLOT} -E"
+			NM=llvm-nm
+			CC="${CHOST}-clang-${LLVM_SLOT}"
+			CXX="${CHOST}-clang++-${LLVM_SLOT}"
+		fi
+
+		# LTO in Chromium means LLVM ThinLTO, if GCC support is re-added
+		# We'll need to handle that here too.
+		use_lto="false"
+		local lto_usable="true"
+		if [[ "$want_lto" == "true" ]]; then
+			if use arm64 && [[ "${LLVM_SLOT}" -lt 22 ]]; then
+				einfo "LTO is broken with LLVM 21 on arm64, ignoring CFLAGS."
+				lto_usable="false"
+			else
+				use_lto="true"
+			fi
+			# We can rely on GN to do this for us; without this builds
+			# take significantly longer with LTO enabled.
+			filter-lto
+		fi
+
+		if [[ "$use_lto" == "false" ]] && use official && [[ "$lto_usable" == "true" ]]; then
+			einfo "USE=official selected and LTO not detected."
+			einfo "It is _highly_ recommended that LTO be enabled for performance reasons"
+			einfo "and to be consistent with the upstream \"official\" build optimisations."
+		fi
+
+		if [[ "$use_lto" == "false" ]] && use test; then
+			die "Tests require CFI which requires LTO"
+		fi
+
+		export use_lto
+
+		if tc-is-cross-compiler; then
+			use pgo && die "The pgo USE flag cannot be used when cross-compiling"
+			CPP="${CBUILD}-clang++-${LLVM_SLOT} -E"
+		fi
+
+		# I hate doing this but upstream Rust have yet to come up with a better solution for
+		# us poor packagers. Required for Split LTO units, which are required for CFI.
+		export RUSTC_BOOTSTRAP=1
+
+		# Sanity checks for development convenience
+		if ver_test $(gn --version || die) -lt ${GN_MIN_VER}; then
+			die "dev-build/gn >= ${GN_MIN_VER} is required to build this Chromium"
+		fi
+
+		# Sometimes, when adding a new LLVM slot, devs (me) forget to install an appropriate lld.
+		if tc-ld-is-lld; then
+			local lld_ver=$(ld.lld --version | awk '{split($2,a,"."); print a[1]}' || die "Failed to check lld version")
+			if [[ ${lld_ver} -lt ${LLVM_SLOT} ]]; then
+				die "Your lld version (${lld_ver}) is too old for the selected LLVM slot (${LLVM_SLOT}). Please install a newer lld or select an older LLVM slot."
+			fi
+		fi
+	fi
+
+	chromium_suid_sandbox_check_kernel_config
+}
+
+src_unpack() {
+	unpack ${P}-linux.tar.xz
+	unpack chromium-patches-${PATCH_V}.tar.bz2
+	# These should only be required when we're not using the official toolchain
+	if use !bundled-toolchain; then
+		unpack chromium-patches-copium-${COPIUM_COMMIT:0:10}.tar.gz
+	fi
+
+	use pgo && unpack chromium-profiler-0.2.tar
+
+	if use test; then
+		# This just contains a bunch of font files that need to be unpacked (or moved) to the correct location.
+		local testfonts_dir="${WORKDIR}/${P}/third_party/test_fonts/test_fonts"
+		local testfonts_tar="${DISTDIR}/chromium-testfonts-${TEST_FONT:0:10}.tar.gz"
+		einfo "Unpacking test fonts ..."
+		tar xf "${testfonts_tar}" -C "${testfonts_dir}" || die "Failed to unpack testfonts"
+	fi
+
+	# We need to manually unpack this since M126 else we'd unpack one toolchain over the other.
+	# Since we're doing that anyway let's unpack to sensible locations to make symlink creation easier.
+	if use bundled-toolchain; then
+		einfo "Unpacking bundled Clang ..."
+		mkdir -p "${WORKDIR}"/clang || die "Failed to create clang directory"
+		tar xf "${DISTDIR}/chromium-clang-${BUNDLED_CLANG_VER}.tar.xz" -C "${WORKDIR}/clang" || die "Failed to unpack Clang"
+		einfo "Unpacking bundled Rust ..."
+		local rust_dir="${WORKDIR}/rust-toolchain"
+		mkdir -p "${rust_dir}" || die "Failed to create rust toolchain directory"
+		tar xf "${DISTDIR}/chromium-rust-toolchain-${RUST_SHORT_HASH}-${BUNDLED_CLANG_VER%-*}.tar.xz" -C "${rust_dir}" ||
+			die "Failed to unpack Rust"
+	fi
+
+	if use ppc64; then
+		unpack chromium-openpower-${PPC64_HASH:0:10}.tar.bz2
+	fi
+
+	# This is a dirty hack, but we need rollup to build successfully and it's proving to be challenging
+	# to build locally due to deps
+	unpack rollup-wasm-node-${ROLLUP_VER}.tgz
+}
+
+remove_compiler_builtins() {
+	# We can't use the bundled compiler builtins with the system toolchain
+	# We used to `grep` then `sed`, but it was indirect. Combining the two into a single
+	# `awk` command is more efficient and lets us document the logic more clearly.
+
+	local pattern='    configs += [ "//build/config/clang:compiler_builtins" ]'
+	local target='build/config/compiler/BUILD.gn'
+
+	local tmpfile
+	tmpfile=$(mktemp) || die "Failed to create temporary file."
+
+	if awk -v pat="${pattern}" '
+	BEGIN {
+		match_found = 0
+	}
+
+	# If the delete countdown is active, decrement it and skip to the next line.
+	d > 0 { d--; next }
+
+	# If the current line matches the pattern...
+	$0 == pat {
+		match_found = 1   # ...set our flag to true.
+		d = 2             # Set delete counter for this line and the next two.
+		prev = ""         # Clear the buffered previous line so it is not printed.
+		next
+	}
+
+	# For any other line, print the buffered previous line.
+	NR > 1 { print prev }
+
+	# Buffer the current line to be printed on the next cycle.
+	{ prev = $0 }
+
+	END {
+		# Print the last line if it was not part of a deleted block.
+		if (d == 0) { print prev }
+
+		# If the pattern was never found, exit with a failure code.
+		if (match_found == 0) {
+		exit 1
+		}
+	}
+	' "${target}" > "${tmpfile}"; then
+		# AWK SUCCEEDED (exit code 0): The pattern was found and edited.
+		# This is to avoid gawk's `-i inplace` option which users complain about.
+		mv "${tmpfile}" "${target}"
+	else
+		# AWK FAILED (exit code 1): The pattern was not found.
+		rm -f "${tmpfile}"
+		die "Awk patch failed: Pattern not found in ${target}."
+	fi
+}
+
+src_prepare() {
+	# Calling this here supports resumption via FEATURES=keepwork
+	python_setup
+
+	# We'll fill this in as we go. Patches go in chromium-patches.
+	local PATCHES=()
+
+	PATCHES+=(
+		"${WORKDIR}/chromium-patches-${PATCH_V}/common/"
+	)
+
+	# So many fontconfig magic numbers to cover
+	# TODO: once upstream roll to 2.18.2+ set that as our minimum and remove this logic.
+	# <=2.17.1 -> 9
+	# >2.17.1 && <2.18.2 -> 11
+	# >=2.18.2 -> 12
+	local fontconfig_cache_magic=9
+	if has_version ">=media-libs/fontconfig-2.18.2"; then
+		fontconfig_cache_magic=12
+	elif has_version ">media-libs/fontconfig-2.17.1"; then
+		fontconfig_cache_magic=11
+	fi
+
+	sed -E -i \
+		-e "s#(fb5c91b2895aa445d23aebf7f9e2189c-le64\.cache-)(9|10|11|12)#\1${fontconfig_cache_magic}#g" \
+		third_party/test_fonts/fontconfig/BUILD.gn || die "Failed to set fontconfig cache magic in BUILD.gn"
+
+	sed -E -i \
+		-e "s#(kCacheKey \+ \"/-le64\.cache-)(9|10|11|12)(\")#\1${fontconfig_cache_magic}\3#g" \
+		-e "s#(kCacheKey \+ \"-le64\.cache-)(9|10|11|12)(\")#\1${fontconfig_cache_magic}\3#g" \
+		third_party/test_fonts/fontconfig/generate_fontconfig_caches.cc || \
+			die "Failed to set fontconfig cache magic in generate_fontconfig_caches.cc"
+
+	if use bundled-toolchain; then
+		# We need to symlink the toolchain into the expected location
+		einfo "Symlinking Clang toolchain to expected location ..."
+		mkdir -p third_party/llvm-build/ || die "Failed to create llvm-build directory"
+		# the 'Chromium Linux Tarballs' seem to already have 'Release+Asserts/{lib,bin}'; not sure if this is an
+		# upstream change - we're using the same scripts to build, theoretically. We'll still attempt to create
+		# llvm-build, but we'll rm Release+Asserts and symlink directly.
+		if [[ -d third_party/llvm-build/Release+Asserts ]]; then
+			rm -r third_party/llvm-build/Release+Asserts || die "Failed to remove third_party/llvm-build/Release+Asserts"
+		fi
+		ln -s "${WORKDIR}"/clang third_party/llvm-build/Release+Asserts || die "Failed to bundle Clang"
+		einfo "Symlinking Rust toolchain to expected location ..."
+		# As above, so below
+		if [[ -d third_party/rust-toolchain ]]; then
+			rm -r third_party/rust-toolchain || die "Failed to remove third_party/rust-toolchain"
+		fi
+		ln -s "${WORKDIR}"/rust-toolchain third_party/rust-toolchain || die "Failed to bundle rust"
+		cp "${WORKDIR}"/rust-toolchain/VERSION \
+			"${WORKDIR}"/rust-toolchain/INSTALLED_VERSION || die "Failed to set rust version"
+	else
+		# We don't need our toolchain patches if we're using the official toolchain
+
+		# Copium patches go here.
+		PATCHES+=(
+			"${WORKDIR}/copium/cr143-libsync-__BEGIN_DECLS.patch"
+			"${WORKDIR}/copium/cr149-unbundle-minizip-undo-unicode.patch"
+		)
+
+		# Automate conditional application of chromium-patches
+		# The directory structure is expected to be something like:
+		# chromium-patches-145/
+		# ├── toolchain/
+		# │   ├── cr123-foo.patch
+		# │   └── cr135-bar.patch
+		# ├── llvm/
+		# │   ├── cr144-baz.patch
+		# │   └── lt-23/
+		# │       └── cr145-bleeding-edge-llvm-feature.patch
+		# Where `lt-23` means "apply this patch if the LLVM version is less than 23".
+		# Only categories in `slot_map` will be checked for version constraints.
+		shopt -s nullglob
+		local -A slot_map=( [llvm]="${LLVM_SLOT}" [rust]="${RUST_SLOT}" )
+
+		for category in "${WORKDIR}/chromium-patches-${PATCH_V}"/*/; do
+			local category_name="${category%/}"
+			category_name="${category_name##*/}"
+
+			# Skip arch-specific categories
+			if [[ "${category_name}" == "ppc64le" ]]; then
+				use ppc64 || continue
+			fi
+
+			# We applied common patches above, no need to apply them again here
+			[[ "${category_name}" == "common" ]] && continue
+
+			# Unconditional patches for this category
+			local category_patches=( "${category}"*.patch )
+			[[ ${#category_patches[@]} -gt 0 ]] && PATCHES+=( "${category}" )
+
+			# Version-constrained subdirectories (e.g., llvm/lt-23/)
+			for constraint_dir in "${category}"*/; do
+				local dir_name="${constraint_dir%/}"
+				dir_name="${dir_name##*/}"
+				if [[ "${dir_name}" =~ ^lt-(.*)$ && -v slot_map[${category_name}] ]]; then
+					ver_test "${slot_map[${category_name}]}" -lt "${BASH_REMATCH[1]}" &&
+						PATCHES+=( "${constraint_dir}" )
+				fi
+			done
+		done
+
+		shopt -u nullglob
+
+		# Strictly speaking this doesn't need to be gated (no bundled toolchain for ppc64); it keeps the logic together
+		if use ppc64; then
+			local patchset_dir="${WORKDIR}/openpower-patches-${PPC64_HASH}/patches"
+			# patch causes build errors on 4K page systems (https://bugs.gentoo.org/show_bug.cgi?id=940304)
+			local page_size_patch="ppc64le/third_party/use-sysconf-page-size-on-ppc64.patch"
+			local isa_3_patch="ppc64le/core/baseline-isa-3-0.patch"
+			# Apply the OpenPOWER patches (check for page size and isa 3.0)
+			openpower_patches=( $(grep -E "^ppc64le|^upstream" "${patchset_dir}/series" | grep -v "${page_size_patch}" |
+				grep -v "${isa_3_patch}" || die) )
+			for patch in "${openpower_patches[@]}"; do
+				PATCHES+=( "${patchset_dir}/${patch}" )
+			done
+			if [[ $(getconf PAGESIZE) == 65536 ]]; then
+				PATCHES+=( "${patchset_dir}/${page_size_patch}" )
+			fi
+			# We use vsx3 as a proxy for 'want isa3.0' (POWER9)
+			if use cpu_flags_ppc_vsx3 ; then
+				PATCHES+=( "${patchset_dir}/${isa_3_patch}" )
+			fi
+		fi
+
+		remove_compiler_builtins
+
+		# We can't rely on the eselect'd Rust to actually include rustfmt, so we'll point to the selected slot specifically.
+		local suffix=""
+		if [[ "${RUST_TYPE}" == "binary" ]]; then
+			suffix="-bin-${RUST_SLOT}"
+		else
+			suffix="-${RUST_SLOT}"
+		fi
+		sed -i "s|/bin/rustfmt|/bin/rustfmt${suffix}|g" build/rust/rust_bindgen_generator.gni ||
+			die "Failed to update rustfmt path"
+
+	fi
+
+	# Do this before we apply patches since (e.g.) ppc64 needs to patch rollup and it's easier in ${S}
+	einfo "Moving rollup wasm-node package into place ..."
+	mkdir -p third_party/devtools-frontend/src/node_modules/@rollup/wasm-node ||
+		die "Failed to create node_modules/@rollup/wasm-node"
+	mv "${WORKDIR}"/package/* third_party/devtools-frontend/src/node_modules/@rollup/wasm-node ||
+		die "Failed to move rollup package"
+
+	default
+
+	# Sanity check esbuild version before we start removing files.
+	# We _could_ patch the version check out - in theory esbuild upstream are being super conservative after
+	# arch(AUR) packaged an `esbuild` binary and set ESBUILD_BINARY_PATH=/usr/bin/esbuild, causing much breakage,
+	# but this is fine too and exactly matches what upstream are expecting.
+	# https://github.com/evanw/esbuild/issues/2894
+	local esbuild_js="${S}/third_party/devtools-frontend/src/node_modules/esbuild/lib/main.js"
+	local found
+	found=$(awk -F'"' '/if \(binaryVersion !==/ {print $2}' "${esbuild_js}")
+	if [[ "${found}" != "${ESBUILD_VER}" ]]; then
+		die "esbuild version mismatch: expected ${ESBUILD_VER}, found ${found}"
+	fi
+
+	elog "Removing bundled binaries from source tree ..."
+	# Purge bundled ELF files: These are non-portable and will cause issues if used instead of system versions.
+	# Use `--wasm` to also remove WebAssembly binaries, if desired - they're portable so shouldn't break builds.
+	${EPYTHON} "${FILESDIR}/bin-finder.py" --elf "${S}" | awk '{print $1}' | xargs rm -f ||
+		die "Failed to remove bundled binaries"
+
+	# And now we restore any that we actually need, from the host system
+	local esbuild_path="${S}/third_party/devtools-frontend/src/third_party/esbuild"
+	local -A restore_list=(
+		["/usr/bin/esbuild-${ESBUILD_VER}"]="${esbuild_path}/esbuild"
+		["/usr/bin/gperf"]="${S}/third_party/gperf/cipd/bin/gperf"
+		["/usr/bin/node"]="${S}/third_party/node/linux/node-linux-x64/bin/node"
+	)
+
+	for src in "${!restore_list[@]}"; do
+		dst="${restore_list[${src}]}"
+		if [[ -f "${src}" ]]; then
+			einfo "Symlinking ${src} ..."
+			# Make sure the parent dir exists; some tarballs don't include (e.g.) node's bindir
+			mkdir -p "$(dirname "${dst}")" || die "Failed to create directory for ${dst}"
+			ln -s "${src}" "${dst}" || die "Failed to symlink ${dst} from ${src}"
+			if [[ ! -L "${dst}" || "$(readlink -f "${dst}")" != "${src}" ]]; then
+				die "Symlink verification failed for ${dst} -> ${src}"
+			fi
+		else
+			die "Expected to find ${src} to restore ${dst}, but it does not exist."
+		fi
+	done
+
+	# adjust python interpreter version
+	sed -i -e "s|\(^script_executable = \).*|\1\"${EPYTHON}\"|g" .gn || die
+
+	# Use the system copy of hwdata's usb.ids
+	sed 's|//third_party/usb_ids/src/usb.ids|/usr/share/hwdata/usb.ids|g' \
+		-i services/device/public/cpp/usb/BUILD.gn || die "Failed to set system usb.ids path"
+
+	# remove_bundled_libraries.py walks the source tree and looks for paths containing the substring 'third_party'
+	# whitelist matches use the right-most matching path component, so we need to whitelist from that point down.
+	local keeplibs=(
+		base/third_party/cityhash
+		base/third_party/double_conversion
+		base/third_party/icu
+		base/third_party/nspr
+		base/third_party/superfasthash
+		base/third_party/symbolize
+		base/third_party/xdg_user_dirs
+		buildtools/third_party/libc++
+		buildtools/third_party/libc++abi
+		net/third_party/mozilla_security_manager
+		net/third_party/quic
+		net/third_party/uri_template
+		third_party/abseil-cpp
+		third_party/angle
+		third_party/angle/src/common/third_party/xxhash
+		third_party/angle/src/third_party/ceval
+		third_party/angle/src/third_party/libXNVCtrl
+		third_party/angle/src/third_party/volk
+		third_party/anonymous_tokens
+		third_party/apple_apsl
+		third_party/axe-core
+		third_party/bidimapper
+		third_party/blink
+		third_party/boringssl
+		third_party/boringssl/src/third_party/fiat
+		third_party/breakpad
+		third_party/breakpad/breakpad/src/third_party/curl
+		third_party/brotli
+		third_party/catapult
+		third_party/catapult/common/py_vulcanize/third_party/rcssmin
+		third_party/catapult/common/py_vulcanize/third_party/rjsmin
+		third_party/catapult/third_party/beautifulsoup4-4.9.3
+		third_party/catapult/third_party/html5lib-1.1
+		third_party/catapult/third_party/polymer
+		third_party/catapult/third_party/six
+		third_party/catapult/third_party/typ
+		third_party/catapult/tracing/third_party/d3
+		third_party/catapult/tracing/third_party/gl-matrix
+		third_party/catapult/tracing/third_party/jpeg-js
+		third_party/catapult/tracing/third_party/jszip
+		third_party/catapult/tracing/third_party/mannwhitneyu
+		third_party/catapult/tracing/third_party/oboe
+		third_party/catapult/tracing/third_party/pako
+		third_party/ced
+		third_party/cld_3
+		third_party/closure_compiler
+		third_party/compiler-rt # Since M137 atomic is required; we could probably unbundle this as a target of opportunity.
+		third_party/content_analysis_sdk
+		third_party/cpuinfo
+		third_party/crabbyavif
+		third_party/crashpad
+		third_party/crashpad/crashpad/third_party/lss
+		third_party/crashpad/crashpad/third_party/zlib
+		third_party/crc32c
+		third_party/cros_system_api
+		third_party/d3
+		third_party/dav1d
+		third_party/dawn
+		third_party/dawn/third_party/gn/webgpu-cts
+		third_party/dawn/third_party/OpenGL-Registry
+		third_party/dawn/third_party/renderdoc
+		third_party/dawn/third_party/webgpu-headers
+		third_party/depot_tools
+		third_party/devscripts
+		third_party/devtools-frontend
+		third_party/devtools-frontend/src/front_end/third_party/acorn
+		third_party/devtools-frontend/src/front_end/third_party/additional_readme_paths.json
+		third_party/devtools-frontend/src/front_end/third_party/axe-core
+		third_party/devtools-frontend/src/front_end/third_party/chromium
+		third_party/devtools-frontend/src/front_end/third_party/codemirror
+		third_party/devtools-frontend/src/front_end/third_party/csp_evaluator
+		third_party/devtools-frontend/src/front_end/third_party/diff
+		third_party/devtools-frontend/src/front_end/third_party/i18n
+		third_party/devtools-frontend/src/front_end/third_party/intl-messageformat
+		third_party/devtools-frontend/src/front_end/third_party/json5
+		third_party/devtools-frontend/src/front_end/third_party/legacy-javascript
+		third_party/devtools-frontend/src/front_end/third_party/lighthouse
+		third_party/devtools-frontend/src/front_end/third_party/lit
+		third_party/devtools-frontend/src/front_end/third_party/marked
+		third_party/devtools-frontend/src/front_end/third_party/puppeteer
+		third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/third_party/mitt
+		third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/third_party/parsel-js
+		third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/third_party/rxjs
+		third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/third_party/urlpattern-polyfill
+		third_party/devtools-frontend/src/front_end/third_party/source-map-scopes-codec
+		third_party/devtools-frontend/src/front_end/third_party/third-party-web
+		third_party/devtools-frontend/src/front_end/third_party/vscode.web-custom-data
+		third_party/devtools-frontend/src/front_end/third_party/wasmparser
+		third_party/devtools-frontend/src/front_end/third_party/web-vitals
+		third_party/devtools-frontend/src/third_party
+		third_party/dom_distiller_js
+		third_party/dragonbox
+		third_party/eigen3
+		third_party/emoji-segmenter
+		third_party/farmhash
+		third_party/fast_float
+		third_party/fdlibm
+		third_party/federated_compute/chromium/fcp/confidentialcompute
+		third_party/federated_compute/chromium/fcp/protos
+		third_party/federated_compute/chromium/fcp/secagg
+		third_party/federated_compute/chromium/fcp/client
+		third_party/federated_compute/src/fcp/base
+		third_party/federated_compute/src/fcp/confidentialcompute
+		third_party/federated_compute/src/fcp/protos
+		third_party/federated_compute/src/fcp/client
+		third_party/federated_compute/src/fcp/secagg
+		third_party/federated_compute/third_party/googleapis/src/google
+		third_party/federated_compute/third_party/tensorflow-federated
+		third_party/federated_compute/third_party/protodatastore-cpp
+		third_party/ffmpeg
+		third_party/fft2d
+		third_party/flatbuffers
+		third_party/fp16
+		third_party/freetype
+		third_party/fusejs
+		third_party/fxdiv
+		third_party/gemmlowp
+		third_party/google_input_tools
+		third_party/google_input_tools/third_party/closure_library
+		third_party/google_input_tools/third_party/closure_library/third_party/closure
+		third_party/googletest
+		third_party/gperf # We symlink system gperf, but this will purge the symlink since we tidy up afterwards.
+		third_party/highway
+		third_party/hunspell
+		third_party/ink/src/ink/brush
+		third_party/ink/src/ink/color
+		third_party/ink/src/ink/geometry
+		third_party/ink/src/ink/rendering
+		third_party/ink/src/ink/rendering/skia/common_internal
+		third_party/ink/src/ink/rendering/skia/native
+		third_party/ink/src/ink/rendering/skia/native/internal
+		third_party/ink/src/ink/strokes
+		third_party/ink/src/ink/types
+		third_party/inspector_protocol
+		third_party/ipcz
+		third_party/jinja2
+		third_party/jsoncpp
+		third_party/khronos
+		third_party/lens_server_proto
+		third_party/leveldatabase
+		third_party/libaddressinput
+		third_party/libaom
+		third_party/libaom/source/libaom/third_party/fastfeat
+		third_party/libaom/source/libaom/third_party/vector
+		third_party/libaom/source/libaom/third_party/x86inc
+		third_party/libc++
+		third_party/libdrm
+		third_party/libgav1
+		third_party/libjingle
+		third_party/libpfm4
+		third_party/libphonenumber
+		third_party/libpng
+		third_party/libsecret
+		third_party/libsrtp
+		third_party/libsync
+		third_party/libtess2/libtess2
+		third_party/libtess2/src/Include
+		third_party/libtess2/src/Source
+		third_party/liburlpattern
+		third_party/libva_protected_content
+		third_party/libvpx
+		third_party/libvpx/source/libvpx/third_party/x86inc
+		third_party/libwebm
+		third_party/libx11
+		third_party/libxcb-keysyms
+		third_party/libxml/chromium
+		third_party/libyuv
+		third_party/libzip
+		third_party/lit
+		third_party/llvm-libc
+		third_party/llvm-libc/src/shared/
+		third_party/lottie
+		third_party/lss
+		third_party/lzma_sdk
+		third_party/mako
+		third_party/markupsafe
+		third_party/material_color_utilities
+		third_party/metrics_proto
+		third_party/minigbm
+		third_party/ml_dtypes
+		third_party/modp_b64
+		third_party/nasm
+		third_party/nearby
+		third_party/neon_2_sse
+		third_party/node
+		third_party/oak/chromium/proto
+		third_party/oak/chromium/proto/attestation
+		third_party/omnibox_proto
+		third_party/one_euro_filter
+		third_party/openscreen
+		third_party/openscreen/src/third_party/
+		third_party/openscreen/src/third_party/tinycbor/src/src
+		third_party/opus
+		third_party/ots
+		third_party/pdfium
+		third_party/pdfium/third_party/agg23
+		third_party/pdfium/third_party/bigint
+		third_party/pdfium/third_party/freetype
+		third_party/pdfium/third_party/lcms
+		third_party/pdfium/third_party/libopenjpeg
+		third_party/pdfium/third_party/libtiff
+		third_party/perfetto
+		third_party/perfetto/protos/third_party/android
+		third_party/perfetto/protos/third_party/chromium
+		third_party/perfetto/protos/third_party/pprof
+		third_party/perfetto/protos/third_party/primes
+		third_party/perfetto/protos/third_party/simpleperf
+		third_party/pffft
+		third_party/ply
+		third_party/polymer
+		third_party/private_membership
+		third_party/private-join-and-compute
+		third_party/protobuf
+		third_party/protobuf/third_party/utf8_range
+		third_party/pthreadpool
+		third_party/puffin
+		third_party/pyjson5
+		third_party/pyyaml
+		third_party/rapidhash
+		third_party/re2
+		third_party/readability
+		third_party/rnnoise
+		third_party/rust
+		third_party/ruy
+		third_party/s2cellid
+		third_party/search_engines_data
+		third_party/securemessage
+		third_party/selenium-atoms
+		third_party/sentencepiece
+		third_party/sentencepiece/src/third_party/darts_clone
+		third_party/shell-encryption
+		third_party/simdutf
+		third_party/simplejson
+		third_party/six
+		third_party/skia
+		third_party/skia/include/third_party/vulkan
+		third_party/smhasher
+		third_party/snappy
+		third_party/spirv-headers
+		third_party/spirv-tools
+		third_party/sqlite
+		third_party/swiftshader
+		third_party/swiftshader/third_party/astc-encoder
+		third_party/swiftshader/third_party/llvm-subzero
+		third_party/swiftshader/third_party/marl
+		third_party/swiftshader/third_party/SPIRV-Headers/include/spirv
+		third_party/swiftshader/third_party/SPIRV-Tools
+		third_party/swiftshader/third_party/subzero
+		third_party/tensorflow_models
+		third_party/tensorflow-text
+		third_party/tflite
+		third_party/tflite/src/third_party/fft2d
+		third_party/tflite/src/third_party/xla/third_party/tsl
+		third_party/tflite/src/third_party/xla/xla/tsl/framework
+		third_party/tflite/src/third_party/xla/xla/tsl/lib/random
+		third_party/tflite/src/third_party/xla/xla/tsl/platform
+		third_party/tflite/src/third_party/xla/xla/tsl/protobuf
+		third_party/tflite/src/third_party/xla/xla/tsl/util
+		third_party/ukey2
+		third_party/utf
+		third_party/vulkan
+		third_party/wayland
+		third_party/webdriver
+		third_party/webgpu-cts
+		third_party/webrtc
+		third_party/webrtc/common_audio/third_party/ooura
+		third_party/webrtc/common_audio/third_party/spl_sqrt_floor
+		third_party/webrtc/modules/third_party/fft
+		third_party/webrtc/modules/third_party/g711
+		third_party/webrtc/modules/third_party/g722
+		third_party/widevine
+		third_party/woff2
+		third_party/wuffs
+		third_party/x11proto
+		third_party/xcbproto
+		third_party/xnnpack
+		third_party/zlib/google
+		third_party/zxcvbn-cpp
+		url/third_party/mozilla
+		v8/third_party/glibc
+		v8/third_party/inspector_protocol
+		v8/third_party/rapidhash-v8
+		v8/third_party/siphash
+		v8/third_party/utf8-decoder
+		v8/third_party/v8
+		v8/third_party/valgrind
+
+		# gyp -> gn leftovers
+		third_party/speech-dispatcher
+		third_party/usb_ids
+	)
+
+	if use rar; then
+		keeplibs+=( third_party/unrar )
+	fi
+
+	if use test; then
+		keeplibs+=(
+			third_party/breakpad/breakpad/src/processor
+			third_party/fuzztest
+			third_party/google_benchmark/src/include/benchmark
+			third_party/google_benchmark/src/src
+			third_party/test_fonts
+			third_party/test_fonts/fontconfig
+			third_party/test_fonts/test_fonts
+		)
+	fi
+
+	# USE=system-*
+	if ! use system-harfbuzz; then
+		keeplibs+=( third_party/harfbuzz )
+	fi
+
+	if ! use system-icu; then
+		keeplibs+=( third_party/icu )
+	fi
+
+	if ! use system-zstd; then
+		keeplibs+=( third_party/zstd )
+	fi
+
+	# Arch-specific
+	if use arm64 || use ppc64 ; then
+		keeplibs+=( third_party/swiftshader/third_party/llvm-10.0 )
+	fi
+	# we need to generate ppc64 stuff because upstream does not ship it yet
+	# it has to be done before unbundling.
+	if use ppc64; then
+		pushd third_party/libvpx >/dev/null || die
+		mkdir -p source/config/linux/ppc64 || die
+		# requires git and clang, bug #832803
+		# Revert https://chromium.googlesource.com/chromium/src/+/b463d0f40b08b4e896e7f458d89ae58ce2a27165%5E%21/third_party/libvpx/generate_gni.sh
+		# and https://chromium.googlesource.com/chromium/src/+/71ebcbce867dd31da5f8b405a28fcb0de0657d91%5E%21/third_party/libvpx/generate_gni.sh
+		# since we're not in a git repo
+		sed -i -e "s|^update_readme||g; s|clang-format|${EPREFIX}/bin/true|g; /^git -C/d; /git cl/d; /cd \$BASE_DIR\/\$LIBVPX_SRC_DIR/ign format --in-place \$BASE_DIR\/BUILD.gn\ngn format --in-place \$BASE_DIR\/libvpx_srcs.gni" \
+			generate_gni.sh || die
+		./generate_gni.sh || die
+		popd >/dev/null || die
+
+		pushd third_party/ffmpeg >/dev/null || die
+		cp libavcodec/ppc/h264dsp.c libavcodec/ppc/h264dsp_ppc.c || die
+		cp libavcodec/ppc/h264qpel.c libavcodec/ppc/h264qpel_ppc.c || die
+		popd >/dev/null || die
+	fi
+
+	# Sanity check keeplibs, on major version bumps it is often necessary to update this list
+	# and this enables us to hit them all at once.
+	# There are some entries that need to be whitelisted (TODO: Why? The file is understandable, the rest seem odd)
+	whitelist_libs=(
+		net/third_party/quic
+		third_party/devtools-frontend/src/front_end/third_party/additional_readme_paths.json
+		third_party/libjingle
+		third_party/mesa
+		third_party/skia/third_party/vulkan
+		third_party/vulkan
+	)
+	local not_found_libs=()
+	for lib in "${keeplibs[@]}"; do
+		if [[ ! -d "${lib}" ]] && ! has "${lib}" "${whitelist_libs[@]}"; then
+			not_found_libs+=( "${lib}" )
+		fi
+	done
+
+	if [[ ${#not_found_libs[@]} -gt 0 ]]; then
+		eerror "The following \`keeplibs\` directories were not found in the source tree:"
+		for lib in "${not_found_libs[@]}"; do
+			eerror "  ${lib}"
+		done
+		die "Please update the ebuild."
+	fi
+
+	# Remove most bundled libraries. Some are still needed.
+	einfo "Unbundling third-party libraries ..."
+	build/linux/unbundle/remove_bundled_libraries.py "${keeplibs[@]}" --do-remove || die
+
+	# Interferes with our bundled clang path; we don't want stripped binaries anyway.
+	sed -i -e 's|${clang_base_path}/bin/llvm-strip|/bin/true|g' \
+		-e 's|${clang_base_path}/bin/llvm-objcopy|/bin/true|g' \
+		build/linux/strip_binary.gni || die
+
+	if ! use official; then
+		ln -s /usr/bin/mold buildtools/third_party/mold/cipd/mold || die
+	fi
+}
+
+chromium_configure() {
+	# Calling this here supports resumption via FEATURES=keepwork
+	python_setup
+
+	# 974899: sometimes people try to build with a non-Unicode locale and python gets very upset
+	python_export_utf8_locale || die "Chromium builds require a UTF-8 locale."
+
+	# Bug 491582.
+	export TMPDIR="${WORKDIR}/temp"
+	mkdir -p -m 755 "${TMPDIR}" || die
+
+	# https://bugs.gentoo.org/654216
+	addpredict /dev/dri/ #nowarn
+
+	# Use system-provided libraries.
+	# TODO: freetype -- remove sources (https://bugs.chromium.org/p/pdfium/issues/detail?id=733).
+	# TODO: use_system_hunspell (upstream changes needed).
+	# TODO: use_system_protobuf (bug #525560).
+	# TODO: use_system_sqlite (http://crbug.com/22208).
+
+	# libevent: https://bugs.gentoo.org/593458
+	local gn_system_libraries=(
+		flac
+		fontconfig
+		freetype
+		# Need harfbuzz_from_pkgconfig target
+		#harfbuzz-ng
+		libjpeg
+		libwebp
+		libxml
+		libxslt
+		openh264
+		zlib
+	)
+
+	if use system-icu; then
+		gn_system_libraries+=( icu )
+	fi
+
+	if use system-zstd; then
+		gn_system_libraries+=( zstd )
+	fi
+
+	build/linux/unbundle/replace_gn_files.py --system-libraries "${gn_system_libraries[@]}" ||
+		die "Failed to replace GN files for system libraries"
+
+	# TODO 131: The above call clobbers `enable_freetype = true` in the freetype gni file
+	# drop the last line, then append the freetype line and a new curly brace to end the block
+	local freetype_gni="build/config/freetype/freetype.gni"
+	sed -i -e '$d' ${freetype_gni} || die
+	echo "  enable_freetype = true" >> ${freetype_gni} || die
+	echo "}" >> ${freetype_gni} || die
+
+	if use !custom-cflags; then
+		replace-flags "-Os" "-O2"
+		strip-flags
+		# Debug info section overflows without component build
+		# Prevent linker from running out of address space, bug #471810 .
+		filter-flags "-g*"
+		# 949123: Several multimedia components explicitly build with specific CFLAGS and
+		# use runtime detection to enable optimisations; unfortunately any of our CFLAGS are suffixed
+		# to the end of the command line, which causes build failures.
+		# Since M150 `skia` will begin breaking for x86_64 due to compilation of `avx512` code paths;
+		# we need to filter these for all arches.
+		filter-flags "-march*" "-mtune*" "-mcpu*"
+
+	fi
+
+	# We don't use the same clang version as upstream, and with -Werror
+	# we need to make sure that we don't get superfluous warnings.
+	append-flags -Wno-unknown-warning-option
+	if tc-is-cross-compiler; then # can you cross-compile with the bundled toolchain?
+			export BUILD_CXXFLAGS+=" -Wno-unknown-warning-option"
+			export BUILD_CFLAGS+=" -Wno-unknown-warning-option"
+	fi
+
+	# Start building our GN options
+	local myconf_gn=() # Tip: strings must be quoted, bools or numbers are fine
+
+	if use !bundled-toolchain; then
+		# We already forced the "correct" clang via pkg_setup
+
+		if tc-is-cross-compiler; then
+			CC="${CC} -target ${CHOST} --sysroot ${ESYSROOT}"
+			CXX="${CXX} -target ${CHOST} --sysroot ${ESYSROOT}"
+			BUILD_AR=${AR}
+			BUILD_CC=${CC}
+			BUILD_CXX=${CXX}
+			BUILD_NM=${NM}
+		fi
+
+		# Make sure the build system will use the right tools, bug #340795.
+		tc-export AR CC CXX NM
+
+		strip-unsupported-flags
+		append-ldflags -Wl,--undefined-version # https://bugs.gentoo.org/918897#c32
+
+		myconf_gn+=(
+			"is_clang=true"
+			"clang_use_chrome_plugins=false"
+			"use_clang_modules=false" # M141 enables this for the linux platform by default.
+			'custom_toolchain="//build/toolchain/linux/unbundle:default"'
+			# From M127 we need to provide a location for libclang and the clang resource dir so that bindgen can find them
+			"bindgen_libclang_path=\"$(get_llvm_prefix)/$(get_libdir)\""
+			"bindgen_clang_resource_dir=\"${EPREFIX}/usr/lib/clang/${LLVM_SLOT}/include\""
+			"bindgen_extra_clang_args=[\"-I${EPREFIX}/usr/lib/clang/${LLVM_SLOT}/include\"]"
+			"clang_base_path=\"${EPREFIX}/usr/lib/clang/${LLVM_SLOT}/\""
+			"rust_bindgen_root=\"${EPREFIX}/usr/\""
+			"rust_sysroot_absolute=\"$(get_rust_prefix)\""
+			"rustc_version=\"${RUST_SLOT}\""
+		)
+
+		# Currently disabled, runtime issues with mold
+		#if tc-ld-is-mold; then
+		#	myconf_gn+=(
+		#		"use_mold=true"
+		#		"use_lld=false"
+		#		"linker_path=\"${EPREFIX}/usr/bin/mold\""
+		#	)
+		#else
+		myconf_gn+=( "use_lld=true" )
+		#fi
+
+		if [[ ${LLVM_SLOT} -lt 23 ]]; then
+			# Workaround for -fsanitize-ignore-for-ubsan-feature (added in LLVM 23)
+			myconf_gn+=( 'clang_has_ubsan_feature_ignore=false' )
+		fi
+
+		if ! tc-is-cross-compiler; then
+			myconf_gn+=( 'host_toolchain="//build/toolchain/linux/unbundle:default"' )
+		else
+			tc-export BUILD_{AR,CC,CXX,NM}
+			myconf_gn+=(
+				'host_toolchain="//build/toolchain/linux/unbundle:host"'
+				'v8_snapshot_toolchain="//build/toolchain/linux/unbundle:host"'
+				"host_pkg_config=\"$(tc-getBUILD_PKG_CONFIG)\""
+				"pkg_config=\"$(tc-getPKG_CONFIG)\""
+			)
+
+			# setup cups-config, build system only uses --libs option
+			if use cups; then
+				mkdir "${T}/cups-config" || die
+				cp "${ESYSROOT}/usr/bin/${CHOST}-cups-config" "${T}/cups-config/cups-config" || die
+				export PATH="${PATH}:${T}/cups-config"
+			fi
+
+			# Don't inherit PKG_CONFIG_PATH from environment
+			local -x PKG_CONFIG_PATH=
+		fi
+
+	fi # !bundled-toolchain
+
+	local myarch
+	myarch="$(tc-arch)"
+	case ${myarch} in
+		amd64)
+			# Bug 530248, 544702, 546984, 853646.
+			use !custom-cflags && filter-flags -mno-mmx -mno-sse2 -mno-ssse3 -mno-sse4.1 \
+										-mno-avx -mno-avx2 -mno-fma -mno-fma4 -mno-xop -mno-sse4a
+			myconf_gn+=( 'target_cpu="x64"' )
+			;;
+		arm64)
+			myconf_gn+=( 'target_cpu="arm64"' )
+			;;
+		ppc64)
+			myconf_gn+=( 'target_cpu="ppc64"' )
+			;;
+		*)
+			die "Failed to determine target arch, got '${myarch}'."
+			;;
+	esac
+
+	# Common options
+
+	myconf_gn+=(
+		# Disable code formating of generated files
+		"blink_enable_generated_code_formatting=false"
+		# enable DCHECK with USE=debug only, increases chrome binary size by 30%, bug #811138.
+		# DCHECK is fatal by default, make it configurable at runtime, #bug 807881.
+		"dcheck_always_on=$(usex debug true false)"
+		"dcheck_is_configurable=$(usex debug true false)"
+		# Chromium builds provided by Linux distros should disable the testing config
+		"disable_fieldtrial_testing_config=true"
+		# Custom patch: Enable building Chromium as individual channels (e.g. stable, beta, dev) that
+		# use different profile directories, desktop entries, etc. This enables slotting the ebuild.
+		"enable_channel_branding=true"
+		# 131 began laying the groundwork for replacing freetype with
+		# "Rust-based Fontations set of libraries plus Skia path rendering"
+		# We now need to opt-in
+		"enable_freetype=true"
+		"enable_hangout_services_extension=$(usex hangouts true false)"
+		# Don't need nocompile checks and GN crashes with our config (verify with modern GN)
+		"enable_nocompile_tests=false"
+		# pseudolocales are only used for testing
+		"enable_pseudolocales=false"
+		"enable_widevine=$(usex widevine true false)"
+		# Disable fatal linker warnings, bug 506268.
+		"fatal_linker_warnings=false"
+		# Set up Google API keys, see http://www.chromium.org/developers/how-tos/api-keys
+		# Note: these are for Gentoo use ONLY. For your own distribution,
+		# please get your own set of keys. Feel free to contact [email protected] for more info.
+		# note: OAuth2 is patched in; check patchset for details.
+		'google_api_key="AIzaSyDEAOvatFo0eTgsV_ZlEzx0ObmepsMzfAc"'
+		# Component build isn't generally intended for use by end users. It's mostly useful
+		# for development and debugging.
+		"is_component_build=false"
+		# GN needs explicit config for Debug/Release as opposed to inferring it from build directory.
+		"is_debug=false"
+		"is_official_build=$(usex official true false)"
+		# Enable ozone wayland and/or headless support
+		"ozone_auto_platforms=false"
+		"ozone_platform_headless=true"
+		# Enables building without non-free unRAR licence
+		"safe_browsing_use_unrar=$(usex rar true false)"
+		"thin_lto_enable_optimizations=${use_lto}"
+		"treat_warnings_as_errors=false"
+		# Use in-tree libc++ (buildtools/third_party/libc++ and buildtools/third_party/libc++abi)
+		# instead of the system C++ library for C++ standard library support.
+		# default: true, but let's be explicit (forced since 120 ; USE removed 127).
+		"use_custom_libcxx=true"
+		# Enable ozone wayland and/or headless support
+		"use_ozone=true"
+		# The sysroot is the oldest debian image that chromium supports, we don't need it
+		"use_sysroot=false"
+		# See dependency logic in third_party/BUILD.gn
+		"use_system_harfbuzz=$(usex system-harfbuzz true false)"
+		"use_thin_lto=${use_lto}"
+		# Only enabled for clang, but gcc has endian macros too
+		"v8_use_libm_trig_functions=true"
+		# use system go
+		"tint_use_system_go=true"
+	)
+
+	if use bindist ; then
+		myconf_gn+=(
+			# If this is set to false Chromium won't be able to load any proprietary codecs
+			# even if provided with an ffmpeg capable of h264/aac decoding
+			"proprietary_codecs=true"
+			'ffmpeg_branding="Chrome"'
+			# build ffmpeg as an external component (libffmpeg.so) that we can remove / substitute
+			"is_component_ffmpeg=true"
+		)
+	else
+		myconf_gn+=(
+			"proprietary_codecs=$(usex proprietary-codecs true false)"
+			"ffmpeg_branding=\"$(usex proprietary-codecs Chrome Chromium)\""
+		)
+	fi
+
+	if use headless; then
+		myconf_gn+=(
+			"enable_print_preview=false"
+			"enable_remoting=false"
+			'ozone_platform="headless"'
+			"rtc_use_pipewire=false"
+			"use_alsa=false"
+			"use_cups=false"
+			"use_gio=false"
+			"use_glib=false"
+			"use_gtk=false"
+			"use_kerberos=false"
+			"use_libpci=false"
+			"use_pangocairo=false"
+			"use_pulseaudio=false"
+			"use_qt5=false"
+			"use_qt6=false"
+			"use_udev=false"
+			"use_vaapi=false"
+			"use_xkbcommon=false"
+		)
+	else
+		myconf_gn+=(
+			"gtk_version=$(usex gtk4 4 3)"
+			# link pulseaudio directly (DT_NEEDED) instead of using dlopen.
+			# helps with automated detection of ABI mismatches and prevents silent errors.
+			"link_pulseaudio=$(usex pulseaudio true false)"
+			"ozone_platform_wayland=$(usex wayland true false)"
+			"ozone_platform_x11=$(usex X true false)"
+			"ozone_platform=\"$(usex wayland wayland x11)\""
+			"rtc_use_pipewire=$(usex screencast true false)"
+			# As above - link directly instead of dlopening
+			"rtc_link_pipewire=$(usex screencast true false)"
+			"use_cups=$(usex cups true false)"
+			"use_kerberos=$(usex kerberos true false)"
+			"use_pulseaudio=$(usex pulseaudio true false)"
+			"use_qt5=false"
+			"use_system_libffi=$(usex wayland true false)"
+			"use_system_minigbm=true"
+			"use_vaapi=$(usex vaapi true false)"
+			"use_xkbcommon=true"
+		)
+		if use qt6; then
+			local cbuild_libdir
+			cbuild_libdir="$(get_libdir)"
+			if tc-is-cross-compiler; then
+			# Hack to workaround get_libdir not being able to handle CBUILD, bug #794181
+				cbuild_libdir="$($(tc-getBUILD_PKG_CONFIG) --keep-system-libs --libs-only-L libxslt)"
+				cbuild_libdir="${cbuild_libdir:2}"
+				cbuild_libdir="${cbuild_libdir/% }"
+			fi
+			myconf_gn+=(
+				"use_qt6=true"
+				"moc_qt6_path=\"${EPREFIX}/usr/${cbuild_libdir}/qt6/libexec\""
+			)
+		else
+			myconf_gn+=( "use_qt6=false" )
+		fi
+	fi
+
+	# Explicitly disable ICU data file support for system-icu/headless builds.
+	if use system-icu || use headless; then
+		myconf_gn+=( "icu_use_data_file=false" )
+	fi
+
+	if use official; then
+		# Allow building against system libraries in official builds
+		sed -i 's/OFFICIAL_BUILD/GOOGLE_CHROME_BUILD/' \
+			tools/generate_shim_headers/generate_shim_headers.py || die
+		if use !ppc64; then
+			myconf_gn+=( "is_cfi=${use_lto}" )
+		else
+			myconf_gn+=( "is_cfi=false" ) # requires llvm-runtimes/compiler-rt-sanitizers[cfi]
+		fi
+		# Don't add symbols to build
+		myconf_gn+=( "symbol_level=0" )
+	fi
+
+	if use pgo; then
+		myconf_gn+=( "chrome_pgo_phase=${1}" )
+		if [[ "$1" == "2" ]]; then
+			myconf_gn+=( "pgo_data_path=${2}" )
+		fi
+	else
+		myconf_gn+=( "chrome_pgo_phase=0" )
+	fi
+
+	# Odds and ends
+
+	# skipping typecheck is only supported on amd64, bug #876157
+	if ! use amd64; then
+		myconf_gn+=( "devtools_skip_typecheck=false" )
+	fi
+
+	# Disable external code space for V8 for ppc64. It is disabled for ppc64
+	# by default, but cross-compiling on amd64 enables it again.
+	if tc-is-cross-compiler && use ppc64; then
+		myconf_gn+=( "v8_enable_external_code_space=false" )
+	fi
+
+	# Since we build from tarballs, we need to set the channel here so that it can be used in the build.
+	export CHROME_VERSION_EXTRA="${SLOT}"
+
+	einfo "Configuring Chromium ..."
+	# add a `-v` here if gn `hangs` to see which file it's getting stuck on.
+	set -- gn gen --args="${myconf_gn[*]}${EXTRA_GN:+ ${EXTRA_GN}}" out/Release
+	echo "$@"
+	"$@" || die "Failed to configure Chromium"
+}
+
+src_configure() {
+	chromium_configure $(usex pgo 1 0)
+}
+
+chromium_compile() {
+
+	# Final link uses lots of file descriptors.
+	ulimit -n 2048
+
+	# Calling this here supports resumption via FEATURES=keepwork
+	python_setup
+
+	# Don't inherit PYTHONPATH from environment, bug #789021, #812689
+	local -x PYTHONPATH=
+
+	# Build mksnapshot and pax-mark it.
+	if use pax-kernel; then
+		local x
+		for x in mksnapshot v8_context_snapshot_generator code_cache_generator; do
+			if tc-is-cross-compiler; then
+				eninja -C out/Release "host/${x}"
+				pax-mark m "out/Release/host/${x}"
+			else
+				eninja -C out/Release "${x}"
+				pax-mark m "out/Release/${x}"
+			fi
+		done
+	fi
+
+	# Even though ninja autodetects number of CPUs, we respect
+	# user's options, for debugging with -j 1 or any other reason.
+	eninja -C out/Release chrome chromedriver chrome_sandbox $(use test && echo "base_unittests")
+
+	pax-mark m out/Release/chrome
+
+	# This codepath does minimal patching, so we're at the mercy of upstream
+	# CFLAGS. This is fine - we're not intending to force this on users
+	# and we do a lot of flag 'management' anyway.
+	if use bundled-toolchain; then
+		QA_FLAGS_IGNORED="
+			usr/lib64/chromium-browser/chrome
+			usr/lib64/chromium-browser/chrome-sandbox
+			usr/lib64/chromium-browser/chromedriver
+			usr/lib64/chromium-browser/chrome_crashpad_handler
+			usr/lib64/chromium-browser/libEGL.so
+			usr/lib64/chromium-browser/libGLESv2.so
+			usr/lib64/chromium-browser/libVkICD_mock_icd.so
+			usr/lib64/chromium-browser/libVkLayer_khronos_validation.so
+			usr/lib64/chromium-browser/libqt6_shim.so
+			usr/lib64/chromium-browser/libvk_swiftshader.so
+			usr/lib64/chromium-browser/libvulkan.so.1
+		"
+	fi
+}
+
+# This function is called from virtx, and must always return so that Xvfb
+# session isn't left running. If we return 1, virtx will call die().
+chromium_profile() {
+	einfo "Profiling for PGO"
+
+	pushd "${WORKDIR}/chromium-profiler-"* >/dev/null || return 1
+
+	# Remove old profdata in case profiling was interrupted.
+	rm -rf "${1}" || return 1
+
+	if ! "${EPYTHON}" ./chromium_profiler.py \
+		--chrome-executable "${S}/out/Release/chrome" \
+		--chromedriver-executable "${S}/out/Release/chromedriver.unstripped" \
+		--add-arg no-sandbox --add-arg disable-dev-shm-usage \
+		--profile-output "${1}"; then
+		eerror "Profiling failed"
+		return 1
+	fi
+
+	popd >/dev/null || return 1
+}
+
+src_compile() {
+	if use pgo; then
+		local profdata
+
+		profdata="${WORKDIR}/chromium.profdata"
+
+		if [[ ! -e "${WORKDIR}/.pgo-profiled" ]]; then
+			chromium_compile
+			virtx chromium_profile "$profdata"
+
+			touch "${WORKDIR}/.pgo-profiled" || die
+		fi
+
+		if [[ ! -e "${WORKDIR}/.pgo-phase-2-configured" ]]; then
+			# Remove phase 1 output
+			rm -r out/Release || die
+
+			chromium_configure 2 "$profdata"
+
+			touch "${WORKDIR}/.pgo-phase-2-configured" || die
+		fi
+
+		if [[ ! -e "${WORKDIR}/.pgo-phase-2-compiled" ]]; then
+			chromium_compile
+			touch "${WORKDIR}/.pgo-phase-2-compiled" || die
+		fi
+	else
+		chromium_compile
+	fi
+
+	mv out/Release/chromedriver{.unstripped,} || die
+
+	rm -f out/Release/locales/*.pak.info || die
+
+	# Generate support files (desktop file, manpage, etc.) See: #684550 #706786 #968958
+	${EPYTHON} "${FILESDIR}/generate-support-files.py" \
+		--installdir "/usr/$(get_libdir)/chromium-browser" \
+		--channel "${SLOT}" ||
+			die "Failed to generate support files"
+}
+
+src_test() {
+	# Tests may be flaky with usersandbox, and the test runner executes significantly faster without.
+	# If you seem to be excluding too many tests for a particular milestone: comment them out, reboot, and
+	# run the tests again. If that doesn't help, try FEATURES="-usersandbox" and send it because obviously the
+	# chromium gods are not smiling upon you today. Do some runtime testing, obvs.
+	local skip_tests=(
+		# Wildcard exclusions (if all tests in a test suite are broken)
+		'AlternateTestParams/PartitionAllocDeathTest.RepeatedAllocReturnNullDirect/*'
+		'AlternateTestParams/PartitionAllocDeathTest.RepeatedReallocReturnNullDirect/*'
+		'AlternateTestParams/PartitionAllocTest.*' # 200+ tests, >= 1 crashes entire test runner with usersandbox.
+		'CheckExitCodeAfterSignalHandlerDeathTest.*'
+		'CriticalProcessAndThreadSpotChecks/HangWatcherAnyCriticalThreadTests.*'
+		'LazyThreadPoolTaskRunnerEnvironmentTest.*' # M142
+		'ToolsSanityTest.BadVirtualCall*'
+		# Since 151.0.7922.137
+		'CheckDeathTest.*'
+		'EnumSetDeathTest.*'
+		'OptionalRefDeathTest.*'
+		'RawRefDeathTest.*'
+		'AlternateTestParams/PartitionAllocDeathTest.CheckTriggered*'
+		'CallbackHelpersTest.*'
+		'SafeRefTest.*'
+		'SpanTest.*'
+		'WeakValueTableTest.*'
+		'PlatformSharedMemoryRegionTest.*'
+		'RefCountedOverflowTest.*'
+		'SingleThreadTaskRunnerCurrentDefaultHandleTest.*'
+		'TestFutureDeathTest.*'
+		'WeakPtrDeathTest.*'
+		'SafeRefDeathTest.*'
+		'LinkedListDeathTest.*'
+		'BindDeathTest.*'
+		'ReallocProtectedIteratorDeathTest.*'
+		'PASpanTest.*'
+		'BackupRefPtrTest.*'
+		'All/Base64Test.Overflow*'
+		'ValuesTest.*'
+		'TaskEnvironmentTest.*'
+		'CheckedObserverListTest.*'
+		'MemoryConsumerRegistryTest.*'
+		ProtectedMemoryDeathTest.FailsIfDefinedOutsideOfProtectMemoryRegion
+		StructuredSharedMemoryDeathTest.DuplicateRegion
+		CheckedContiguousIteratorDeathTest.OutOfBounds
+		HeapArrayDeathTest.TakeFirstWithOverSize
+		CallbackDeathTest.RunNullCallbackChecks
+		ObserverListThreadSafeDeathTest.CrossThreadRemovalRestricted
+		SequencedTaskRunnerCurrentDefaultHandleDeathTest.OverrideWithNull
+		TestFutureWithoutTaskEnvironmentDeathTest.WaitShouldDcheckWithoutTaskEnvironment
+		ScopedThreadPriorityDeathTest.NoRealTime
+		ReallocProtectedIteratorDeathTest.StringReallocCrashes
+		BarrierCallbackTest.ErrorToCallCallbackWithZeroCallbacks
+		BarrierClosureTest.ChecksIfCalledForZeroClosures
+		SupportsUserDataTest.ReentrantSetUserDataDuringRemoval
+		TimeBase.AddSubInfinities
+		LibcppHardeningTest.Assertions
+		IDMapTest.RemovedValueHandling
+		MultiMemoryConsumerTest.DuplicateInterventionsCheck
+		PersistentMemoryAllocatorTest.DelayedAllocationTest
+		SequenceCheckerTest.MoveOffSequenceBanned
+		ThreadCheckerTest.MoveOffThreadBanned
+		TokenType.TokenFromNullUnguessableToken
+		ZipTest.CheckForIterationPastTheEnd
+		MemoryConsumerTraitsTest.ActiveConsumerWithPassiveTraitsFails
+		SingleThreadTaskRunnerMainThreadDefaultHandleTest.Basic
+
+		# requires en-us locale
+		SysStrings.SysNativeMBAndWide
+		SysStrings.SysNativeMBToWide
+		SysStrings.SysWideToNativeMB
+		# Specific test cases
+		CancelableEventTest.BothCancelFailureAndSucceedOccurUnderContention
+		FilePathTest.FromUTF8Unsafe_And_AsUTF8Unsafe
+		HistogramTesterTest.PumaTestUniqueSample
+		ImmediateCrashTest.ExpectedOpcodeSequence # M150
+		PathServiceTest.CheckedGetFailure
+		PlatformThreadTest.CanChangeThreadType
+		RawPtrTest.SetLookupUsesGetForComparison # M146 ; also broken for alpine in M144.
+		RustLogIntegrationTest.CheckAllSeverity
+		StackCanary.ChangingStackCanaryCrashesOnReturn
+		StackTraceDeathTest.StackDumpSignalHandlerIsMallocFree
+		TestLauncherTools.TruncateSnippetFocusedMatchesFatalMessagesTest
+		ThreadPoolEnvironmentConfig.CanUseBackgroundPriorityForWorker
+		DriveInfoTest.GetFileDriveInfo
+
+	)
+	local test_filter="-$(IFS=:; printf '%s' "${skip_tests[*]}")"
+	# test-launcher-bot-mode enables parallelism and plain output
+	# Check individual tests with --gtest_filter=<test you want> --single-process-tests
+	./out/Release/base_unittests --test-launcher-bot-mode \
+		--test-launcher-jobs="$(get_makeopts_jobs)" \
+		--gtest_filter="${test_filter}" || die "Tests failed!"
+}
+
+src_install() {
+	local browser_suffix
+	if [[ "${SLOT}" != "stable" ]]; then
+		browser_suffix="-${SLOT}"
+	else
+		browser_suffix=""
+	fi
+	local CHROMIUM_HOME="/usr/$(get_libdir)/chromium-browser${browser_suffix}"
+	exeinto "${CHROMIUM_HOME}"
+	doexe out/Release/chrome
+
+	newexe out/Release/chrome_sandbox chrome-sandbox
+	fperms 4755 "${CHROMIUM_HOME}/chrome-sandbox"
+
+	doexe out/Release/chromedriver
+	doexe out/Release/chrome_crashpad_handler
+
+	ozone_auto_session () {
+		use X && use wayland && ! use headless && echo true || echo false
+	}
+
+	cat <<- EOF > "${D}${CHROMIUM_HOME}/chromium-launcher.sh" || die
+		#!/bin/bash
+		# Wrapper to launch slotted Chromium via the chromium-common launcher script.
+		export CHROME_DESKTOP="chromium-browser${browser_suffix}.desktop"
+		export CHROME_EXEC_NAME="chromium-browser${browser_suffix}"
+		export CHROME_VERSION_EXTRA="${SLOT}"
+		export CHROME_WRAPPER="\$(readlink -f "\$0")"
+		export OZONE_AUTO_SESSION=$(ozone_auto_session)
+
+		exec /usr/libexec/chromium/chromium-launcher.sh "\$@"
+	EOF
+
+	chmod 755 "${D}${CHROMIUM_HOME}/chromium-launcher.sh" || die
+
+	# It is important that we name the target "chromium-browser",
+	# xdg-utils expect it; bug #355517.
+	dosym "${CHROMIUM_HOME}/chromium-launcher.sh" /usr/bin/chromium-browser${browser_suffix}
+	# keep the old symlink around for consistency
+	dosym "${CHROMIUM_HOME}/chromium-launcher.sh" /usr/bin/chromium${browser_suffix}
+
+	dosym "${CHROMIUM_HOME}/chromedriver" /usr/bin/chromedriver${browser_suffix}
+
+	pushd out/Release/locales > /dev/null || die
+	chromium_remove_language_paks
+	popd > /dev/null || die
+
+	insinto "${CHROMIUM_HOME}"
+	doins out/Release/*.bin
+	doins out/Release/*.pak
+
+	if use bindist; then
+		# We built libffmpeg as a component library, but we can't distribute it
+		# with proprietary codec support. Remove it and make a symlink to the requested
+		# system library.
+		rm -f out/Release/libffmpeg.so \
+			|| die "Failed to remove bundled libffmpeg.so (with proprietary codecs)"
+		# symlink the libffmpeg.so from either ffmpeg-chromium or ffmpeg[chromium].
+		einfo "Creating symlink to libffmpeg.so from $(usex ffmpeg-chromium ffmpeg-chromium ffmpeg[chromium])..."
+		dosym ../chromium/libffmpeg.so$(usex ffmpeg-chromium .${PV%%\.*} "") \
+			/usr/$(get_libdir)/chromium-browser/libffmpeg.so
+	fi
+
+	local test_libs=(
+		"libimmediate_crash_test_helper.so"
+		"libmalloc_wrapper.so"
+		"libtest_shared_library.so"
+		"libtest_trace_processor.so"
+	)
+	if use test; then
+		local test_lib
+		for test_lib in "${test_libs[@]}"; do
+			rm -f "out/Release/${test_lib}" || die "Failed to remove ${test_lib}"
+		done
+	fi
+
+	(
+		shopt -s nullglob
+		local files=(out/Release/*.so out/Release/*.so.[0-9])
+		[[ ${#files[@]} -gt 0 ]] && doins "${files[@]}"
+	)
+
+	if ! use system-icu && ! use headless; then
+		doins out/Release/icudtl.dat
+	fi
+
+	doins -r out/Release/locales
+	doins -r out/Release/MEIPreload
+
+	# Install vk_swiftshader_icd.json; bug #827861
+	doins out/Release/vk_swiftshader_icd.json
+
+	if [[ -d out/Release/swiftshader ]]; then
+		insinto "${CHROMIUM_HOME}/swiftshader"
+		doins out/Release/swiftshader/*.so
+	fi
+
+	# Install icons
+	local branding size
+	for size in 16 24 32 48 64 128 256 ; do
+		case ${size} in
+			16|32) branding="chrome/app/theme/default_100_percent/chromium" ;;
+				*) branding="chrome/app/theme/chromium" ;;
+		esac
+		newicon -s ${size} "${branding}/product_logo_${size}.png" \
+			chromium-browser${browser_suffix}.png
+	done
+
+	# Install desktop entry
+	domenu out/Release/chromium-browser${browser_suffix}.desktop
+
+	# Install GNOME default application entry (bug #303100).
+	insinto /usr/share/gnome-control-center/default-apps
+	doins out/Release/chromium-browser${browser_suffix}.xml
+
+	# Install AppStream metadata
+	insinto /usr/share/appdata
+	doins out/Release/chromium-browser${browser_suffix}.appdata.xml
+
+	# Install manpage; bug #684550
+	doman out/Release/chromium-browser${browser_suffix}.1
+	dosym chromium-browser${browser_suffix}.1 /usr/share/man/man1/chromium${browser_suffix}.1
+
+	readme.gentoo_create_doc
+}
+
+pkg_postrm() {
+	xdg_icon_cache_update
+	xdg_desktop_database_update
+}
+
+pkg_postinst() {
+	xdg_icon_cache_update
+	xdg_desktop_database_update
+	readme.gentoo_print_elog
+
+	if use !headless && [[ -z "${REPLACING_VERSIONS}" ]]; then
+		if use vaapi; then
+			elog "Hardware-accelerated video decoding configuration:"
+			elog
+			elog "Chromium supports multiple backends for hardware acceleration. To enable one,"
+			elog "   Add to CHROMIUM_FLAGS in /etc/chromium/default:"
+			elog
+			elog "1. VA-API with OpenGL (recommended for most users):"
+			elog "   --enable-features=AcceleratedVideoDecodeLinuxGL"
+			elog "   VaapiVideoDecoder may need to be added as well, but try without first."
+			elog
+			if use wayland; then
+				elog "2. Enhanced Wayland/EGL performance:"
+				elog "   --enable-features=AcceleratedVideoDecodeLinuxGL,AcceleratedVideoDecodeLinuxZeroCopyGL"
+				elog
+			fi
+			if use X; then
+				elog "$(usex wayland "3" "2"). VA-API with Vulkan:"
+				elog "   --enable-features=VaapiVideoDecoder,VaapiIgnoreDriverChecks,Vulkan,DefaultANGLEVulkan,VulkanFromANGLE"
+				elog
+				if use wayland; then
+					elog "   NOTE: Vulkan acceleration requires X11 and will not work under Wayland sessions."
+					elog "   Use OpenGL-based acceleration instead when running under Wayland."
+					elog
+				fi
+			fi
+			elog "Additional options:"
+			elog "  To enable hardware-accelerated encoding (if supported)"
+			elog "  add 'AcceleratedVideoEncoder' to your feature list"
+			elog "  VaapiIgnoreDriverChecks bypasses driver compatibility checks"
+			elog "  (may be needed for newer/unsupported hardware)"
+			elog
+		else
+			elog "This Chromium build was compiled without VA-API support, which provides"
+			elog "hardware-accelerated video decoding."
+		fi
+		if use screencast; then
+			elog "Screencast is disabled by default at runtime. Either enable it"
+			elog "by navigating to chrome://flags/#enable-webrtc-pipewire-capturer"
+			elog "inside Chromium or add --enable-features=WebRTCPipeWireCapturer"
+			elog "to CHROMIUM_FLAGS in /etc/chromium/default."
+		fi
+		if use gtk4; then
+			elog "Chromium prefers GTK3 over GTK4 at runtime. To override this"
+			elog "behavior you need to pass --gtk-version=4, e.g. by adding it"
+			elog "to CHROMIUM_FLAGS in /etc/chromium/default."
+		fi
+	fi
+
+	if systemd_is_booted && ! [[ -f "/etc/machine-id" ]]; then
+		ewarn "The lack of an '/etc/machine-id' file on this system booted with systemd"
+		ewarn "indicates that the Gentoo handbook was not followed to completion."
+		ewarn ""
+		ewarn "Chromium is known to behave unpredictably with this system configuration;"
+		ewarn "please complete the configuration of this system before logging any bugs."
+	fi
+
+	# Stable slot doesn't change profile directory, and it's vanishingly unlikely that users will downgrade from dev.
+	if [[ -n "${REPLACING_VERSIONS}" ]]; then
+		local replacing_non_slotted=false
+		# there could be more than one PVR
+		for version in ${REPLACING_VERSIONS}; do
+			if ver_test "${version}" -le "145.0.7632.116"; then
+				replacing_non_slotted=true
+				break
+			fi
+		done
+		if ${replacing_non_slotted}; then
+			ewarn "This version of Chromium has replaced a non-slotted ebuild."
+			if [[ ${SLOT} != "stable" ]]; then
+				ewarn "This channel has its own profile directory, so your existing profile will not be used."
+				ewarn "To use your existing profile, either copy or move it to the new location."
+				ewarn "See https://wiki.gentoo.org/wiki/Chromium#Profile_Directories for more information."
+				ewarn ""
+			fi
+			ewarn "Any existing Progressive Web Apps (PWAs) will need to be reinstalled,"
+			ewarn "or have the path in the desktop files updated to point to the new wrapper script."
+		fi
+	fi
+}
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.