# Copyright 1999-2022 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 # Ebuild is based on the Firefox ebuilds in the main repo EAPI="7" # Using Gentoos firefox patches as system libraries and lto are quite nice FIREFOX_PATCHSET="firefox-91esr-patches-06j.tar.xz" LLVM_MAX_SLOT=13 PYTHON_COMPAT=( python3_{8..10} ) PYTHON_REQ_USE="ncurses,sqlite,ssl" WANT_AUTOCONF="2.1" VIRTUALX_REQUIRED="pgo" inherit autotools check-reqs desktop flag-o-matic gnome2-utils linux-info \ llvm multiprocessing pax-utils python-any-r1 toolchain-funcs \ virtualx xdg PATCH_URIS=( https://dev.gentoo.org/~{juippis,polynomial-c,whissi}/mozilla/patchsets/${FIREFOX_PATCHSET} ) SRC_URI=" !buildtarball? ( icecat-${PV}-gnu1.tar.bz2 ) ${PATCH_URIS[@]} " DESCRIPTION="GNU IceCat Web Browser" HOMEPAGE="https://www.gnu.org/software/gnuzilla/" KEYWORDS="~amd64" SLOT="0" LICENSE="MPL-2.0 GPL-2 LGPL-2.1" IUSE="+clang cpu_flags_arm_neon dbus debug +buildtarball geckodriver hardened hwaccel jack lto +openh264 pgo pulseaudio screencast selinux +system-av1 +system-harfbuzz +system-icu +system-jpeg +system-libevent +system-libvpx +system-webp wayland wifi" IUSE="+clang cpu_flags_arm_neon dbus debug +buildtarball hardened hwaccel" IUSE+=" jack lto +openh264 pgo pulseaudio sndio selinux" IUSE+=" +system-av1 +system-harfbuzz +system-icu +system-jpeg +system-libevent +system-libvpx +system-webp" IUSE+=" wayland wifi" # Firefox-only IUSE IUSE+=" geckodriver" IUSE+=" screencast" REQUIRED_USE="debug? ( !system-av1 ) wifi? ( dbus )" # Firefox-only REQUIRED_USE flags REQUIRED_USE+=" screencast? ( wayland )" BDEPEND="${PYTHON_DEPS} app-arch/unzip app-arch/zip >=dev-util/cbindgen-0.19.0 >=net-libs/nodejs-10.23.1 virtual/pkgconfig >=virtual/rust-1.51.0 || ( ( sys-devel/clang:13 sys-devel/llvm:13 clang? ( =sys-devel/lld-13* pgo? ( =sys-libs/compiler-rt-sanitizers-13*[profile] ) ) ) ( sys-devel/clang:12 sys-devel/llvm:12 clang? ( =sys-devel/lld-12* pgo? ( =sys-libs/compiler-rt-sanitizers-12*[profile] ) ) ) ) amd64? ( >=dev-lang/nasm-2.13 ) x86? ( >=dev-lang/nasm-2.13 ) buildtarball? ( ~www-client/makeicecat-"${PV}"[buildtarball] )" COMMON_DEPEND=" >=dev-libs/nss-3.68 >=dev-libs/nspr-4.32 dev-libs/atk dev-libs/expat >=x11-libs/cairo-1.10[X] >=x11-libs/gtk+-3.4.0:3[X] x11-libs/gdk-pixbuf >=x11-libs/pango-1.22.0 >=media-libs/libpng-1.6.35:0=[apng] >=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/libxcb:= x11-libs/libXcomposite x11-libs/libXdamage x11-libs/libXext x11-libs/libXfixes x11-libs/libXrender x11-libs/libXt dbus? ( sys-apps/dbus dev-libs/dbus-glib ) screencast? ( media-video/pipewire:0/0.3 ) 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-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 )" DEPEND="${COMMON_DEPEND} x11-libs/libICE x11-libs/libSM pulseaudio? ( || ( media-sound/pulseaudio >=media-sound/apulse-0.1.12-r4[sdk] ) ) wayland? ( >=x11-libs/gtk+-3.11:3[wayland] ) amd64? ( virtual/opengl ) x86? ( virtual/opengl )" S="${WORKDIR}/${PN}-${PV%_*}" llvm_check_deps() { if ! has_version -b "sys-devel/clang:${LLVM_SLOT}" ; then einfo "sys-devel/clang:${LLVM_SLOT} is missing! Cannot use LLVM slot ${LLVM_SLOT} ..." >&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=( af ar ast be bg br ca cak cs cy da de dsb el en-CA en-GB en-US es-AR es-ES et eu fi fr fy-NL ga-IE gd gl he hr hsb hu id is it ja ka kab kk ko lt lv ms nb-NO nl nn-NO pa-IN pl pt-BR pt-PT rm ro ru sk sl sq sr sv-SE th tr uk uz vi zh-CN zh-TW ) # Firefox-only LANGS MOZ_LANGS+=( ach ) MOZ_LANGS+=( an ) MOZ_LANGS+=( az ) MOZ_LANGS+=( bn ) MOZ_LANGS+=( bs ) MOZ_LANGS+=( ca-valencia ) MOZ_LANGS+=( eo ) MOZ_LANGS+=( es-CL ) MOZ_LANGS+=( es-MX ) MOZ_LANGS+=( fa ) MOZ_LANGS+=( ff ) MOZ_LANGS+=( gn ) MOZ_LANGS+=( gu-IN ) MOZ_LANGS+=( hi-IN ) MOZ_LANGS+=( hy-AM ) MOZ_LANGS+=( ia ) MOZ_LANGS+=( km ) MOZ_LANGS+=( kn ) MOZ_LANGS+=( lij ) MOZ_LANGS+=( mk ) MOZ_LANGS+=( mr ) MOZ_LANGS+=( my ) MOZ_LANGS+=( ne-NP ) MOZ_LANGS+=( oc ) MOZ_LANGS+=( sco ) MOZ_LANGS+=( si ) MOZ_LANGS+=( son ) MOZ_LANGS+=( szl ) MOZ_LANGS+=( ta ) MOZ_LANGS+=( te ) MOZ_LANGS+=( tl ) MOZ_LANGS+=( trs ) MOZ_LANGS+=( ur ) MOZ_LANGS+=( xh ) 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 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_build_xpi() { debug-print-function ${FUNCNAME} "$@" 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 ) cd "${BUILD_DIR}"/browser/locales || die 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 if use l10n_"${xflag}"; then emake langpack-"${lang}" LOCALE_MERGEDIR=. fi done } 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_nofetch() { if ! use buildtarball; then einfo "You have not enabled buildtarball use flag, therefore you will have to" einfo "build the tarball manually and place it in your distfiles directory." einfo "You may find the script for building the tarball here" einfo "https://git.savannah.gnu.org/cgit/gnuzilla.git/, but make sure it is the" einfo "right version." einfo "The output of the script should be icecat-"${PV}"-gnu1.tar.bz2" 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 >"${GENTOO_PREFS}" <<-EOF || die "failed to set spellchecker.dictionary_path pref" pref("spellchecker.dictionary_path", "${EPREFIX}/usr/share/myspell"); EOF # Set installDistroAddons to true so that language packs work cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to set extensions.installDistroAddons pref" pref("extensions.installDistroAddons", true); pref("extensions.langpacks.signatures.required", false); EOF # Disable signatures for language packs so that unsigned just built language packs work cat >>"${GENTOO_PREFS}" <<-EOF || die "failed to disable langpacks signatures" pref("extensions.langpacks.signatures.required", false); 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 # Install language packs local langpacks=( $(find "${BUILD_DIR}"/dist/linux-x86_64/xpi -type f -name '*.xpi') ) if [[ -n "${langpacks}" ]] ; then moz_install_xpi "${MOZILLA_FIVE_HOME}/browser/extensions" "${langpacks[@]}" fi # Install geckodriver if use geckodriver ; then einfo "Installing geckodriver into ${ED}${MOZILLA_FIVE_HOME} ..." pax-mark m "${BUILD_DIR}"/dist/bin/geckodriver exeinto "${MOZILLA_FIVE_HOME}" doexe "${BUILD_DIR}"/dist/bin/geckodriver dosym ${MOZILLA_FIVE_HOME}/geckodriver /usr/bin/geckodriver fi # Install icons local icon_srcdir="${S}/browser/branding/official" local icon_symbolic_file="${FILESDIR}/icon/"${PN}"-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="GNU IceCat" local desktop_file="${FILESDIR}/icon/${PN}-r3.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 elog "Cloudflare browser checks are broken with GNU IceCats anti fingerprinting measures." elog "You can fix cloudflare browser checks by undoing them in about:config like below:" # Specifying (X11) is necessary for it to work, even in a Wayland session elog " general.appversion.override: 91.0 (X11)" elog " general.oscpu.override: Linux x86_64" elog " general.platform.override: Linux x86_64" 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 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 }