X-Git-Url: https://git.hcoop.net/jackhill/guix/guix.git/blobdiff_plain/593dfdc33b071f5f0c2d51d9b7f81d36b7c2133e..6f0c2c95d4c5f5590540acdf108037246d481678:/gnu/packages/kodi.scm diff --git a/gnu/packages/kodi.scm b/gnu/packages/kodi.scm index 929894d61e..23afd138a3 100644 --- a/gnu/packages/kodi.scm +++ b/gnu/packages/kodi.scm @@ -1,5 +1,9 @@ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2015 David Thompson +;;; Copyright © 2017, 2019 Marius Bakke +;;; Copyright © 2017 Oleg Pykhalov +;;; Copyright © 2018, 2019 Tobias Geerinckx-Rice +;;; Copyright © 2018 Efraim Flashner ;;; ;;; This file is part of GNU Guix. ;;; @@ -22,13 +26,16 @@ #:use-module (guix packages) #:use-module (guix download) #:use-module (guix git-download) + #:use-module (guix build-system cmake) #:use-module (guix build-system gnu) + #:use-module (guix build-system trivial) + #:use-module (gnu packages) #:use-module (gnu packages algebra) #:use-module (gnu packages audio) #:use-module (gnu packages autotools) #:use-module (gnu packages avahi) #:use-module (gnu packages base) - #:use-module (gnu packages boost) + #:use-module (gnu packages bash) #:use-module (gnu packages cdrom) #:use-module (gnu packages cmake) #:use-module (gnu packages compression) @@ -36,6 +43,7 @@ #:use-module (gnu packages databases) #:use-module (gnu packages documentation) #:use-module (gnu packages fontutils) + #:use-module (gnu packages freedesktop) #:use-module (gnu packages fribidi) #:use-module (gnu packages gettext) #:use-module (gnu packages ghostscript) @@ -43,6 +51,7 @@ #:use-module (gnu packages gl) #:use-module (gnu packages glib) #:use-module (gnu packages gperf) + #:use-module (gnu packages groff) #:use-module (gnu packages gnunet) #:use-module (gnu packages gnupg) #:use-module (gnu packages image) @@ -52,10 +61,13 @@ #:use-module (gnu packages mp3) #:use-module (gnu packages pcre) #:use-module (gnu packages pkg-config) + #:use-module (gnu packages pretty-print) #:use-module (gnu packages pulseaudio) #:use-module (gnu packages python) #:use-module (gnu packages samba) #:use-module (gnu packages sdl) + #:use-module (gnu packages serialization) + #:use-module (gnu packages sqlite) #:use-module (gnu packages ssh) #:use-module (gnu packages swig) #:use-module (gnu packages textutils) @@ -66,15 +78,15 @@ #:use-module (gnu packages xiph) #:use-module (gnu packages xml) #:use-module (gnu packages xorg) - #:use-module (gnu packages assembly) - #:use-module (gnu packages zip)) + #:use-module (gnu packages assembly)) (define-public crossguid - (let ((commit "8f399e8bd4252be9952f3dfa8199924cc8487ca4")) + (let ((commit "fef89a4174a7bf8cd99fa9154864ce9e8e3bf989") + (revision "2")) (package (name "crossguid") - (version (string-append "0.0-1." (string-take commit 7))) - ;; There's no official release. Just a Git repository. + (version (string-append "0.0-" revision "." (string-take commit 7))) + ;; This is the commit that Kodi wants. (source (origin (method git-fetch) (uri (git-reference @@ -83,27 +95,24 @@ (file-name (string-append name "-" version "-checkout")) (sha256 (base32 - "1i29y207qqddvaxbn39pk2fbh3gx8zvdprfp35wasj9rw2wjk3s9")))) + "1blrkc7zcqrqcr5msvhyhm98s2jvm9hr0isqs4288q2r4mdnrfq0")))) (build-system gnu-build-system) (arguments '(#:phases (modify-phases %standard-phases - (delete 'configure) ; no configure script - ;; There's no build system here, so we have to do it ourselves. + (delete 'configure) ; no configure script (replace 'build (lambda _ - (and (zero? (system* "g++" "-c" "guid.cpp" "-o" "guid.o" - "-std=c++11" "-DGUID_LIBUUID")) - (zero? (system* "ar" "rvs" "libcrossguid.a" "guid.o"))))) + (invoke "g++" "-c" "guid.cpp" "-o" "guid.o" + "-DGUID_LIBUUID") + (invoke "ar" "rvs" "libcrossguid.a" "guid.o"))) (replace 'check (lambda _ - (and (zero? (system* "g++" "-c" "test.cpp" "-o" "test.o" - "-std=c++11")) - (zero? (system* "g++" "-c" "testmain.cpp" "-o" "testmain.o" - "-std=c++11")) - (zero? (system* "g++" "test.o" "guid.o" "testmain.o" - "-o" "test" "-luuid")) - (zero? (system* (string-append (getcwd) "/test")))))) + (invoke "g++" "-c" "test.cpp" "-o" "test.o") + (invoke "g++" "-c" "testmain.cpp" "-o" "testmain.o") + (invoke "g++" "test.o" "guid.o" "testmain.o" + "-o" "test" "-luuid") + (invoke (string-append (getcwd) "/test")))) (replace 'install (lambda* (#:key outputs #:allow-other-keys) (let ((out (assoc-ref outputs "out"))) @@ -119,153 +128,325 @@ generator library for C++.") (home-page "https://github.com/graeme-hill/crossguid") (license license:expat)))) +;; Kodi requires using their own special forks of these libraries. +;; In addition, it insists on downloading and building these as part +;; of the standard build process. To make things easier, we bootstrap +;; and patch shebangs here, so we don't have to worry about it later. +(define libdvdnav/kodi + (let ((commit "6.0.0-Leia-Alpha-3")) + (package + (name "libdvdnav-bootstrapped") + (version commit) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/xbmc/libdvdnav.git") + (commit commit))) + (file-name (string-append name "-" version "-checkout")) + (sha256 + (base32 + "0qwlf4lgahxqxk1r2pzl866mi03pbp7l1fc0rk522sc0ak2s9jhb")))) + (build-system gnu-build-system) + (arguments + '(#:tests? #f + #:phases + (modify-phases %standard-phases + (delete 'configure) + (delete 'build) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (copy-recursively "." (assoc-ref outputs "out")) + #t))))) + (native-inputs + `(("autoconf" ,autoconf) + ("automake" ,automake) + ("libtool" ,libtool) + ("pkg-config" ,pkg-config))) + (home-page "https://github.com/xbmc/libdvdnav") + (synopsis (package-synopsis libdvdnav)) + (description (package-description libdvdnav)) + (license license:gpl2+)))) + +(define libdvdread/kodi + (let ((commit "6.0.0-Leia-Alpha-3")) + (package + (name "libdvdread-bootstrapped") + (version commit) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/xbmc/libdvdread.git") + (commit commit))) + (file-name (string-append name "-" version "-checkout")) + (sha256 + (base32 + "1xxn01mhkdnp10cqdr357wx77vyzfb5glqpqyg8m0skyi75aii59")))) + (build-system gnu-build-system) + (arguments + '(#:tests? #f + #:phases + (modify-phases %standard-phases + (delete 'configure) + (delete 'build) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (copy-recursively "." (assoc-ref outputs "out")) + #t))))) + (native-inputs + `(("autoconf" ,autoconf) + ("automake" ,automake) + ("libtool" ,libtool) + ("pkg-config" ,pkg-config))) + (home-page "https://github.com/xbmc/libdvdread") + (synopsis (package-synopsis libdvdread)) + (description (package-description libdvdread)) + (license (list license:gpl2+ license:lgpl2.1+))))) + +(define libdvdcss/kodi + (let ((commit "1.4.2-Leia-Beta-5")) + (package + (name "libdvdcss-bootstrapped") + (version commit) + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/xbmc/libdvdcss.git") + (commit commit))) + (file-name (string-append name "-" version "-checkout")) + (sha256 + (base32 + "0j41ydzx0imaix069s3z07xqw9q95k7llh06fc27dcn6f7b8ydyl")))) + (build-system gnu-build-system) + (arguments + '(#:tests? #f + #:phases + (modify-phases %standard-phases + (delete 'configure) + (delete 'build) + (replace 'install + (lambda* (#:key outputs #:allow-other-keys) + (copy-recursively "." (assoc-ref outputs "out")) + #t))))) + (native-inputs + `(("autoconf" ,autoconf) + ("automake" ,automake) + ("libtool" ,libtool) + ("pkg-config" ,pkg-config))) + (home-page "https://github.com/xbmc/libdvdcss") + (synopsis (package-synopsis libdvdcss)) + (description (package-description libdvdcss)) + (license license:gpl2+)))) + +(define-public fstrcmp + (package + (name "fstrcmp") + (version "0.7.D001") + (source + (origin + (method url-fetch) + (uri (string-append "http://fstrcmp.sourceforge.net/fstrcmp-" + version ".tar.gz")) + (sha256 + (base32 + "0xilghiy3mz78bjmfldi39qyy7jvw5b6wafsx370lw401y2qw0g4")))) + (build-system gnu-build-system) + (home-page "http://fstrcmp.sourceforge.net/") + (arguments + '(#:configure-flags '("SH=sh"))) + (native-inputs + `(("ghostscript" ,ghostscript) ; ps2pdf + ("groff" ,groff) + ("libtool" ,libtool) + ("which" ,which))) + (synopsis "fuzzy comparison of strings") + (description + "The fstrcmp project provides a library that is used to make fuzzy +comparisons of strings and byte arrays, including multi-byte character strings. +This can be useful in error messages, enabling the suggestion of likely valid +alternatives. In compilers, this can reduce the cascade of secondary errors.") + (license license:gpl3+))) + (define-public kodi (package (name "kodi") - (version "16.0") + (version "18.4") (source (origin - (method url-fetch) - (uri (string-append "http://mirrors.kodi.tv/releases/source/" - version "-Jarvis.tar.gz")) - (file-name (string-append name "-" version ".tar.gz")) + (method git-fetch) + (uri (git-reference + (url "https://github.com/xbmc/xbmc.git") + (commit (string-append version "-Leia")))) + (file-name (git-file-name name version)) (sha256 (base32 - "0iirspvv7czf785l2lqf232dvdaj87srbn9ni97ngvnd6w9yl884")) + "1m0295czxabdcqyqf5m94av9d88pzhnzjvyfs1q07xqq82h313p7")) + (patches (search-patches "kodi-skip-test-449.patch" + "kodi-increase-test-timeout.patch" + "kodi-set-libcurl-ssl-parameters.patch")) (snippet - ;; Delete bundled ffmpeg. - ;; TODO: Delete every other bundled library. '(begin (use-modules (guix build utils)) - (delete-file-recursively "tools/depends/target/ffmpeg"))) + (for-each delete-file-recursively + '("project/BuildDependencies/" + ;; TODO: Purge these jars. + ;;"tools/codegenerator/groovy" + ;; And these sources: + ;; "tools/depend/native/JsonSchemaBuilder" + ;; "tools/depend/native/TexturePacker" + ;; "lib/gtest" + ;; "lib/cpluff" + ;; "lib/libUPnP" + "lib/libUPnP/Neptune/ThirdParty" + "project/Win32BuildSetup/tools/7z")) + #t)) (modules '((guix build utils))))) - (build-system gnu-build-system) + (build-system cmake-build-system) (arguments - '(#:configure-flags '("--with-ffmpeg=shared") ; don't use bundled ffmpeg + '(#:modules ((srfi srfi-1) + (guix build cmake-build-system) + (guix build utils)) + #:configure-flags + (list "-DENABLE_INTERNAL_FFMPEG=OFF" + "-DENABLE_INTERNAL_CROSSGUID=OFF" + (string-append "-Dlibdvdread_URL=" + (assoc-ref %build-inputs "libdvdread-bootstrapped")) + (string-append "-Dlibdvdnav_URL=" + (assoc-ref %build-inputs "libdvdnav-bootstrapped")) + (string-append "-Dlibdvdcss_URL=" + (assoc-ref %build-inputs "libdvdcss-bootstrapped")) + (string-append "-DSYSTEM_LDFLAGS=-Wl,-rpath=" + (assoc-ref %build-inputs "curl") "/lib")) #:phases (modify-phases %standard-phases - ;; JsonSchemaBuilder is a small tool needed by the build system that - ;; comes bundled with the source. The build system tries to build it - ;; during the bootstrapping phase, which causes serious issues + ;; The build system tries to bootstrap these bundled components + ;; during the regular build phase, which causes serious issues ;; because there's no time for shebangs to be patched. So, we ;; bootstrap it on our own instead. - (add-after 'unpack 'bootstrap-jsonschemabuilder - (lambda* (#:key inputs #:allow-other-keys) - (let ((dir "tools/depends/native/JsonSchemaBuilder/src")) - (with-directory-excursion dir - (zero? (system* "sh" "autogen.sh")))))) - ;; Now we can do the regular bootstrapping process, but only after - ;; the first round of shebang patching. We must repeat the patching - ;; after bootstrapping so that all of the files generated by the - ;; Autotools et al. are patched appropriately. - (add-after 'patch-source-shebangs 'bootstrap - (lambda* (#:key inputs #:allow-other-keys) - ;; We bootstrapped JsonSchemaBuilder in the previous phase, so we - ;; need to make sure it isn't done a second time. Otherwise, it - ;; would undo the shebang patching that we worked so hard for. - (substitute* '("tools/depends/native/JsonSchemaBuilder/Makefile") - (("\\./autogen\\.sh") "")) - ;; This essentially does what their 'bootstrap' script does, but - ;; additionally passes the correct CONFIG_SHELL. - (let ((bash (string-append (assoc-ref inputs "bash") "/bin/sh"))) - (define (run-make makefile) - (zero? (system* "make" "-f" makefile - "BOOTSTRAP_STANDALONE=1" - (string-append "CONFIG_SHELL=" bash)))) - (and (run-make "bootstrap.mk") - (run-make "codegenerator.mk"))))) - (add-after 'bootstrap 'patch-source-shebangs-again - (assoc-ref %standard-phases 'patch-source-shebangs)) - ;; 3 tests fail that appear harmless, so we disable them. - (add-before 'check 'disable-some-tests + (add-after 'unpack 'bootstrap-bundled-software (lambda _ + (let ((dirs '("tools/depends/native/JsonSchemaBuilder/src" + "lib/cpluff"))) + (every (lambda (third-party) + (with-directory-excursion third-party + (invoke "autoreconf" "-vif"))) + dirs)))) + (add-after 'bootstrap-bundled-software 'patch-stuff + (lambda* (#:key inputs #:allow-other-keys) + ;; Prevent the build scripts from calling autoreconf in the + ;; build stage. Otherwise, it would undo the bootstrapping + ;; and shebang patching that we worked so hard for. + (substitute* "cmake/modules/FindCpluff.cmake" + (("autoreconf -vif") "true")) + (substitute* "lib/cpluff/po/Makefile.in.in" + (("/bin/sh") (which "sh"))) + (substitute* "cmake/modules/FindLibDvd.cmake" + ;; The libdvd* sources that we bootstrapped separately are + ;; unpacked in the build phase. This is our best opportunity + ;; to make them writable before the build process starts. + (("autoreconf -vif") "chmod -R u+w .")) + + (substitute* "xbmc/platform/linux/LinuxTimezone.cpp" + (("/usr/share/zoneinfo") + (string-append (assoc-ref inputs "tzdata") + "/share/zoneinfo"))) + + ;; Don't phone home to check for updates. + (substitute* "system/addon-manifest.xml" + (("service.xbmc.versioncheck") + "")) + + ;; Let's disable some tests that are known not to work here. + ;; Doing this later while in the cmake "../build" directory + ;; is trickier. (substitute* '("xbmc/utils/test/TestSystemInfo.cpp") (("TEST_F\\(TestSystemInfo, GetOsPrettyNameWithVersion\\)") "TEST_F(TestSystemInfo, DISABLED_GetOsPrettyNameWithVersion)") (("TEST_F\\(TestSystemInfo, GetOsName\\)") "TEST_F(TestSystemInfo, DISABLED_GetOsName)") (("TEST_F\\(TestSystemInfo, GetOsVersion\\)") - "TEST_F(TestSystemInfo, DISABLED_GetOsVersion)"))))))) + "TEST_F(TestSystemInfo, DISABLED_GetOsVersion)")) + #t)) + (add-before 'build 'set-build-environment + (lambda _ + ;; Some bundled build scripts fall back to /bin/sh + ;; if this is not set. + (setenv "CONFIG_SHELL" (which "sh")) + #t)) + (add-before 'check 'build-kodi-test + (lambda _ + (invoke "make" "kodi-test")))))) ;; TODO: Add dependencies for: - ;; - vdpau ;; - nfs - ;; - ;; FIXME: libusb detection fails. - ;; - ;; FIXME: As you can see, we use a lot of external libraries, but it seems - ;; that a few bundled ones are still being used. + ;; - cec + ;; - plist + ;; - shairplay (native-inputs `(("autoconf" ,autoconf) ("automake" ,automake) - ("cmake" ,cmake) - ("doxygen" ,doxygen) - ("gawk" ,gawk) ("gettext" ,gettext-minimal) ("icedtea" ,icedtea) ; needed at build-time only, mandatory + ("libdvdcss-bootstrapped" ,libdvdcss/kodi) + ("libdvdnav-bootstrapped" ,libdvdnav/kodi) + ("libdvdread-bootstrapped" ,libdvdread/kodi) ("libtool" ,libtool) ("pkg-config" ,pkg-config) ("swig" ,swig) - ("which" ,which) ("yasm" ,yasm))) (inputs `(("alsa-lib" ,alsa-lib) ("avahi" ,avahi) ("bluez" ,bluez) - ("boost" ,boost) - ("bzip2" ,bzip2) ("crossguid" ,crossguid) ("curl" ,curl) ("dcadec" ,dcadec) ("dbus" ,dbus) - ("enca" ,enca) ("eudev" ,eudev) ("ffmpeg" ,ffmpeg) ("flac" ,flac) + ("flatbuffers" ,flatbuffers) + ("fmt" ,fmt) ("fontconfig" ,fontconfig) ("freetype" ,freetype) ("fribidi" ,fribidi) + ("fstrcmp" ,fstrcmp) + ("giflib" ,giflib) ("glew" ,glew) ("gnutls" ,gnutls) - ("gperf" ,gperf) - ("jasper" ,jasper) ("lame" ,lame) + ("lcms" ,lcms) ("libass" ,libass) ("libbluray" ,libbluray) ("libcap" ,libcap) ("libcdio" ,libcdio) + ("libdrm" ,libdrm) ("libgcrypt" ,libgcrypt) ("libjpeg" ,libjpeg) ("libltdl" ,libltdl) ("libmad" ,libmad) ("libmicrohttpd" ,libmicrohttpd) - ("libmodplug" ,libmodplug) ("libmpeg2" ,libmpeg2) ("libogg" ,libogg) ("libpng" ,libpng) - ("libsamplerate" ,libsamplerate) ("libssh" ,libssh) ("libtiff" ,libtiff) ("libva" ,libva) ("libvorbis" ,libvorbis) ("libxml2" ,libxml2) - ("libxmu" ,libxmu) ("libxrandr" ,libxrandr) ("libxrender" ,libxrender) ("libxslt" ,libxslt) - ("libxt" ,libxt) - ("libyajl" ,libyajl) ("lzo" ,lzo) - ("mesa-utils" ,mesa-utils) - ("mysql" ,mysql) + ("mariadb" ,mariadb "lib") + ("mariadb-dev" ,mariadb "dev") ("openssl" ,openssl) ("pcre" ,pcre) ("pulseaudio" ,pulseaudio) ("python" ,python-2) + ("rapidjson" ,rapidjson) ("samba" ,samba) - ("sdl2" ,sdl2) ("sqlite" ,sqlite) ("taglib" ,taglib) ("tinyxml" ,tinyxml) - ("unzip" ,unzip) + ("tzdata" ,tzdata) ("util-linux" ,util-linux) ("zip" ,zip) ("zlib" ,zlib))) @@ -273,5 +454,86 @@ generator library for C++.") (description "Kodi is a media center application for playing videos, music, games, etc. Kodi is highly customizable and features a theme and plug-in system.") - (home-page "http://kodi.tv") - (license license:gpl2+))) + (home-page "https://kodi.tv") + ;; XBMC is largely GPL2+, with some library components as LGPL2.1+, but + ;; there are some other licenses spread throughout. + (license (list license:gpl2+ license:lgpl2.1+ + license:gpl3+ ;WiiRemote client + license:expat ;cpluff, dbwrappers + license:public-domain ;cpluff/examples + license:bsd-3 ;misc, gtest + license:bsd-2)))) ;xbmc/freebsd + +(define-public kodi/wayland + (package/inherit kodi + (name "kodi-wayland") + (arguments + (substitute-keyword-arguments (package-arguments kodi) + ((#:configure-flags flags) + `(append '("-DCORE_PLATFORM_NAME=wayland" + "-DWAYLAND_RENDER_SYSTEM=gl") + ,flags)))) + (inputs + `(("libinput" ,libinput) + ("libxkbcommon" ,libxkbcommon) + ("waylandpp" ,waylandpp) + ("waylandp-protocols" ,wayland-protocols) + ,@(package-inputs kodi))) + (synopsis "Kodi with Wayland rendering backend"))) + +(define-public kodi-cli + (let ((commit "104dc23b2a993c8e6db8c46f4f8bec24b146549b") ; Add support for + (revision "1")) ; `$HOME/.kodirc'. + (package + (name "kodi-cli") + (version (string-append "1.1-" revision "." (string-take commit 7))) + (source (origin + (method git-fetch) + (uri (git-reference (url "https://github.com/nawar/kodi-cli") + (commit commit))) + (sha256 + (base32 + "1xjhasc5gngfxpr1dlzy6q24w0wpdfjx12p43fanjppxw4i49n5p")) + (file-name (string-append name "-" version "-checkout")))) + (build-system trivial-build-system) + (inputs + `(("bash" ,bash) + ("curl" ,curl) + ("mps-youtube" ,mps-youtube))) + (arguments + `(#:modules ((guix build utils)) + #:builder + (begin + (use-modules (guix build utils)) + (copy-recursively (assoc-ref %build-inputs "source") ".") + (substitute* "kodi-cli" + (("/bin/bash") (string-append (assoc-ref %build-inputs "bash") + "/bin/bash")) + (("output=\\$\\((curl)" all curl) + (string-append "output=$(" + (assoc-ref %build-inputs "curl") + "/bin/" curl)) + (("play_youtube `(mpsyt)" all mpsyt) + (string-append "play_youtube `" + (assoc-ref %build-inputs "mps-youtube") + "/bin/" mpsyt))) + (install-file "kodi-cli" (string-append %output "/bin")) + #t))) + (home-page "https://github.com/nawar/kodi-cli") + (synopsis "Control Kodi from the command line") + (description "@code{kodi-cli} is a tool for sending commands to a Kodi +server using JSON RPC. + +Features: + +@itemize +@item Play, pause, stop the currently playing item. +@item Skip forward or backward in the currently playing item. +@item Play or queue to the currently list of YouTube videos. +@item Interactive and noninteractive volume control. +@item Interactive navigation. +@item Send text to the Kodi keyboard. +@item Toggle fullscreen. +@item Update or clean Kodi libraries. +@end itemize\n") + (license license:gpl2+))))