about summary refs log tree commit diff
path: root/nixpkgs/pkgs/applications/video/kodi/unwrapped.nix
diff options
context:
space:
mode:
Diffstat (limited to 'nixpkgs/pkgs/applications/video/kodi/unwrapped.nix')
-rw-r--r--nixpkgs/pkgs/applications/video/kodi/unwrapped.nix270
1 files changed, 270 insertions, 0 deletions
diff --git a/nixpkgs/pkgs/applications/video/kodi/unwrapped.nix b/nixpkgs/pkgs/applications/video/kodi/unwrapped.nix
new file mode 100644
index 000000000000..f97b53b60937
--- /dev/null
+++ b/nixpkgs/pkgs/applications/video/kodi/unwrapped.nix
@@ -0,0 +1,270 @@
+{ stdenv, lib, fetchFromGitHub
+, fetchpatch
+, autoconf, automake, libtool, makeWrapper
+, pkg-config, cmake, yasm, python3Packages
+, libxcrypt, libgcrypt, libgpg-error, libunistring
+, boost, avahi, lame
+, gettext, pcre-cpp, yajl, fribidi, which
+, openssl, gperf, tinyxml2, taglib, libssh, swig, jre_headless
+, gtest, ncurses, spdlog
+, libxml2, systemd
+, alsa-lib, libGLU, libGL, fontconfig, freetype, ftgl
+, libjpeg, libpng, libtiff
+, libmpeg2, libsamplerate, libmad
+, libogg, libvorbis, flac, libxslt
+, lzo, libcdio, libmodplug, libass, libbluray, libudfread
+, sqlite, libmysqlclient, nasm, gnutls, libva, libdrm
+, curl, bzip2, zip, unzip, glxinfo
+, libcec, libcec_platform, dcadec, libuuid
+, libcrossguid, libmicrohttpd
+, bluez, doxygen, giflib, glib, harfbuzz, lcms2, libidn2, libpthreadstubs, libtasn1
+, libplist, p11-kit, zlib, flatbuffers, fstrcmp, rapidjson
+, lirc
+, x11Support ? true, libX11, xorgproto, libXt, libXmu, libXext, libXinerama, libXrandr, libXtst, libXfixes, xdpyinfo, libXdmcp
+, dbusSupport ? true, dbus
+, joystickSupport ? true, cwiid
+, nfsSupport ? true, libnfs
+, pulseSupport ? true, libpulseaudio
+, pipewireSupport ? true, pipewire
+, rtmpSupport ? true, rtmpdump
+, sambaSupport ? true, samba
+, udevSupport ? true, udev
+, usbSupport  ? false, libusb-compat-0_1
+, vdpauSupport ? true, libvdpau
+, waylandSupport ? false, wayland, wayland-protocols
+, waylandpp ?  null, libxkbcommon
+, gbmSupport ? false, mesa, libinput
+, buildPackages
+}:
+
+assert usbSupport -> !udevSupport; # libusb-compat-0_1 won't be used if udev is available
+assert gbmSupport || waylandSupport || x11Support;
+
+let
+  kodiReleaseDate = "20240302";
+  kodiVersion = "20.5";
+  rel = "Nexus";
+
+  kodi_src = fetchFromGitHub {
+    owner = "xbmc";
+    repo = "xbmc";
+    rev = "${kodiVersion}-${rel}";
+    hash = "sha256-R/tzk3ZarJ4BTR312p2lTLezeCEsqdQH54ROsNIoJZA=";
+  };
+
+  # see https://github.com/xbmc/xbmc/blob/${kodiVersion}-${rel}/tools/depends/target/ to get suggested versions for all dependencies
+
+  # kodi 20.0 moved to ffmpeg 5, *but* there is a bug making the compilation fail which will
+  # only been fixed in kodi 21, so stick to ffmpeg 4 for now
+  ffmpeg = stdenv.mkDerivation rec {
+    pname = "kodi-ffmpeg";
+    version = "4.4.1";
+    src = fetchFromGitHub {
+      owner   = "xbmc";
+      repo    = "FFmpeg";
+      rev     = "${version}-${rel}-Alpha1";
+      sha256  = "sha256-EQHmmWnDw+/udKYq7Nrf00nL7I5XWUtmzdauDryfTII=";
+    };
+    patches = [
+      # Backport fix for binutils-2.41.
+      (fetchpatch {
+        name = "binutils-2.41.patch";
+        url = "https://git.ffmpeg.org/gitweb/ffmpeg.git/patch/effadce6c756247ea8bae32dc13bb3e6f464f0eb";
+        hash = "sha256-vlBUMJ1bORQHRNpuzc5iXsTWwS/CN5BmGIA8g7H7mJE=";
+      })
+    ];
+    preConfigure = ''
+      cp ${kodi_src}/tools/depends/target/ffmpeg/{CMakeLists.txt,*.cmake} .
+      sed -i 's/ --cpu=''${CPU}//' CMakeLists.txt
+      sed -i 's/--strip=''${CMAKE_STRIP}/--strip=''${CMAKE_STRIP} --ranlib=''${CMAKE_RANLIB}/' CMakeLists.txt
+    '';
+    cmakeFlags = lib.optionals (stdenv.hostPlatform != stdenv.buildPlatform) [
+      "-DCROSSCOMPILING=ON"
+      "-DCPU=${stdenv.hostPlatform.parsed.cpu.name}"
+      "-DOS=${stdenv.hostPlatform.parsed.kernel.name}"
+      "-DPKG_CONFIG_EXECUTABLE=pkg-config"
+    ];
+    buildInputs = [ libidn2 libtasn1 p11-kit zlib libva ]
+      ++ lib.optional vdpauSupport libvdpau;
+    nativeBuildInputs = [ cmake nasm pkg-config gnutls ];
+  };
+
+  # We can build these externally but FindLibDvd.cmake forces us to build it
+  # them, so we currently just use them for the src.
+  libdvdcss = fetchFromGitHub {
+    owner = "xbmc";
+    repo = "libdvdcss";
+    rev = "1.4.3-Next-Nexus-Alpha2-2";
+    sha256 = "sha256-CJMGH50mNAkovccNcol5ArF3zUnZKfbVB9EXyQgu5k4=";
+  };
+
+  libdvdnav = fetchFromGitHub {
+    owner = "xbmc";
+    repo = "libdvdnav";
+    rev = "6.1.1-Next-Nexus-Alpha2-2";
+    sha256 = "sha256-m8SCjOokVbwJ7eVfYKHap1pQjVbI+BXaoxhGZQIg0+k=";
+  };
+
+  libdvdread = fetchFromGitHub {
+    owner = "xbmc";
+    repo = "libdvdread";
+    rev = "6.1.3-Next-Nexus-Alpha2-2";
+    sha256 = "sha256-AphBQhXud+a6wm52zjzC5biz53NnqWdgpL2QDt2ZuXc=";
+  };
+
+  kodi_platforms = lib.optional gbmSupport "gbm"
+    ++ lib.optional waylandSupport "wayland"
+    ++ lib.optional x11Support "x11";
+
+in stdenv.mkDerivation {
+    pname = "kodi";
+    version = kodiVersion;
+
+    src = kodi_src;
+    buildInputs = [
+      gnutls libidn2 libtasn1 nasm p11-kit
+      libxml2 python3Packages.python
+      boost libmicrohttpd
+      gettext pcre-cpp yajl fribidi libva libdrm
+      openssl gperf tinyxml2 taglib libssh
+      gtest ncurses spdlog
+      alsa-lib libGL libGLU fontconfig freetype ftgl
+      libjpeg libpng libtiff
+      libmpeg2 libsamplerate libmad
+      libogg libvorbis flac libxslt systemd
+      lzo libcdio libmodplug libass libbluray libudfread
+      sqlite libmysqlclient avahi lame
+      curl bzip2 zip unzip glxinfo
+      libcec libcec_platform dcadec libuuid
+      libxcrypt libgcrypt libgpg-error libunistring
+      libcrossguid libplist
+      bluez giflib glib harfbuzz lcms2 libpthreadstubs
+      ffmpeg flatbuffers fstrcmp rapidjson
+      lirc
+      mesa # for libEGL
+    ]
+    ++ lib.optionals x11Support [
+      libX11 xorgproto libXt libXmu libXext.dev libXdmcp
+      libXinerama libXrandr.dev libXtst libXfixes
+    ]
+    ++ lib.optional  dbusSupport     dbus
+    ++ lib.optional  joystickSupport cwiid
+    ++ lib.optional  nfsSupport      libnfs
+    ++ lib.optional  pulseSupport    libpulseaudio
+    ++ lib.optional  pipewireSupport pipewire
+    ++ lib.optional  rtmpSupport     rtmpdump
+    ++ lib.optional  sambaSupport    samba
+    ++ lib.optional  udevSupport     udev
+    ++ lib.optional  usbSupport      libusb-compat-0_1
+    ++ lib.optional  vdpauSupport    libvdpau
+    ++ lib.optionals waylandSupport [
+      wayland
+      waylandpp.dev
+      wayland-protocols
+      # Not sure why ".dev" is needed here, but CMake doesn't find libxkbcommon otherwise
+      libxkbcommon.dev
+    ]
+    ++ lib.optionals gbmSupport [
+      libxkbcommon.dev
+      mesa.dev
+      libinput.dev
+    ];
+
+    nativeBuildInputs = [
+      cmake
+      doxygen
+      makeWrapper
+      which
+      pkg-config
+      autoconf automake libtool # still needed for some components. Check if that is the case with 19.0
+      jre_headless yasm gettext python3Packages.python flatbuffers
+
+      # for TexturePacker
+      giflib zlib libpng libjpeg lzo
+    ] ++ lib.optionals waylandSupport [ wayland-protocols waylandpp.bin ];
+
+    depsBuildBuild = [
+      buildPackages.stdenv.cc
+    ];
+
+    cmakeFlags = [
+      "-DAPP_RENDER_SYSTEM=${if gbmSupport then "gles" else "gl"}"
+      "-Dlibdvdcss_URL=${libdvdcss}"
+      "-Dlibdvdnav_URL=${libdvdnav}"
+      "-Dlibdvdread_URL=${libdvdread}"
+      "-DGIT_VERSION=${kodiReleaseDate}"
+      "-DENABLE_EVENTCLIENTS=ON"
+      "-DENABLE_INTERNAL_CROSSGUID=OFF"
+      "-DENABLE_INTERNAL_RapidJSON=OFF"
+      "-DENABLE_OPTICAL=ON"
+      "-DLIRC_DEVICE=/run/lirc/lircd"
+      "-DSWIG_EXECUTABLE=${buildPackages.swig}/bin/swig"
+      "-DFLATBUFFERS_FLATC_EXECUTABLE=${buildPackages.flatbuffers}/bin/flatc"
+      "-DPYTHON_EXECUTABLE=${buildPackages.python3Packages.python}/bin/python"
+      # When wrapped KODI_HOME will likely contain symlinks to static assets
+      # that Kodi's built in webserver will cautiously refuse to serve up
+      # (because their realpaths are outside of KODI_HOME and the other
+      # whitelisted directories). This adds the entire nix store to the Kodi
+      # webserver whitelist to avoid this problem.
+      "-DKODI_WEBSERVER_EXTRA_WHITELIST=${builtins.storeDir}"
+    ] ++ lib.optionals waylandSupport [
+      "-DWAYLANDPP_SCANNER=${buildPackages.waylandpp}/bin/wayland-scanner++"
+    ];
+
+    # 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;
+
+    preConfigure = ''
+      cmakeFlagsArray+=("-DCORE_PLATFORM_NAME=${lib.concatStringsSep " " kodi_platforms}")
+    '' + lib.optionalString (stdenv.hostPlatform != stdenv.buildPlatform) ''
+      # Need these tools on the build system when cross compiling,
+      # hacky, but have found no other way.
+      CXX=$CXX_FOR_BUILD LD=ld make -C tools/depends/native/JsonSchemaBuilder
+      cmakeFlags+=" -DWITH_JSONSCHEMABUILDER=$PWD/tools/depends/native/JsonSchemaBuilder/bin"
+
+      CXX=$CXX_FOR_BUILD LD=ld make EXTRA_CONFIGURE= -C tools/depends/native/TexturePacker
+      cmakeFlags+=" -DWITH_TEXTUREPACKER=$PWD/tools/depends/native/TexturePacker/bin"
+    '';
+
+    postPatch = ''
+      substituteInPlace xbmc/platform/posix/PosixTimezone.cpp \
+        --replace 'usr/share/zoneinfo' 'etc/zoneinfo'
+    '';
+
+    postInstall = ''
+      # TODO: figure out which binaries should be wrapped this way and which shouldn't
+      for p in $(ls --ignore=kodi-send $out/bin/) ; do
+        wrapProgram $out/bin/$p \
+          --prefix PATH ":" "${lib.makeBinPath ([ python3Packages.python glxinfo ]
+            ++ lib.optional x11Support xdpyinfo ++ lib.optional sambaSupport samba)}" \
+          --prefix LD_LIBRARY_PATH ":" "${lib.makeLibraryPath
+              ([ curl systemd libmad libvdpau libcec libcec_platform libass ]
+                 ++ lib.optional nfsSupport libnfs
+                 ++ lib.optional rtmpSupport rtmpdump)}"
+      done
+
+      wrapProgram $out/bin/kodi-send \
+        --prefix PYTHONPATH : $out/${python3Packages.python.sitePackages}
+
+      substituteInPlace $out/share/xsessions/kodi.desktop \
+        --replace kodi-standalone $out/bin/kodi-standalone
+    '';
+
+    doInstallCheck = true;
+
+    installCheckPhase = "$out/bin/kodi --version";
+
+    passthru = {
+      pythonPackages = python3Packages;
+      ffmpeg = ffmpeg;
+    };
+
+    meta = with lib; {
+      description = "Media center";
+      homepage    = "https://kodi.tv/";
+      license     = licenses.gpl2Plus;
+      platforms   = platforms.linux;
+      maintainers = teams.kodi.members;
+    };
+}