# Copyright 1999-2017 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 EAPI=6 VIRTUALX_REQUIRED="pgo" WANT_AUTOCONF="2.1" PYTHON_COMPAT=( python3_{5,6,7} ) PYTHON_REQ_USE='ncurses,sqlite,ssl,threads(+)' # This list can be updated with scripts/get_langs.sh from the mozilla overlay MOZ_LANGS=( ach af an ar as ast az bg bn-BD bn-IN br bs ca cak cs cy da de dsb el en en-GB en-US en-ZA eo es-AR es-CL es-ES es-MX et eu fa ff fi fr fy-NL ga-IE gd gl gn gu-IN he hi-IN hr hsb hu hy-AM id is it ja ka kab kk km kn ko lij lt lv mai mk ml mr ms nb-NO nl nn-NO or pa-IN pl pt-BR pt-PT rm ro ru si sk sl son sq sr sv-SE ta te th tr uk uz vi xh zh-CN zh-TW ) #MOZCONFIG_OPTIONAL_GTK2ONLY=1 MOZCONFIG_OPTIONAL_WIFI=1 MOZCONFIG_OPTIONAL_GTK3='enabled' #MOZ_CURRENT_PROJECT=browser MOZ_LANGPACK_HTTP_URI="https://ftp.gnu.org/gnu/gnuzilla/${PV}/langpacks" MOZ_LANGPACK_SUFFIX='.langpack.xpi' MOZ_LANGPACK_PREFIX="${P}." MOZ_L10N_SUFFIX='.langpack.xpi' MOZ_L10N_PREFIX="${P}." inherit check-reqs flag-o-matic toolchain-funcs eutils gnome2-utils llvm \ mozconfig-v6.60 pax-utils xdg-utils autotools mozlinguas-v2 DESCRIPTION="Icecat Web Browser" HOMEPAGE="https://www.gnu.org/software/gnuzilla" KEYWORDS="~alpha amd64 ~arm ~arm64 ~ia64 ppc ppc64 x86 ~amd64-linux ~x86-linux" SLOT="0" LICENSE="MPL-2.0 GPL-2 LGPL-2.1" IUSE="bindist hardened geckodriver hwaccel jack pgo selinux test debug startup-notification" RESTRICT="!bindist? ( bindist )" SRC_URI="${SRC_URI} https://ftp.gnu.org/gnu/gnuzilla/${PV}/${P}-gnu1.tar.bz2 " ASM_DEPEND=">=dev-lang/yasm-1.1" RDEPEND=" system-icu? ( >=dev-libs/icu-60.2 ) jack? ( virtual/jack ) >=dev-libs/nss-3.36.4 >=dev-libs/nspr-4.19 selinux? ( sec-policy/selinux-mozilla )" DEPEND="${RDEPEND} >=sys-devel/llvm-4.0.1 >=sys-devel/clang-4.0.1 amd64? ( ${ASM_DEPEND} virtual/opengl ) x86? ( ${ASM_DEPEND} virtual/opengl )" BUILD_OBJ_DIR="${S}/obj-x86_64-pc-linux-gnu" BUILD_DIR=${BUILD_OBJ_DIR} FFMAJOR=60 FFMINOR=2 FFSUB=0 GNUVERSION=1 FFVERSION=$FFMAJOR.$FFMINOR.${FFSUB} ICECATVERSION=$FFVERSION-gnu$GNUVERSION SOURCEDIR=icecat-$FFVERSION makeicecat() { cat <<-EOF > .mozconfig #### #### icecat 'src/mozconfig' file #### ## Linux_Prerequisites - see: https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Linux_Prerequisites ## Build options - see: https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Build_Instructions/Configuring_Build_Options ## Source documentation - see: https://firefox-source-docs.mozilla.org/ ### IMPORTANT NOTICE: ### add the following lines to the VERY BOTTOM of 'src/mozconfig' ### WARNING: the following lines should NOT be changed ## Mozilla requires Python2 (python3 will NOT work - see: Linux_Prerequisites) mk_add_options PYTHON=/usr/bin/python2 ### WARNING: the following lines should NOT be changed ### (from: . "\$topsrcdir/build/mozconfig.common") mk_add_options AUTOCLOBBER=1 ac_add_options --enable-release ac_add_options --enable-js-shell ac_add_options --disable-eme ### WARNING: the following lines should NOT be changed ### (from: . "\$topsrcdir/src/browser/config/mozconfig") ## application to build ac_add_options --enable-application=browser ### WARNING: the following one should be comment out if not using ccache ## build using ccache ac_add_options --with-ccache ### WARNING: the following lines should NOT be changed ## build using an objdir (to keep sources clean) #mk_add_options MOZ_OBJDIR=\$topsrcdir/../obj ## path: sources for locales ac_add_options --with-l10n-base=\$topsrcdir/l10n ## path: system install dir ac_add_options --prefix=${EPREFIX}/usr ac_add_options --libdir="${EPREFIX}"/usr/$(get_libdir) ac_add_options --target="${CHOST}" ac_add_options --host="${CBUILD:-${CHOST}}" ### WARNING: the following lines should NOT be changed ## build with optimization #ac_add_options --enable-optimize="-pipe -O2" ## default toolkit ac_add_options --enable-default-toolkit=cairo-gtk3 ### WARNING: the following lines should NOT be changed ## branding ac_add_options --enable-official-branding ac_add_options --with-distribution-id=org.gnu ## enable support for user|portable fonts on desktop platforms (put your fonts ## to dir browser/fonts, then you can select them in the font preferences) ac_add_options --enable-bundled-fonts ### RECOMMENDED: NOT NECESSARY AND/OR PRIVACY RELATED STUFF ## disable geolocation services ac_add_options --disable-necko-wifi ac_add_options --disable-gpsd ## disable unwanted options ac_add_options --disable-debug ac_add_options --disable-debug-symbols ac_add_options --disable-tests ac_add_options --disable-crashreporter ac_add_options --disable-updater ac_add_options --disable-maintenance-service ac_add_options --disable-parental-controls ### OTHER RECOMMENDED OPTIONS (uncomment/comment what you want/unwant) ## use alsa instead of pulseaudio (Alsa must be installed in your system!) ## WARNING: commentout BOTH the following two lines to use pulseaudio ac_add_options --enable-alsa ac_add_options --disable-pulseaudio ## jack audio backend ac_add_options --enable-jack ## raw support ac_add_options --enable-raw ## if dbus-glib is installed you could uncomment the next line ac_add_options --disable-dbus ## if gconf is installed you could uncomment the next line ac_add_options --disable-gconf EOF cat <<- EOF >> browser/confvars.sh ### ### icecat 'src/browser/confvars.sh' APPEND file ### ## IMPORTANT NOTICE: ## append the following lines to the VERY BOTTOM of 'src/browser/confvars.sh' ## Extra IceCat settings MOZ_APP_VENDOR=GNU MOZ_APP_VERSION=$FFVERSION MOZ_APP_PROFILE=mozilla/icecat MOZ_ANDROID_GOOGLE_PLAY_SERVICES= MOZ_BUNDLED_FONTS=1 MOZ_CRASHREPORTER= MOZ_CRASHREPORTER_DISABLE=1 MOZ_DATA_REPORTING= MOZ_DEVICES= MOZ_SERVICES_FXACCOUNTS= MOZ_SERVICES_HEALTHREPORT= MOZ_SERVICES_HEALTHREPORTER= MOZ_SERVICES_METRICS= MOZ_SERVICES_SYNC= MOZ_SOCIAL= MOZ_TELEMETRY_REPORTING= MOZ_UPDATER= MOZ_ADDON_SIGNING= MOZ_PAY= MOZ_SERVICES_BLOCKLISTS= MOZ_SERVICES_CLOUDSYNC= EOF } llvm_check_deps() { has_version "sys-devel/clang:${LLVM_SLOT}" } pkg_setup() { moz_pkgsetup # Avoid PGO profiling problems due to enviroment leakage # These should *always* be cleaned up anyway unset DBUS_SESSION_BUS_ADDRESS \ DISPLAY \ ORBIT_SOCKETDIR \ SESSION_MANAGER \ XDG_SESSION_COOKIE \ XAUTHORITY addpredict /proc/self/oom_score_adj llvm_pkg_setup } pkg_pretend() { # Ensure we have enough disk space to compile if use pgo || use debug || use test ; then CHECKREQS_DISK_BUILD="8G" else CHECKREQS_DISK_BUILD="4G" fi check-reqs_pkg_setup } src_unpack() { unpack ${A} # Unpack language packs mozlinguas_src_unpack } src_prepare() { # Drop -Wl,--as-needed related manipulation for ia64 as it causes ld sefgaults, bug #582432 if use ia64 ; then sed -i \ -e '/^OS_LIBS += no_as_needed/d' \ -e '/^OS_LIBS += as_needed/d' \ "${S}"/widget/gtk/mozgtk/gtk2/moz.build \ "${S}"/widget/gtk/mozgtk/gtk3/moz.build \ || die "sed failed to drop --as-needed for ia64" fi if use clang ; then # https://bugzilla.mozilla.org/show_bug.cgi?id=1423822 mozconfig_annotate 'elf-hack is broken when using Clang' --disable-elf-hack fi # Ensure that our plugins dir is enabled as default sed -i -e "s:/usr/lib/mozilla/plugins:/usr/lib/nsbrowser/plugins:" \ "${S}"/xpcom/io/nsAppFileLocationProvider.cpp || die "sed failed to replace plugin path for 32bit!" sed -i -e "s:/usr/lib64/mozilla/plugins:/usr/lib64/nsbrowser/plugins:" \ "${S}"/xpcom/io/nsAppFileLocationProvider.cpp || die "sed failed to replace plugin path for 64bit!" # Fix sandbox violations during make clean, bug 372817 sed -e "s:\(/no-such-file\):${T}\1:g" \ -i "${S}"/config/rules.mk \ -i "${S}"/nsprpub/configure{.in,} \ || die # Don't exit with error when some libs are missing which we have in # system. sed '/^MOZ_PKG_FATAL_WARNINGS/s@= 1@= 0@' \ -i "${S}"/browser/installer/Makefile.in || die # Don't error out when there's no files to be removed: sed 's@\(xargs rm\)$@\1 -f@' \ -i "${S}"/toolkit/mozapps/installer/packager.mk || die # Allow user to apply any additional patches without modifing ebuild eapply_user (cd ${S} && makeicecat) # Autotools configure is now called old-configure.in # This works because there is still a configure.in that happens to be for the # shell wrapper configure script eautoreconf old-configure.in # Must run autoconf in js/src cd "${S}"/js/src || die eautoconf old-configure.in } src_configure() { MEXTENSIONS="default" # Google API keys (see http://www.chromium.org/developers/how-tos/api-keys) # Note: These are for Gentoo Linux use ONLY. For your own distribution, please # get your own set of keys. _google_api_key=AIzaSyDEAOvatFo0eTgsV_ZlEzx0ObmepsMzfAc #################################### # # mozconfig, CFLAGS and CXXFLAGS setup # #################################### mozconfig_init mozconfig_use_enable geckodriver # enable JACK, bug 600002 mozconfig_use_enable jack # It doesn't compile on alpha without this LDFLAGS use alpha && append-ldflags "-Wl,--no-relax" # Add full relro support for hardened use hardened && append-ldflags "-Wl,-z,relro,-z,now" if use hardened; then append-ldflags "-Wl,-z,relro,-z,now" mozconfig_use_enable hardened hardening fi # Setup api key for location services echo -n "${_google_api_key}" > "${S}"/google-api-key mozconfig_annotate '' --with-google-api-keyfile="${S}/google-api-key" mozconfig_annotate '' --enable-extensions="${MEXTENSIONS}" # Allow for a proper pgo build if use pgo; then echo "mk_add_options PROFILE_GEN_SCRIPT='EXTRA_TEST_ARGS=10 \$(MAKE) -C \$(MOZ_OBJDIR) pgo-profile-run'" >> "${S}"/.mozconfig fi if use clang ; then # https://bugzilla.mozilla.org/show_bug.cgi?id=1423822 mozconfig_annotate 'elf-hack is broken when using Clang' --disable-elf-hack fi echo "mk_add_options MOZ_OBJDIR=${BUILD_OBJ_DIR}" >> "${S}"/.mozconfig echo "mk_add_options XARGS=/usr/bin/xargs" >> "${S}"/.mozconfig # Finalize and report settings mozconfig_final if [[ $(gcc-major-version) -lt 4 ]]; then append-cxxflags -fno-stack-protector fi mkdir -p "${BUILD_OBJ_DIR}" cd "${BUILD_OBJ_DIR}" || die ../mach configure || die } src_compile() { cd "${BUILD_OBJ_DIR}" || die if use pgo; then addpredict /root addpredict /etc/gconf # Reset and cleanup environment variables used by GNOME/XDG gnome2_environment_reset # Firefox tries to use dri stuff when it's run, see bug 380283 shopt -s nullglob cards=$(echo -n /dev/dri/card* | sed 's/ /:/g') if test -z "${cards}"; then cards=$(echo -n /dev/ati/card* /dev/nvidiactl* | sed 's/ /:/g') if test -n "${cards}"; then # Binary drivers seem to cause access violations anyway, so # let's use indirect rendering so that the device files aren't # touched at all. See bug 394715. export LIBGL_ALWAYS_INDIRECT=1 fi fi shopt -u nullglob [[ -n "${cards}" ]] && addpredict "${cards}" export MOZ_PGO=1 fi ../mach build } src_install() { cd "${BUILD_OBJ_DIR}" || die # Pax mark xpcshell for hardened support, only used for startupcache creation. pax-mark m "${BUILD_OBJ_DIR}"/dist/bin/xpcshell # Add our default prefs for icecat cp "${FILESDIR}"/gentoo-default-prefs.js-1 \ "${BUILD_OBJ_DIR}/dist/bin/browser/defaults/preferences/all-gentoo.js" \ || die mozconfig_install_prefs \ "${BUILD_OBJ_DIR}/dist/bin/browser/defaults/preferences/all-gentoo.js" # Augment this with hwaccel prefs if use hwaccel ; then cat "${FILESDIR}"/gentoo-hwaccel-prefs.js-1 >> \ "${BUILD_OBJ_DIR}/dist/bin/browser/defaults/preferences/all-gentoo.js" \ || die fi echo "pref(\"extensions.autoDisableScopes\", 3);" >> \ "${BUILD_OBJ_DIR}/dist/bin/browser/defaults/preferences/all-gentoo.js" \ || die MOZ_MAKE_FLAGS="${MAKEOPTS}" SHELL="${SHELL:-${EPREFIX%/}/bin/bash}" \ emake DESTDIR="${D}" install if use geckodriver ; then cp "${BUILD_OBJ_DIR}"/dist/bin/geckodriver "${ED%/}"${MOZILLA_FIVE_HOME} || die pax-mark m "${ED%/}"${MOZILLA_FIVE_HOME}/geckodriver dosym ${MOZILLA_FIVE_HOME}/geckodriver /usr/bin/geckodriver fi # Install language packs mozlinguas_src_install local sizes="16 22 24 32 256" local icon_path="${S}/browser/branding/official" local icon="${PN}" local name="Icecat" # Install icons and .desktop for menu entry for size in ${sizes}; do insinto "/usr/share/icons/hicolor/${size}x${size}/apps" newins "${icon_path}/default${size}.png" "${icon}.png" done # The 128x128 icon has a different name insinto "/usr/share/icons/hicolor/128x128/apps" newins "${icon_path}/mozicon128.png" "${icon}.png" # Install a 48x48 icon into /usr/share/pixmaps for legacy DEs newicon "${icon_path}/content/icon48.png" "${icon}.png" newmenu "${FILESDIR}/icon/${PN}.desktop" "${PN}.desktop" sed -i -e "s:@NAME@:${name}:" -e "s:@ICON@:${icon}:" \ "${ED}/usr/share/applications/${PN}.desktop" || die # Add StartupNotify=true bug 237317 if use startup-notification ; then echo "StartupNotify=true"\ >> "${ED}/usr/share/applications/${PN}.desktop" \ || die fi # Don't install llvm-symbolizer from sys-devel/llvm package [[ -f "${ED%/}${MOZILLA_FIVE_HOME}/llvm-symbolizer" ]] && \ rm "${ED%/}${MOZILLA_FIVE_HOME}/llvm-symbolizer" # Required in order to use plugins and even run icecat on hardened. pax-mark m "${ED}"${MOZILLA_FIVE_HOME}/{icecat,icecat-bin,plugin-container} } pkg_preinst() { gnome2_icon_savelist # if the apulse libs are available in MOZILLA_FIVE_HOME then apulse # doesn't need to be forced into the LD_LIBRARY_PATH if use pulseaudio && has_version ">=media-sound/apulse-0.1.9" ; 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() { # Update mimedb for the new .desktop file xdg_desktop_database_update gnome2_icon_cache_update } pkg_postrm() { gnome2_icon_cache_update xdg_desktop_database_update }