Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: NixOS/nixpkgs
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: e1545d42aac0
Choose a base ref
...
head repository: NixOS/nixpkgs
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: aa4a14b7ad26
Choose a head ref
  • 8 commits
  • 3 files changed
  • 2 contributors

Commits on Jan 13, 2021

  1. firefox: remove superfluous NIX_CFLAGS_COMPILE

    It was added for nspr and nss back in the 55.0.3 to 56.0 upgrade. It
    also served as a workaround for an undeclared gio-unix-2.0 dependency.
    Sometime afterwards nspr was removed, leaving just the two. Since then,
    upstream has added a declaration for gio-unix-2.0 (in FF62). As for the
    nss include it seemingly has no purpose since current firefox builds
    with it removed.
    S-NA committed Jan 13, 2021
    Copy the full SHA
    c6f113a View commit details
  2. firefox: restrict system NSPR workaround

    It only affected FF80 so place an upper bound restriction. See
    bmo#1661096 for details.
    
    This fixes substituteStream() warnings about missing patterns which
    appeared in the logs.
    S-NA committed Jan 13, 2021
    Copy the full SHA
    96c3470 View commit details
  3. firefox: clean up optionals

    Change `lib.optionals a [ b ]` to `lib.optional a b`.
    S-NA committed Jan 13, 2021

    Verified

    This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
    Copy the full SHA
    80e863c View commit details
  4. firefox: remove patchelf usage

    Firefox has a number of optional dependencies that get dlopened.
    Instead of using patchelf to set the RPATH use LD_LIBRARY_PATH.
    The motivation for this is we already set LD_LIBRARY_PATH in the
    wrapper on Linux.
    S-NA committed Jan 13, 2021
    Copy the full SHA
    a277fca View commit details
  5. firefox: simplify NIX_LDFLAGS usage

    This was required to solve the XPCOMGlueLoad error when building with
    LTO. However, it turns out libxul.so is supposed to have some libraries
    that are reported as not found by ldd. Setting the RPATH worked around
    the error as it forced dependency resolution but failed to fix the real
    issue of broken generation of dependentlibs.list.
    
    The libraries that are reported as not found by ldd are supposed to be
    dlopened through the logic found in nsXPCOMGlue.cpp. However since the
    generation of dependentlibs.list is broken under LTO this did not
    happen. Instead of pulling libwayland-client.so from the GTK libraries
    it found the stub library first (libmozwayland.so). The stub library
    causes (as it should) wl_display_connect to always return NULL which is
    the cause of the segmentation fault and LTO breaking wayland support.
    
    Remove the hardcoded path used for the XPCOMGlueLoad error workaround
    in NIX_LDFLAGS. libunwind is still unfortunately needed. Once the issue
    of the generation of dependentlibs.list being borked is fixed it should
    remedy the wayland crash issue on LTO.
    S-NA committed Jan 13, 2021
    Copy the full SHA
    40b4eb1 View commit details
  6. firefox: overhaul LTO

    Enable LTO support on Linux by default again.
    
    Add patch to fix dependentlibs.list generation under LTO. This is
    necessary for fixing firefox-wayland crashing when built with LTO.
    
    Add makeFlags which set ar, ranlib, and nm to be llvm-ar, llvm-ranlib
    and llvm-nm when building with llvm-based LTO. (bmo#1480005)
    S-NA committed Jan 13, 2021
    Copy the full SHA
    7415d05 View commit details
  7. firefox: remove python2 dependency

    Python 2 is no longer required to build Firefox.
    S-NA committed Jan 13, 2021
    Copy the full SHA
    dbe008a View commit details

Commits on Jan 16, 2021

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

    firefox: fix running wayland firefox built with LTO and some miscellaneous improvements
    lovesegfault authored Jan 16, 2021
    Copy the full SHA
    aa4a14b View commit details
67 changes: 32 additions & 35 deletions pkgs/applications/networking/browsers/firefox/common.nix
Original file line number Diff line number Diff line change
@@ -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,22 +90,26 @@ 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 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
# doesn't work on it. For now it is fine since ltoSupport implies no Darwin.
buildStdenv = if ltoSupport
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;
Original file line number Diff line number Diff line change
@@ -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:
8 changes: 5 additions & 3 deletions pkgs/applications/networking/browsers/firefox/wrapper.nix
Original file line number Diff line number Diff line change
@@ -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