about summary refs log tree commit diff
path: root/pkgs/by-name/vl/vlc/package.nix
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/by-name/vl/vlc/package.nix')
-rw-r--r--pkgs/by-name/vl/vlc/package.nix299
1 files changed, 299 insertions, 0 deletions
diff --git a/pkgs/by-name/vl/vlc/package.nix b/pkgs/by-name/vl/vlc/package.nix
new file mode 100644
index 000000000000..9b89cca9a192
--- /dev/null
+++ b/pkgs/by-name/vl/vlc/package.nix
@@ -0,0 +1,299 @@
+{ lib
+, SDL
+, SDL_image
+, a52dec
+, alsa-lib
+, autoreconfHook
+, avahi
+, dbus
+, faad2
+, fetchpatch
+, fetchurl
+, ffmpeg
+, flac
+, fluidsynth
+, freefont_ttf
+, freetype
+, fribidi
+, gnutls
+, libSM
+, libXext
+, libXinerama
+, libXpm
+, libXv
+, libXvMC
+, libarchive
+, libass
+, libbluray
+, libcaca
+, libcddb
+, libdc1394
+, libdvbpsi
+, libdvdnav
+, libebml
+, libgcrypt
+, libgpg-error
+, libjack2
+, libkate
+, libmad
+, libmatroska
+, libmicrodns
+, libmodplug
+, libmtp
+, liboggz
+, libopus
+, libplacebo_5
+, libpulseaudio
+, libraw1394
+, librsvg
+, libsForQt5
+, libsamplerate
+, libspatialaudio
+, libssh2
+, libtheora
+, libtiger
+, libupnp
+, libv4l
+, libva
+, libvdpau
+, libvorbis
+, libxml2
+, live555
+, lua5
+, mpeg2dec
+, ncurses
+, perl
+, pkg-config
+, pkgsBuildBuild
+, protobuf
+, removeReferencesTo
+, samba
+, schroedinger
+, speex
+, srt
+, stdenv
+, systemd
+, taglib
+, unzip
+, wayland
+, wayland-protocols
+, wrapGAppsHook
+, xcbutilkeysyms
+, zlib
+
+, chromecastSupport ? true
+, jackSupport ? false
+, onlyLibVLC ? false
+, skins2Support ? !onlyLibVLC
+, waylandSupport ? true
+, withQt5 ? true
+}:
+
+# chromecastSupport requires TCP port 8010 to be open for it to work.
+# If your firewall is enabled, make sure to have something like:
+#   networking.firewall.allowedTCPPorts = [ 8010 ];
+
+let
+  inherit (lib) optionalString optionals;
+in
+stdenv.mkDerivation (finalAttrs: {
+  pname = "${optionalString onlyLibVLC "lib"}vlc";
+  version = "3.0.20";
+
+  src = fetchurl {
+    url = "https://get.videolan.org/vlc/${finalAttrs.version}/vlc-${finalAttrs.version}.tar.xz";
+    hash = "sha256-rccoW00nIc3fQOtScMraKqoQozTLVG/VWgY1NEe6KbU=";
+  };
+
+  nativeBuildInputs = [
+    autoreconfHook
+    lua5
+    perl
+    pkg-config
+    removeReferencesTo
+    unzip
+    wrapGAppsHook
+  ]
+  ++ optionals chromecastSupport [ protobuf ]
+  ++ optionals withQt5 [ libsForQt5.wrapQtAppsHook ]
+  ++ optionals waylandSupport [
+    wayland
+    wayland-protocols
+  ];
+
+  # VLC uses a *ton* of libraries for various pieces of functionality, many of
+  # which are not included here for no other reason that nobody has mentioned
+  # needing them
+  buildInputs = [
+    SDL
+    SDL_image
+    a52dec
+    alsa-lib
+    avahi
+    dbus
+    faad2
+    ffmpeg
+    flac
+    fluidsynth
+    fribidi
+    gnutls
+    libSM
+    libXpm
+    libXv
+    libXvMC
+    libarchive
+    libass
+    libbluray
+    libcaca
+    libcddb
+    libdc1394
+    libdvbpsi
+    libdvdnav
+    libdvdnav.libdvdread
+    libebml
+    libgcrypt
+    libgpg-error
+    libkate
+    libmad
+    libmatroska
+    libmodplug
+    libmtp
+    liboggz
+    libopus
+    libplacebo_5
+    libpulseaudio
+    libraw1394
+    librsvg
+    libsamplerate
+    libspatialaudio
+    libssh2
+    libtheora
+    libtiger
+    libupnp
+    libv4l
+    libva
+    libvdpau
+    libvorbis
+    libxml2
+    lua5
+    mpeg2dec
+    ncurses
+    samba
+    schroedinger
+    speex
+    srt
+    systemd
+    taglib
+    xcbutilkeysyms
+    zlib
+  ]
+  ++ optionals (!stdenv.hostPlatform.isAarch && !onlyLibVLC) [ live555 ]
+  ++ optionals jackSupport [ libjack2 ]
+  ++ optionals chromecastSupport [ libmicrodns protobuf ]
+  ++ optionals skins2Support [
+    freetype
+    libXext
+    libXinerama
+    libXpm
+  ]
+  ++ optionals waylandSupport [ wayland wayland-protocols ]
+  ++ optionals withQt5 (with libsForQt5; [
+    qtbase
+    qtsvg
+    qtx11extras
+  ])
+  ++ optionals (waylandSupport && withQt5) [ libsForQt5.qtwayland ];
+
+  env = {
+    # vlc depends on a c11-gcc wrapper script which we don't have so we need to
+    # set the path to the compiler
+    BUILDCC = "${pkgsBuildBuild.stdenv.cc}/bin/gcc";
+    PKG_CONFIG_WAYLAND_SCANNER_WAYLAND_SCANNER = "wayland-scanner";
+  } // lib.optionalAttrs (!stdenv.hostPlatform.isAarch) {
+    LIVE555_PREFIX = live555;
+  };
+
+  patches = [
+    # patch to build with recent live555
+    # upstream issue: https://code.videolan.org/videolan/vlc/-/issues/25473
+    (fetchpatch {
+      url = "https://code.videolan.org/videolan/vlc/uploads/eb1c313d2d499b8a777314f789794f9d/0001-Add-lssl-and-lcrypto-to-liblive555_plugin_la_LIBADD.patch";
+      hash = "sha256-qs3gY1ksCZlf931TSZyMuT2JD0sqrmcRCZwL+wVG0U8=";
+    })
+  ];
+
+  postPatch = ''
+    substituteInPlace modules/text_renderer/freetype/platform_fonts.h \
+      --replace \
+        /usr/share/fonts/truetype/freefont \
+        ${freefont_ttf}/share/fonts/truetype
+  ''
+  # Upstream luac can't cross compile, so we have to install the lua sources
+  # instead of bytecode:
+  # https://www.lua.org/wshop13/Jericke.pdf#page=39
+  + lib.optionalString (!stdenv.hostPlatform.canExecute stdenv.buildPlatform) ''
+      substituteInPlace share/Makefile.am \
+        --replace $'.luac \\\n' $'.lua \\\n'
+  '';
+
+  enableParallelBuilding = true;
+
+  dontWrapGApps = true; # to prevent double wrapping of Qtwrap and Gwrap
+
+  # Most of the libraries are auto-detected so we don't need to set a bunch of
+  # "--enable-foo" flags here
+  configureFlags = [
+    "--enable-srt" # Explicit enable srt to ensure the patch is applied.
+    "--with-kde-solid=$out/share/apps/solid/actions"
+  ]
+  ++ optionals onlyLibVLC [ "--disable-vlc" ]
+  ++ optionals skins2Support [ "--enable-skins2" ]
+  ++ optionals waylandSupport [ "--enable-wayland" ]
+  ++ optionals chromecastSupport [
+    "--enable-sout"
+    "--enable-chromecast"
+    "--enable-microdns"
+  ];
+
+  # Remove runtime dependencies on libraries
+  postConfigure = ''
+    sed -i 's|^#define CONFIGURE_LINE.*$|#define CONFIGURE_LINE "<removed>"|g' config.h
+  '';
+
+  # fails on high core machines
+  # ld: cannot find -lvlc_vdpau: No such file or directory
+  # https://code.videolan.org/videolan/vlc/-/issues/27338
+  enableParallelInstalling = false;
+
+  # Add missing SOFA files
+  # Given in EXTRA_DIST, but not in install-data target
+  postInstall = ''
+    cp -R share/hrtfs $out/share/vlc
+  '';
+
+  preFixup = ''
+    qtWrapperArgs+=("''${gappsWrapperArgs[@]}")
+  '';
+
+  # - Touch plugins (plugins cache keyed off mtime and file size:
+  #     https://github.com/NixOS/nixpkgs/pull/35124#issuecomment-370552830
+  # - Remove references to the Qt development headers (used in error messages)
+  #
+  # pkgsBuildBuild is used here because buildPackages.libvlc somehow
+  # depends on a qt5.qttranslations that doesn't build, even though it
+  # should be the same as pkgsBuildBuild.qt5.qttranslations.
+  postFixup = ''
+    find $out/lib/vlc/plugins -exec touch -d @1 '{}' ';'
+    ${if stdenv.buildPlatform.canExecute stdenv.hostPlatform then "$out" else pkgsBuildBuild.libvlc}/lib/vlc/vlc-cache-gen $out/vlc/plugins
+  '' + optionalString withQt5 ''
+    remove-references-to -t "${libsForQt5.qtbase.dev}" $out/lib/vlc/plugins/gui/libqt_plugin.so
+  '';
+
+  meta = {
+    description = "Cross-platform media player and streaming server";
+    homepage = "https://www.videolan.org/vlc/";
+    license = lib.licenses.lgpl21Plus;
+    maintainers = with lib.maintainers; [ AndersonTorres ];
+    platforms = lib.platforms.linux;
+  };
+})