mirror of
https://github.com/NixOS/nixpkgs.git
synced 2024-12-22 13:43:22 +00:00
4f981b4f84
This addresses #12794 so that we now have only a single tarball where we base our build on instead of splitting the source into different outputs first and then reference the outputs. The reason I did this in the first place is that we previously built the sandbox as a different derivation and unpacking the whole source tree just for building the sandbox was a bit too much. As we now have namespaces sandbox built in by default we no longer have that derivation anymore. It still might come up however if we want to build NaCl as a separate derivation (see #8560), but splitting the source code into things only NaCl might require is already too much work and doesn't weight out the benefits. Another issue with the source splitup is that Hydra now has an output limit for non-fixed-output derivations which we're already hitting. Tested the build against the stable channel and it went well, but I haven't tested running the browser. Signed-off-by: aszlig <aszlig@redmoonstudios.org>
118 lines
4.0 KiB
Nix
118 lines
4.0 KiB
Nix
{ stdenv
|
|
, jshon
|
|
, enablePepperFlash ? false
|
|
, enableWideVine ? false
|
|
|
|
, upstream-info
|
|
}:
|
|
|
|
with stdenv.lib;
|
|
|
|
let
|
|
# Generate a shell fragment that emits flags appended to the
|
|
# final makeWrapper call for wrapping the browser's main binary.
|
|
#
|
|
# Note that this is shell-escaped so that only the variable specified
|
|
# by the "output" attribute is substituted.
|
|
mkPluginInfo = { output ? "out", allowedVars ? [ output ]
|
|
, flags ? [], envVars ? {}
|
|
}: let
|
|
shSearch = ["'"] ++ map (var: "@${var}@") allowedVars;
|
|
shReplace = ["'\\''"] ++ map (var: "'\"\${${var}}\"'") allowedVars;
|
|
# We need to triple-escape "val":
|
|
# * First because makeWrapper doesn't do any quoting of its arguments by
|
|
# itself.
|
|
# * Second because it's passed to the makeWrapper call separated by IFS but
|
|
# not by the _real_ arguments, for example the Widevine plugin flags
|
|
# contain spaces, so they would end up as separate arguments.
|
|
# * Third in order to be correctly quoted for the "echo" call below.
|
|
shEsc = val: "'${replaceStrings ["'"] ["'\\''"] val}'";
|
|
mkSh = val: "'${replaceStrings shSearch shReplace (shEsc val)}'";
|
|
mkFlag = flag: ["--add-flags" (shEsc flag)];
|
|
mkEnvVar = key: val: ["--set" (shEsc key) (shEsc val)];
|
|
envList = mapAttrsToList mkEnvVar envVars;
|
|
quoted = map mkSh (flatten ((map mkFlag flags) ++ envList));
|
|
in ''
|
|
mkdir -p "''$${output}/nix-support"
|
|
echo ${toString quoted} > "''$${output}/nix-support/wrapper-flags"
|
|
'';
|
|
|
|
plugins = stdenv.mkDerivation {
|
|
name = "chromium-binary-plugins";
|
|
|
|
src = upstream-info.binary;
|
|
|
|
phases = [ "unpackPhase" "patchPhase" "installPhase" "checkPhase" ];
|
|
outputs = [ "flash" "widevine" ];
|
|
|
|
unpackCmd = let
|
|
chan = if upstream-info.channel == "dev" then "chrome-unstable"
|
|
else if upstream-info.channel == "stable" then "chrome"
|
|
else "chrome-${upstream-info.channel}";
|
|
in ''
|
|
mkdir -p plugins
|
|
ar p "$src" data.tar.xz | tar xJ -C plugins --strip-components=4 \
|
|
./opt/google/${chan}/PepperFlash \
|
|
./opt/google/${chan}/libwidevinecdm.so \
|
|
./opt/google/${chan}/libwidevinecdmadapter.so
|
|
'';
|
|
|
|
doCheck = true;
|
|
checkPhase = ''
|
|
! find -iname '*.so' -exec ldd {} + | grep 'not found'
|
|
'';
|
|
|
|
patchPhase = let
|
|
rpaths = [ stdenv.cc.cc ];
|
|
mkrpath = p: "${makeSearchPath "lib64" p}:${makeSearchPath "lib" p}";
|
|
in ''
|
|
for sofile in PepperFlash/libpepflashplayer.so \
|
|
libwidevinecdm.so libwidevinecdmadapter.so; do
|
|
chmod +x "$sofile"
|
|
patchelf --set-rpath "${mkrpath rpaths}" "$sofile"
|
|
done
|
|
|
|
patchelf --set-rpath "$widevine/lib:${mkrpath rpaths}" \
|
|
libwidevinecdmadapter.so
|
|
'';
|
|
|
|
installPhase = let
|
|
wvName = "Widevine Content Decryption Module";
|
|
wvDescription = "Playback of encrypted HTML audio/video content";
|
|
wvMimeTypes = "application/x-ppapi-widevine-cdm";
|
|
wvModule = "@widevine@/lib/libwidevinecdmadapter.so";
|
|
wvInfo = "#${wvName}#${wvDescription};${wvMimeTypes}";
|
|
in ''
|
|
flashVersion="$(
|
|
"${jshon}/bin/jshon" -F PepperFlash/manifest.json -e version -u
|
|
)"
|
|
|
|
install -vD PepperFlash/libpepflashplayer.so \
|
|
"$flash/lib/libpepflashplayer.so"
|
|
|
|
${mkPluginInfo {
|
|
output = "flash";
|
|
allowedVars = [ "flash" "flashVersion" ];
|
|
flags = [
|
|
"--ppapi-flash-path=@flash@/lib/libpepflashplayer.so"
|
|
"--ppapi-flash-version=@flashVersion@"
|
|
];
|
|
}}
|
|
|
|
install -vD libwidevinecdm.so \
|
|
"$widevine/lib/libwidevinecdm.so"
|
|
install -vD libwidevinecdmadapter.so \
|
|
"$widevine/lib/libwidevinecdmadapter.so"
|
|
|
|
${mkPluginInfo {
|
|
output = "widevine";
|
|
flags = [ "--register-pepper-plugins=${wvModule}${wvInfo}" ];
|
|
envVars.NIX_CHROMIUM_PLUGIN_PATH_WIDEVINE = "@widevine@/lib";
|
|
}}
|
|
'';
|
|
|
|
passthru.enabled = optional enablePepperFlash plugins.flash
|
|
++ optional enableWideVine plugins.widevine;
|
|
};
|
|
in plugins
|