summary refs log tree commit diff
path: root/pkgs/applications/networking/browsers/chromium
diff options
context:
space:
mode:
authoraszlig <aszlig@redmoonstudios.org>2016-10-29 04:05:53 +0200
committeraszlig <aszlig@redmoonstudios.org>2016-11-08 20:12:11 +0100
commit8391241e0c90c8e5ee90d86d6cc1c9146e575768 (patch)
treee4e8899466fed24d77dc74977b131b210d13c7cd /pkgs/applications/networking/browsers/chromium
parent5f18ccb001caf62e9c4908354a1fea44bb11300b (diff)
downloadnixlib-8391241e0c90c8e5ee90d86d6cc1c9146e575768.tar
nixlib-8391241e0c90c8e5ee90d86d6cc1c9146e575768.tar.gz
nixlib-8391241e0c90c8e5ee90d86d6cc1c9146e575768.tar.bz2
nixlib-8391241e0c90c8e5ee90d86d6cc1c9146e575768.tar.lz
nixlib-8391241e0c90c8e5ee90d86d6cc1c9146e575768.tar.xz
nixlib-8391241e0c90c8e5ee90d86d6cc1c9146e575768.tar.zst
nixlib-8391241e0c90c8e5ee90d86d6cc1c9146e575768.zip
chromium: Build with GN unconditionally
Previously I've added the extra file common-gn.nix in addition to
common.nix, so we can possibly have a smooth transition from current
stable to the new version 54.

Unfortunately, version 53 is already EOL and we have to move to version
54 as soon as possible so we can only use GN and thus it doesn't make
sense to provide expressions for GYP anymore.

