Unverified Commit aa4a14b7 authored by Bernardo Meurer's avatar Bernardo Meurer Committed by GitHub
Browse files

Merge pull request #106617 from S-NA/wip/firefox-improvements

firefox: fix running wayland firefox built with LTO and some miscellaneous improvements
parents e1545d42 dbe008a5
Loading
Loading
Loading
Loading
+32 −35
Original line number Diff line number Diff line
@@ -2,9 +2,9 @@
, src, unpackPhase ? null, patches ? []
, extraNativeBuildInputs ? [], extraConfigureFlags ? [], extraMakeFlags ? [] }:

{ lib, stdenv, pkgconfig, pango, perl, python2, python3, zip
{ lib, stdenv, pkgconfig, pango, perl, python3, zip
, libjpeg, zlib, dbus, dbus-glib, bzip2, xorg
, freetype, fontconfig, file, nspr, nss, nss_3_53, libnotify
, freetype, fontconfig, file, nspr, nss, nss_3_53
, yasm, libGLU, libGL, sqlite, unzip, makeWrapper
, hunspell, libXdamage, libevent, libstartup_notification
, libvpx_1_8
@@ -23,8 +23,7 @@
, ffmpegSupport ? true
, gtk3Support ? true, gtk2, gtk3, wrapGAppsHook
, waylandSupport ? true, libxkbcommon
# LTO is disabled since it caused segfaults on wayland see https://github.com/NixOS/nixpkgs/issues/101429
, ltoSupport ? false, overrideCC, buildPackages
, ltoSupport ? stdenv.isLinux, overrideCC, buildPackages
, gssSupport ? true, kerberos
, pipewireSupport ? waylandSupport && webrtcSupport, pipewire

@@ -91,10 +90,18 @@ let
            then "/Applications/${binaryNameCapitalized}.app/Contents/MacOS"
            else "/bin";

  # 78 ESR won't build with rustc 1.47
  inherit (if lib.versionAtLeast ffversion "82" then rustPackages else rustPackages_1_45)
    rustc cargo;

  # Darwin's stdenv provides the default llvmPackages version, match that since
  # clang LTO on Darwin is broken so the stdenv is not being changed.
  # Target the LLVM version that rustc -Vv reports it is built with for LTO.
  # rustPackages_1_45 -> LLVM 10, rustPackages -> LLVM 11
  llvmPackages = if stdenv.isDarwin
                 then buildPackages.llvmPackages
                 else if lib.versionAtLeast rustc.llvm.version "11"
                      then buildPackages.llvmPackages_11
                      else buildPackages.llvmPackages_10;

  # When LTO for Darwin is fixed, the following will need updating as lld
@@ -103,10 +110,6 @@ let
                then overrideCC stdenv llvmPackages.lldClang
                else stdenv;

  # 78 ESR won't build with rustc 1.47
  inherit (if lib.versionAtLeast ffversion "82" then rustPackages else rustPackages_1_45)
    rustc cargo;

  nss_pkg = if lib.versionOlder ffversion "83" then nss_3_53 else nss;
in

@@ -121,13 +124,19 @@ buildStdenv.mkDerivation ({
  ] ++
  lib.optional (lib.versionOlder ffversion "83") ./no-buildconfig-ffx76.patch ++
  lib.optional (lib.versionAtLeast ffversion "84") ./no-buildconfig-ffx84.patch ++
  lib.optional (ltoSupport && lib.versionOlder ffversion "84") ./lto-dependentlibs-generation-ffx83.patch ++
  lib.optional (ltoSupport && lib.versionAtLeast ffversion "84" && lib.versionOlder ffversion "86")
    (fetchpatch {
      url = "https://hg.mozilla.org/mozilla-central/raw-rev/fdff20c37be3";
      sha256 = "135n9brliqy42lj3nqgb9d9if7x6x9nvvn0z4anbyf89bikixw48";
    })

  # there are two flavors of pipewire support
  # The patches for the ESR release and the patches for the current stable
  # release.
  # Until firefox upstream stabilizes pipewire support we will have to continue
  # tracking multiple versions here.
  lib.optional (pipewireSupport && lib.versionOlder ffversion "83")
  ++ lib.optional (pipewireSupport && lib.versionOlder ffversion "83")
    (fetchpatch {
      # https://src.fedoraproject.org/rpms/firefox/blob/master/f/firefox-pipewire-0-3.patch
      url = "https://src.fedoraproject.org/rpms/firefox/raw/e99b683a352cf5b2c9ff198756859bae408b5d9d/f/firefox-pipewire-0-3.patch";
@@ -157,7 +166,7 @@ buildStdenv.mkDerivation ({
    gtk2 perl zip libjpeg zlib bzip2
    dbus dbus-glib pango freetype fontconfig xorg.libXi xorg.libXcursor
    xorg.libX11 xorg.libXrender xorg.libXft xorg.libXt file
    libnotify xorg.pixman yasm libGLU libGL
    xorg.pixman yasm libGLU libGL
    xorg.xorgproto
    xorg.libXext unzip makeWrapper
    libevent libstartup_notification /* cairo */
@@ -173,24 +182,17 @@ buildStdenv.mkDerivation ({
  ++ lib.optional  pulseaudioSupport libpulseaudio # only headers are needed
  ++ lib.optional  gtk3Support gtk3
  ++ lib.optional  gssSupport kerberos
  ++ lib.optional  ltoSupport llvmPackages.libunwind
  ++ lib.optionals waylandSupport [ libxkbcommon ]
  ++ lib.optionals pipewireSupport [ pipewire ]
  ++ lib.optionals (lib.versionAtLeast ffversion "82") [ gnum4 ]
  ++ lib.optional  waylandSupport libxkbcommon
  ++ lib.optional  pipewireSupport pipewire
  ++ lib.optional  (lib.versionAtLeast ffversion "82") gnum4
  ++ lib.optionals buildStdenv.isDarwin [ CoreMedia ExceptionHandling Kerberos
                                          AVFoundation MediaToolbox CoreLocation
                                          Foundation libobjc AddressBook cups ];

  NIX_LDFLAGS = lib.optionalString ltoSupport ''
    -rpath ${placeholder "out"}/lib/${binaryName}
    -rpath ${llvmPackages.libunwind.out}/lib
  '';

  NIX_CFLAGS_COMPILE = toString [
    "-I${glib.dev}/include/gio-unix-2.0"
    "-I${nss_pkg.dev}/include/nss"
  ];

  MACH_USE_SYSTEM_PYTHON = "1";

  postPatch = ''
@@ -202,7 +204,7 @@ buildStdenv.mkDerivation ({
    substituteInPlace \
      media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build \
      --replace /usr/include ${pipewire.dev}/include
  '' + lib.optionalString (lib.versionAtLeast ffversion "80") ''
  '' + lib.optionalString (lib.versionAtLeast ffversion "80" && lib.versionOlder ffversion "81") ''
    substituteInPlace dom/system/IOUtils.h \
      --replace '#include "nspr/prio.h"'          '#include "prio.h"'

@@ -221,7 +223,6 @@ buildStdenv.mkDerivation ({
      nodejs
      perl
      pkgconfig
      python2
      python3
      rust-cbindgen
      rustc
@@ -323,6 +324,13 @@ buildStdenv.mkDerivation ({
    "MOZILLA_OFFICIAL=1"
    "BUILD_OFFICIAL=1"
  ]
  ++ lib.optionals ltoSupport [
    "AR=${llvmPackages.bintools}/bin/llvm-ar"
    "LLVM_OBJDUMP=${llvmPackages.bintools}/bin/llvm-objdump"
    "NM=${llvmPackages.bintools}/bin/llvm-nm"
    "RANLIB=${llvmPackages.bintools}/bin/llvm-ranlib"
    "STRIP=${llvmPackages.bintools}/bin/llvm-strip"
  ]
  ++ extraMakeFlags;

  enableParallelBuilding = true;
@@ -341,18 +349,6 @@ buildStdenv.mkDerivation ({
    gappsWrapperArgs+=(--argv0 "$out/bin/.${binaryName}-wrapped")
  '';

  postFixup = lib.optionalString buildStdenv.isLinux ''
    # Fix notifications. LibXUL uses dlopen for this, unfortunately; see #18712.
    patchelf --set-rpath "${lib.getLib libnotify
      }/lib:$(patchelf --print-rpath "$out"/lib/${binaryName}*/libxul.so)" \
        "$out"/lib/${binaryName}*/libxul.so
    patchelf --add-needed ${xorg.libXScrnSaver.out}/lib/libXss.so $out/lib/${binaryName}/${binaryName}
    ${lib.optionalString (pipewireSupport && lib.versionAtLeast ffversion "83") ''
      patchelf --add-needed "${lib.getLib pipewire}/lib/libpipewire-0.3.so" \
        "$out"/lib/${binaryName}/${binaryName}
    ''}
  '';

  doInstallCheck = true;
  installCheckPhase = ''
    # Some basic testing
@@ -365,6 +361,7 @@ buildStdenv.mkDerivation ({
    isFirefox3Like = true;
    gtk = gtk2;
    inherit alsaSupport;
    inherit pipewireSupport;
    inherit nspr;
    inherit ffmpegSupport;
    inherit gssSupport;
+45 −0
Original line number Diff line number Diff line
--- a/toolkit/library/build/dependentlibs.py
+++ b/toolkit/library/build/dependentlibs.py
@@ -36,26 +36,17 @@ def dependentlibs_win32_objdump(lib):
     proc.wait()
     return deps
 
-def dependentlibs_readelf(lib):
+def dependentlibs_elf_objdump(lib):
     '''Returns the list of dependencies declared in the given ELF .so'''
-    proc = subprocess.Popen([substs.get('TOOLCHAIN_PREFIX', '') + 'readelf', '-d', lib], stdout = subprocess.PIPE,
+    proc = subprocess.Popen([substs['LLVM_OBJDUMP'], '--private-headers', lib], stdout = subprocess.PIPE,
                             universal_newlines=True)
     deps = []
     for line in proc.stdout:
-        # Each line has the following format:
-        #  tag (TYPE)          value
-        # or with BSD readelf:
-        #  tag TYPE            value
-        # Looking for NEEDED type entries
-        tmp = line.split(' ', 3)
-        if len(tmp) > 3 and 'NEEDED' in tmp[2]:
-            # NEEDED lines look like:
-            # 0x00000001 (NEEDED)             Shared library: [libname]
-            # or with BSD readelf:
-            # 0x00000001 NEEDED               Shared library: [libname]
-            match = re.search('\[(.*)\]', tmp[3])
-            if match:
-                deps.append(match.group(1))
+        # We are looking for lines with the format:
+        #   NEEDED             libname
+        tmp = line.split()
+        if len(tmp) == 2 and tmp[0] == 'NEEDED':
+            deps.append(tmp[1])
     proc.wait()
     return deps
 
@@ -110,7 +101,7 @@ def gen_list(output, lib):
     libpaths = [os.path.join(substs['DIST'], 'bin')]
     binary_type = get_type(lib)
     if binary_type == ELF:
-        func = dependentlibs_readelf
+        func = dependentlibs_elf_objdump
     elif binary_type == MACHO:
         func = dependentlibs_mac_objdump
     else:
+5 −3
Original line number Diff line number Diff line
@@ -3,9 +3,9 @@

## various stuff that can be plugged in
, flashplayer, hal-flash
, ffmpeg, xorg, alsaLib, libpulseaudio, libcanberra-gtk2, libglvnd
, ffmpeg, xorg, alsaLib, libpulseaudio, libcanberra-gtk2, libglvnd, libnotify
, gnome3/*.gnome-shell*/
, browserpass, chrome-gnome-shell, uget-integrator, plasma5, bukubrow
, browserpass, chrome-gnome-shell, uget-integrator, plasma5, bukubrow, pipewire
, tridactyl-native
, fx_cast_bridge
, udev
@@ -51,6 +51,7 @@ let
      ffmpegSupport = browser.ffmpegSupport or false;
      gssSupport = browser.gssSupport or false;
      alsaSupport = browser.alsaSupport or false;
      pipewireSupport = browser.pipewireSupport or false;

      plugins =
        let
@@ -80,7 +81,8 @@ let
          ++ lib.optional (cfg.enableFXCastBridge or false) fx_cast_bridge
          ++ extraNativeMessagingHosts
        );
      libs =   lib.optionals stdenv.isLinux [ udev libva mesa ]
      libs =   lib.optionals stdenv.isLinux [ udev libva mesa libnotify xorg.libXScrnSaver ]
            ++ lib.optional (pipewireSupport && lib.versionAtLeast version "83") pipewire
            ++ lib.optional ffmpegSupport ffmpeg
            ++ lib.optional gssSupport kerberos
            ++ lib.optional useGlvnd libglvnd