690a845de9
We now create Nix expressions within the plugin output path(s) which then will be imported and incorporated into the wrapper. This makes it easier for other plugins to provide configuration settings to the main Chromium wrapper. Of course, in order to allow for external plugins we need to allow passing a list of plugins to the Chromium derivation, but right now we keep it internal and only use it for things such as NaCl (as soon as we support it, of course). Signed-off-by: aszlig <aszlig@redmoonstudios.org>
99 lines
3.2 KiB
Nix
99 lines
3.2 KiB
Nix
{ stdenv
|
|
, enablePepperFlash ? false
|
|
, enableWideVine ? false
|
|
|
|
, source
|
|
}:
|
|
|
|
with stdenv.lib;
|
|
|
|
let
|
|
plugins = stdenv.mkDerivation {
|
|
name = "chromium-binary-plugins";
|
|
|
|
# XXX: Only temporary and has to be version-specific
|
|
src = source.plugins;
|
|
|
|
phases = [ "unpackPhase" "patchPhase" "installPhase" "checkPhase" ];
|
|
outputs = [ "flash" "widevine" ];
|
|
|
|
unpackCmd = let
|
|
chan = if source.channel == "dev" then "chrome-unstable"
|
|
else if source.channel == "stable" then "chrome"
|
|
else "chrome-${source.channel}";
|
|
in ''
|
|
mkdir -p plugins
|
|
ar p "$src" data.tar.lzma | 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.gcc.gcc ];
|
|
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="$(
|
|
sed -n -r 's/.*"version": "([^"]+)",.*/\1/p' PepperFlash/manifest.json
|
|
)"
|
|
|
|
install -vD PepperFlash/libpepflashplayer.so \
|
|
"$flash/lib/libpepflashplayer.so"
|
|
mkdir -p "$flash/nix-support"
|
|
cat > "$flash/nix-support/chromium-plugin.nix" <<NIXOUT
|
|
{ flags = [
|
|
"--ppapi-flash-path='$flash/lib/libpepflashplayer.so'"
|
|
"--ppapi-flash-version=$flashVersion"
|
|
];
|
|
}
|
|
NIXOUT
|
|
|
|
install -vD libwidevinecdm.so \
|
|
"$widevine/lib/libwidevinecdm.so"
|
|
install -vD libwidevinecdmadapter.so \
|
|
"$widevine/lib/libwidevinecdmadapter.so"
|
|
mkdir -p "$widevine/nix-support"
|
|
cat > "$widevine/nix-support/chromium-plugin.nix" <<NIXOUT
|
|
{ flags = [ "--register-pepper-plugins='${wvModule}${wvInfo}'" ];
|
|
envVars.NIX_CHROMIUM_PLUGIN_PATH_WIDEVINE = "$widevine/lib";
|
|
}
|
|
NIXOUT
|
|
'';
|
|
|
|
passthru = let
|
|
enabledPlugins = optional enablePepperFlash plugins.flash
|
|
++ optional enableWideVine plugins.widevine;
|
|
getNix = plugin: import "${plugin}/nix-support/chromium-plugin.nix";
|
|
mergeAttrsets = let
|
|
f = v: if all isAttrs v then mergeAttrsets v
|
|
else if all isList v then concatLists v
|
|
else if tail v == [] then head v
|
|
else head (tail v);
|
|
in fold (l: r: zipAttrsWith (_: f) [ l r ]) {};
|
|
in {
|
|
settings = mergeAttrsets (map getNix enabledPlugins);
|
|
};
|
|
};
|
|
in plugins
|