Signed-off-by: aszlig <aszlig@redmoonstudios.org>
Diffstat (limited to 'pkgs/applications/networking/browsers/chromium')
-rw-r--r--pkgs/applications/networking/browsers/chromium/common-gn.nix198
-rw-r--r--pkgs/applications/networking/browsers/chromium/common.nix112
-rw-r--r--pkgs/applications/networking/browsers/chromium/default.nix7
3 files changed, 42 insertions, 275 deletions
diff --git a/pkgs/applications/networking/browsers/chromium/common-gn.nix b/pkgs/applications/networking/browsers/chromium/common-gn.nix
deleted file mode 100644
index b574edef205e..000000000000
--- a/pkgs/applications/networking/browsers/chromium/common-gn.nix
+++ /dev/null
@@ -1,198 +0,0 @@
-{ stdenv, gn, ninja, which
-
-# default dependencies
-, bzip2, flac, speex, libopus
-, libevent, expat, libjpeg, snappy
-, libpng, libxml2, libxslt, libcap
-, xdg_utils, yasm, minizip, libwebp
-, libusb1, pciutils, nss, re2, zlib, libvpx
-
-, python, pythonPackages, perl, pkgconfig
-, nspr, systemd, kerberos
-, utillinux, alsaLib
-, bison, gperf
-, glib, gtk2, dbus_glib
-, libXScrnSaver, libXcursor, libXtst, mesa
-, protobuf, speechd, libXdamage, cups
-
-# optional dependencies
-, libgcrypt ? null # gnomeSupport || cupsSupport
-, libexif ? null # only needed for Chromium before version 51
-
-# package customization
-, enableSELinux ? false, libselinux ? null
-, enableNaCl ? false
-, enableHotwording ? false
-, gnomeSupport ? false, gnome ? null
-, gnomeKeyringSupport ? false, libgnome_keyring3 ? null
-, proprietaryCodecs ? true
-, cupsSupport ? true
-, pulseSupport ? false, libpulseaudio ? null
-
-, upstream-info
-}:
-
-buildFun:
-
-with stdenv.lib;
-
-let
-  # The additional attributes for creating derivations based on the chromium
-  # source tree.
-  extraAttrs = buildFun base;
-
-  mkGnFlags =
-    let
-      # Serialize Nix types into GN types according to this document:
-      # https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs/language.md
-      mkGnString = value: "\"${escape ["\"" "$" "\\"] value}\"";
-      sanitize = value:
-        if value == true then "true"
-        else if value == false then "false"
-        else if isList value then "[${concatMapStringsSep ", " sanitize value}]"
-        else if isInt value then toString value
-        else if isString value then mkGnString value
-        else throw "Unsupported type for GN value `${value}'.";
-      toFlag = key: value: "${key}=${sanitize value}";
-    in attrs: concatStringsSep " " (attrValues (mapAttrs toFlag attrs));
-
-  gnSystemLibraries = [
-    "flac" "libjpeg" "libpng" "libvpx" "libwebp" "libxml" "libxslt" "re2"
-    "snappy" "yasm" "zlib"
-  ];
-
-  opusWithCustomModes = libopus.override {
-    withCustomModes = true;
-  };
-
-  defaultDependencies = [
-    bzip2 flac speex opusWithCustomModes
-    libevent expat libjpeg snappy
-    libpng libxml2 libxslt libcap
-    xdg_utils yasm minizip libwebp
-    libusb1 re2 zlib libvpx
-  ];
-
-  # build paths and release info
-  packageName = extraAttrs.packageName or extraAttrs.name;
-  buildType = "Release";
-  buildPath = "out/${buildType}";
-  libExecPath = "$out/libexec/${packageName}";
-
-  base = rec {
-    name = "${packageName}-${version}";
-    inherit (upstream-info) version;
-    inherit packageName buildType buildPath;
-
-    src = upstream-info.main;
-
-    nativeBuildInputs = [ gn which python perl pkgconfig ];
-
-    buildInputs = defaultDependencies ++ [
-      nspr nss systemd
-      utillinux alsaLib
-      bison gperf kerberos
-      glib gtk2 dbus_glib
-      libXScrnSaver libXcursor libXtst mesa
-      pciutils protobuf speechd libXdamage
-      pythonPackages.ply pythonPackages.jinja2
-    ] ++ optional gnomeKeyringSupport libgnome_keyring3
-      ++ optionals gnomeSupport [ gnome.GConf libgcrypt ]
-      ++ optional enableSELinux libselinux
-      ++ optionals cupsSupport [ libgcrypt cups ]
-      ++ optional pulseSupport libpulseaudio;
-
-    patches = [
-      ./patches/widevine.patch
-      ./patches/glibc-2.24.patch
-      ./patches/nix_plugin_paths_52.patch
-    ];
-
-    postPatch = ''
-      # We want to be able to specify where the sandbox is via CHROME_DEVEL_SANDBOX
-      substituteInPlace sandbox/linux/suid/client/setuid_sandbox_host.cc \
-        --replace \
-          'return sandbox_binary;' \
-          'return base::FilePath(GetDevelSandboxPath());'
-
-      sed -i -e '/lib_loader.*Load/s!"\(libudev\.so\)!"${systemd.lib}/lib/\1!' \
-        device/udev_linux/udev?_loader.cc
-
-      sed -i -e '/libpci_loader.*Load/s!"\(libpci\.so\)!"${pciutils}/lib/\1!' \
-        gpu/config/gpu_info_collector_linux.cc
-
-      sed -i -re 's/([^:])\<(isnan *\()/\1std::\2/g' \
-        chrome/browser/ui/webui/engagement/site_engagement_ui.cc
-
-      sed -i -e '/#include/ {
-        i #include <algorithm>
-        :l; n; bl
-      }' gpu/config/gpu_control_list.cc
-
-      patchShebangs .
-    '' + optionalString (versionAtLeast version "52.0.0.0") ''
-      sed -i -re 's/([^:])\<(isnan *\()/\1std::\2/g' \
-        third_party/pdfium/xfa/fxbarcode/utils.h
-    '';
-
-    gnFlags = mkGnFlags ({
-      linux_use_bundled_binutils = false;
-      linux_use_bundled_gold = false;
-      linux_use_gold_flags = true;
-      is_debug = false;
-
-      proprietary_codecs = false;
-      use_sysroot = false;
-      use_gnome_keyring = gnomeKeyringSupport;
-      use_gconf = gnomeSupport;
-      use_gio = gnomeSupport;
-      enable_nacl = enableNaCl;
-      enable_hotwording = enableHotwording;
-      selinux = enableSELinux;
-      use_cups = cupsSupport;
-    } // {
-      treat_warnings_as_errors = false;
-      is_clang = false;
-
-      # Google API keys, see:
-      #   http://www.chromium.org/developers/how-tos/api-keys
-      # Note: These are for NixOS/nixpkgs use ONLY. For your own distribution,
-      # please get your own set of keys.
-      google_api_key = "AIzaSyDGi15Zwl11UNe6Y-5XW_upsfyw31qwZPI";
-      google_default_client_id = "404761575300.apps.googleusercontent.com";
-      google_default_client_secret = "9rIFQjfnkykEmqb6FfjJQD1D";
-    } // optionalAttrs proprietaryCodecs {
-      # enable support for the H.264 codec
-      proprietary_codecs = true;
-      enable_hangout_services_extension = true;
-      ffmpeg_branding = "Chrome";
-    } // optionalAttrs pulseSupport {
-      use_pulseaudio = true;
-      link_pulseaudio = true;
-    } // (extraAttrs.gnFlags or {}));
-
-    configurePhase = ''
-      # This is to ensure expansion of $out.
-      libExecPath="${libExecPath}"
-      python build/linux/unbundle/replace_gn_files.py \
-        --system-libraries ${toString gnSystemLibraries}
-      gn gen --args=${escapeShellArg gnFlags} out/Release
-    '';
-
-    buildPhase = let
-      buildCommand = target: ''
-        "${ninja}/bin/ninja" -C "${buildPath}"  \
-          -j$NIX_BUILD_CORES -l$NIX_BUILD_CORES \
-          "${target}"
-      '' + optionalString (target == "mksnapshot" || target == "chrome") ''
-        paxmark m "${buildPath}/${target}"
-      '';
-      targets = extraAttrs.buildTargets or [];
-      commands = map buildCommand targets;
-    in concatStringsSep "\n" commands;
-  };
-
-# Remove some extraAttrs we supplied to the base attributes already.
-in stdenv.mkDerivation (base // removeAttrs extraAttrs [
-  "name" "gnFlags" "buildTargets"
-])
diff --git a/pkgs/applications/networking/browsers/chromium/common.nix b/pkgs/applications/networking/browsers/chromium/common.nix
index 3ff90d28b9f8..b574edef205e 100644
--- a/pkgs/applications/networking/browsers/chromium/common.nix
+++ b/pkgs/applications/networking/browsers/chromium/common.nix
@@ -1,13 +1,13 @@
-{ stdenv, ninja, which
+{ stdenv, gn, ninja, which
 
 # default dependencies
 , bzip2, flac, speex, libopus
 , libevent, expat, libjpeg, snappy
 , libpng, libxml2, libxslt, libcap
 , xdg_utils, yasm, minizip, libwebp
-, libusb1, pciutils, nss
+, libusb1, pciutils, nss, re2, zlib, libvpx
 
-, python2Packages, perl, pkgconfig
+, python, pythonPackages, perl, pkgconfig
 , nspr, systemd, kerberos
 , utillinux, alsaLib
 , bison, gperf
@@ -37,47 +37,29 @@ buildFun:
 with stdenv.lib;
 
 let
-  inherit (python2Packages) python gyp ply jinja2;
-
   # The additional attributes for creating derivations based on the chromium
   # source tree.
   extraAttrs = buildFun base;
 
-  mkGypFlags =
+  mkGnFlags =
     let
+      # Serialize Nix types into GN types according to this document:
+      # https://chromium.googlesource.com/chromium/src/+/master/tools/gn/docs/language.md
+      mkGnString = value: "\"${escape ["\"" "$" "\\"] value}\"";
       sanitize = value:
