# Copyright 1999-2022 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 EAPI="8" FIREFOX_PATCHSET="firefox-91esr-patches-10j.tar.xz" LLVM_MAX_SLOT=14 PYTHON_COMPAT=( python3_{12..13} ) PYTHON_REQ_USE="ncurses,sqlite,ssl" WANT_AUTOCONF="2.1" VIRTUALX_REQUIRED="pgo" MOZ_ESR= MOZ_PV=${PV} MOZ_PV_SUFFIX= if [[ ${PV} =~ (_(alpha|beta|rc).*)$ ]] ; then MOZ_PV_SUFFIX=${BASH_REMATCH[1]} # Convert the ebuild version to the upstream Mozilla version MOZ_PV="${MOZ_PV/_alpha/a}" # Handle alpha for SRC_URI MOZ_PV="${MOZ_PV/_beta/b}" # Handle beta for SRC_URI MOZ_PV="${MOZ_PV%%_rc*}" # Handle rc for SRC_URI fi if [[ -n ${MOZ_ESR} ]] ; then # ESR releases have slightly different version numbers MOZ_PV="${MOZ_PV}esr" fi MOZ_PN="${PN%-bin}" MOZ_P="${MOZ_PN}-${MOZ_PV}" MOZ_PV_DISTFILES="${MOZ_PV}${MOZ_PV_SUFFIX}" MOZ_P_DISTFILES="${MOZ_PN}-${MOZ_PV_DISTFILES}" inherit autotools check-reqs desktop flag-o-matic gnome2-utils \ llvm multiprocessing optfeature pax-utils python-any-r1 toolchain-funcs \ virtualx xdg MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/releases/${MOZ_PV}" if [[ ${PV} == *_rc* ]] ; then MOZ_SRC_BASE_URI="https://archive.mozilla.org/pub/${MOZ_PN}/candidates/${MOZ_PV}-candidates/build${PV##*_rc}" fi PATCH_URIS=( https://dev.gentoo.org/~{juippis,polynomial-c,whissi}/mozilla/patchsets/${FIREFOX_PATCHSET} ) SRC_URI="${MOZ_SRC_BASE_URI}/source/${MOZ_P}.source.tar.xz -> ${MOZ_P_DISTFILES}.source.tar.xz ${PATCH_URIS[@]}" DESCRIPTION="Thunderbird Mail Client" HOMEPAGE="https://www.thunderbird.net/" KEYWORDS="~amd64 ~arm64 ~ppc64 ~x86" SLOT="0" LICENSE="MPL-2.0 GPL-2 LGPL-2.1" IUSE="+clang cpu_flags_arm_neon dbus debug eme-free hardened hwaccel" IUSE+=" jack lto +openh264 pgo pulseaudio sndio selinux" IUSE+=" +system-av1 +system-harfbuzz +system-icu +system-jpeg +system-libevent +system-libvpx system-png +system-webp" IUSE+=" wayland wifi" IUSE+=" +kde +privacy +screencast" REQUIRED_USE="debug? ( !system-av1 ) pgo? ( lto ) screencast? ( wayland ) wifi? ( dbus )" BDEPEND="${PYTHON_DEPS} app-arch/unzip app-arch/zip >=dev-util/cbindgen-0.24.0 >=net-libs/nodejs-10.23.1 virtual/pkgconfig >=virtual/rust-1.51.0 || ( ( sys-devel/clang:14 sys-devel/llvm:14 clang? ( =sys-devel/lld-14* pgo? ( =sys-libs/compiler-rt-sanitizers-14*[profile] ) ) ) ( sys-devel/clang:13 sys-devel/llvm:13 clang? ( =sys-devel/lld-13* pgo? ( =sys-libs/compiler-rt-sanitizers-13*[profile] ) ) ) ) amd64? ( >=dev-lang/nasm-2.13 ) x86? ( >=dev-lang/nasm-2.13 )" COMMON_DEPEND=" >=dev-libs/nss-3.68 >=dev-libs/nspr-4.32 dev-libs/atk dev-libs/expat >=x11-libs/cairo-1.10 >=x11-libs/gtk+-3.4.0:3 x11-libs/gdk-pixbuf >=x11-libs/pango-1.22.0 >=media-libs/mesa-10.2:* media-libs/fontconfig >=media-libs/freetype-2.4.10 kernel_linux? ( !pulseaudio? ( media-libs/alsa-lib ) ) virtual/freedesktop-icon-theme >=x11-libs/pixman-0.19.2 >=dev-libs/glib-2.26:2 >=sys-libs/zlib-1.2.3 >=dev-libs/libffi-3.0.10:= media-video/ffmpeg x11-libs/libX11 x11-libs/libXcomposite x11-libs/libXrender dbus? ( sys-apps/dbus dev-libs/dbus-glib ) screencast? ( media-video/pipewire ) system-av1? ( >=media-libs/dav1d-0.8.1:= >=media-libs/libaom-1.0.0:= ) system-harfbuzz? ( >=media-libs/harfbuzz-2.8.1:0= >=media-gfx/graphite2-1.3.13 ) system-icu? ( >=dev-libs/icu-69.1:= ) system-jpeg? ( >=media-libs/libjpeg-turbo-1.2.1 ) system-libevent? ( >=dev-libs/libevent-2.0:0=[threads] ) system-libvpx? ( >=media-libs/libvpx-1.8.2:0=[postproc] ) system-png? ( >=media-libs/libpng-1.6.35:0=[apng] ) system-webp? ( >=media-libs/libwebp-1.1.0:0= ) wifi? ( kernel_linux? ( sys-apps/dbus dev-libs/dbus-glib net-misc/networkmanager ) ) jack? ( virtual/jack ) selinux? ( sec-policy/selinux-mozilla ) sndio? ( media-sound/sndio )" RDEPEND="${COMMON_DEPEND} jack? ( virtual/jack ) openh264? ( media-libs/openh264:*[plugin] ) pulseaudio? ( || ( media-sound/pulseaudio >=media-sound/apulse-0.1.12-r4 ) ) selinux? ( sec-policy/selinux-mozilla ) kde? ( kde-apps/kdialog kde-misc/kmozillahelper ) !&2 return 1 fi if use clang ; then if ! has_version -b "=sys-devel/lld-${LLVM_SLOT}*" ; then einfo "=sys-devel/lld-${LLVM_SLOT}* is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." >&2 return 1 fi if use pgo ; then if ! has_version -b "=sys-libs/compiler-rt-sanitizers-${LLVM_SLOT}*" ; then einfo "=sys-libs/compiler-rt-sanitizers-${LLVM_SLOT}* is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." >&2 return 1 fi fi fi einfo "Using LLVM slot ${LLVM_SLOT} to build" >&2 } MOZ_LANGS=( de en-CA en-GB en-US ru ) mozilla_set_globals() { # https://bugs.gentoo.org/587334 local MOZ_TOO_REGIONALIZED_FOR_L10N=( fy-NL ga-IE gu-IN hi-IN hy-AM nb-NO ne-NP nn-NO pa-IN sv-SE ) local lang xflag for lang in "${MOZ_LANGS[@]}" ; do # en and en_US are handled internally if [[ ${lang} == en ]] || [[ ${lang} == en-US ]] ; then continue fi # strip region subtag if $lang is in the list if has ${lang} "${MOZ_TOO_REGIONALIZED_FOR_L10N[@]}" ; then xflag=${lang%%-*} else xflag=${lang} fi SRC_URI+=" l10n_${xflag/[_@]/-}? (" SRC_URI+=" ${MOZ_SRC_BASE_URI}/linux-x86_64/xpi/${lang}.xpi -> ${MOZ_P_DISTFILES}-${lang}.xpi" SRC_URI+=" )" IUSE+=" l10n_${xflag/[_@]/-}" done } mozilla_set_globals moz_clear_vendor_checksums() { debug-print-function ${FUNCNAME} "$@" if [[ ${#} -ne 1 ]] ; then die "${FUNCNAME} requires exact one argument" fi einfo "Clearing cargo checksums for ${1} ..." sed -i \ -e 's/\("files":{\)[^}]*/\1/' \ "${S}"/third_party/rust/${1}/.cargo-checksum.json \ || die } moz_install_xpi() { debug-print-function ${FUNCNAME} "$@" if [[ ${#} -lt 2 ]] ; then die "${FUNCNAME} requires at least two arguments" fi local DESTDIR=${1} shift insinto "${DESTDIR}" local emid xpi_file xpi_tmp_dir for xpi_file in "${@}" ; do emid= xpi_tmp_dir=$(mktemp -d --tmpdir="${T}") # Unpack XPI unzip -qq "${xpi_file}" -d "${xpi_tmp_dir}" || die # Determine extension ID if [[ -f "${xpi_tmp_dir}/install.rdf" ]] ; then emid=$(sed -n -e '/install-manifest/,$ { /em:id/!d; s/.*[\">]\([^\"<>]*\)[\"<].*/\1/; p; q }' "${xpi_tmp_dir}/install.rdf") [[ -z "${emid}" ]] && die "failed to determine extension id from install.rdf" elif [[ -f "${xpi_tmp_dir}/manifest.json" ]] ; then emid=$(sed -n -e 's/.*"id": "\([^"]*\)".*/\1/p' "${xpi_tmp_dir}/manifest.json") [[ -z "${emid}" ]] && die "failed to determine extension id from manifest.json" else die "failed to determine extension id" fi einfo "Installing ${emid}.xpi into ${ED}${DESTDIR} ..." newins "${xpi_file}" "${emid}.xpi" done } mozconfig_add_options_ac() { debug-print-function ${FUNCNAME} "$@" if [[ ${#} -lt 2 ]] ; then die "${FUNCNAME} requires at least two arguments" fi local reason=${1} shift local option for option in ${@} ; do echo "ac_add_options ${option} # ${reason}" >>${MOZCONFIG} done } mozconfig_add_options_mk() { debug-print-function ${FUNCNAME} "$@" if [[ ${#} -lt 2 ]] ; then die "${FUNCNAME} requires at least two arguments" fi local reason=${1} shift local option for option in ${@} ; do echo "mk_add_options ${option} # ${reason}" >>${MOZCONFIG} done } mozconfig_use_enable() { debug-print-function ${FUNCNAME} "$@" if [[ ${#} -lt 1 ]] ; then die "${FUNCNAME} requires at least one arguments" fi local flag=$(use_enable "${@}") mozconfig_add_options_ac "$(use ${1} && echo +${1} || echo -${1})" "${flag}" } mozconfig_use_with() { debug-print-function ${FUNCNAME} "$@" if [[ ${#} -lt 1 ]] ; then die "${FUNCNAME} requires at least one arguments" fi local flag=$(use_with "${@}") mozconfig_add_options_ac "$(use ${1} && echo +${1} || echo -${1})" "${flag}" } pkg_pretend() { if [[ ${MERGE_TYPE} != binary ]] ; then if use pgo ; then if ! has usersandbox $FEATURES ; then die "You must enable usersandbox as X server can not run as root!" fi fi # Ensure we have enough disk space to compile if use pgo || use lto || use debug ; then CHECKREQS_DISK_BUILD="13500M" else CHECKREQS_DISK_BUILD="6400M" fi check-reqs_pkg_pretend fi } pkg_setup() { if [[ ${MERGE_TYPE} != binary ]] ; then if use pgo ; then if ! has userpriv ${FEATURES} ; then eerror "Building ${PN} with USE=pgo and FEATURES=-userpriv is not supported!" fi fi # Ensure we have enough disk space to compile if use pgo || use lto || use debug ; then CHECKREQS_DISK_BUILD="13500M" else CHECKREQS_DISK_BUILD="6400M" fi check-reqs_pkg_setup llvm_pkg_setup if use clang && use lto ; then local version_lld=$(ld.lld --version 2>/dev/null | awk '{ print $2 }') [[ -n ${version_lld} ]] && version_lld=$(ver_cut 1 "${version_lld}") [[ -z ${version_lld} ]] && die "Failed to read ld.lld version!" local version_llvm_rust=$(rustc -Vv 2>/dev/null | grep -F -- 'LLVM version:' | awk '{ print $3 }') [[ -n ${version_llvm_rust} ]] && version_llvm_rust=$(ver_cut 1 "${version_llvm_rust}") [[ -z ${version_llvm_rust} ]] && die "Failed to read used LLVM version from rustc!" if ver_test "${version_lld}" -ne "${version_llvm_rust}" ; then eerror "Rust is using LLVM version ${version_llvm_rust} but ld.lld version belongs to LLVM version ${version_lld}." eerror "You will be unable to link ${CATEGORY}/${PN}. To proceed you have the following options:" eerror " - Manually switch rust version using 'eselect rust' to match used LLVM version" eerror " - Switch to dev-lang/rust[system-llvm] which will guarantee matching version" eerror " - Build ${CATEGORY}/${PN} without USE=lto" eerror " - Rebuild lld with llvm that was used to build rust (may need to rebuild the whole " eerror " llvm/clang/lld/rust chain depending on your @world updates)" die "LLVM version used by Rust (${version_llvm_rust}) does not match with ld.lld version (${version_lld})!" fi fi if ! use clang && [[ $(gcc-major-version) -eq 11 ]] \ && ! has_version -b ">sys-devel/gcc-11.1.0:11" ; then # bug 792705 eerror "Using GCC 11 to compile firefox is currently known to be broken (see bug #792705)." die "Set USE=clang or select "${S}"/api-google.key || die echo -n "${MOZ_API_KEY_LOCATION//gGaPi/}" > "${S}"/api-location.key || die echo -n "${MOZ_API_KEY_MOZILLA//m0ap1/}" > "${S}"/api-mozilla.key || die ####### My stuff ### OpenSUSE-KDE patchset einfo +++++++++++++++++++++++++++++ einfo Applying OpenSUSE-KDE patches einfo +++++++++++++++++++++++++++++ use kde && for p in $(cat "${FILESDIR}/opensuse-kde-$(ver_cut 1)"/series);do patch --dry-run --silent -p1 -i "${FILESDIR}/opensuse-kde-$(ver_cut 1)"/$p 2>/dev/null if [ $? -eq 0 ]; then eapply "${FILESDIR}/opensuse-kde-$(ver_cut 1)"/$p; einfo +++++++++++++++++++++++++; einfo Patch $p is APPLIED; einfo +++++++++++++++++++++++++ else einfo -------------------------; einfo Patch $p is NOT applied and IGNORED; einfo ------------------------- fi done ####### ### Privacy-esr patches einfo ++++++++++++++++++++++++ einfo Applying privacy patches einfo ++++++++++++++++++++++++ for i in $(cat "${FILESDIR}/privacy-patchset/series"); do eapply "${FILESDIR}/privacy-patchset/$i"; done rm -rv browser/extensions/{doh-rollout,webcompat,report-site-issue} ### Debian patches einfo "Applying Debian's patches" for p in $(cat "${FILESDIR}/debian-patchset-$(ver_cut 1)"/series);do patch --dry-run --silent -p1 -i "${FILESDIR}/debian-patchset-$(ver_cut 1)"/$p 2>/dev/null if [ $? -eq 0 ]; then eapply "${FILESDIR}/debian-patchset-$(ver_cut 1)"/$p; einfo +++++++++++++++++++++++++; einfo Patch $p is APPLIED; einfo +++++++++++++++++++++++++ else einfo -------------------------; einfo Patch $p is NOT applied and IGNORED; einfo ------------------------- fi done ####### ### FreeBSD patches einfo ++++++++++++++++++++++++++ einfo "Applying FreeBSD's patches" einfo ++++++++++++++++++++++++++ for i in $(cat "${FILESDIR}/freebsd-patchset-$(ver_cut 1)/series"); do eapply "${FILESDIR}/freebsd-patchset-$(ver_cut 1)/$i"; done ### Fedora patches einfo "Applying Fedora's patches" for p in $(cat "${FILESDIR}/fedora-patchset-$(ver_cut 1)"/series);do patch --dry-run --silent -p1 -i "${FILESDIR}/fedora-patchset-$(ver_cut 1)"/$p 2>/dev/null if [ $? -eq 0 ]; then eapply "${FILESDIR}/fedora-patchset-$(ver_cut 1)"/$p; einfo +++++++++++++++++++++++++; einfo Patch $p is APPLIED; einfo +++++++++++++++++++++++++ else einfo -------------------------; einfo Patch $p is NOT applied and IGNORED; einfo ------------------------- fi done ####### ### KissLinux patches einfo +++++++++++++++++++++++++++++ einfo "Applying KissLinux's patches" einfo +++++++++++++++++++++++++++++ for p in $(cat "${FILESDIR}/kiss-patchset-$(ver_cut 1)"/series);do patch --dry-run --silent -p1 -i "${FILESDIR}/kiss-patchset-$(ver_cut 1)"/$p 2>/dev/null if [ $? -eq 0 ]; then eapply "${FILESDIR}/kiss-patchset-$(ver_cut 1)"/$p; einfo +++++++++++++++++++++++++; einfo Patch $p is APPLIED; einfo +++++++++++++++++++++++++ else einfo -------------------------; einfo Patch $p is NOT applied and IGNORED; einfo ------------------------- fi done ### PGO fix patch use pgo && eapply "${FILESDIR}/thunderbird-pgo_freeze_fix.patch" ####### # Write API keys to disk echo -n "${MOZ_API_KEY_GOOGLE//gGaPi/}" > "${S}"/api-google.key || die echo -n "${MOZ_API_KEY_LOCATION//gGaPi/}" > "${S}"/api-location.key || die echo -n "${MOZ_API_KEY_MOZILLA//m0ap1/}" > "${S}"/api-mozilla.key || die xdg_environment_reset } src_configure() { # Show flags set at the beginning einfo "Current BINDGEN_CFLAGS:\t${BINDGEN_CFLAGS:-no value set}" einfo "Current CFLAGS:\t\t${CFLAGS:-no value set}" einfo "Current CXXFLAGS:\t\t${CXXFLAGS:-no value set}" einfo "Current LDFLAGS:\t\t${LDFLAGS:-no value set}" einfo "Current RUSTFLAGS:\t\t${RUSTFLAGS:-no value set}" local have_switched_compiler= if use clang && ! tc-is-clang ; then # Force clang einfo "Enforcing the use of clang due to USE=clang ..." have_switched_compiler=yes AR=llvm-ar CC=${CHOST}-clang CXX=${CHOST}-clang++ NM=llvm-nm RANLIB=llvm-ranlib elif ! use clang && ! tc-is-gcc ; then # Force gcc have_switched_compiler=yes einfo "Enforcing the use of gcc due to USE=-clang ..." AR=gcc-ar CC=${CHOST}-gcc CXX=${CHOST}-g++ NM=gcc-nm RANLIB=gcc-ranlib fi if [[ -n "${have_switched_compiler}" ]] ; then # Because we switched active compiler we have to ensure # that no unsupported flags are set strip-unsupported-flags fi # Ensure we use correct toolchain export HOST_CC="$(tc-getBUILD_CC)" export HOST_CXX="$(tc-getBUILD_CXX)" tc-export CC CXX LD AR NM OBJDUMP RANLIB PKG_CONFIG # Pass the correct toolchain paths through cbindgen if tc-is-cross-compiler ; then export BINDGEN_CFLAGS="${SYSROOT:+--sysroot=${ESYSROOT}} --target=${CHOST} ${BINDGEN_CFLAGS-}" fi # Set MOZILLA_FIVE_HOME export MOZILLA_FIVE_HOME="/usr/$(get_libdir)/${PN}" # python/mach/mach/mixin/process.py fails to detect SHELL export SHELL="${EPREFIX}/bin/bash" # Set state path export MOZBUILD_STATE_PATH="${BUILD_DIR}" # Set MOZCONFIG export MOZCONFIG="${S}/.mozconfig" # Initialize MOZCONFIG mozconfig_add_options_ac '' --enable-application=comm/mail # Set Gentoo defaults export MOZILLA_OFFICIAL=1 mozconfig_add_options_ac 'Gentoo default' \ --allow-addon-sideload \ --disable-cargo-incremental \ --disable-crashreporter \ --disable-install-strip \ --disable-strip \ --disable-updater \ --enable-js-shell \ --enable-official-branding \ --enable-release \ --enable-system-ffi \ --enable-system-pixman \ --host="${CBUILD:-${CHOST}}" \ --libdir="${EPREFIX}/usr/$(get_libdir)" \ --prefix="${EPREFIX}/usr" \ --target="${CHOST}" \ --without-ccache \ --with-intl-api \ --with-libclang-path="$(llvm-config --libdir)" \ --with-system-nspr \ --with-system-nss \ --with-system-zlib \ --with-toolchain-prefix="${CHOST}-" \ --with-unsigned-addon-scopes=app,system \ --x-includes="${ESYSROOT}/usr/include" \ --x-libraries="${ESYSROOT}/usr/$(get_libdir)" # Set update channel local update_channel=release [[ -n ${MOZ_ESR} ]] && update_channel=esr mozconfig_add_options_ac '' --update-channel=${update_channel} if ! use x86 && [[ ${CHOST} != armv*h* ]] ; then mozconfig_add_options_ac '' --enable-rust-simd fi if [[ -s "${S}/api-google.key" ]] ; then local key_origin="Gentoo default" if [[ $(cat "${S}/api-google.key" | md5sum | awk '{ print $1 }') != 709560c02f94b41f9ad2c49207be6c54 ]] ; then key_origin="User value" fi mozconfig_add_options_ac "${key_origin}" \ --with-google-safebrowsing-api-keyfile="${S}/api-google.key" else einfo "Building without Google API key ..." fi if [[ -s "${S}/api-location.key" ]] ; then local key_origin="Gentoo default" if [[ $(cat "${S}/api-location.key" | md5sum | awk '{ print $1 }') != ffb7895e35dedf832eb1c5d420ac7420 ]] ; then key_origin="User value" fi mozconfig_add_options_ac "${key_origin}" \ --with-google-location-service-api-keyfile="${S}/api-location.key" else einfo "Building without Location API key ..." fi if [[ -s "${S}/api-mozilla.key" ]] ; then local key_origin="Gentoo default" if [[ $(cat "${S}/api-mozilla.key" | md5sum | awk '{ print $1 }') != 3927726e9442a8e8fa0e46ccc39caa27 ]] ; then key_origin="User value" fi mozconfig_add_options_ac "${key_origin}" \ --with-mozilla-api-keyfile="${S}/api-mozilla.key" else einfo "Building without Mozilla API key ..." fi mozconfig_use_with system-av1 mozconfig_use_with system-harfbuzz mozconfig_use_with system-harfbuzz system-graphite2 mozconfig_use_with system-icu mozconfig_use_with system-jpeg mozconfig_use_with system-libevent system-libevent "${ESYSROOT}/usr" mozconfig_use_with system-libvpx mozconfig_use_with system-png mozconfig_use_with system-webp mozconfig_use_enable dbus use eme-free && mozconfig_add_options_ac '+eme-free' --disable-eme if use hardened ; then mozconfig_add_options_ac "+hardened" --enable-hardening append-ldflags "-Wl,-z,relro -Wl,-z,now" fi mozconfig_use_enable jack mozconfig_use_enable pulseaudio # force the deprecated alsa sound code if pulseaudio is disabled if use kernel_linux && ! use pulseaudio ; then mozconfig_add_options_ac '-pulseaudio' --enable-alsa fi mozconfig_use_enable sndio mozconfig_use_enable wifi necko-wifi if use wayland ; then mozconfig_add_options_ac '+wayland' --enable-default-toolkit=cairo-gtk3-wayland else mozconfig_add_options_ac '' --enable-default-toolkit=cairo-gtk3 fi if use lto ; then if use clang ; then # Upstream only supports lld when using clang mozconfig_add_options_ac "forcing ld=lld due to USE=clang and USE=lto" --enable-linker=lld mozconfig_add_options_ac '+lto' --enable-lto=cross mozconfig_add_options_ac '+lto-cross' MOZ_LTO=cross mozconfig_add_options_ac '+lto-cross' MOZ_LTO_RUST=1 else # ld.gold is known to fail: # /usr/lib/gcc/x86_64-pc-linux-gnu/11.2.1/../../../../x86_64-pc-linux-gnu/bin/ld.gold: internal error in set_xindex, at /var/tmp/portage/sys-devel/binutils-2.37_p1-r1/work/binutils-2.37/gold/object.h:1050 # ThinLTO is currently broken, see bmo#1644409 mozconfig_add_options_ac '+lto' --enable-lto=full mozconfig_add_options_ac "linker is set to bfd" --enable-linker=bfd fi if use pgo ; then mozconfig_add_options_ac '+pgo' MOZ_PGO=1 if use clang ; then # Used in build/pgo/profileserver.py export LLVM_PROFDATA="llvm-profdata" mozconfig_add_options_ac '+pgo-rust' MOZ_PGO_RUST=1 fi fi else # Avoid auto-magic on linker if use clang ; then # This is upstream's default mozconfig_add_options_ac "forcing ld=lld due to USE=clang" --enable-linker=lld else mozconfig_add_options_ac "linker is set to bfd" --enable-linker=bfd fi fi # LTO flag was handled via configure filter-flags '-flto*' mozconfig_use_enable debug if use debug ; then mozconfig_add_options_ac '+debug' --disable-optimize else if is-flag '-g*' ; then if use clang ; then mozconfig_add_options_ac 'from CFLAGS' --enable-debug-symbols=$(get-flag '-g*') else mozconfig_add_options_ac 'from CFLAGS' --enable-debug-symbols fi else mozconfig_add_options_ac 'Gentoo default' --disable-debug-symbols fi if is-flag '-O0' ; then mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O0 elif is-flag '-O4' ; then mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O4 elif is-flag '-O3' ; then mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O3 elif is-flag '-O1' ; then mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-O1 elif is-flag '-Os' ; then mozconfig_add_options_ac "from CFLAGS" --enable-optimize=-Os else mozconfig_add_options_ac "Gentoo default" --enable-optimize=-O2 fi fi # Debug flag was handled via configure filter-flags '-g*' # Optimization flag was handled via configure filter-flags '-O*' # Modifications to better support ARM, bug #553364 if use cpu_flags_arm_neon ; then mozconfig_add_options_ac '+cpu_flags_arm_neon' --with-fpu=neon if ! tc-is-clang ; then # thumb options aren't supported when using clang, bug 666966 mozconfig_add_options_ac '+cpu_flags_arm_neon' \ --with-thumb=yes \ --with-thumb-interwork=no fi fi if [[ ${CHOST} == armv*h* ]] ; then mozconfig_add_options_ac 'CHOST=armv*h*' --with-float-abi=hard if ! use system-libvpx ; then sed -i \ -e "s|softfp|hard|" \ "${S}"/media/libvpx/moz.build \ || die fi fi if use clang ; then # https://bugzilla.mozilla.org/show_bug.cgi?id=1482204 # https://bugzilla.mozilla.org/show_bug.cgi?id=1483822 # toolkit/moz.configure Elfhack section: target.cpu in ('arm', 'x86', 'x86_64') local disable_elf_hack= if use amd64 ; then disable_elf_hack=yes elif use x86 ; then disable_elf_hack=yes elif use arm ; then disable_elf_hack=yes fi if [[ -n ${disable_elf_hack} ]] ; then mozconfig_add_options_ac 'elf-hack is broken when using Clang' --disable-elf-hack fi elif tc-is-gcc ; then if ver_test $(gcc-fullversion) -ge 10 ; then einfo "Forcing -fno-tree-loop-vectorize to workaround GCC bug, see bug 758446 ..." append-cxxflags -fno-tree-loop-vectorize fi fi # Additional ARCH support case "${ARCH}" in arm) # Reduce the memory requirements for linking if use clang ; then # Nothing to do :; elif tc-ld-is-gold || use lto ; then append-ldflags -Wl,--no-keep-memory else append-ldflags -Wl,--no-keep-memory -Wl,--reduce-memory-overheads fi ;; esac if ! use elibc_glibc ; then mozconfig_add_options_ac '!elibc_glibc' --disable-jemalloc fi # Allow elfhack to work in combination with unstripped binaries # when they would normally be larger than 2GiB. append-ldflags "-Wl,--compress-debug-sections=zlib" # Make revdep-rebuild.sh happy; Also required for musl append-ldflags -Wl,-rpath="${MOZILLA_FIVE_HOME}",--enable-new-dtags # Pass $MAKEOPTS to build system export MOZ_MAKE_FLAGS="${MAKEOPTS}" # Use system's Python environment export MACH_USE_SYSTEM_PYTHON=1 # Disable notification when build system has finished export MOZ_NOSPAM=1 # Portage sets XARGS environment variable to "xargs -r" by default which # breaks build system's check_prog() function which doesn't support arguments mozconfig_add_options_ac 'Gentoo default' "XARGS=${EPREFIX}/usr/bin/xargs" # Set build dir mozconfig_add_options_mk 'Gentoo default' "MOZ_OBJDIR=${BUILD_DIR}" # Show flags we will use einfo "Build BINDGEN_CFLAGS:\t${BINDGEN_CFLAGS:-no value set}" einfo "Build CFLAGS:\t\t${CFLAGS:-no value set}" einfo "Build CXXFLAGS:\t\t${CXXFLAGS:-no value set}" einfo "Build LDFLAGS:\t\t${LDFLAGS:-no value set}" einfo "Build RUSTFLAGS:\t\t${RUSTFLAGS:-no value set}" # Handle EXTRA_CONF and show summary local ac opt hash reason # Apply EXTRA_ECONF entries to $MOZCONFIG if [[ -n ${EXTRA_ECONF} ]] ; then IFS=\! read -a ac <<<${EXTRA_ECONF// --/\!} for opt in "${ac[@]}"; do mozconfig_add_options_ac "EXTRA_ECONF" --${opt#--} done fi ####### ### Disable features mozconfig_add_options_ac '' --disable-accessibility mozconfig_add_options_ac '' --disable-address-sanitizer mozconfig_add_options_ac '' --disable-address-sanitizer-reporter mozconfig_add_options_ac '' --disable-callgrind mozconfig_add_options_ac '' --disable-crashreporter mozconfig_add_options_ac '' --disable-debug mozconfig_add_options_ac '' --disable-debug-js-modules mozconfig_add_options_ac '' --disable-debug-symbols mozconfig_add_options_ac '' --disable-dmd mozconfig_add_options_ac '' --disable-dtrace mozconfig_add_options_ac '' --disable-dump-painting mozconfig_add_options_ac '' --disable-frame-pointers mozconfig_add_options_ac '' --disable-gold mozconfig_add_options_ac '' --disable-gpsd mozconfig_add_options_ac '' --disable-gtest-in-build mozconfig_add_options_ac '' --disable-instruments mozconfig_add_options_ac '' --disable-ipdl-tests mozconfig_add_options_ac '' --disable-jprof mozconfig_add_options_ac '' --disable-libproxy mozconfig_add_options_ac '' --disable-logrefcnt mozconfig_add_options_ac '' --disable-memory-sanitizer mozconfig_add_options_ac '' --disable-mobile-optimize mozconfig_add_options_ac '' --disable-necko-wifi mozconfig_add_options_ac '' --disable-parental-controls mozconfig_add_options_ac '' --disable-perf mozconfig_add_options_ac '' --disable-profiling mozconfig_add_options_ac '' --disable-reflow-perf mozconfig_add_options_ac '' --disable-rust-debug mozconfig_add_options_ac '' --disable-rust-tests mozconfig_add_options_ac '' --disable-signed-overflow-sanitizer mozconfig_add_options_ac '' --disable-spidermonkey-telemetry mozconfig_add_options_ac '' --disable-system-extension-dirs mozconfig_add_options_ac '' --disable-thread-sanitizer mozconfig_add_options_ac '' --disable-trace-logging mozconfig_add_options_ac '' --disable-undefined-sanitizer mozconfig_add_options_ac '' --disable-unsigned-overflow-sanitizer mozconfig_add_options_ac '' --disable-updater mozconfig_add_options_ac '' --disable-valgrind mozconfig_add_options_ac '' --disable-verify-mar mozconfig_add_options_ac '' --disable-vtune mozconfig_add_options_ac '' --disable-warnings-as-errors mozconfig_add_options_ac '' --disable-wasm-codegen-debug mozconfig_add_options_ac '' --disable-webrender-debugger mozconfig_add_options_ac '' --without-debug-label mozconfig_add_options_ac '' --without-google-location-service-api-keyfile mozconfig_add_options_ac '' --without-google-safebrowsing-api-keyfile mozconfig_add_options_ac '' --without-mozilla-api-keyfile mozconfig_add_options_ac '' --without-pocket-api-keyfile mozconfig_add_options_ac '' MOZ_DATA_REPORTING= mozconfig_add_options_ac '' MOZ_DEVICES= mozconfig_add_options_ac '' MOZ_LOGGING= mozconfig_add_options_ac '' MOZ_PAY= mozconfig_add_options_ac '' MOZ_SERVICES_HEALTHREPORTER= mozconfig_add_options_ac '' MOZ_SERVICES_METRICS= mozconfig_add_options_ac '' MOZ_TELEMETRY_REPORTING= mozconfig_add_options_ac '' MOZ_X11=0 mozconfig_add_options_ac '' USE_X11=0 mozconfig_add_options_ac '' MOZ_WEBRENDER=1 ### Enable good features mozconfig_add_options_ac '' --enable-icf mozconfig_add_options_ac '' --enable-install-strip mozconfig_add_options_ac '' --enable-rust-simd mozconfig_add_options_ac '' --enable-strip mozconfig_add_options_ac '' --enable-webrtc echo "export MOZ_DATA_REPORTING=" >> "${S}"/.mozconfig echo "export MOZ_DEVICES=" >> "${S}"/.mozconfig echo "export MOZ_LOGGING=" >> "${S}"/.mozconfig echo "export MOZ_PAY=" >> "${S}"/.mozconfig echo "export MOZ_SERVICES_HEALTHREPORTER=" >> "${S}"/.mozconfig echo "export MOZ_SERVICES_METRICS=" >> "${S}"/.mozconfig echo "export MOZ_TELEMETRY_REPORTING=" >> "${S}"/.mozconfig echo "export MOZ_X11=0" >> "${S}"/.mozconfig echo "export USE_X11=0" >> "${S}"/.mozconfig echo "export MOZ_WEBRENDER=1" >> "${S}"/.mozconfi ####### echo echo "==========================================================" echo "Building ${PF} with the following configuration" grep ^ac_add_options "${MOZCONFIG}" | while read ac opt hash reason; do [[ -z ${hash} || ${hash} == \# ]] \ || die "error reading mozconfig: ${ac} ${opt} ${hash} ${reason}" printf " %-30s %s\n" "${opt}" "${reason:-mozilla.org default}" done echo "==========================================================" echo ./mach configure || die } src_compile() { local virtx_cmd= if use pgo ; then virtx_cmd=virtx # Reset and cleanup environment variables used by GNOME/XDG gnome2_environment_reset addpredict /root fi #local -x GDK_BACKEND=x11 MOZ_ENABLE_WAYLAND=1 ${virtx_cmd} ./mach build --verbose \ || die } src_install() { # xpcshell is getting called during install pax-mark m \ "${BUILD_DIR}"/dist/bin/xpcshell \ "${BUILD_DIR}"/dist/bin/${PN} \ "${BUILD_DIR}"/dist/bin/plugin-container DESTDIR="${D}" ./mach install || die # Upstream cannot ship symlink but we can (bmo#658850) rm "${ED}${MOZILLA_FIVE_HOME}/${PN}-bin" || die dosym ${PN} ${MOZILLA_FIVE_HOME}/${PN}-bin # Don't install llvm-symbolizer from sys-devel/llvm package if [[ -f "${ED}${MOZILLA_FIVE_HOME}/llvm-symbolizer" ]] ; then rm -v "${ED}${MOZILLA_FIVE_HOME}/llvm-symbolizer" || die fi # Install policy (currently only used to disable application updates) insinto "${MOZILLA_FIVE_HOME}/distribution" newins "${FILESDIR}"/distribution.ini distribution.ini ####### if use privacy; then newins "${FILESDIR}"/enable-privacy.policy.json policies.json else newins "${FILESDIR}"/disable-auto-update.policy.json policies.json fi ####### # Install system-wide preferences local PREFS_DIR="${MOZILLA_FIVE_HOME}/defaults/pref" insinto "${PREFS_DIR}" newins "${FILESDIR}"/gentoo-default-prefs.js gentoo-prefs.js local GENTOO_PREFS="${ED}${PREFS_DIR}/gentoo-prefs.js" # Set dictionary path to use system hunspell cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set spellchecker.dictionary_path pref" pref("spellchecker.dictionary_path", "${EPREFIX}/usr/share/myspell"); EOF # Force hwaccel prefs if USE=hwaccel is enabled if use hwaccel ; then cat "${FILESDIR}"/gentoo-hwaccel-prefs.js \ >>"${GENTOO_PREFS}" \ || die "failed to add prefs to force hardware-accelerated rendering to all-gentoo.js" fi # Force the graphite pref if USE=system-harfbuzz is enabled, since the pref cannot disable it if use system-harfbuzz ; then cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set gfx.font_rendering.graphite.enabled pref" sticky_pref("gfx.font_rendering.graphite.enabled", true); EOF fi ####### cat "${FILESDIR}"/opensuse-kde-$(ver_cut 1)/kde.js >> \ "${GENTOO_PREFS}" \ || die cat "${FILESDIR}"/privacy-patchset/privacy.js >> \ "${GENTOO_PREFS}" \ || die ####### # Install language packs local langpacks=( $(find "${WORKDIR}/language_packs" -type f -name '*.xpi') ) if [[ -n "${langpacks}" ]] ; then moz_install_xpi "${MOZILLA_FIVE_HOME}/distribution/extensions" "${langpacks[@]}" fi # Install icons local icon_srcdir="${S}/comm/mail/branding/thunderbird" local icon_symbolic_file="${icon_srcdir}/TB-symbolic.svg" insinto /usr/share/icons/hicolor/symbolic/apps newins "${icon_symbolic_file}" ${PN}-symbolic.svg local icon size for icon in "${icon_srcdir}"/default*.png ; do size=${icon%.png} size=${size##*/default} if [[ ${size} -eq 48 ]] ; then newicon "${icon}" ${PN}.png fi newicon -s ${size} "${icon}" ${PN}.png done # Install menu local app_name="Mozilla ${MOZ_PN^}" local desktop_file="${FILESDIR}/icon/${PN}-r2.desktop" local desktop_filename="${PN}.desktop" local exec_command="${PN}" local icon="${PN}" local use_wayland="false" if use wayland ; then use_wayland="true" fi cp "${desktop_file}" "${WORKDIR}/${PN}.desktop-template" || die sed -i \ -e "s:@NAME@:${app_name}:" \ -e "s:@EXEC@:${exec_command}:" \ -e "s:@ICON@:${icon}:" \ "${WORKDIR}/${PN}.desktop-template" \ || die newmenu "${WORKDIR}/${PN}.desktop-template" "${desktop_filename}" rm "${WORKDIR}/${PN}.desktop-template" || die # Install wrapper script [[ -f "${ED}/usr/bin/${PN}" ]] && rm "${ED}/usr/bin/${PN}" newbin "${FILESDIR}/${PN}-r1.sh" ${PN} # Update wrapper sed -i \ -e "s:@PREFIX@:${EPREFIX}/usr:" \ -e "s:@MOZ_FIVE_HOME@:${MOZILLA_FIVE_HOME}:" \ -e "s:@APULSELIB_DIR@:${apulselib}:" \ -e "s:@DEFAULT_WAYLAND@:${use_wayland}:" \ "${ED}/usr/bin/${PN}" \ || die } pkg_preinst() { xdg_pkg_preinst # If the apulse libs are available in MOZILLA_FIVE_HOME then apulse # does not need to be forced into the LD_LIBRARY_PATH if use pulseaudio && has_version ">=media-sound/apulse-0.1.12-r4" ; then einfo "APULSE found; Generating library symlinks for sound support ..." local lib pushd "${ED}${MOZILLA_FIVE_HOME}" &>/dev/null || die for lib in ../apulse/libpulse{.so{,.0},-simple.so{,.0}} ; do # A quickpkg rolled by hand will grab symlinks as part of the package, # so we need to avoid creating them if they already exist. if [[ ! -L ${lib##*/} ]] ; then ln -s "${lib}" ${lib##*/} || die fi done popd &>/dev/null || die fi } pkg_postinst() { xdg_pkg_postinst if use pulseaudio && has_version ">=media-sound/apulse-0.1.12-r4" ; then elog "Apulse was detected at merge time on this system and so it will always be" elog "used for sound. If you wish to use pulseaudio instead please unmerge" elog "media-sound/apulse." elog fi local show_doh_information local show_shortcut_information if [[ -z "${REPLACING_VERSIONS}" ]] ; then # New install; Tell user that DoH is disabled by default show_doh_information=yes show_shortcut_information=no else local replacing_version for replacing_version in ${REPLACING_VERSIONS} ; do if ver_test "${replacing_version}" -lt 91.0 ; then # Tell user that we no longer install a shortcut # per supported display protocol show_shortcut_information=yes fi done fi if [[ -n "${show_doh_information}" ]] ; then elog elog "Note regarding Trusted Recursive Resolver aka DNS-over-HTTPS (DoH):" elog "Due to privacy concerns (encrypting DNS might be a good thing, sending all" elog "DNS traffic to Cloudflare by default is not a good idea and applications" elog "should respect OS configured settings), \"network.trr.mode\" was set to 5" elog "(\"Off by choice\") by default." elog "You can enable DNS-over-HTTPS in ${PN^}'s preferences." fi if [[ -n "${show_shortcut_information}" ]] ; then elog elog "Since ${PN}-91.0 we no longer install multiple shortcuts for" elog "each supported display protocol. Instead we will only install" elog "one generic Mozilla ${PN^} shortcut." elog "If you still want to be able to select between running Mozilla ${PN^}" elog "on X11 or Wayland, you have to re-create these shortcuts on your own." fi optfeature_header "Optional runtime features:" optfeature "encrypted chat support" net-libs/libotr }