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>
This commit is contained in:
aszlig 2016-10-29 04:05:53 +02:00
parent 5f18ccb001
commit 8391241e0c
No known key found for this signature in database
GPG Key ID: 1DE8E48E57DB5436
3 changed files with 42 additions and 275 deletions

View File

@ -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"
])

View File

@ -1,13 +1,13 @@
{ stdenv, ninja, which { stdenv, gn, ninja, which
# default dependencies # default dependencies
, bzip2, flac, speex, libopus , bzip2, flac, speex, libopus
, libevent, expat, libjpeg, snappy , libevent, expat, libjpeg, snappy
, libpng, libxml2, libxslt, libcap , libpng, libxml2, libxslt, libcap
, xdg_utils, yasm, minizip, libwebp , xdg_utils, yasm, minizip, libwebp
, libusb1, pciutils, nss , libusb1, pciutils, nss, re2, zlib, libvpx
, python2Packages, perl, pkgconfig , python, pythonPackages, perl, pkgconfig
, nspr, systemd, kerberos , nspr, systemd, kerberos
, utillinux, alsaLib , utillinux, alsaLib
, bison, gperf , bison, gperf
@ -37,47 +37,29 @@ buildFun:
with stdenv.lib; with stdenv.lib;
let let
inherit (python2Packages) python gyp ply jinja2;
# The additional attributes for creating derivations based on the chromium # The additional attributes for creating derivations based on the chromium
# source tree. # source tree.
extraAttrs = buildFun base; extraAttrs = buildFun base;
mkGypFlags = mkGnFlags =
let 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: sanitize = value:
if value == true then "1" if value == true then "true"
else if value == false then "0" else if value == false then "false"
else "${value}"; else if isList value then "[${concatMapStringsSep ", " sanitize value}]"
toFlag = key: value: "-D${key}=${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)); in attrs: concatStringsSep " " (attrValues (mapAttrs toFlag attrs));
gypFlagsUseSystemLibs = { gnSystemLibraries = [
use_system_bzip2 = true; "flac" "libjpeg" "libpng" "libvpx" "libwebp" "libxml" "libxslt" "re2"
use_system_flac = true; "snappy" "yasm" "zlib"
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;
};
opusWithCustomModes = libopus.override { opusWithCustomModes = libopus.override {
withCustomModes = true; withCustomModes = true;
@ -88,7 +70,7 @@ let
libevent expat libjpeg snappy libevent expat libjpeg snappy
libpng libxml2 libxslt libcap libpng libxml2 libxslt libcap
xdg_utils yasm minizip libwebp xdg_utils yasm minizip libwebp
libusb1 libusb1 re2 zlib libvpx
]; ];
# build paths and release info # build paths and release info
@ -104,23 +86,16 @@ let
src = upstream-info.main; src = upstream-info.main;
unpackCmd = '' nativeBuildInputs = [ gn which python perl pkgconfig ];
tar xf "$src" \
--anchored \
--no-wildcards-match-slash \
--exclude='*/tools/gyp'
'';
buildInputs = defaultDependencies ++ [ buildInputs = defaultDependencies ++ [
which
python perl pkgconfig
nspr nss systemd nspr nss systemd
utillinux alsaLib utillinux alsaLib
bison gperf kerberos bison gperf kerberos
glib gtk2 dbus_glib glib gtk2 dbus_glib
libXScrnSaver libXcursor libXtst mesa libXScrnSaver libXcursor libXtst mesa
pciutils protobuf speechd libXdamage pciutils protobuf speechd libXdamage
gyp ply jinja2 pythonPackages.ply pythonPackages.jinja2
] ++ optional gnomeKeyringSupport libgnome_keyring3 ] ++ optional gnomeKeyringSupport libgnome_keyring3
++ optionals gnomeSupport [ gnome.GConf libgcrypt ] ++ optionals gnomeSupport [ gnome.GConf libgcrypt ]
++ optional enableSELinux libselinux ++ optional enableSELinux libselinux
@ -140,12 +115,6 @@ let
'return sandbox_binary;' \ 'return sandbox_binary;' \
'return base::FilePath(GetDevelSandboxPath());' '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!' \ sed -i -e '/lib_loader.*Load/s!"\(libudev\.so\)!"${systemd.lib}/lib/\1!' \
device/udev_linux/udev?_loader.cc device/udev_linux/udev?_loader.cc
@ -154,30 +123,36 @@ let
sed -i -re 's/([^:])\<(isnan *\()/\1std::\2/g' \ sed -i -re 's/([^:])\<(isnan *\()/\1std::\2/g' \
chrome/browser/ui/webui/engagement/site_engagement_ui.cc 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") '' '' + optionalString (versionAtLeast version "52.0.0.0") ''
sed -i -re 's/([^:])\<(isnan *\()/\1std::\2/g' \ sed -i -re 's/([^:])\<(isnan *\()/\1std::\2/g' \
third_party/pdfium/xfa/fxbarcode/utils.h third_party/pdfium/xfa/fxbarcode/utils.h
''; '';
gypFlags = mkGypFlags (gypFlagsUseSystemLibs // { gnFlags = mkGnFlags ({
linux_use_bundled_binutils = false; linux_use_bundled_binutils = false;
linux_use_bundled_gold = false; linux_use_bundled_gold = false;
linux_use_gold_flags = true; linux_use_gold_flags = true;
is_debug = false;
proprietary_codecs = false; proprietary_codecs = false;
use_sysroot = false; use_sysroot = false;
use_gnome_keyring = gnomeKeyringSupport; use_gnome_keyring = gnomeKeyringSupport;
use_gconf = gnomeSupport; use_gconf = gnomeSupport;
use_gio = gnomeSupport; use_gio = gnomeSupport;
use_pulseaudio = pulseSupport; enable_nacl = enableNaCl;
linux_link_pulseaudio = pulseSupport;
disable_nacl = !enableNaCl;
enable_hotwording = enableHotwording; enable_hotwording = enableHotwording;
selinux = enableSELinux; selinux = enableSELinux;
use_cups = cupsSupport; use_cups = cupsSupport;
} // { } // {
werror = ""; treat_warnings_as_errors = false;
clang = false; is_clang = false;
# Google API keys, see: # Google API keys, see:
# http://www.chromium.org/developers/how-tos/api-keys # http://www.chromium.org/developers/how-tos/api-keys
@ -191,22 +166,17 @@ let
proprietary_codecs = true; proprietary_codecs = true;
enable_hangout_services_extension = true; enable_hangout_services_extension = true;
ffmpeg_branding = "Chrome"; ffmpeg_branding = "Chrome";
} // optionalAttrs (stdenv.system == "x86_64-linux") { } // optionalAttrs pulseSupport {
target_arch = "x64"; use_pulseaudio = true;
python_arch = "x86-64"; link_pulseaudio = true;
} // optionalAttrs (stdenv.system == "i686-linux") { } // (extraAttrs.gnFlags or {}));
target_arch = "ia32";
python_arch = "ia32";
} // (extraAttrs.gypFlags or {}));
configurePhase = '' 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. # This is to ensure expansion of $out.
libExecPath="${libExecPath}" libExecPath="${libExecPath}"
python build/linux/unbundle/replace_gyp_files.py ${gypFlags} python build/linux/unbundle/replace_gn_files.py \
python build/gyp_chromium -f ninja --depth . ${gypFlags} --system-libraries ${toString gnSystemLibraries}
gn gen --args=${escapeShellArg gnFlags} out/Release
''; '';
buildPhase = let buildPhase = let
@ -224,5 +194,5 @@ let
# Remove some extraAttrs we supplied to the base attributes already. # Remove some extraAttrs we supplied to the base attributes already.
in stdenv.mkDerivation (base // removeAttrs extraAttrs [ in stdenv.mkDerivation (base // removeAttrs extraAttrs [
"name" "gypFlags" "buildTargets" "name" "gnFlags" "buildTargets"
]) ])

View File

@ -17,15 +17,10 @@
let let
callPackage = newScope chromium; 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 = { chromium = {
upstream-info = (callPackage ./update.nix {}).getChannel channel; upstream-info = (callPackage ./update.nix {}).getChannel channel;
mkChromiumDerivation = callPackage common { mkChromiumDerivation = callPackage ./common.nix {
inherit enableSELinux enableNaCl enableHotwording gnomeSupport gnome inherit enableSELinux enableNaCl enableHotwording gnomeSupport gnome
gnomeKeyringSupport proprietaryCodecs cupsSupport pulseSupport; gnomeKeyringSupport proprietaryCodecs cupsSupport pulseSupport;
}; };