summary refs log blame commit diff
path: root/pkgs/applications/networking/browsers/chromium/common.nix
blob: 301950e3f44b4d328c2f0a00de586446417d5138 (plain) (tree)
1
2
3
4
5
6




                                  
                          

























                                                       
          




































                                                                            
                            






                                                         
                          








                                                              
                          




                                  
                                                          



















                                              
                                                                 




















                                                                            




                                                                          

                                                                                
                  









                                                     
                                           






                                                                

                                                             









                                                                              
                                                  










                                                                     














                                                                             





                                                                    
{ stdenv, fetchurl, ninja, which

# default dependencies
, bzip2, flac, speex, icu, libopus
, libevent, expat, libjpeg, snappy
, libpng, libxml2, libxslt
, xdg_utils, yasm, minizip, libwebp
, libusb1, libexif, pciutils

, python, pythonPackages, perl, pkgconfig
, nspr, udev, krb5
, utillinux, alsaLib
, gcc, bison, gperf
, glib, gtk, dbus_glib
, libXScrnSaver, libXcursor, libXtst, mesa
, protobuf, speechd, libXdamage

# optional dependencies
, libgcrypt ? null # gnomeSupport || cupsSupport

# package customization
, enableSELinux ? false, libselinux ? null
, enableNaCl ? false
, useOpenSSL ? false, nss ? null, openssl ? null
, gnomeSupport ? false, gnome ? null
, gnomeKeyringSupport ? false, libgnome_keyring3 ? null
, proprietaryCodecs ? true
, cupsSupport ? false
, pulseSupport ? false, pulseaudio ? null

, source
, plugins
, archInfo
}:

buildFun:

with stdenv.lib;

let
  # The additional attributes for creating derivations based on the chromium
  # source tree.
  extraAttrs = buildFun base;

  mkGypFlags =
    let
      sanitize = value:
        if value == true then "1"
        else if value == false then "0"
        else "${value}";
      toFlag = key: value: "-D${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;
    use_system_libexif = true;
    use_system_libjpeg = true;
    use_system_libpng = true;
    use_system_libwebp = true;
    use_system_libxml = true;
    use_system_opus = true;
    use_system_snappy = true;
    use_system_speex = true;
    use_system_ssl = useOpenSSL;
    use_system_stlport = true;
    use_system_xdg_utils = true;
    use_system_yasm = true;
    use_system_zlib = false;
    use_system_protobuf = true;

    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;
  };

  opusWithCustomModes = libopus.override {
    withCustomModes = !versionOlder source.version "35.0.0.0";
  };

  defaultDependencies = [
    bzip2 flac speex icu opusWithCustomModes
    libevent expat libjpeg snappy
    libpng libxml2 libxslt
    xdg_utils yasm minizip libwebp
    libusb1 libexif
  ];

  # 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 (source) version;
    inherit packageName buildType buildPath;
    src = source;

    buildInputs = defaultDependencies ++ [
      which
      python perl pkgconfig
      nspr udev
      (if useOpenSSL then openssl else nss)
      utillinux alsaLib
      gcc bison gperf krb5
      glib gtk dbus_glib
      libXScrnSaver libXcursor libXtst mesa
      pciutils protobuf speechd libXdamage
      pythonPackages.gyp pythonPackages.ply pythonPackages.jinja2
    ] ++ optional gnomeKeyringSupport libgnome_keyring3
      ++ optionals gnomeSupport [ gnome.GConf libgcrypt ]
      ++ optional enableSELinux libselinux
      ++ optional cupsSupport libgcrypt
      ++ optional pulseSupport pulseaudio;

    # XXX: Wait for https://crbug.com/239107 and https://crbug.com/239181 to
    #      be fixed, then try again to unbundle everything into separate
    #      derivations.
    prePatch = ''
      cp -dsr --no-preserve=mode "${source.main}"/* .
      cp -dsr --no-preserve=mode "${source.sandbox}" sandbox
      cp -dr "${source.bundled}" third_party
      chmod -R u+w third_party

      # Hardcode source tree root in all gyp files
      find -iname '*.gyp*' \( -type f -o -type l \) \
        -exec sed -i -e 's|<(DEPTH)|'"$(pwd)"'|g' {} + \
        -exec chmod u+w {} +
    '';

    postPatch = let
      toPatch = if versionOlder source.version "36.0.0.0"
                then "content/browser/browser_main_loop.cc"
                else "sandbox/linux/suid/client/setuid_sandbox_client.cc";
    in ''
      sed -i -e '/base::FilePath exe_dir/,/^ *} *$/c \
        sandbox_binary = base::FilePath(getenv("CHROMIUM_SANDBOX_BINARY_PATH"));
      ' ${toPatch}
    '';

    gypFlags = mkGypFlags (gypFlagsUseSystemLibs // {
      linux_use_gold_binary = false;
      linux_use_gold_flags = false;
      proprietary_codecs = false;
      use_gnome_keyring = gnomeKeyringSupport;
      use_gconf = gnomeSupport;
      use_gio = gnomeSupport;
      use_pulseaudio = pulseSupport;
      linux_link_pulseaudio = pulseSupport;
      disable_nacl = !enableNaCl;
      use_openssl = useOpenSSL;
      selinux = enableSELinux;
      use_cups = cupsSupport;
      linux_sandbox_chrome_path="${libExecPath}/${packageName}";
      werror = "";

      # 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;
      ffmpeg_branding = "Chrome";
    } // archInfo // (extraAttrs.gypFlags or {}));

    configurePhase = ''
      # 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 "$(pwd)" ${gypFlags}
    '';

    buildPhase = let
      CC = "${gcc}/bin/gcc";
      CXX = "${gcc}/bin/g++";
      buildCommand = target: ''
        CC="${CC}" CC_host="${CC}"     \
        CXX="${CXX}" CXX_host="${CXX}" \
        LINK_host="${CXX}"             \
          "${ninja}/bin/ninja" -C "${buildPath}"  \
            -j$NIX_BUILD_CORES -l$NIX_BUILD_CORES \
            ${target}

        if [[ "${target}" == mksnapshot.* || "${target}" == "chrome" ]]; then
          paxmark m "${buildPath}/${target}"
        fi
      '';
      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" "gypFlags" "buildTargets"
])