chromium: fix widevine

This change allows widevine to work in chromium (it was previously
broken due to a segfault). Newer versions of chromium do not use the
libwidevinecdmadapter.so. Instead, libwidevinecdm.so should be installed
in the chromium libExec directory.
This commit is contained in:
Julien Langlois 2019-04-22 21:47:19 -04:00
parent b081115788
commit 545d58a1ef
No known key found for this signature in database
GPG Key ID: BB220B0A40F7F862
4 changed files with 68 additions and 86 deletions

View File

@ -1,8 +1,47 @@
{ stdenv, mkChromiumDerivation, channel }: { stdenv, mkChromiumDerivation, channel, upstream-info, gcc, glib, nspr, nss, patchelfUnstable, enableWideVine }:
with stdenv.lib; with stdenv.lib;
mkChromiumDerivation (base: rec { let
mkrpath = p: "${makeSearchPathOutput "lib" "lib64" p}:${makeLibraryPath p}";
widevine = stdenv.mkDerivation {
name = "chromium-binary-plugin-widevine";
src = upstream-info.binary;
nativeBuildInputs = [ patchelfUnstable ];
phases = [ "unpackPhase" "patchPhase" "installPhase" "checkPhase" ];
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}/libwidevinecdm.so
'';
doCheck = true;
checkPhase = ''
! find -iname '*.so' -exec ldd {} + | grep 'not found'
'';
PATCH_RPATH = mkrpath [ gcc.cc glib nspr nss ];
patchPhase = ''
patchelf --set-rpath "$PATCH_RPATH" libwidevinecdm.so
'';
installPhase = ''
install -vD libwidevinecdm.so \
"$out/lib/libwidevinecdm.so"
'';
meta.platforms = platforms.x86_64;
};
in mkChromiumDerivation (base: rec {
name = "chromium-browser"; name = "chromium-browser";
packageName = "chromium"; packageName = "chromium";
buildTargets = [ "mksnapshot" "chrome_sandbox" "chrome" ]; buildTargets = [ "mksnapshot" "chrome_sandbox" "chrome" ];
@ -18,11 +57,6 @@ mkChromiumDerivation (base: rec {
cp -vLR "$buildPath/locales" "$buildPath/resources" "$libExecPath/" cp -vLR "$buildPath/locales" "$buildPath/resources" "$libExecPath/"
cp -v "$buildPath/chrome" "$libExecPath/$packageName" cp -v "$buildPath/chrome" "$libExecPath/$packageName"
if [ -e "$buildPath/libwidevinecdmadapter.so" ]; then
cp -v "$buildPath/libwidevinecdmadapter.so" \
"$libExecPath/libwidevinecdmadapter.so"
fi
mkdir -p "$sandbox/bin" mkdir -p "$sandbox/bin"
cp -v "$buildPath/chrome_sandbox" "$sandbox/bin/${sandboxExecutableName}" cp -v "$buildPath/chrome_sandbox" "$sandbox/bin/${sandboxExecutableName}"
@ -57,6 +91,8 @@ mkChromiumDerivation (base: rec {
-e '/\[Desktop Entry\]/a\' \ -e '/\[Desktop Entry\]/a\' \
-e 'StartupWMClass=chromium-browser' \ -e 'StartupWMClass=chromium-browser' \
$out/share/applications/chromium-browser.desktop $out/share/applications/chromium-browser.desktop
${optionalString enableWideVine "ln -s ${widevine}/lib/libwidevinecdm.so \"$libExecPath/libwidevinecdm.so\""}
''; '';
passthru = { inherit sandboxExecutableName; }; passthru = { inherit sandboxExecutableName; };

View File

@ -38,10 +38,10 @@ in let
enableWideVine; enableWideVine;
}; };
browser = callPackage ./browser.nix { inherit channel; }; browser = callPackage ./browser.nix { inherit channel enableWideVine; };
plugins = callPackage ./plugins.nix { plugins = callPackage ./plugins.nix {
inherit enablePepperFlash enableWideVine; inherit enablePepperFlash;
}; };
}; };
@ -113,13 +113,7 @@ in stdenv.mkDerivation {
''; '';
inherit (chromium.browser) packageName; inherit (chromium.browser) packageName;
meta = chromium.browser.meta // { meta = chromium.browser.meta;
broken = if enableWideVine then
builtins.trace "WARNING: WideVine is not functional, please only use for testing"
true
else false;
};
passthru = { passthru = {
inherit (chromium) upstream-info browser; inherit (chromium) upstream-info browser;
mkDerivation = chromium.mkChromiumDerivation; mkDerivation = chromium.mkChromiumDerivation;

View File

@ -1,16 +1,24 @@
Minimal WideVine patch from Gentoo: Description: enable widevine and set its version string to "undefined"
Author: Michael Gilbert <mgilbert@debian.org>
Author: Olivier Tilloy <olivier.tilloy@canonical.com>
https://gitweb.gentoo.org/repo/gentoo.git/tree/www-client/chromium/files/chromium-widevine-r1.patch --- a/third_party/widevine/cdm/widevine_cdm_version.h
+++ b/third_party/widevine/cdm/widevine_cdm_version.h
BTS: https://bugs.gentoo.org/show_bug.cgi?id=547630 @@ -11,5 +11,6 @@
// If the Widevine CDM is available define the following:
--- a/third_party/widevine/cdm/stub/widevine_cdm_version.h // - WIDEVINE_CDM_VERSION_STRING (with the version of the CDM that's available
+++ b/third_party/widevine/cdm/stub/widevine_cdm_version.h // as a string, e.g., "1.0.123.456").
@@ -10,6 +10,7 @@ +#define WIDEVINE_CDM_VERSION_STRING "undefined"
#include "third_party/widevine/cdm/widevine_cdm_common.h"
+#define WIDEVINE_CDM_VERSION_STRING "unknown"
#define WIDEVINE_CDM_AVAILABLE
#endif // WIDEVINE_CDM_VERSION_H_ #endif // WIDEVINE_CDM_VERSION_H_
--- a/chrome/common/chrome_content_client.cc
+++ b/chrome/common/chrome_content_client.cc
@@ -99,7 +99,7 @@
// Registers Widevine CDM if Widevine is enabled, the Widevine CDM is
// bundled and not a component. When the Widevine CDM is a component, it is
// registered in widevine_cdm_component_installer.cc.
-#if BUILDFLAG(BUNDLE_WIDEVINE_CDM) && !BUILDFLAG(ENABLE_WIDEVINE_CDM_COMPONENT)
+#if !BUILDFLAG(ENABLE_WIDEVINE_CDM_COMPONENT)
#define REGISTER_BUNDLED_WIDEVINE_CDM
#include "third_party/widevine/cdm/widevine_cdm_common.h" // nogncheck
// TODO(crbug.com/663554): Needed for WIDEVINE_CDM_VERSION_STRING. Support

View File

@ -6,7 +6,6 @@
, fetchzip , fetchzip
, patchelfUnstable , patchelfUnstable
, enablePepperFlash ? false , enablePepperFlash ? false
, enableWideVine ? false
, upstream-info , upstream-info
}: }:
@ -44,60 +43,6 @@ let
echo ${toString quoted} > "''$${output}/nix-support/wrapper-flags" echo ${toString quoted} > "''$${output}/nix-support/wrapper-flags"
''; '';
widevine = stdenv.mkDerivation {
name = "chromium-binary-plugin-widevine";
src = upstream-info.binary;
nativeBuildInputs = [ patchelfUnstable ];
phases = [ "unpackPhase" "patchPhase" "installPhase" "checkPhase" ];
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}/libwidevinecdm.so \
./opt/google/${chan}/libwidevinecdmadapter.so
'';
doCheck = true;
checkPhase = ''
! find -iname '*.so' -exec ldd {} + | grep 'not found'
'';
PATCH_RPATH = mkrpath [ gcc.cc glib nspr nss ];
patchPhase = ''
chmod +x libwidevinecdm.so libwidevinecdmadapter.so
patchelf --set-rpath "$PATCH_RPATH" libwidevinecdm.so
patchelf --set-rpath "$out/lib:$PATCH_RPATH" libwidevinecdmadapter.so
'';
installPhase = let
wvName = "Widevine Content Decryption Module";
wvDescription = "Playback of encrypted HTML audio/video content";
wvMimeTypes = "application/x-ppapi-widevine-cdm";
wvModule = "@out@/lib/libwidevinecdmadapter.so";
wvInfo = "#${wvName}#${wvDescription};${wvMimeTypes}";
in ''
install -vD libwidevinecdm.so \
"$out/lib/libwidevinecdm.so"
install -vD libwidevinecdmadapter.so \
"$out/lib/libwidevinecdmadapter.so"
${mkPluginInfo {
flags = [ "--register-pepper-plugins=${wvModule}${wvInfo}" ];
envVars.NIX_CHROMIUM_PLUGIN_PATH_WIDEVINE = "@out@/lib";
}}
'';
meta.platforms = platforms.x86_64;
};
flash = stdenv.mkDerivation rec { flash = stdenv.mkDerivation rec {
pname = "flashplayer-ppapi"; pname = "flashplayer-ppapi";
version = "32.0.0.238"; version = "32.0.0.238";
@ -140,6 +85,5 @@ let
}; };
in { in {
enabled = optional enableWideVine widevine enabled = optional enablePepperFlash flash;
++ optional enablePepperFlash flash;
} }