diff options
-rw-r--r-- | pkgs/applications/networking/browsers/chromium/common-gn.nix | 202 | ||||
-rw-r--r-- | pkgs/applications/networking/browsers/chromium/default.nix | 7 |
2 files changed, 208 insertions, 1 deletions
diff --git a/pkgs/applications/networking/browsers/chromium/common-gn.nix b/pkgs/applications/networking/browsers/chromium/common-gn.nix new file mode 100644 index 00000000000..e795c2735b0 --- /dev/null +++ b/pkgs/applications/networking/browsers/chromium/common-gn.nix @@ -0,0 +1,202 @@ +{ 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 +, hiDPISupport ? false + +, 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 + (if versionOlder version "52.0.0.0" + then ./patches/nix_plugin_paths_50.patch + else ./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; + enable_hidpi = hiDPISupport; + + # 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/default.nix b/pkgs/applications/networking/browsers/chromium/default.nix index 7402a8bae29..c03011c07c1 100644 --- a/pkgs/applications/networking/browsers/chromium/default.nix +++ b/pkgs/applications/networking/browsers/chromium/default.nix @@ -18,10 +18,15 @@ 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.nix { + mkChromiumDerivation = callPackage common { inherit enableSELinux enableNaCl enableHotwording gnomeSupport gnome gnomeKeyringSupport proprietaryCodecs cupsSupport pulseSupport hiDPISupport; |