-        if value == true then "1"
-        else if value == false then "0"
-        else "${value}";
-      toFlag = key: value: "-D${key}=${sanitize value}";
+        if value == true then "true"
+        else if value == false then "false"
+        else if isList value then "[${concatMapStringsSep ", " sanitize value}]"
+        else if isInt value then toString value
+        else if isString value then mkGnString value
+        else throw "Unsupported type for GN value `${value}'.";
+      toFlag = key: value: "${key}=${sanitize value}";
     in attrs: concatStringsSep " " (attrValues (mapAttrs toFlag attrs));
 
-  gypFlagsUseSystemLibs = {
-    use_system_bzip2 = true;
-    use_system_flac = true;
-    use_system_libevent = true;
-    use_system_libexpat = true;
-    # XXX: System libjpeg fails to link for version 52.0.2743.10
-    use_system_libjpeg = versionOlder upstream-info.version "52.0.2743.10";
-    use_system_libpng = false;
-    use_system_libwebp = true;
-    use_system_libxml = true;
-    use_system_opus = true;
-    use_system_snappy = true;
-    use_system_speex = true;
-    use_system_stlport = true;
-    use_system_xdg_utils = true;
-    use_system_yasm = true;
-    use_system_zlib = false;
-    use_system_protobuf = false; # needs newer protobuf
-
-    use_system_harfbuzz = false;
-    use_system_icu = false; # Doesn't support ICU 52 yet.
-    use_system_libusb = false; # http://crbug.com/266149
-    use_system_skia = false;
-    use_system_sqlite = false; # http://crbug.com/22208
-    use_system_v8 = false;
-  };
+  gnSystemLibraries = [
+    "flac" "libjpeg" "libpng" "libvpx" "libwebp" "libxml" "libxslt" "re2"
+    "snappy" "yasm" "zlib"
+  ];
 
   opusWithCustomModes = libopus.override {
     withCustomModes = true;
@@ -88,7 +70,7 @@ let
     libevent expat libjpeg snappy
     libpng libxml2 libxslt libcap
     xdg_utils yasm minizip libwebp
-    libusb1
+    libusb1 re2 zlib libvpx
   ];
 
   # build paths and release info
