chromium: Factor out common build attributes.
This results in a new function called mkChromiumDerivation, which can be used to easily build packages that are based on the Chromium source tree. We pass through this function as mkDerivation in the chromium wrappre, so in the end if you want to create such a package, something like: chromium.mkDerivation (base: { name = "your-shiny-package-based-on-chromium"; ... }) will suffice. Of course, this is only the first step towards this functionality, because right now I'm not even sure the Chromium browser itself will build. Signed-off-by: aszlig <aszlig@redmoonstudios.org>
This commit is contained in:
parent
a87208de58
commit
111caaad53
3 changed files with 220 additions and 192 deletions
|
@ -1,201 +1,24 @@
|
|||
{ stdenv, fetchurl, ninja, which
|
||||
|
||||
# default dependencies
|
||||
, bzip2, flac, speex, icu, libopus
|
||||
, libevent, expat, libjpeg, snappy
|
||||
, libpng, libxml2, libxslt, v8
|
||||
, 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
|
||||
}:
|
||||
{ stdenv, mkChromiumDerivation }:
|
||||
|
||||
with stdenv.lib;
|
||||
|
||||
let
|
||||
|
||||
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 = true;
|
||||
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 = !versionOlder source.version "34.0.0.0";
|
||||
};
|
||||
|
||||
defaultDependencies = [
|
||||
bzip2 flac speex icu libopus
|
||||
libevent expat libjpeg snappy
|
||||
libpng libxml2 libxslt v8
|
||||
xdg_utils yasm minizip libwebp
|
||||
libusb1 libexif
|
||||
];
|
||||
|
||||
# build paths and release info
|
||||
packageName = "chromium";
|
||||
buildType = "Release";
|
||||
buildPath = "out/${buildType}";
|
||||
libExecPath = "$out/libexec/${packageName}";
|
||||
|
||||
in stdenv.mkDerivation rec {
|
||||
name = "${packageName}-browser-${version}";
|
||||
inherit (source) version;
|
||||
inherit packageName;
|
||||
src = source;
|
||||
|
||||
buildInputs = defaultDependencies ++ [
|
||||
which
|
||||
python perl pkgconfig
|
||||
nspr udev
|
||||
(if useOpenSSL then openssl else nss)
|
||||
utillinux alsaLib
|
||||
gcc bison gperf
|
||||
gcc bison gperf krb5
|
||||
glib gtk dbus_glib
|
||||
libXScrnSaver libXcursor libXtst mesa
|
||||
pciutils protobuf speechd libXdamage
|
||||
pythonPackages.gyp
|
||||
] ++ 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 = ''
|
||||
sed -i -e '/base::FilePath exe_dir/,/^ *} *$/c \
|
||||
sandbox_binary = base::FilePath(getenv("CHROMIUM_SANDBOX_BINARY_PATH"));
|
||||
' content/browser/browser_main_loop.cc
|
||||
'';
|
||||
|
||||
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;
|
||||
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";
|
||||
} // optionalAttrs (stdenv.system == "x86_64-linux") {
|
||||
target_arch = "x64";
|
||||
python_arch = "x86-64";
|
||||
} // optionalAttrs (stdenv.system == "i686-linux") {
|
||||
target_arch = "ia32";
|
||||
python_arch = "ia32";
|
||||
});
|
||||
|
||||
configurePhase = ''
|
||||
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++";
|
||||
in ''
|
||||
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 \
|
||||
chrome
|
||||
'';
|
||||
mkChromiumDerivation (base: rec {
|
||||
name = "chromium-browser";
|
||||
buildTargets = [ "chrome" ];
|
||||
|
||||
installPhase = ''
|
||||
ensureDir "${libExecPath}"
|
||||
cp -v "${buildPath}/"*.pak "${libExecPath}/"
|
||||
${optionalString (!versionOlder version "34.0.0.0") ''
|
||||
cp -v "${buildPath}/icudtl.dat" "${libExecPath}/"
|
||||
ensureDir "$libExecPath"
|
||||
cp -v "$buildPath/"*.pak "$libExecPath/"
|
||||
${optionalString (!versionOlder base.version "34.0.0.0") ''
|
||||
cp -v "$buildPath/icudtl.dat" "$libExecPath/"
|
||||
''}
|
||||
cp -vR "${buildPath}/locales" "${buildPath}/resources" "${libExecPath}/"
|
||||
cp -v ${buildPath}/libffmpegsumo.so "${libExecPath}/"
|
||||
cp -vR "$buildPath/locales" "$buildPath/resources" "$libExecPath/"
|
||||
cp -v $buildPath/libffmpegsumo.so "$libExecPath/"
|
||||
|
||||
cp -v "${buildPath}/chrome" "${libExecPath}/${packageName}"
|
||||
cp -v "$buildPath/chrome" "$libExecPath/$packageName"
|
||||
|
||||
mkdir -vp "$out/share/man/man1"
|
||||
cp -v "${buildPath}/chrome.1" "$out/share/man/man1/${packageName}.1"
|
||||
cp -v "$buildPath/chrome.1" "$out/share/man/man1/$packageName.1"
|
||||
|
||||
for icon_file in chrome/app/theme/chromium/product_logo_*[0-9].png; do
|
||||
num_and_suffix="''${icon_file##*logo_}"
|
||||
|
@ -204,7 +27,7 @@ in stdenv.mkDerivation rec {
|
|||
logo_output_prefix="$out/share/icons/hicolor"
|
||||
logo_output_path="$logo_output_prefix/''${icon_size}x''${icon_size}/apps"
|
||||
mkdir -vp "$logo_output_path"
|
||||
cp -v "$icon_file" "$logo_output_path/${packageName}.png"
|
||||
cp -v "$icon_file" "$logo_output_path/$packageName.png"
|
||||
done
|
||||
'';
|
||||
|
||||
|
@ -215,4 +38,4 @@ in stdenv.mkDerivation rec {
|
|||
license = licenses.bsd3;
|
||||
platforms = platforms.linux;
|
||||
};
|
||||
}
|
||||
})
|
||||
|
|
200
pkgs/applications/networking/browsers/chromium/common.nix
Normal file
200
pkgs/applications/networking/browsers/chromium/common.nix
Normal file
|
@ -0,0 +1,200 @@
|
|||
{ stdenv, fetchurl, ninja, which
|
||||
|
||||
# default dependencies
|
||||
, bzip2, flac, speex, icu, libopus
|
||||
, libevent, expat, libjpeg, snappy
|
||||
, libpng, libxml2, libxslt, v8
|
||||
, 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
|
||||
}:
|
||||
|
||||
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 = true;
|
||||
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 = !versionOlder source.version "34.0.0.0";
|
||||
};
|
||||
|
||||
opusWithCustomModes = libopus.override {
|
||||
withCustomModes = !versionOlder source.version "35.0.0.0";
|
||||
};
|
||||
|
||||
defaultDependencies = [
|
||||
bzip2 flac speex icu opusWithCustomModes
|
||||
libevent expat libjpeg snappy
|
||||
libpng libxml2 libxslt v8
|
||||
xdg_utils yasm minizip libwebp
|
||||
libusb1 libexif
|
||||
];
|
||||
|
||||
# build paths and release info
|
||||
packageName = 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
|
||||
] ++ 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 = ''
|
||||
sed -i -e '/base::FilePath exe_dir/,/^ *} *$/c \
|
||||
sandbox_binary = base::FilePath(getenv("CHROMIUM_SANDBOX_BINARY_PATH"));
|
||||
' content/browser/browser_main_loop.cc
|
||||
'';
|
||||
|
||||
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;
|
||||
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";
|
||||
} // 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 {}));
|
||||
|
||||
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++";
|
||||
in ''
|
||||
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 \
|
||||
${concatStringsSep " " (extraAttrs.buildTargets or [])}
|
||||
'';
|
||||
};
|
||||
|
||||
# Remove some extraAttrs we supplied to the base attributes already.
|
||||
in stdenv.mkDerivation (base // removeAttrs extraAttrs [
|
||||
"name" "gypFlags" "buildTargets"
|
||||
])
|
|
@ -24,12 +24,13 @@ let
|
|||
inherit useOpenSSL;
|
||||
};
|
||||
|
||||
browser = callPackage ./browser.nix {
|
||||
mkChromiumDerivation = callPackage ./common.nix {
|
||||
inherit enableSELinux enableNaCl useOpenSSL gnomeSupport
|
||||
gnomeKeyringSupport proprietaryCodecs cupsSupport
|
||||
pulseSupport;
|
||||
};
|
||||
|
||||
browser = callPackage ./browser.nix { };
|
||||
sandbox = callPackage ./sandbox.nix { };
|
||||
|
||||
plugins = callPackage ./plugins.nix {
|
||||
|
@ -54,4 +55,8 @@ in stdenv.mkDerivation {
|
|||
'';
|
||||
|
||||
inherit (chromium.browser) meta packageName;
|
||||
|
||||
passthru = {
|
||||
mkDerivation = chromium.mkChromiumDerivation;
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue