3
0
Fork 0
forked from mirrors/nixpkgs
nixpkgs/pkgs/applications/networking/browsers/google-chrome/default.nix
Luke Granger-Brown 51d83077ff google-chrome: avoid crash under some situations
If our Chrome derivation is Vulkan enabled, the Chrome GPU process
reliably crashes for me under M92 using the proprietary Nvidia drivers.
This is because the PCI-based GPU detection path fails, and we attempt
to use the Vulkan fallback instead, which then crashes(!!)

Including libpci allows us to use Angle's
src/gpu_info_util/SystemInfo_libpci.cpp path instead, which doesn't
crash, unlike src/gpu_info_util/SystemInfo_vulkan.cpp.
2021-07-25 08:53:56 +01:00

169 lines
5.1 KiB
Nix

{ lib, stdenv, patchelf, makeWrapper
# Linked dynamic libraries.
, glib, fontconfig, freetype, pango, cairo, libX11, libXi, atk, gconf, nss, nspr
, libXcursor, libXext, libXfixes, libXrender, libXScrnSaver, libXcomposite, libxcb
, alsa-lib, libXdamage, libXtst, libXrandr, libxshmfence, expat, cups
, dbus, gtk3, gdk-pixbuf, gcc-unwrapped, at-spi2-atk, at-spi2-core
, libkrb5, libdrm, mesa
, libxkbcommon, wayland # ozone/wayland
# Command line programs
, coreutils
# command line arguments which are always set e.g "--disable-gpu"
, commandLineArgs ? ""
# Will crash without.
, systemd
# Loaded at runtime.
, libexif, pciutils
# Additional dependencies according to other distros.
## Ubuntu
, liberation_ttf, curl, util-linux, xdg-utils, wget
## Arch Linux.
, flac, harfbuzz, icu, libpng, libopus, snappy, speechd
## Gentoo
, bzip2, libcap
# Which distribution channel to use.
, channel ? "stable"
# Necessary for USB audio devices.
, pulseSupport ? true, libpulseaudio ? null
# Only needed for getting information about upstream binaries
, chromium
, gsettings-desktop-schemas
, gnome
# For video acceleration via VA-API (--enable-features=VaapiVideoDecoder)
, libvaSupport ? true, libva
# For Vulkan support (--enable-features=Vulkan)
, vulkanSupport ? true, vulkan-loader
}:
with lib;
let
opusWithCustomModes = libopus.override {
withCustomModes = true;
};
version = chromium.upstream-info.version;
deps = [
glib fontconfig freetype pango cairo libX11 libXi atk gconf nss nspr
libXcursor libXext libXfixes libXrender libXScrnSaver libXcomposite libxcb
alsa-lib libXdamage libXtst libXrandr libxshmfence expat cups
dbus gdk-pixbuf gcc-unwrapped.lib
systemd
libexif pciutils
liberation_ttf curl util-linux xdg-utils wget
flac harfbuzz icu libpng opusWithCustomModes snappy speechd
bzip2 libcap at-spi2-atk at-spi2-core
libkrb5 libdrm mesa coreutils
libxkbcommon wayland
] ++ optional pulseSupport libpulseaudio
++ optional libvaSupport libva
++ optional vulkanSupport vulkan-loader
++ [ gtk3 ];
suffix = if channel != "stable" then "-" + channel else "";
in stdenv.mkDerivation {
inherit version;
name = "google-chrome${suffix}-${version}";
src = chromium.chromeSrc;
nativeBuildInputs = [ patchelf makeWrapper ];
buildInputs = [
# needed for GSETTINGS_SCHEMAS_PATH
gsettings-desktop-schemas glib gtk3
# needed for XDG_ICON_DIRS
gnome.adwaita-icon-theme
];
unpackPhase = ''
ar x $src
tar xf data.tar.xz
'';
rpath = makeLibraryPath deps + ":" + makeSearchPathOutput "lib" "lib64" deps;
binpath = makeBinPath deps;
installPhase = ''
case ${channel} in
beta) appname=chrome-beta dist=beta ;;
dev) appname=chrome-unstable dist=unstable ;;
*) appname=chrome dist=stable ;;
esac
exe=$out/bin/google-chrome-$dist
mkdir -p $out/bin $out/share
cp -a opt/* $out/share
cp -a usr/share/* $out/share
# To fix --use-gl=egl:
test -e $out/share/google/$appname/libEGL.so
ln -s libEGL.so $out/share/google/$appname/libEGL.so.1
test -e $out/share/google/$appname/libGLESv2.so
ln -s libGLESv2.so $out/share/google/$appname/libGLESv2.so.2
substituteInPlace $out/share/applications/google-$appname.desktop \
--replace /usr/bin/google-chrome-$dist $exe
substituteInPlace $out/share/gnome-control-center/default-apps/google-$appname.xml \
--replace /opt/google/$appname/google-$appname $exe
substituteInPlace $out/share/menu/google-$appname.menu \
--replace /opt $out/share \
--replace $out/share/google/$appname/google-$appname $exe
for icon_file in $out/share/google/chrome*/product_logo_[0-9]*.png; do
num_and_suffix="''${icon_file##*logo_}"
if [ $dist = "stable" ]; then
icon_size="''${num_and_suffix%.*}"
else
icon_size="''${num_and_suffix%_*}"
fi
logo_output_prefix="$out/share/icons/hicolor"
logo_output_path="$logo_output_prefix/''${icon_size}x''${icon_size}/apps"
mkdir -p "$logo_output_path"
mv "$icon_file" "$logo_output_path/google-$appname.png"
done
makeWrapper "$out/share/google/$appname/google-$appname" "$exe" \
--prefix LD_LIBRARY_PATH : "$rpath" \
--prefix PATH : "$binpath" \
--prefix XDG_DATA_DIRS : "$XDG_ICON_DIRS:$GSETTINGS_SCHEMAS_PATH" \
--add-flags ${escapeShellArg commandLineArgs}
for elf in $out/share/google/$appname/{chrome,chrome-sandbox,crashpad_handler,nacl_helper}; do
patchelf --set-rpath $rpath $elf
patchelf --set-interpreter "$(cat $NIX_CC/nix-support/dynamic-linker)" $elf
done
'';
meta = {
description = "A freeware web browser developed by Google";
homepage = "https://www.google.com/chrome/browser/";
license = licenses.unfree;
maintainers = with maintainers; [ primeos ];
# Note from primeos: By updating Chromium I also update Google Chrome and
# will try to merge PRs and respond to issues but I'm not actually using
# Google Chrome.
platforms = [ "x86_64-linux" ];
mainProgram =
if (channel == "dev") then "google-chrome-unstable"
else "google-chrome-${channel}";
};
}