@@ -104,23 +86,16 @@ let
 
     src = upstream-info.main;
 
-    unpackCmd = ''
-      tar xf "$src" \
-        --anchored \
-        --no-wildcards-match-slash \
-        --exclude='*/tools/gyp'
-    '';
+    nativeBuildInputs = [ gn which python perl pkgconfig ];
 
     buildInputs = defaultDependencies ++ [
-      which
-      python perl pkgconfig
       nspr nss systemd
       utillinux alsaLib
       bison gperf kerberos
       glib gtk2 dbus_glib
       libXScrnSaver libXcursor libXtst mesa
       pciutils protobuf speechd libXdamage
-      gyp ply jinja2
+      pythonPackages.ply pythonPackages.jinja2
     ] ++ optional gnomeKeyringSupport libgnome_keyring3
       ++ optionals gnomeSupport [ gnome.GConf libgcrypt ]
       ++ optional enableSELinux libselinux
@@ -140,12 +115,6 @@ let
           'return sandbox_binary;' \
           'return base::FilePath(GetDevelSandboxPath());'
 
-      sed -i -r \
-        -e 's/-f(stack-protector)(-all)?/-fno-\1/' \
-        -e 's|/bin/echo|echo|' \
-        -e "/python_arch/s/: *'[^']*'/: '""'/" \
-        build/common.gypi chrome/chrome_tests.gypi
-
       sed -i -e '/lib_loader.*Load/s!"\(libudev\.so\)!"${systemd.lib}/lib/\1!' \
         device/udev_linux/udev?_loader.cc
 
@@ -154,30 +123,36 @@ let
 
       sed -i -re 's/([^:])\<(isnan *\()/\1std::\2/g' \
         chrome/browser/ui/webui/engagement/site_engagement_ui.cc
