summary refs log tree commit diff
path: root/pkgs/applications/networking/browsers/google-chrome/default.nix
blob: eb51fa5c102097188f62ca5664704bbc4c20e607 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
{ stdenv, buildEnv, fetchurl, patchelf, bash

# Linked dynamic libraries.
, glib, fontconfig, freetype, pango, cairo, libX11, libXi, atk, gconf, nss, nspr
, libXcursor, libXext, libXfixes, libXrender, libXScrnSaver, libXcomposite
, alsaLib, libXdamage, libXtst, libXrandr, expat, cups
, dbus_libs, gtk, gdk_pixbuf, gcc

# Will crash without.
, udev

# Loaded at runtime.
, libexif

# Additional dependencies according to other distros.
## Ubuntu
, liberation_ttf, curl, utillinux, 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

}:

with stdenv.lib;

with (import ../chromium/update.nix {
  inherit (stdenv) system;
}).getChannel channel;

let
  opusWithCustomModes = libopus.override {
    withCustomModes = true;
  };

  env = buildEnv {
    name = "google-chrome-env";
    paths = [
      glib fontconfig freetype pango cairo libX11 libXi atk gconf nss nspr
      libXcursor libXext libXfixes libXrender libXScrnSaver libXcomposite
      alsaLib libXdamage libXtst libXrandr expat cups
      dbus_libs gtk gdk_pixbuf gcc
      udev
      libexif
      liberation_ttf curl utillinux xdg_utils wget
      flac harfbuzz icu libpng opusWithCustomModes snappy speechd
      bzip2 libcap
    ]
    ++ optional pulseSupport libpulseaudio;
  };
in stdenv.mkDerivation rec {
  inherit version;

  name = "google-chrome-${version}";

  src = binary;

  buildInputs = [ env patchelf ];

  unpackPhase = ''
    ar x $src
    tar xf data.tar.xz
  '';

  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
    rpath="${env}/lib:${env}/lib64"

    mkdir -p $out/bin $out/share

    cp -a opt/* $out/share
    cp -a usr/share/* $out/share

    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/chrome/google-$appname $exe

    for icon_file in $out/share/google/chrome*/product_logo_*[0-9].png; do
      num_and_suffix="''${icon_file##*logo_}"
      icon_size="''${num_and_suffix%.*}"
      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

    cat > $exe << EOF
    #!${bash}/bin/sh
    export LD_LIBRARY_PATH=$rpath\''${LD_LIBRARY_PATH:+:\$LD_LIBRARY_PATH}
    export PATH=${env}/bin\''${PATH:+:\$PATH}
    $out/share/google/$appname/google-$appname "\$@"
    EOF
    chmod +x $exe

    for elf in $out/share/google/$appname/{chrome,chrome-sandbox,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 = [ maintainers.msteen ];
    platforms = platforms.linux;
  };
}