kodi: 17.4 -> 17.6 and move to cmake

ffmpeg is now built as a separate derivation using the kodi makefile to avoid
having to rebuild ffmpeg every time kodi is changed.

Additionally, due to the far superior cmake output a number of dependencies were
identified that have been added as well.
This commit is contained in:
Peter Hoeg 2017-03-22 14:08:01 +08:00 committed by Domen Kožar
parent 9ce33dd8fb
commit 737558b7bb

@ -1,6 +1,7 @@
{ stdenv, lib, fetchurl, makeWrapper { stdenv, lib, fetchFromGitHub, fetchurl, autoconf, automake, libtool, makeWrapper
, pkgconfig, cmake, gnumake, yasm, python2 , pkgconfig, cmake, gnumake, yasm, python2
, boost, avahi, libdvdcss, libdvdnav, libdvdread, lame, autoreconfHook , libgcrypt, libgpgerror, libunistring
, boost, avahi, lame, autoreconfHook
, gettext, pcre-cpp, yajl, fribidi, which , gettext, pcre-cpp, yajl, fribidi, which
, openssl, gperf, tinyxml2, taglib, libssh, swig, jre , openssl, gperf, tinyxml2, taglib, libssh, swig, jre
, libX11, xproto, inputproto, libxml2 , libX11, xproto, inputproto, libxml2
@ -16,133 +17,194 @@
, sqlite, mysql, nasm, gnutls, libva, wayland , sqlite, mysql, nasm, gnutls, libva, wayland
, curl, bzip2, zip, unzip, glxinfo, xdpyinfo , curl, bzip2, zip, unzip, glxinfo, xdpyinfo
, libcec, libcec_platform, dcadec, libuuid , libcec, libcec_platform, dcadec, libuuid
, libcrossguid , libcrossguid, libmicrohttpd
, dbus_libs ? null, dbusSupport ? true , bluez, doxygen, giflib, glib, harfbuzz, lcms2, libidn, libpthreadstubs, libtasn1, libXdmcp
, udev, udevSupport ? true , libplist, p11_kit, zlib
, libusb ? null, usbSupport ? false , dbusSupport ? true, dbus_libs ? null
, samba ? null, sambaSupport ? true , joystickSupport ? true, cwiid ? null
, libmicrohttpd, bash , nfsSupport ? true, libnfs ? null
# TODO: would be nice to have nfsSupport (needs libnfs library) , pulseSupport ? true, libpulseaudio ? null
, rtmpdump ? null, rtmpSupport ? true , rtmpSupport ? true, rtmpdump ? null
, libvdpau ? null, vdpauSupport ? true , sambaSupport ? true, samba ? null
, libpulseaudio ? null, pulseSupport ? true , udevSupport ? true, udev ? null
, joystickSupport ? true , usbSupport ? false, libusb ? null
, vdpauSupport ? true, libvdpau ? null
}: }:
assert dbusSupport -> dbus_libs != null; assert dbusSupport -> dbus_libs != null;
assert udevSupport -> udev != null; assert nfsSupport -> libnfs != null;
assert usbSupport -> libusb != null && ! udevSupport; # libusb won't be used if udev is avaliable
assert sambaSupport -> samba != null;
assert vdpauSupport -> libvdpau != null;
assert pulseSupport -> libpulseaudio != null; assert pulseSupport -> libpulseaudio != null;
assert rtmpSupport -> rtmpdump != null; assert rtmpSupport -> rtmpdump != null;
assert sambaSupport -> samba != null;
assert udevSupport -> udev != null;
assert usbSupport -> libusb != null && ! udevSupport; # libusb won't be used if udev is avaliable
assert vdpauSupport -> libvdpau != null;
# TODO for Kodi 18.0
# - cmake is no longer in project/cmake
# - maybe we can remove auto{conf,make} and libtool from inputs
# - check if dbus support PR has been merged and add dbus as a buildInput
let let
kodi_version = "17.4"; kodiReleaseDate = "20171115";
kodiVersion = "17.6";
rel = "Krypton"; rel = "Krypton";
ffmpeg_3_1_9 = fetchurl {
url = "https://github.com/xbmc/FFmpeg/archive/3.1.9-${rel}-${kodi_version}.tar.gz";
sha256 = "0rhjz505ljfg2jqbm3rd7qbcjq4vnp8h9a8vad8rjf84v3alglpa";
};
# Usage of kodi fork of libdvdnav and libdvdread is necessary for functional dvd playback:
libdvdnav_src = fetchurl {
url = "https://github.com/xbmc/libdvdnav/archive/981488f.tar.gz";
sha256 = "312b3d15bc448d24e92f4b2e7248409525eccc4e75776026d805478e51c5ef3d";
};
libdvdread_src = fetchurl {
url = "https://github.com/xbmc/libdvdread/archive/17d99db.tar.gz";
sha256 = "e7179b2054163652596a56301c9f025515cb08c6d6310b42b897c3ad11c0199b";
};
in stdenv.mkDerivation rec {
version = kodi_version;
name = "kodi-${version}";
src = fetchurl { kodi_src = fetchFromGitHub {
url = "https://github.com/xbmc/xbmc/archive/${version}-${rel}.tar.gz"; owner = "xbmc";
sha256 = "1p1lxkapynjbd85ns7m4jybl4k35kxzv7105xkh03hlz8kkqc23b"; repo = "xbmc";
}; rev = "${kodiVersion}-${rel}";
sha256 = "1pwmmbry7dajwdpmc1mdygjvxna4kl38h32d71g10yf3mdm5wmz3";
};
kodiDependency = { name, version, rev, sha256, ... } @attrs:
let
attrs' = builtins.removeAttrs attrs ["name" "version" "rev" "sha256"];
in stdenv.mkDerivation ({
name = "kodi-${lib.toLower name}-${version}";
src = fetchFromGitHub {
owner = "xbmc";
repo = name;
inherit rev sha256;
};
enableParallelBuilding = true;
} // attrs');
ffmpeg = kodiDependency rec {
name = "FFmpeg";
version = "3.1.11";
rev = "${version}-${rel}-17.5"; # TODO: change 17.5 back to ${kodiVersion}
sha256 = "0nc4sb6v1g3l11v9h5l9n44a8r40186rcbp2xg5c7vg6wcpjid13";
preConfigure = ''
cp ${kodi_src}/tools/depends/target/ffmpeg/{CMakeLists.txt,*.cmake} .
'';
buildInputs = [ gnutls libidn libtasn1 p11_kit zlib ];
nativeBuildInputs = [ cmake nasm pkgconfig ];
};
# we should be able to build these externally and have kodi reference them as buildInputs.
# Doesn't work ATM though so we just use them for the src
libdvdcss = kodiDependency {
name = "libdvdcss";
version = "20160215";
rev = "2f12236bc1c92f73c21e973363f79eb300de603f";
sha256 = "198r0q73i55ga1dvyqq9nfcri0zq08b94hy8671lg14i3izx44dd";
buildInputs = [ libdvdread ];
nativeBuildInputs = [ autoreconfHook pkgconfig ];
};
libdvdnav = kodiDependency {
name = "libdvdnav";
version = "20170217";
rev = "981488f7f27554b103cca10c1fbeba027396c94a";
sha256 = "089pswc51l3avh95zl4cpsh7gh1innh7b2y4xgx840mcmy46ycr8";
buildInputs = [ libdvdread ];
nativeBuildInputs = [ autoreconfHook pkgconfig ];
};
libdvdread = kodiDependency {
name = "libdvdread";
version = "20160221";
rev = "17d99db97e7b8f23077b342369d3c22a6250affd";
sha256 = "1gr5aq1cjr3as9mnwrw29cxn4m6f6pfrxdahkdcjy70q3ldg90sl";
nativeBuildInputs = [ autoreconfHook pkgconfig ];
};
in stdenv.mkDerivation rec {
name = "kodi-${kodiVersion}";
src = kodi_src;
buildInputs = [ buildInputs = [
libxml2 gnutls yasm python2 gnutls libidn libtasn1 nasm p11_kit
libxml2 yasm python2
boost libmicrohttpd boost libmicrohttpd
gettext pcre-cpp yajl fribidi libva gettext pcre-cpp yajl fribidi libva
openssl gperf tinyxml2 taglib libssh swig jre openssl gperf tinyxml2 taglib libssh swig jre
libX11 xproto inputproto which libX11 xproto inputproto libXt libXmu libXext xextproto
libXt libXmu libXext xextproto libXinerama libXrandr randrproto libXtst libXfixes fixesproto
libXinerama libXrandr randrproto
libXtst libXfixes fixesproto
SDL SDL_image SDL_mixer alsaLib SDL SDL_image SDL_mixer alsaLib
mesa glew fontconfig freetype ftgl mesa glew fontconfig freetype ftgl
libjpeg jasper libpng libtiff wayland libjpeg jasper libpng libtiff libva wayland
libmpeg2 libsamplerate libmad libmpeg2 libsamplerate libmad
libogg libvorbis flac libxslt systemd libogg libvorbis flac libxslt systemd
lzo libcdio libmodplug libass libbluray lzo libcdio libmodplug libass libbluray
sqlite mysql.lib nasm avahi libdvdcss lame sqlite mysql.lib avahi lame
curl bzip2 zip unzip glxinfo xdpyinfo curl bzip2 zip unzip glxinfo xdpyinfo
libcec libcec_platform dcadec libuuid libcec libcec_platform dcadec libuuid
libcrossguid libgcrypt libgpgerror libunistring
libcrossguid cwiid libplist
bluez giflib glib harfbuzz lcms2 libpthreadstubs libXdmcp
ffmpeg
# libdvdcss libdvdnav libdvdread
] ]
++ lib.optional dbusSupport dbus_libs ++ lib.optional dbusSupport dbus_libs
++ lib.optional udevSupport udev ++ lib.optionals joystickSupport [ cwiid SDL2 ]
++ lib.optional usbSupport libusb ++ lib.optional nfsSupport libnfs
++ lib.optional sambaSupport samba ++ lib.optional pulseSupport libpulseaudio
++ lib.optional vdpauSupport libvdpau ++ lib.optional rtmpSupport rtmpdump
++ lib.optional pulseSupport libpulseaudio ++ lib.optional sambaSupport samba
++ lib.optional rtmpSupport rtmpdump ++ lib.optional udevSupport udev
++ lib.optional joystickSupport SDL2; ++ lib.optional usbSupport libusb
++ lib.optional vdpauSupport libvdpau;
nativeBuildInputs = [ nativeBuildInputs = [
autoreconfHook cmake gnumake makeWrapper pkgconfig cmake
doxygen
makeWrapper
which
pkgconfig gnumake
autoconf automake libtool # still needed for some components. Check if that is the case with 18.0
]; ];
dontUseCmakeConfigure = true; cmakeFlags = [
"-Dlibdvdcss_URL=${libdvdcss.src}"
"-Dlibdvdnav_URL=${libdvdnav.src}"
"-Dlibdvdread_URL=${libdvdread.src}"
"-DGIT_VERSION=${kodiReleaseDate}"
"-DENABLE_EVENTCLIENTS=ON"
"-DENABLE_INTERNAL_CROSSGUID=OFF"
"-DENABLE_OPTICAL=ON"
"-DLIRC_DEVICE=/run/lirc/lircd"
];
enableParallelBuilding = true;
# 14 tests fail but the biggest issue is that every test takes 30 seconds -
# I'm guessing there is a thing waiting to time out
doCheck = false;
postPatch = '' postPatch = ''
substituteInPlace xbmc/linux/LinuxTimezone.cpp \ substituteInPlace xbmc/linux/LinuxTimezone.cpp \
--replace 'usr/share/zoneinfo' 'etc/zoneinfo' --replace 'usr/share/zoneinfo' 'etc/zoneinfo'
substituteInPlace tools/depends/target/ffmpeg/autobuild.sh \
--replace "/bin/bash" "${bash}/bin/bash -ex"
cp ${ffmpeg_3_1_9} tools/depends/target/ffmpeg/ffmpeg-3.1.9-${rel}-${version}.tar.gz
ln -s ${libdvdcss.src} tools/depends/target/libdvdcss/libdvdcss-master.tar.gz
cp ${libdvdnav_src} tools/depends/target/libdvdnav/libdvdnav-master.tar.gz
cp ${libdvdread_src} tools/depends/target/libdvdread/libdvdread-master.tar.gz
''; '';
preConfigure = '' preConfigure = ''
patchShebangs . cd project/cmake
./bootstrap
# tests here fail
sed -i '/TestSystemInfo.cpp/d' xbmc/utils/test/{Makefile,CMakeLists.txt}
# tests here trigger a segfault in kodi.bin
sed -i '/TestWebServer.cpp/d' xbmc/network/test/{Makefile,CMakeLists.txt}
''; '';
enableParallelBuilding = true;
doCheck = true;
configureFlags = [ "--enable-libcec" ]
++ lib.optional (!sambaSupport) "--disable-samba"
++ lib.optional vdpauSupport "--enable-vdpau"
++ lib.optional pulseSupport "--enable-pulse"
++ lib.optional rtmpSupport "--enable-rtmp"
++ lib.optional joystickSupport "--enable-joystick";
postInstall = '' postInstall = ''
for p in $(ls $out/bin/) ; do for p in $(ls $out/bin/) ; do
wrapProgram $out/bin/$p \ wrapProgram $out/bin/$p \
--prefix PATH ":" "${lib.makeBinPath --prefix PATH ":" "${lib.makeBinPath [ python2 glxinfo xdpyinfo ]}" \
[ python2 glxinfo xdpyinfo ]}" \
--prefix LD_LIBRARY_PATH ":" "${lib.makeLibraryPath --prefix LD_LIBRARY_PATH ":" "${lib.makeLibraryPath
[ curl systemd libmad libvdpau libcec libcec_platform rtmpdump libass SDL2 ]}" [ curl systemd libmad libvdpau libcec libcec_platform rtmpdump libass SDL2 ]}"
done done
substituteInPlace $out/share/xsessions/kodi.desktop \
--replace kodi-standalone $out/bin/kodi-standalone
''; '';
doInstallCheck = true;
installCheckPhase = "$out/bin/kodi --version";
meta = with stdenv.lib; { meta = with stdenv.lib; {
homepage = https://kodi.tv/;
description = "Media center"; description = "Media center";
license = licenses.gpl2; homepage = https://kodi.tv/;
platforms = platforms.linux; license = licenses.gpl2;
maintainers = with maintainers; [ domenkozar titanous edwtjo ]; platforms = platforms.linux;
maintainers = with maintainers; [ domenkozar titanous edwtjo peterhoeg ];
}; };
} }