+
+      sed -i -e '/#include/ {
+        i #include <algorithm>
+        :l; n; bl
+      }' gpu/config/gpu_control_list.cc
+
+      patchShebangs .
     '' + optionalString (versionAtLeast version "52.0.0.0") ''
       sed -i -re 's/([^:])\<(isnan *\()/\1std::\2/g' \
         third_party/pdfium/xfa/fxbarcode/utils.h
     '';
 
-    gypFlags = mkGypFlags (gypFlagsUseSystemLibs // {
+    gnFlags = mkGnFlags ({
       linux_use_bundled_binutils = false;
       linux_use_bundled_gold = false;
       linux_use_gold_flags = true;
+      is_debug = false;
 
       proprietary_codecs = false;
       use_sysroot = false;
       use_gnome_keyring = gnomeKeyringSupport;
       use_gconf = gnomeSupport;
       use_gio = gnomeSupport;
-      use_pulseaudio = pulseSupport;
-      linux_link_pulseaudio = pulseSupport;
-      disable_nacl = !enableNaCl;
+      enable_nacl = enableNaCl;
       enable_hotwording = enableHotwording;
       selinux = enableSELinux;
       use_cups = cupsSupport;
     } // {
-      werror = "";
-      clang = false;
+      treat_warnings_as_errors = false;
+      is_clang = false;
 
       # Google API keys, see:
       #   http://www.chromium.org/developers/how-tos/api-keys
@@ -191,22 +166,17 @@ let
       proprietary_codecs = true;
       enable_hangout_services_extension = true;
       ffmpeg_branding = "Chrome";
-    } // optionalAttrs (stdenv.system == "x86_64-linux") {
-      target_arch = "x64";
-      python_arch = "x86-64";
-    } // optionalAttrs (stdenv.system == "i686-linux") {
-      target_arch = "ia32";
-      python_arch = "ia32";
-    } // (extraAttrs.gypFlags or {}));
+    } // optionalAttrs pulseSupport {
+      use_pulseaudio = true;
+      link_pulseaudio = true;
+    } // (extraAttrs.gnFlags or {}));
 
     configurePhase = ''
-      echo "Precompiling .py files to prevent race conditions..." >&2
-      python -m compileall -q -f . > /dev/null 2>&1 || : # ignore errors
-
       # This is to ensure expansion of $out.
       libExecPath="${libExecPath}"
-      python build/linux/unbundle/replace_gyp_files.py ${gypFlags}
-      python build/gyp_chromium -f ninja --depth . ${gypFlags}
+      python build/linux/unbundle/replace_gn_files.py \
+        --system-libraries ${toString gnSystemLibraries}
+      gn gen --args=${escapeShellArg gnFlags} out/Release
     '';
 
     buildPhase = let
@@ -224,5 +194,5 @@ let
 
 # Remove some extraAttrs we supplied to the base attributes already.
 in stdenv.mkDerivation (base // removeAttrs extraAttrs [
-  "name" "gypFlags" "buildTargets"
+  "name" "gnFlags" "buildTargets"
 ])
diff --git a/pkgs/applications/networking/browsers/chromium/default.nix b/pkgs/applications/networking/browsers/chromium/default.nix
index fd42c1b927b0..bf4e4cf8ae36 100644
--- a/pkgs/applications/networking/browsers/chromium/default.nix
+++ b/pkgs/applications/networking/browsers/chromium/default.nix
@@ -17,15 +17,10 @@
 let
   callPackage = newScope chromium;
 
-  # XXX: This is an ugly hack for the transition to GN:
-  inherit (stdenv.lib) versionAtLeast;
-  gnRequired = versionAtLeast chromium.upstream-info.version "54.0.0.0";
-  common = if gnRequired then ./common-gn.nix else ./common.nix;
-
   chromium = {
     upstream-info = (callPackage ./update.nix {}).getChannel channel;
 
-    mkChromiumDerivation = callPackage common {
+    mkChromiumDerivation = callPackage ./common.nix {
       inherit enableSELinux enableNaCl enableHotwording gnomeSupport gnome
               gnomeKeyringSupport proprietaryCodecs cupsSupport pulseSupport;
     };