From f0f572ff4635ff58e2ebbccf1b60617911308b16 Mon Sep 17 00:00:00 2001 From: Jan Malakhovski Date: Mon, 27 Mar 2017 12:33:00 +0000 Subject: [PATCH] firefox: refactor into firefoxPackages, add more options --- .../networking/browsers/firefox/common.nix | 278 +++++++++--------- .../networking/browsers/firefox/packages.nix | 43 +++ pkgs/top-level/all-packages.nix | 18 +- 3 files changed, 189 insertions(+), 150 deletions(-) create mode 100644 pkgs/applications/networking/browsers/firefox/packages.nix diff --git a/pkgs/applications/networking/browsers/firefox/common.nix b/pkgs/applications/networking/browsers/firefox/common.nix index 3193490b639..adf04c424aa 100644 --- a/pkgs/applications/networking/browsers/firefox/common.nix +++ b/pkgs/applications/networking/browsers/firefox/common.nix @@ -1,175 +1,167 @@ -{ lib, stdenv, fetchurl, pkgconfig, gtk2, pango, perl, python, zip, libIDL +{ pname, version, updateScript ? null +, src, patches ? [], meta }: + +{ lib, stdenv, pkgconfig, pango, perl, python, zip, libIDL , libjpeg, zlib, dbus, dbus_glib, bzip2, xorg -, freetype, fontconfig, file, alsaLib, nspr, nss, libnotify +, freetype, fontconfig, file, nspr, nss, libnotify , yasm, mesa, sqlite, unzip, makeWrapper , hunspell, libevent, libstartup_notification, libvpx -, cairo, gstreamer, gst-plugins-base, icu, libpng, jemalloc, libpulseaudio -, autoconf213, which, cargo, rustc -, writeScript, xidel, common-updater-scripts, coreutils, gnused, gnugrep, curl -, enableGTK3 ? false, gtk3, wrapGAppsHook +, cairo, icu, libpng, jemalloc +, autoconf213, which, gnused, cargo, rustc + , debugBuild ? false -, # If you want the resulting program to call itself "Firefox" instead - # of "Nightly" or whatever, enable this option. However, those - # binaries may not be distributed without permission from the - # Mozilla Foundation, see - # http://www.mozilla.org/foundation/trademarks/. - enableOfficialBranding ? false + +### optionals + +, alsaSupport ? true, alsaLib +, pulseaudioSupport ? true, libpulseaudio +, ffmpegSupport ? true, gstreamer, gst-plugins-base +, gtk3Support ? true, gtk2, gtk3, wrapGAppsHook + +, webrtcSupport ? true +, geolocationSupport ? true +, googleAPISupport ? geolocationSupport +, crashreporterSupport ? false + +, safeBrowsingSupport ? false +, drmSupport ? false + +# If you want the resulting program to call itself "Firefox" instead +# of "Nightly" or whatever, enable this option. However, those +# binaries may not be distributed without permission from the +# Mozilla Foundation, see +# http://www.mozilla.org/foundation/trademarks/. +, enableOfficialBranding ? false }: assert stdenv.cc ? libc && stdenv.cc.libc != null; let + flag = tf: x: [(if tf then "--enable-${x}" else "--disable-${x}")]; +in -common = { pname, version, sha512, updateScript }: stdenv.mkDerivation rec { +stdenv.mkDerivation rec { name = "${pname}-unwrapped-${version}"; - src = fetchurl { - url = - let ext = if lib.versionAtLeast version "41.0" then "xz" else "bz2"; - in "mirror://mozilla/firefox/releases/${version}/source/firefox-${version}.source.tar.${ext}"; - inherit sha512; - }; + inherit src patches meta; - # this patch should no longer be needed in 53 - # from https://bugzilla.mozilla.org/show_bug.cgi?id=1013882 - patches = lib.optional debugBuild ./fix-debug.patch; - - buildInputs = - [ gtk2 zip libIDL libjpeg zlib bzip2 - dbus dbus_glib pango freetype fontconfig xorg.libXi - xorg.libX11 xorg.libXrender xorg.libXft xorg.libXt file - alsaLib nspr nss libnotify xorg.pixman yasm mesa - xorg.libXScrnSaver xorg.scrnsaverproto - xorg.libXext xorg.xextproto sqlite unzip - hunspell libevent libstartup_notification libvpx /* cairo */ - icu libpng jemalloc - libpulseaudio # only headers are needed - ] - ++ lib.optional enableGTK3 gtk3 - ++ lib.optionals (!passthru.ffmpegSupport) [ gstreamer gst-plugins-base ]; + buildInputs = [ + gtk2 perl zip libIDL libjpeg zlib bzip2 + dbus dbus_glib pango freetype fontconfig xorg.libXi + xorg.libX11 xorg.libXrender xorg.libXft xorg.libXt file + nss nspr libnotify xorg.pixman yasm mesa + xorg.libXScrnSaver xorg.scrnsaverproto + xorg.libXext xorg.xextproto sqlite unzip makeWrapper + hunspell libevent libstartup_notification libvpx /* cairo */ + icu libpng jemalloc + ] + ++ lib.optional alsaSupport alsaLib + ++ lib.optional pulseaudioSupport libpulseaudio # only headers are needed + ++ lib.optionals ffmpegSupport [ gstreamer gst-plugins-base ] + ++ lib.optional gtk3Support gtk3; nativeBuildInputs = [ autoconf213 which gnused pkgconfig perl python cargo rustc ] - ++ lib.optional enableGTK3 wrapGAppsHook; + ++ lib.optional gtk3Support wrapGAppsHook; - configureFlags = - [ "--enable-application=browser" - "--with-system-jpeg" - "--with-system-zlib" - "--with-system-bz2" - "--with-system-nspr" - "--with-system-nss" - "--with-system-libevent" - "--with-system-libvpx" - "--with-system-png" # needs APNG support - "--with-system-icu" - "--enable-alsa" - "--enable-system-ffi" - "--enable-system-hunspell" - "--enable-system-pixman" - "--enable-system-sqlite" - #"--enable-system-cairo" - "--enable-startup-notification" - "--enable-content-sandbox" # available since 26.0, but not much info available - "--disable-crashreporter" - "--disable-tests" - "--disable-necko-wifi" # maybe we want to enable this at some point - "--disable-updater" - "--enable-jemalloc" - "--disable-gconf" - "--enable-default-toolkit=cairo-gtk${if enableGTK3 then "3" else "2"}" - "--with-google-api-keyfile=ga" - ] - ++ (if debugBuild then [ "--enable-debug" "--enable-profiling" ] - else [ "--disable-debug" "--enable-release" - "--enable-optimize" - "--enable-strip" ]) - ++ lib.optional enableOfficialBranding "--enable-official-branding"; + preConfigure = '' + # remove distributed configuration files + rm -f configure + rm -f js/src/configure + rm -f .mozconfig* + + # this will run autoconf213 + make -f client.mk configure-files + + configureScript="$(realpath ./configure)" + cd obj-* + '' + lib.optionalString googleAPISupport '' + # Google API key used by Chromium and Firefox. + # Note: These are for NixOS/nixpkgs use ONLY. For your own distribution, + # please get your own set of keys. + echo "AIzaSyDGi15Zwl11UNe6Y-5XW_upsfyw31qwZPI" >ga + ''; + + configureFlags = [ + "--enable-application=browser" + "--with-system-jpeg" + "--with-system-zlib" + "--with-system-bz2" + "--with-system-nspr" + "--with-system-nss" + "--with-system-libevent" + "--with-system-libvpx" + "--with-system-png" # needs APNG support + "--with-system-icu" + "--enable-system-ffi" + "--enable-system-hunspell" + "--enable-system-pixman" + "--enable-system-sqlite" + #"--enable-system-cairo" + "--enable-startup-notification" + "--enable-content-sandbox" # available since 26.0, but not much info available + "--disable-tests" + "--disable-necko-wifi" # maybe we want to enable this at some point + "--disable-updater" + "--enable-jemalloc" + "--disable-maintenance-service" + "--disable-gconf" + "--enable-default-toolkit=cairo-gtk${if gtk3Support then "3" else "2"}" + ] + ++ flag alsaSupport "alsa" + ++ flag pulseaudioSupport "pulseaudio" + ++ flag ffmpegSupport "ffmpeg" + ++ lib.optional (!ffmpegSupport) "--disable-gstreamer" + ++ flag webrtcSupport "webrtc" + ++ flag geolocationSupport "mozril-geoloc" + ++ lib.optional googleAPISupport "--with-google-api-keyfile=ga" + ++ flag crashreporterSupport "crashreporter" + ++ flag safeBrowsingSupport "safe-browsing" + ++ flag drmSupport "eme" + + ++ (if debugBuild then [ "--enable-debug" "--enable-profiling" ] + else [ "--disable-debug" "--enable-release" + "--enable-optimize" + "--enable-strip" ]) + ++ lib.optional enableOfficialBranding "--enable-official-branding"; enableParallelBuilding = true; - preConfigure = - '' - configureScript="$(realpath ./configure)" - mkdir ../objdir - cd ../objdir + preInstall = '' + # The following is needed for startup cache creation on grsecurity kernels. + paxmark m dist/bin/xpcshell + ''; - # Google API key used by Chromium and Firefox. - # Note: These are for NixOS/nixpkgs use ONLY. For your own distribution, - # please get your own set of keys. - echo "AIzaSyDGi15Zwl11UNe6Y-5XW_upsfyw31qwZPI" >ga - ''; + postInstall = '' + # For grsecurity kernels + paxmark m $out/lib/firefox-[0-9]*/{firefox,firefox-bin,plugin-container} - preInstall = - '' - # The following is needed for startup cache creation on grsecurity kernels. - paxmark m ../objdir/dist/bin/xpcshell - ''; + # Remove SDK cruft. FIXME: move to a separate output? + rm -rf $out/share/idl $out/include $out/lib/firefox-devel-* - postInstall = - '' - # For grsecurity kernels - paxmark m $out/lib/firefox-[0-9]*/{firefox,firefox-bin,plugin-container} + # Needed to find Mozilla runtime + gappsWrapperArgs+=(--argv0 "$out/bin/.firefox-wrapped") + ''; - # Remove SDK cruft. FIXME: move to a separate output? - rm -rf $out/share/idl $out/include $out/lib/firefox-devel-* - - # Needed to find Mozilla runtime - gappsWrapperArgs+=(--argv0 "$out/bin/.firefox-wrapped") - ''; - - postFixup = + postFixup = '' # Fix notifications. LibXUL uses dlopen for this, unfortunately; see #18712. - '' - patchelf --set-rpath "${lib.getLib libnotify - }/lib:$(patchelf --print-rpath "$out"/lib/firefox-*/libxul.so)" \ - "$out"/lib/firefox-*/libxul.so - ''; + patchelf --set-rpath "${lib.getLib libnotify + }/lib:$(patchelf --print-rpath "$out"/lib/firefox-*/libxul.so)" \ + "$out"/lib/firefox-*/libxul.so + ''; doInstallCheck = true; - installCheckPhase = - '' - # Some basic testing - "$out/bin/firefox" --version - ''; - - meta = { - description = "A web browser" + lib.optionalString (pname == "firefox-esr") " (Extended Support Release)"; - homepage = http://www.mozilla.com/en-US/firefox/; - maintainers = with lib.maintainers; [ eelco ]; - platforms = lib.platforms.linux; - }; + installCheckPhase = '' + # Some basic testing + "$out/bin/firefox" --version + ''; passthru = { - inherit nspr version updateScript; - gtk = gtk2; - isFirefox3Like = true; browserName = "firefox"; - ffmpegSupport = lib.versionAtLeast version "46.0"; + inherit version updateScript; + isFirefox3Like = true; + gtk = gtk2; + inherit nspr; + inherit ffmpegSupport; }; -}; - -in { - - firefox-unwrapped = common { - pname = "firefox"; - version = "53.0"; - sha512 = "36ec810bab58e3d99478455a38427a5efbc74d6dd7d4bb93b700fd7429b9b89250efd0abe4609091483991802090c6373c8434dfc9ba64c79a778e51fd2a2886"; - updateScript = import ./update.nix { - attrPath = "firefox-unwrapped"; - inherit writeScript lib common-updater-scripts xidel coreutils gnused gnugrep curl; - }; - }; - - firefox-esr-unwrapped = common { - pname = "firefox-esr"; - version = "52.1.0esr"; - sha512 = "ba833904654eda347f83df77e04c8e81572772e8555f187b796ecc30e498b93fb729b6f60935731d9584169adc9d61329155364fddf635cbd11abebe4a600247"; - updateScript = import ./update.nix { - attrPath = "firefox-esr-unwrapped"; - versionSuffix = "esr"; - inherit writeScript lib common-updater-scripts xidel coreutils gnused gnugrep curl; - }; - }; - } diff --git a/pkgs/applications/networking/browsers/firefox/packages.nix b/pkgs/applications/networking/browsers/firefox/packages.nix new file mode 100644 index 00000000000..ad9cfa2ca5d --- /dev/null +++ b/pkgs/applications/networking/browsers/firefox/packages.nix @@ -0,0 +1,43 @@ +{ lib, callPackage, fetchurl }: + +let common = opts: callPackage (import ./common.nix opts); in + +rec { + + firefox = common rec { + pname = "firefox"; + version = "53.0"; + src = fetchurl { + url = "mirror://mozilla/firefox/releases/${version}/source/firefox-${version}.source.tar.xz"; + sha512 = "36ec810bab58e3d99478455a38427a5efbc74d6dd7d4bb93b700fd7429b9b89250efd0abe4609091483991802090c6373c8434dfc9ba64c79a778e51fd2a2886"; + }; + + meta = { + description = "A web browser built from Firefox source tree"; + homepage = http://www.mozilla.com/en-US/firefox/; + maintainers = with lib.maintainers; [ eelco ]; + platforms = lib.platforms.linux; + }; + updateScript = callPackage ./update.nix { + attrPath = "firefox-unwrapped"; + }; + } {}; + + firefox-esr = common rec { + pname = "firefox-esr"; + version = "52.1.0esr"; + src = fetchurl { + url = "mirror://mozilla/firefox/releases/${version}/source/firefox-${version}.source.tar.xz"; + sha512 = "ba833904654eda347f83df77e04c8e81572772e8555f187b796ecc30e498b93fb729b6f60935731d9584169adc9d61329155364fddf635cbd11abebe4a600247"; + }; + + meta = firefox.meta // { + description = "A web browser built from Firefox Extended Support Release source tree"; + }; + updateScript = callPackage ./update.nix { + attrPath = "firefox-esr-unwrapped"; + versionSuffix = "esr"; + }; + } {}; + +} diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 1a3c72c79cc..be36356d90e 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -13776,13 +13776,17 @@ with pkgs; filezilla = callPackage ../applications/networking/ftp/filezilla { }; - inherit (callPackages ../applications/networking/browsers/firefox { - inherit (gnome2) libIDL; - libpng = libpng_apng; - enableGTK3 = true; - python = python2; - gnused = gnused_422; - }) firefox-unwrapped firefox-esr-unwrapped; + firefoxPackages = recurseIntoAttrs (callPackage ../applications/networking/browsers/firefox/packages.nix { + callPackage = pkgs.newScope { + inherit (gnome2) libIDL; + libpng = libpng_apng; + python = python2; + gnused = gnused_422; + }; + }); + + firefox-unwrapped = firefoxPackages.firefox; + firefox-esr-unwrapped = firefoxPackages.firefox-esr; firefox = wrapFirefox firefox-unwrapped { }; firefox-esr = wrapFirefox firefox-esr-unwrapped { };