nixpkgs/pkgs/applications/video/mpv/default.nix
2022-11-15 20:58:01 +01:00

233 lines
7.5 KiB
Nix

{ config
, lib
, stdenv
, fetchFromGitHub
, addOpenGLRunpath
, docutils
, perl
, pkg-config
, python3
, wafHook
, which
, ffmpeg
, freefont_ttf
, freetype
, libass
, libpthreadstubs
, nv-codec-headers
, lua
, libuchardet
, libiconv
, CoreFoundation, Cocoa, CoreAudio, MediaPlayer
, waylandSupport ? stdenv.isLinux
, wayland
, wayland-protocols
, wayland-scanner
, libxkbcommon
, x11Support ? stdenv.isLinux
, libGLU, libGL
, libX11
, libXext
, libXxf86vm
, libXrandr
, libXpresent
, cddaSupport ? false
, libcdio
, libcdio-paranoia
, vulkanSupport ? stdenv.isLinux
, libplacebo
, shaderc # instead of spirv-cross
, vulkan-headers
, vulkan-loader
, drmSupport ? stdenv.isLinux
, libdrm
, mesa
, alsaSupport ? stdenv.isLinux, alsa-lib
, archiveSupport ? true, libarchive
, bluraySupport ? true, libbluray
, bs2bSupport ? true, libbs2b
, cacaSupport ? true, libcaca
, cmsSupport ? true, lcms2
, dvdnavSupport ? stdenv.isLinux, libdvdnav
, dvbinSupport ? stdenv.isLinux
, jackaudioSupport ? false, libjack2
, javascriptSupport ? true, mujs
, libpngSupport ? true, libpng
, openalSupport ? true, openalSoft
, pulseSupport ? config.pulseaudio or stdenv.isLinux, libpulseaudio
, pipewireSupport ? stdenv.isLinux, pipewire
, rubberbandSupport ? true, rubberband
, screenSaverSupport ? true, libXScrnSaver
, sdl2Support ? true, SDL2
, sixelSupport ? false, libsixel
, speexSupport ? true, speex
, swiftSupport ? false, swift
, theoraSupport ? true, libtheora
, vaapiSupport ? stdenv.isLinux, libva
, vapoursynthSupport ? false, vapoursynth
, vdpauSupport ? true, libvdpau
, xineramaSupport ? stdenv.isLinux, libXinerama
, xvSupport ? stdenv.isLinux, libXv
, zimgSupport ? true, zimg
}:
let
luaEnv = lua.withPackages (ps: with ps; [ luasocket ]);
in stdenv.mkDerivation rec {
pname = "mpv";
version = "0.35.0";
outputs = [ "out" "dev" "man" ];
src = fetchFromGitHub {
owner = "mpv-player";
repo = "mpv";
rev = "v${version}";
sha256 = "sha256-U3NDSxlX4/WkoHFkOvpcwPMwfwTnSpCw0QI5yLMK08o=";
};
postPatch = ''
patchShebangs version.* ./TOOLS/
'';
NIX_LDFLAGS = lib.optionalString x11Support "-lX11 -lXext "
+ lib.optionalString stdenv.isDarwin "-framework CoreFoundation";
# These flags are not supported and cause the build
# to fail, even when cross compilation itself works.
dontAddWafCrossFlags = true;
wafConfigureFlags = [
"--enable-libmpv-shared"
"--enable-manpage-build"
"--disable-libmpv-static"
"--disable-static-build"
"--disable-build-date" # Purity
(lib.enableFeature archiveSupport "libarchive")
(lib.enableFeature cddaSupport "cdda")
(lib.enableFeature dvdnavSupport "dvdnav")
(lib.enableFeature javascriptSupport "javascript")
(lib.enableFeature openalSupport "openal")
(lib.enableFeature sdl2Support "sdl2")
(lib.enableFeature sixelSupport "sixel")
(lib.enableFeature vaapiSupport "vaapi")
(lib.enableFeature waylandSupport "wayland")
(lib.enableFeature dvbinSupport "dvbin")
] # Disable whilst Swift isn't supported
++ lib.optional (!swiftSupport) "--disable-macos-cocoa-cb";
nativeBuildInputs = [
addOpenGLRunpath
docutils # for rst2man
perl
pkg-config
python3
wafHook
which
] ++ lib.optionals swiftSupport [ swift ]
++ lib.optionals waylandSupport [ wayland-scanner ];
buildInputs = [
ffmpeg
freetype
libass
libpthreadstubs
libuchardet
luaEnv
] ++ lib.optionals alsaSupport [ alsa-lib ]
++ lib.optionals archiveSupport [ libarchive ]
++ lib.optionals bluraySupport [ libbluray ]
++ lib.optionals bs2bSupport [ libbs2b ]
++ lib.optionals cacaSupport [ libcaca ]
++ lib.optionals cddaSupport [ libcdio libcdio-paranoia ]
++ lib.optionals cmsSupport [ lcms2 ]
++ lib.optionals drmSupport [ libdrm mesa ]
++ lib.optionals dvdnavSupport [ libdvdnav libdvdnav.libdvdread ]
++ lib.optionals jackaudioSupport [ libjack2 ]
++ lib.optionals javascriptSupport [ mujs ]
++ lib.optionals libpngSupport [ libpng ]
++ lib.optionals openalSupport [ openalSoft ]
++ lib.optionals pipewireSupport [ pipewire ]
++ lib.optionals pulseSupport [ libpulseaudio ]
++ lib.optionals rubberbandSupport [ rubberband ]
++ lib.optionals screenSaverSupport [ libXScrnSaver ]
++ lib.optionals sdl2Support [ SDL2 ]
++ lib.optionals sixelSupport [ libsixel ]
++ lib.optionals speexSupport [ speex ]
++ lib.optionals theoraSupport [ libtheora ]
++ lib.optionals vaapiSupport [ libva ]
++ lib.optionals vapoursynthSupport [ vapoursynth ]
++ lib.optionals vdpauSupport [ libvdpau ]
++ lib.optionals vulkanSupport [ libplacebo shaderc vulkan-headers vulkan-loader ]
++ lib.optionals waylandSupport [ wayland wayland-protocols libxkbcommon ]
++ lib.optionals x11Support [ libX11 libXext libGLU libGL libXxf86vm libXrandr libXpresent ]
++ lib.optionals xineramaSupport [ libXinerama ]
++ lib.optionals xvSupport [ libXv ]
++ lib.optionals zimgSupport [ zimg ]
++ lib.optionals stdenv.isLinux [ nv-codec-headers ]
++ lib.optionals stdenv.isDarwin [ libiconv ]
++ lib.optionals stdenv.isDarwin [ CoreFoundation Cocoa CoreAudio MediaPlayer ];
enableParallelBuilding = true;
postBuild = lib.optionalString stdenv.isDarwin ''
python3 TOOLS/osxbundle.py -s build/mpv
'';
postInstall = ''
# Use a standard font
mkdir -p $out/share/mpv
ln -s ${freefont_ttf}/share/fonts/truetype/FreeSans.ttf $out/share/mpv/subfont.ttf
cp TOOLS/mpv_identify.sh $out/bin
cp TOOLS/umpv $out/bin
cp $out/share/applications/mpv.desktop $out/share/applications/umpv.desktop
sed -i '/Icon=/ ! s/mpv/umpv/g' $out/share/applications/umpv.desktop
substituteInPlace $out/lib/pkgconfig/mpv.pc \
--replace "$out/include" "$dev/include"
'' + lib.optionalString stdenv.isDarwin ''
mkdir -p $out/Applications
cp -r build/mpv.app $out/Applications
'';
# Set RUNPATH so that libcuda in /run/opengl-driver(-32)/lib can be found.
# See the explanation in addOpenGLRunpath.
postFixup = lib.optionalString stdenv.isLinux ''
addOpenGLRunpath $out/bin/mpv
'';
passthru = {
inherit
# The wrapper consults luaEnv and lua.version
luaEnv
lua
# In the wrapper, we want to reference vapoursynth which has the `python3`
# passthru attribute (which has the `sitePrefix` attribute). This way we'll
# be sure that in the wrapper we'll use the same python3.sitePrefix used to
# build vapoursynth.
vapoursynthSupport
vapoursynth
;
};
meta = with lib; {
homepage = "https://mpv.io";
description = "General-purpose media player, fork of MPlayer and mplayer2";
longDescription = ''
mpv is a free and open-source general-purpose video player, based on the
MPlayer and mplayer2 projects, with great improvements above both.
'';
license = licenses.gpl2Plus;
maintainers = with maintainers; [ AndersonTorres fpletz globin ma27 tadeokondrak ];
platforms = platforms.darwin ++ platforms.linux;
};
}