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

firefox: fix running wayland firefox built with LTO and some miscellaneous improvements
This commit is contained in:
Bernardo Meurer 2021-01-16 23:17:57 +00:00 committed by GitHub
commit aa4a14b7ad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 82 additions and 38 deletions

View File

@ -2,9 +2,9 @@
, src, unpackPhase ? null, patches ? [] , src, unpackPhase ? null, patches ? []
, extraNativeBuildInputs ? [], extraConfigureFlags ? [], extraMakeFlags ? [] }: , 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 , 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 , yasm, libGLU, libGL, sqlite, unzip, makeWrapper
, hunspell, libXdamage, libevent, libstartup_notification , hunspell, libXdamage, libevent, libstartup_notification
, libvpx_1_8 , libvpx_1_8
@ -23,8 +23,7 @@
, ffmpegSupport ? true , ffmpegSupport ? true
, gtk3Support ? true, gtk2, gtk3, wrapGAppsHook , gtk3Support ? true, gtk2, gtk3, wrapGAppsHook
, waylandSupport ? true, libxkbcommon , waylandSupport ? true, libxkbcommon
# LTO is disabled since it caused segfaults on wayland see https://github.com/NixOS/nixpkgs/issues/101429 , ltoSupport ? stdenv.isLinux, overrideCC, buildPackages
, ltoSupport ? false, overrideCC, buildPackages
, gssSupport ? true, kerberos , gssSupport ? true, kerberos
, pipewireSupport ? waylandSupport && webrtcSupport, pipewire , pipewireSupport ? waylandSupport && webrtcSupport, pipewire
@ -91,11 +90,19 @@ let
then "/Applications/${binaryNameCapitalized}.app/Contents/MacOS" then "/Applications/${binaryNameCapitalized}.app/Contents/MacOS"
else "/bin"; 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 # Darwin's stdenv provides the default llvmPackages version, match that since
# clang LTO on Darwin is broken so the stdenv is not being changed. # 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 llvmPackages = if stdenv.isDarwin
then buildPackages.llvmPackages then buildPackages.llvmPackages
else buildPackages.llvmPackages_10; 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 # When LTO for Darwin is fixed, the following will need updating as lld
# doesn't work on it. For now it is fine since ltoSupport implies no Darwin. # doesn't work on it. For now it is fine since ltoSupport implies no Darwin.
@ -103,10 +110,6 @@ let
then overrideCC stdenv llvmPackages.lldClang then overrideCC stdenv llvmPackages.lldClang
else stdenv; 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; nss_pkg = if lib.versionOlder ffversion "83" then nss_3_53 else nss;
in in
@ -121,13 +124,19 @@ buildStdenv.mkDerivation ({
] ++ ] ++
lib.optional (lib.versionOlder ffversion "83") ./no-buildconfig-ffx76.patch ++ lib.optional (lib.versionOlder ffversion "83") ./no-buildconfig-ffx76.patch ++
lib.optional (lib.versionAtLeast ffversion "84") ./no-buildconfig-ffx84.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 # there are two flavors of pipewire support
# The patches for the ESR release and the patches for the current stable # The patches for the ESR release and the patches for the current stable
# release. # release.
# Until firefox upstream stabilizes pipewire support we will have to continue # Until firefox upstream stabilizes pipewire support we will have to continue
# tracking multiple versions here. # tracking multiple versions here.
lib.optional (pipewireSupport && lib.versionOlder ffversion "83") ++ lib.optional (pipewireSupport && lib.versionOlder ffversion "83")
(fetchpatch { (fetchpatch {
# https://src.fedoraproject.org/rpms/firefox/blob/master/f/firefox-pipewire-0-3.patch # 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"; 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 gtk2 perl zip libjpeg zlib bzip2
dbus dbus-glib pango freetype fontconfig xorg.libXi xorg.libXcursor dbus dbus-glib pango freetype fontconfig xorg.libXi xorg.libXcursor
xorg.libX11 xorg.libXrender xorg.libXft xorg.libXt file xorg.libX11 xorg.libXrender xorg.libXft xorg.libXt file
libnotify xorg.pixman yasm libGLU libGL xorg.pixman yasm libGLU libGL
xorg.xorgproto xorg.xorgproto
xorg.libXext unzip makeWrapper xorg.libXext unzip makeWrapper
libevent libstartup_notification /* cairo */ libevent libstartup_notification /* cairo */
@ -173,24 +182,17 @@ buildStdenv.mkDerivation ({
++ lib.optional pulseaudioSupport libpulseaudio # only headers are needed ++ lib.optional pulseaudioSupport libpulseaudio # only headers are needed
++ lib.optional gtk3Support gtk3 ++ lib.optional gtk3Support gtk3
++ lib.optional gssSupport kerberos ++ lib.optional gssSupport kerberos
++ lib.optional ltoSupport llvmPackages.libunwind ++ lib.optional waylandSupport libxkbcommon
++ lib.optionals waylandSupport [ libxkbcommon ] ++ lib.optional pipewireSupport pipewire
++ lib.optionals pipewireSupport [ pipewire ] ++ lib.optional (lib.versionAtLeast ffversion "82") gnum4
++ lib.optionals (lib.versionAtLeast ffversion "82") [ gnum4 ]
++ lib.optionals buildStdenv.isDarwin [ CoreMedia ExceptionHandling Kerberos ++ lib.optionals buildStdenv.isDarwin [ CoreMedia ExceptionHandling Kerberos
AVFoundation MediaToolbox CoreLocation AVFoundation MediaToolbox CoreLocation
Foundation libobjc AddressBook cups ]; Foundation libobjc AddressBook cups ];
NIX_LDFLAGS = lib.optionalString ltoSupport '' NIX_LDFLAGS = lib.optionalString ltoSupport ''
-rpath ${placeholder "out"}/lib/${binaryName}
-rpath ${llvmPackages.libunwind.out}/lib -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"; MACH_USE_SYSTEM_PYTHON = "1";
postPatch = '' postPatch = ''
@ -202,7 +204,7 @@ buildStdenv.mkDerivation ({
substituteInPlace \ substituteInPlace \
media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build \ media/webrtc/trunk/webrtc/modules/desktop_capture/desktop_capture_generic_gn/moz.build \
--replace /usr/include ${pipewire.dev}/include --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 \ substituteInPlace dom/system/IOUtils.h \
--replace '#include "nspr/prio.h"' '#include "prio.h"' --replace '#include "nspr/prio.h"' '#include "prio.h"'
@ -221,7 +223,6 @@ buildStdenv.mkDerivation ({
nodejs nodejs
perl perl
pkgconfig pkgconfig
python2
python3 python3
rust-cbindgen rust-cbindgen
rustc rustc
@ -323,6 +324,13 @@ buildStdenv.mkDerivation ({
"MOZILLA_OFFICIAL=1" "MOZILLA_OFFICIAL=1"
"BUILD_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; ++ extraMakeFlags;
enableParallelBuilding = true; enableParallelBuilding = true;
@ -341,18 +349,6 @@ buildStdenv.mkDerivation ({
gappsWrapperArgs+=(--argv0 "$out/bin/.${binaryName}-wrapped") 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; doInstallCheck = true;
installCheckPhase = '' installCheckPhase = ''
# Some basic testing # Some basic testing
@ -365,6 +361,7 @@ buildStdenv.mkDerivation ({
isFirefox3Like = true; isFirefox3Like = true;
gtk = gtk2; gtk = gtk2;
inherit alsaSupport; inherit alsaSupport;
inherit pipewireSupport;
inherit nspr; inherit nspr;
inherit ffmpegSupport; inherit ffmpegSupport;
inherit gssSupport; inherit gssSupport;

View File

@ -0,0 +1,45 @@
--- 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:

View File

@ -3,9 +3,9 @@
## various stuff that can be plugged in ## various stuff that can be plugged in
, flashplayer, hal-flash , flashplayer, hal-flash
, ffmpeg, xorg, alsaLib, libpulseaudio, libcanberra-gtk2, libglvnd , ffmpeg, xorg, alsaLib, libpulseaudio, libcanberra-gtk2, libglvnd, libnotify
, gnome3/*.gnome-shell*/ , gnome3/*.gnome-shell*/
, browserpass, chrome-gnome-shell, uget-integrator, plasma5, bukubrow , browserpass, chrome-gnome-shell, uget-integrator, plasma5, bukubrow, pipewire
, tridactyl-native , tridactyl-native
, fx_cast_bridge , fx_cast_bridge
, udev , udev
@ -51,6 +51,7 @@ let
ffmpegSupport = browser.ffmpegSupport or false; ffmpegSupport = browser.ffmpegSupport or false;
gssSupport = browser.gssSupport or false; gssSupport = browser.gssSupport or false;
alsaSupport = browser.alsaSupport or false; alsaSupport = browser.alsaSupport or false;
pipewireSupport = browser.pipewireSupport or false;
plugins = plugins =
let let
@ -80,7 +81,8 @@ let
++ lib.optional (cfg.enableFXCastBridge or false) fx_cast_bridge ++ lib.optional (cfg.enableFXCastBridge or false) fx_cast_bridge
++ extraNativeMessagingHosts ++ 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 ffmpegSupport ffmpeg
++ lib.optional gssSupport kerberos ++ lib.optional gssSupport kerberos
++ lib.optional useGlvnd libglvnd ++ lib.optional useGlvnd libglvnd