# Copyright 2009-2026 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 EAPI=8 # Use following environment variables to customise the build # EXTRA_GN — pass extra options to gn # NINJAOPTS="-k0 -j8" useful to populate ccache even if ebuild is still failing # UGC_SKIP_PATCHES — space-separated list of patches to skip # UGC_KEEP_BINARIES — space-separated list of binaries to keep # UGC_SKIP_SUBSTITUTION — space-separated list of files to skip domain substitution # 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.2354 # 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="a28b222b79851716f8358d2800157d9ffe117b3545031ae51f69b7e1e1b9a969" BUNDLED_CLANG_VER="llvmorg-23-init-5669-g8a0be0bc-4" BUNDLED_RUST_VER="6f54d591c3116ee7f8ce9321ddeca286810cc142-7" RUST_SHORT_HASH=${BUNDLED_RUST_VER:0:10}-${BUNDLED_RUST_VER##*-} NODE_VER="24.12.0" ESBUILD_VER="0.25.1" ROLLUP_VER="4.57.1" # currently manual. VIRTUALX_REQUIRED="pgo" CHROMIUM_LANGS="af am ar as az be bg bn bs ca cs cy da de el en-GB es es-419 et eu fa fi fil fr fr-CA gl gu he hi hr hu hy id is it ja ka kk km kn ko ky lo lt lv mk ml mn mr ms my nb ne nl or pa pl pt-BR pt-PT ro ru si sk sl sq sr sr-Latn sv sw ta te th tr uk ur uz vi zh-CN zh-HK zh-TW zu" LLVM_COMPAT=( 21 22 23 ) PYTHON_COMPAT=( python3_{11..13} ) 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 xdg-utils DESCRIPTION="Modifications to Chromium for removing Google integration and enhancing privacy" HOMEPAGE="https://github.com/ungoogled-software/ungoogled-chromium" PPC64_HASH="a85b64f07b489b8c6fdb13ecf79c16c56c560fc6" PATCH_V="${PV%%\.*}-3" COPIUM_COMMIT="fe1caafa06f27542c18a881348f78e984e2d9fe2" 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 ) " # https://gitlab.com/Matt.Jolly/chromium-patches/-/archive/${PATCH_V}/chromium-patches-${PATCH_V}.tar.bz2 # Gentoo tarball: # https://chromium-tarballs.distfiles.gentoo.org/chromium-${PV/_*}.tar.xz -> chromium-${PV/_*}-gentoo.tar.xz # Official tarball: # https://commondatastorage.googleapis.com/chromium-browser-official/chromium-${PV/_*}${LITE_TARBALL:+-lite}.tar.xz # 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+=" cromite? ( GPL-3 )" SLOT="beta" KEYWORDS="~amd64 ~arm64 ~ppc64 ~x86" IUSE_SYSTEM_LIBS="abseil-cpp av1 brotli crc32c double-conversion ffmpeg +harfbuzz icu jsoncpp +libusb libvpx +openh264 openjpeg re2 snappy woff2 +zstd" IUSE="+X bindist bluetooth bundled-toolchain cfi convert-dict cups custom-cflags debug ffmpeg-chromium enable-driver gtk4 hangouts headless kerberos +libcxx nvidia +official optimize-thinlto optimize-webui override-data-dir pax-kernel pgo" IUSE+=" +proprietary-codecs pulseaudio qt6 screencast selinux test thinlto cromite vaapi wayland widevine cpu_flags_ppc_vsx3" RESTRICT=" !bindist? ( bindist ) !test? ( test ) arm64? ( test ) !system-ffmpeg? ( proprietary-codecs? ( bindist ) ) !system-openh264? ( bindist ) cromite? ( bindist ) " REQUIRED_USE=" !headless? ( || ( X wayland ) ) screencast? ( wayland ) ffmpeg-chromium? ( bindist proprietary-codecs ) optimize-thinlto? ( thinlto ) cfi? ( thinlto ) x86? ( !thinlto !widevine ) debug? ( !official ) vaapi? ( !system-av1 !system-libvpx ) " UGC_COMMIT_ID="eb8121bdae2469f4e0a3634437e99ff687c0e55f" # UGC_PR_COMMITS=( # c917e096342e5b90eeea91ab1f8516447c8756cf # 5794e9d12bf82620d5f24505798fecb45ca5a22d # ) CROMITE_COMMIT_ID="15d48b061426a1f4a8ae8596622f0599ca626056" #declare -A CHROMIUM_COMMITS=( # ["fcfb1a42813f1e9d8babedc7bb2e0f06101a3151"]="." #148+ # ["-acb47d9a6b56c4889a2ed4216e9968cfc740086c"]="." # # ["-37c28a19804e47a68eabf3cf882a310689fc325b"]="." #disable style check for cromite # # ["cd5a0df905a28faa89ff2a4ab44f893f84dc4487"]="net/third_party/quiche/src" #) UGC_PV="${PV/_p/-}" UGC_PF="${PN}-${UGC_PV}" UGC_URL="https://github.com/ungoogled-software/${PN}/archive/" if [ -z "$UGC_COMMIT_ID" ]; then UGC_URL="${UGC_URL}${UGC_PV}.tar.gz -> ${UGC_PF}.tar.gz" UGC_WD="${WORKDIR}/${UGC_PF}" else UGC_URL="${UGC_URL}${UGC_COMMIT_ID}.tar.gz -> ${PN}-${UGC_COMMIT_ID}.tar.gz" UGC_WD="${WORKDIR}/ungoogled-chromium-${UGC_COMMIT_ID}" fi SRC_URI+="${UGC_URL} " if [ ! -z "${UGC_PR_COMMITS[*]}" ]; then for i in "${UGC_PR_COMMITS[@]}"; do SRC_URI+="https://github.com/ungoogled-software/${PN}/commit/$i.patch?full_index=true -> ${PN}-$i.patch " done fi if [ ! -z "${CHROMIUM_COMMITS[*]}" ]; then # for i in "${CHROMIUM_COMMITS[@]}"; do for i in "${!CHROMIUM_COMMITS[@]}"; do if [[ ${CHROMIUM_COMMITS[$i]} =~ webrtc ]]; then #TODO: is it safe to use this mirror? SRC_URI+="https://github.com/webrtc-mirror/webrtc/commit/${i/-}.patch?full_index=true -> webrtc-${i/-}.patch " elif [[ ${CHROMIUM_COMMITS[$i]} =~ angle ]]; then SRC_URI+="https://github.com/google/angle/commit/${i/-}.patch?full_index=true -> angle-${i/-}.patch " elif [[ ${CHROMIUM_COMMITS[$i]} =~ quiche ]]; then SRC_URI+="https://github.com/google/quiche/commit/${i/-}.patch?full_index=true -> quiche-${i/-}.patch " elif [[ ${CHROMIUM_COMMITS[$i]} =~ dawn ]]; then SRC_URI+="https://github.com/google/dawn/commit/${i/-}.patch?full_index=true -> dawn-${i/-}.patch " elif [[ ${CHROMIUM_COMMITS[$i]} =~ perfetto ]]; then SRC_URI+="https://github.com/google/perfetto/commit/${i/-}.patch?full_index=true -> perfetto-${i/-}.patch " elif [[ ${CHROMIUM_COMMITS[$i]} =~ ink ]]; then SRC_URI+="https://github.com/google/ink/commit/${i/-}.patch?full_index=true -> ink-${i/-}.patch " elif [[ ${CHROMIUM_COMMITS[$i]} =~ vulkan-utility-libraries ]]; then SRC_URI+="https://github.com/KhronosGroup/Vulkan-Utility-Libraries/commit/${i/-}.patch?full_index=true -> vulkan-utility-libraries-${i/-}.patch " elif [[ ${CHROMIUM_COMMITS[$i]} =~ ruy ]]; then SRC_URI+="https://github.com/google/ruy/commit/${i/-}.patch?full_index=true -> ruy-${i/-}.patch " else SRC_URI+="https://github.com/chromium/chromium/commit/${i/-}.patch?full_index=true -> chromium-${i/-}.patch " fi done fi SRC_URI+="cromite? ( https://github.com/uazo/cromite/archive/${CROMITE_COMMIT_ID}.tar.gz -> cromite-${CROMITE_COMMIT_ID}.tar.gz ) " for i in ${IUSE_SYSTEM_LIBS}; do [[ $i =~ ^(\+)?(.*)$ ]] IUSE+=" ${BASH_REMATCH[1]}system-${BASH_REMATCH[2]}" done 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-78:= ) system-abseil-cpp? ( >=dev-cpp/abseil-cpp-20260107.0 ) system-brotli? ( >=app-arch/brotli-9999 ) system-crc32c? ( dev-libs/crc32c ) system-double-conversion? ( dev-libs/double-conversion ) system-woff2? ( media-libs/woff2 ) system-snappy? ( app-arch/snappy ) system-jsoncpp? ( dev-libs/jsoncpp ) system-openjpeg? ( media-libs/openjpeg:2= ) system-re2? ( >=dev-libs/re2-0.2019.08.01:= ) system-libvpx? ( >=media-libs/libvpx-1.13.0:=[postproc] ) system-libusb? ( virtual/libusb:1 ) cromite? ( dev-util/patchutils ) >=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-1.6.0:= system-av1? ( >=media-libs/dav1d-1.0.0:= >=media-libs/libaom-3.7.0:= ) sys-libs/zlib:= !headless? ( dev-libs/glib:2 >=media-libs/alsa-lib-1.0.19:= pulseaudio? ( || ( media-libs/libpulse >=media-sound/apulse-0.1.9 ) ) 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? ( dev-libs/libffi:= dev-libs/wayland:= screencast? ( media-video/pipewire:= || ( sys-apps/xdg-desktop-portal-gnome sys-apps/xdg-desktop-portal-gtk kde-plasma/xdg-desktop-portal-kde gui-libs/xdg-desktop-portal-lxqt gui-libs/xdg-desktop-portal-wlr ) ) ) ) " COMMON_DEPEND=" ${COMMON_SNAPSHOT_DEPEND} app-arch/bzip2:= dev-libs/expat:= system-ffmpeg? ( >=media-video/ffmpeg-6.1:= >=media-libs/opus-1.3.1:= ) 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} ) ) " #!www-client/ungoogled-chromium:0 RDEPEND="${COMMON_DEPEND} >=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-chromium:${PV%%\.*} ) ) !override-data-dir? ( !www-client/chromium:${SLOT} !www-client/cromite:${SLOT}[-override-data-dir] ) " DEPEND="${COMMON_DEPEND} !headless? ( gtk4? ( gui-libs/gtk:4[X?,wayland?] ) !gtk4? ( x11-libs/gtk+:3[X?,wayland?] ) ) " # pgo? ( >=llvm-core/clang-22.0.0_pre20260106 >=llvm-core/lld-22.0.0_pre20260106 ) 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} llvm-core/lld:${LLVM_SLOT} cfi? ( llvm-runtimes/clang-runtime:${LLVM_SLOT}[sanitize] ) official? ( !ppc64? ( llvm-runtimes/compiler-rt-sanitizers:${LLVM_SLOT}[cfi] ) ) ') ${RUST_DEPEND} ) >=dev-util/bindgen-0.72.1 >=dev-build/gn-${GN_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. " S="${WORKDIR}/chromium-${PV/_*}" 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 if use libcxx; then ewarn ewarn "Building with libcxx, please be aware that system-*" ewarn "and some other c++ dependencies need to be compiled" ewarn "with the same c++ library as ungoogled-chromium itself" ewarn "dev-libs/jsoncpp is most problematic, see #58 #49 #119 for details" ewarn "Simplest solution would be to disable corresponding system-* flags" ewarn fi if use cfi; then ewarn ewarn "Building with cfi is only possible if building with -stdlib=libc++" ewarn "Make sure all dependencies are also built this way, see #40" ewarn fi if use cromite; then ewarn ewarn "Cromite patches are very experimental and unstable" ewarn "Please consider testing them and giving feedback upstream:" ewarn "https://github.com/uazo/cromite/issues" ewarn "Not all patches are applied, let me know if others should be considered too" ewarn 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 # 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 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 # 936858 if tc-ld-is-mold; then eerror "Your toolchain is using the mold linker." eerror "This is not supported by Chromium." die "Please switch to a different linker." fi 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 # 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. 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 chromium_suid_sandbox_check_kernel_config } src_unpack() { # # Here be dragons! # local XCLD="--exclude=chromium-${PV/_*}/third_party/instrumented_libs \ # --exclude=chromium-${PV/_*}/third_party/llvm \ # --exclude=chromium-${PV/_*}/third_party/llvm-build \ # --exclude=chromium-${PV/_*}/third_party/node/linux \ # --exclude=chromium-${PV/_*}/third_party/rust-src \ # --exclude=chromium-${PV/_*}/third_party/rust-toolchain \ # --exclude=chromium-${PV/_*}/build/linux/debian_bullseye_i386-sysroot \ # --exclude=chromium-${PV/_*}/build/linux/debian_bullseye_amd64-sysroot \ # --exclude=chromium-${PV/_*}/third_party/angle/third_party/VK-GL-CTS \ # " # if ! use libcxx ; then # XCLD+=" --exclude=chromium-${PV/_*}/third_party/libc++" # fi # if ! use pgo ; then # XCLD+=" --exclude=chromium-${PV/_*}/chrome/build/pgo_profiles" # fi # einfo "Unpacking chromium-${PV/_*}.tar.xz to ${WORKDIR}" # # Gentoo tarball: # # tar ${XCLD} -xf "${DISTDIR}/chromium-${PV/_*}-gentoo.tar.xz" -C "${WORKDIR}" || die # tar ${XCLD} -xf "${DISTDIR}/chromium-${PV/_*}${LITE_TARBALL:+-lite}.tar.xz" -C "${WORKDIR}" || die # unpack ${UGC_URL#*->} # # unpack chromium-patches-${PATCH_V}.tar.bz2 # # Warned you! unpack chromium-${PV/_*}-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 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}/chromium-${PV/_*}/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 if use cromite; then unpack cromite-${CROMITE_COMMIT_ID}.tar.gz fi unpack ${UGC_URL#*->} } 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=() rm "${WORKDIR}/chromium-patches-${PATCH_V}/common/cr131-unbundle-icu-target.patch" # if use pgo; then # rm "${WORKDIR}/chromium-patches-${PATCH_V}/rust/cr146-fix-botched-bytemuck-roll.patch" # fi #cp -f ${WORKDIR}/chromium-patches-${PATCH_V}/*-compiler.patch "${T}/compiler.patch" ##cp -f ${FILESDIR}/chromium-147-compiler.patch "${T}/compiler.patch" #if ! use custom-cflags; then #See #25 #92 # sed -i '/default_stack_frames/Q' "${T}/compiler.patch" || die #fi PATCHES+=( "${WORKDIR}/chromium-patches-${PATCH_V}/common/" ) PATCHES+=( "${FILESDIR}/restore-x86-r3.patch" ) # https://issues.chromium.org/issues/442698344 # Unreleased fontconfig changed magic numbers and google have rolled to this version if has_version "<=media-libs/fontconfig-2.17.1"; then PATCHES+=( "${FILESDIR}/chromium-142-work-with-old-fontconfig.patch" ) fi 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" ) # 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 PATCHES+=( "${category}"*.patch ) # 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}"*.patch ) 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" if [ ! -z "${CHROMIUM_COMMITS[*]}" ]; then # for i in "${CHROMIUM_COMMITS[@]}"; do for i in "${!CHROMIUM_COMMITS[@]}"; do if [[ ${CHROMIUM_COMMITS[$i]} =~ webrtc ]]; then patch_prefix="webrtc" elif [[ ${CHROMIUM_COMMITS[$i]} =~ angle ]]; then patch_prefix="angle" elif [[ ${CHROMIUM_COMMITS[$i]} =~ quiche ]]; then patch_prefix="quiche" elif [[ ${CHROMIUM_COMMITS[$i]} =~ dawn ]]; then patch_prefix="dawn" elif [[ ${CHROMIUM_COMMITS[$i]} =~ perfetto ]]; then patch_prefix="perfetto" elif [[ ${CHROMIUM_COMMITS[$i]} =~ ink ]]; then patch_prefix="ink" elif [[ ${CHROMIUM_COMMITS[$i]} =~ vulkan-utility-libraries ]]; then patch_prefix="vulkan-utility-libraries" elif [[ ${CHROMIUM_COMMITS[$i]} =~ ruy ]]; then patch_prefix="ruy" else patch_prefix="chromium" fi pushd "${CHROMIUM_COMMITS[$i]}" > /dev/null || die if [[ $i = -* ]]; then einfo "Reverting ${patch_prefix}-${i/-}.patch" git_wrapper apply -R --exclude="*unittest.cc" --exclude="DEPS" \ -p1 < "${DISTDIR}/${patch_prefix}-${i/-}.patch" else einfo "Applying ${patch_prefix}-${i/-}.patch" git_wrapper apply --exclude="*unittest.cc" --exclude="DEPS" \ -p1 < "${DISTDIR}/${patch_prefix}-${i/-}.patch" fi popd > /dev/null || die done fi if ! use bluetooth ; then PATCHES+=( "${FILESDIR}/disable-bluez-r7.patch" ) fi if use convert-dict ; then PATCHES+=( "${FILESDIR}/chromium-ucf-dict-utility-r3.patch" ) fi if ! use libcxx ; then PATCHES+=( "${FILESDIR}/fix-wayland-oncecallback-copy.patch" ) fi if use system-ffmpeg; then PATCHES+=( "${FILESDIR}/chromium-141-opus-mp3.patch" "${FILESDIR}/chromium-135-hevc.patch" ) sed -i "\!AVFMT_FLAG_NOH264PARSE!d" media/filters/ffmpeg_glue.cc || die ewarn "You need to expose \"av_stream_get_first_dts\" in ffmpeg via user patch" fi if use system-av1; then PATCHES+=( "${FILESDIR}/chromium-system-av1.patch" ) fi if use system-libvpx; then PATCHES+=( "${FILESDIR}/chromium-system-libvpx.patch" ) fi if use system-openjpeg ; then PATCHES+=( "${FILESDIR}/chromium-system-openjpeg-r4.patch" ) fi # if use x86 ; then # #* Fixes a segfault in transport_security_state_generator # PATCHES+=( # "${FILESDIR}/fix-segfault-x86.patch" # ) # fi # Testing all patches when NODIE is defined if [ ! -z "${NODIE}" ]; then for i in "${PATCHES[@]}"; do eapply_wrapper "$i" done nonfatal eapply_user else default fi if use cromite ; then BR_PA_PATH="${WORKDIR}/cromite-${CROMITE_COMMIT_ID}/build/patches" sed -i '/b\/components\/components_strings\.grd/,+10d' "${BR_PA_PATH}/Add-cromite-flags-support.patch" || die sed -i '/b\/chrome\/android\/java\/res\/xml\/privacy_preferences\.xml/,+13d' "${BR_PA_PATH}/Add-cromite-flags-support.patch" || die sed -i '/b\/android_webview\/support_library\/java\/src\/org\/chromium\/support_lib_glue/,+11d' "${BR_PA_PATH}/Client-hints-overrides.patch" || die sed -i '/webapps_strings.grdp" \/>/{s++webapps_strings.grdp" />+;h};${x;/./{x;q0};x;q1}' \ components/components_strings.grd || die sed -i 's/absl::/std::/' "${BR_PA_PATH}/Add-a-proxy-configuration-page.patch" || die BROMITE_PATCHES=( "${BR_PA_PATH}/bromite-build-utils.patch" "${BR_PA_PATH}/Battery-API-return-nothing.patch" "${BR_PA_PATH}/Multiple-fingerprinting-mitigations.patch" "${BR_PA_PATH}/Add-flag-to-configure-maximum-connections-per-host.patch" "${BR_PA_PATH}/Add-a-proxy-configuration-page.patch" "${BR_PA_PATH}/Enable-StrictOriginIsolation-and-SitePerProcess.patch" "${BR_PA_PATH}/Disable-requests-for-single-word-Omnibar-searches.patch" "${BR_PA_PATH}/Reduce-HTTP-headers-in-DoH-requests-to-bare-minimum.patch" "${BR_PA_PATH}/Client-hints-overrides.patch" "${BR_PA_PATH}/Disable-idle-detection.patch" "${BR_PA_PATH}/Disable-TLS-resumption.patch" "${BR_PA_PATH}/Remove-navigator.connection-info.patch" "${BR_PA_PATH}/AudioBuffer-AnalyserNode-fp-mitigations.patch" "${BR_PA_PATH}/Fonts-fingerprinting-mitigation.patch" "${BR_PA_PATH}/Content-settings-infrastructure.patch" "${BR_PA_PATH}/Add-autoplay-site-setting.patch" "${BR_PA_PATH}/Site-setting-for-images.patch" "${BR_PA_PATH}/JIT-site-settings.patch" "${BR_PA_PATH}/Add-webGL-site-setting.patch" "${BR_PA_PATH}/Add-webRTC-site-settings.patch" "${BR_PA_PATH}/Show-site-settings-for-cookies-javascript-and-ads.patch" "${BR_PA_PATH}/Viewport-Protection-flag.patch" "${BR_PA_PATH}/Revert-remove-allowscript-content-setting-secondary-url.patch" "${BR_PA_PATH}/Timezone-customization.patch" "${BR_PA_PATH}/Disable-speechSynthesis-getVoices-API.patch" "${BR_PA_PATH}/Remove-support-for-device-memory-and-cpu-recovery.patch" "${BR_PA_PATH}/Disable-Feeback-Collector.patch" "${BR_PA_PATH}/Disable-remote-altsvc-for-h3-connections.patch" "${BR_PA_PATH}/Add-cromite-flags-support.patch" "${BR_PA_PATH}/Enables-deactivation-of-the-js-debugger-statement.patch" ) for i in "${BROMITE_PATCHES[@]}"; do if [[ "$i" =~ "Add-autoplay-site-setting.patch" ]] || [[ "$i" =~ "JIT-site-settings.patch" ]] || [[ "$i" =~ "Site-setting-for-images.patch" ]]; then einfo "Git binary patch: ${i##*/}" git_wrapper apply -p1 < "$i" else filter_wrapper "$i" --exclude="chrome/android/*" fi done #! conflicting patches sed -i '/browser_features.cc/,+17d' \ "${UGC_WD}/patches/extra/ungoogled-chromium/add-flag-to-clear-data-on-exit.patch" || die sed -i 's$} // namespace features$BASE_FEATURE(kClearDataOnExit, "ClearDataOnExit", base::FEATURE_DISABLED_BY_DEFAULT);}$' \ chrome/browser/browser_features.cc || die sed -i 's$} // namespace features$BASE_DECLARE_FEATURE(kClearDataOnExit);}$' \ chrome/browser/browser_features.h || die sed -i 's$kChromeUIAboutHost,$kChromeUIAboutHost,"ungoogled-first-run",$' \ chrome/common/webui_url_constants.cc || die sed -i '/chrome\/common\/webui_url_constants.cc/Q' \ "${UGC_WD}/patches/extra/ungoogled-chromium/first-run-page.patch" || die #! normalise paths in py sed -i 's$os.path.dirname(include_file)$os.path.abspath(os.path.dirname(include_file))$' \ build/bromite/gyp/cpp_bromite_include.py || die fi # if [[ ${LLVM_SLOT} == "19" ]]; then # # Upstream now hard depend on a feature that was added in LLVM 20.1, but we don't want to stabilise that yet. # # Do the temp file shuffle in case someone is using something other than `gawk` # { # awk '/config\("clang_warning_suppression"\) \{/ { print $0 " }"; sub(/clang/, "xclang"); print; next } # { print }' build/config/compiler/BUILD.gn > "${T}/build.gn" && \ # mv "${T}/build.gn" build/config/compiler/BUILD.gn # } || die "Unable to disable warning suppression" # fi ## Not included in -lite tarballs, but we should check for it anyway. #if [[ -f third_party/node/linux/node-linux-x64/bin/node ]]; then # rm third_party/node/linux/node-linux-x64/bin/node || die #else # mkdir -p third_party/node/linux/node-linux-x64/bin || die #fi #ln -s "${EPREFIX}"/usr/bin/node third_party/node/linux/node-linux-x64/bin/node || die cp "${FILESDIR}/libusb.gn" build/linux/unbundle || die sed -i '/^REPLACEMENTS.*$/{s++REPLACEMENTS = {"libusb":"third_party/libusb/BUILD.gn",+;h};${x;/./{x;q0};x;q1}' \ build/linux/unbundle/replace_gn_files.py || die sed -i '/^.*deps.*third_party\/jsoncpp.*$/{s++public_deps \+= [ "//third_party/jsoncpp" ]+;h};${x;/./{x;q0};x;q1}' \ third_party/webrtc/rtc_base/BUILD.gn || die if use override-data-dir; then sed -i '/"chromium";/{s++"ungoogled-chromium";+;h};${x;/./{x;q0};x;q1}' \ chrome/common/chrome_paths_linux.cc || die fi if use system-abseil-cpp; then eapply_wrapper "${FILESDIR}/chromium-147-system-abseil.patch" #! SFINAE mangling incompatibility between clang and gcc: #! https://github.com/llvm/llvm-project/issues/85656 #! gcc: _ZN4absl12lts_202601074CordC1INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEELi0EEEOT_ #! clang: _ZN4absl12lts_202601074CordC1INSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEETnNSt9enable_ifIXsr3std7is_sameIT_S8_EE5valueEiE4typeELi0EEEOSA_ #! So, either this: eapply_wrapper "${FILESDIR}/chromium-141-system-abseil-cord.patch" #! or build with -fclang-abi-compat=17 # cp -f /usr/include/absl/base/options.h third_party/abseil-cpp/absl/base/options.h # sed -i '/^#define ABSL_OPTION_USE_STD_ORDERING.*$/{s++#define ABSL_OPTION_USE_STD_ORDERING 1+;h};${x;/./{x;q0};x;q1}' \ # third_party/abseil-cpp/absl/base/options.h || die fi #* Applying UGC PRs here if [ ! -z "${UGC_PR_COMMITS[*]}" ]; then pushd "${UGC_WD}" >/dev/null for i in "${UGC_PR_COMMITS[@]}"; do eapply_wrapper "${DISTDIR}/${PN}-$i.patch" done popd >/dev/null fi # From here we adapt ungoogled-chromium's patches to our needs local ugc_pruning_list="${UGC_WD}/pruning.list" local ugc_patch_series="${UGC_WD}/patches/series" local ugc_substitution_list="${UGC_WD}/domain_substitution.list" local ugc_unneeded=( # GN bootstrap extra/debian/gn/parallel # following Gentoo's Chromium core/ungoogled-chromium/build-with-wasm-rollup ) if use cromite ; then einfo "Using fingerprinting patches from Cromite instead" ugc_unneeded+=( extra/bromite/fingerprinting-flags-client-rects-and-measuretext extra/bromite/flag-max-connections-per-host extra/bromite/flag-fingerprinting-canvas-image-data-noise extra/ungoogled-chromium/add-components-ungoogled extra/ungoogled-chromium/remove-pac-size-limit ) fi # #* Temporary fix # sed -i "\!ios/!d" "${ugc_pruning_list}" || die # sed -i "\!third_party/icu/!d" "${ugc_pruning_list}" || die # sed -i "\!third_party/libjpeg_turbo/!d" "${ugc_pruning_list}" || die # sed -i "\!third_party/snappy/!d" "${ugc_pruning_list}" || die # sed -i "\!third_party/closure_compiler/!d" "${ugc_pruning_list}" || die # #* Didn't unpack them at the first place # sed -i "\!build/linux/debian_bullseye_i386-sysroot!d" "${ugc_pruning_list}" || die # sed -i "\!build/linux/debian_bullseye_amd64-sysroot!d" "${ugc_pruning_list}" || die # sed -i "\!third_party/llvm-build!d" "${ugc_pruning_list}" || die # sed -i "\!third_party/node/linux!d" "${ugc_pruning_list}" || die # sed -i "\!third_party/rust-src!d" "${ugc_pruning_list}" || die # sed -i "\!third_party/rust-toolchain!d" "${ugc_pruning_list}" || die # if ! use libcxx ; then # sed -i "\!third_party/libc!d" "${ugc_pruning_list}" || die # fi sed -i "s|debug('files|error('files|" \ "${UGC_WD}/utils/prune_binaries.py" || die sed -i "\!third_party/node/linux!d" \ "${UGC_WD}/utils/prune_binaries.py" || die local ugc_p ugc_dir for p in "${ugc_unneeded[@]}"; do einfo "Removing ${p}.patch" sed -i "\!${p}.patch!d" "${ugc_patch_series}" || die done if [ ! -z "${UGC_SKIP_PATCHES}" ]; then for p in ${UGC_SKIP_PATCHES}; do ewarn "Removing ${p}" sed -i "\!${p}!d" "${ugc_patch_series}" || die done fi if [ ! -z "${UGC_KEEP_BINARIES}" ]; then for p in ${UGC_KEEP_BINARIES}; do ewarn "Keeping binary ${p}" sed -i "\!${p}!d" "${ugc_pruning_list}" || die done fi if [ ! -z "${UGC_SKIP_SUBSTITUTION}" ]; then for p in ${UGC_SKIP_SUBSTITUTION}; do ewarn "No substitutions in ${p}" sed -i "\!${p}!d" "${ugc_substitution_list}" || die done fi ebegin "Pruning binaries" "${UGC_WD}/utils/prune_binaries.py" -q . "${UGC_WD}/pruning.list" eend $? || die ebegin "Applying ungoogled-chromium patches" "${UGC_WD}/utils/patches.py" -q apply . "${UGC_WD}/patches" eend $? || die ebegin "Applying domain substitution" "${UGC_WD}/utils/domain_substitution.py" -q apply -r "${UGC_WD}/domain_regex.list" -f "${UGC_WD}/domain_substitution.list" . eend $? || die # 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; upstream is woefully out of date (2015!) sed 's|//third_party/usb_ids/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 ) use system-double-conversion || keeplibs+=( base/third_party/double_conversion ) keeplibs+=( 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 ) use cromite && keeplibs+=( cromite_flags/third_party ) keeplibs+=( net/third_party/mozilla_security_manager net/third_party/quic net/third_party/uri_template ) use system-abseil-cpp || keeplibs+=( third_party/abseil-cpp ) keeplibs+=( third_party/angle third_party/angle/src/common/third_party/xxhash third_party/angle/src/third_party/ceval ) use nvidia || keeplibs+=( third_party/angle/src/third_party/libXNVCtrl ) keeplibs+=( 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 ) use system-brotli || keeplibs+=( third_party/brotli ) keeplibs+=( 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 ) use libcxx && keeplibs+=( third_party/compiler-rt ) keeplibs+=( 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 ) use system-crc32c || keeplibs+=( third_party/crc32c ) keeplibs+=( third_party/cros_system_api third_party/d3 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/esm/third_party/mitt third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/esm/third_party/parsel-js third_party/devtools-frontend/src/front_end/third_party/puppeteer/package/lib/esm/third_party/rxjs 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/src/fcp/base third_party/federated_compute/src/fcp/confidentialcompute third_party/federated_compute/src/fcp/protos/confidentialcompute third_party/federated_compute/src/fcp/protos/federatedcompute 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/hyphenation-patterns third_party/ink_stroke_modeler/src/ink_stroke_modeler third_party/ink_stroke_modeler/src/ink_stroke_modeler/internal 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 ) use system-jsoncpp || keeplibs+=( third_party/jsoncpp ) keeplibs+=( third_party/khronos third_party/lens_server_proto third_party/leveldatabase third_party/libaddressinput ) use libcxx && keeplibs+=( third_party/libc++ ) keeplibs+=( 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 ) use system-libusb || keeplibs+=( third_party/libusb ) keeplibs+=( third_party/libva_protected_content ) use system-libvpx || keeplibs+=( third_party/libvpx third_party/libvpx/source/libvpx/third_party/x86inc ) keeplibs+=( third_party/libwebm third_party/libx11 third_party/libxcb-keysyms third_party/libxml/chromium third_party/libyuv third_party/libzip third_party/lit ) use libcxx && keeplibs+=( third_party/llvm-libc third_party/llvm-libc/src/shared/ ) keeplibs+=( 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/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 ) use system-openjpeg || keeplibs+=( third_party/pdfium/third_party/libopenjpeg ) keeplibs+=( third_party/pdfium/third_party/libtiff third_party/perfetto 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/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 ) use system-snappy || keeplibs+=( third_party/snappy ) keeplibs+=( 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 ) use system-woff2 || keeplibs+=( third_party/woff2 ) keeplibs+=( 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 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-ffmpeg; then keeplibs+=( third_party/ffmpeg third_party/opus ) fi if ! use system-icu; then keeplibs+=( third_party/icu ) fi if ! use system-zstd; then keeplibs+=( third_party/zstd ) fi if ! use system-av1; then keeplibs+=( third_party/dav1d 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 ) fi if use libcxx; then keeplibs+=( third_party/libc++ third_party/llvm-libc ) fi if ! use system-openh264; then keeplibs+=( third_party/openh264 ) fi if ! use system-re2; then keeplibs+=( third_party/re2 ) 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 ewarn "The following \`keeplibs\` directories were not found in the source tree:" for lib in "${not_found_libs[@]}"; do ewarn " ${lib}" done fi keeplibs+=( third_party/ungoogled ) # 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 } src_configure() { # Calling this here supports resumption via FEATURES=keepwork python_setup # 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 libjpeg libwebp libxml libxslt zlib ) if use system-abseil-cpp; then gn_system_libraries+=( absl_algorithm absl_base absl_cleanup absl_container absl_crc absl_debugging absl_flags absl_functional absl_hash absl_log absl_log_internal absl_memory absl_meta absl_numeric absl_random absl_status absl_strings absl_synchronization absl_time absl_types absl_utility ) fi if use system-brotli; then gn_system_libraries+=( brotli ) fi if use system-crc32c; then gn_system_libraries+=( crc32c ) fi if use system-double-conversion; then gn_system_libraries+=( double-conversion ) fi if use system-woff2; then gn_system_libraries+=( woff2 ) fi if use nvidia; then gn_system_libraries+=( libXNVCtrl ) fi if use system-ffmpeg; then gn_system_libraries+=( ffmpeg opus ) fi if use system-jsoncpp; then gn_system_libraries+=( jsoncpp ) fi if use system-icu; then gn_system_libraries+=( icu ) fi if use system-zstd; then gn_system_libraries+=( zstd ) fi if use system-av1; then gn_system_libraries+=( dav1d libaom ) fi if use system-libusb; then gn_system_libraries+=( libusb ) fi if use system-libvpx; then gn_system_libraries+=( libvpx ) fi use system-openh264 && gn_system_libraries+=( openh264 ) use system-re2 && gn_system_libraries+=( re2 ) use system-snappy && gn_system_libraries+=( snappy ) 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. use arm64 && 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. "use_lld=true" 'custom_toolchain="//build/toolchain/linux/unbundle:default"' # From M127 we need to provide a location for libclang. # We patch this in for gentoo - see chromium-*-bindgen-custom-toolchain.patch # rust_bindgen_root = directory with `bin/bindgen` beneath it. # We don't need to set 'clang_base_path' for anything in our build # and it defaults to the google toolchain location. Instead provide a location # to where system clang lives so that bindgen can find system headers (e.g. stddef.h) "bindgen_libclang_path=\"$(get_llvm_prefix)/$(get_libdir)\"" "clang_base_path=\"${EPREFIX}/usr/lib/clang/${LLVM_SLOT}/\"" "rust_bindgen_root=\"${EPREFIX}/usr/\"" "rust_sysroot_absolute=\"$(get_rust_prefix)\"" "rustc_version=\"${RUST_SLOT}\"" ) 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_fi