biglybt: 3.5.0.0 -> 3.6.0.0
[NixPkgs.git] / pkgs / applications / video / mpv / wrapper.nix
blobb427318121ef038c6f6fe97310507d913ab9e8b1
1 # Arguments that this derivation gets when it is created with `callPackage`
2 { stdenv
3 , buildEnv
4 , lib
5 , makeWrapper
6 , mpvScripts
7 , symlinkJoin
8 , writeTextDir
9 , yt-dlp
12 # the unwrapped mpv derivation - 1st argument to `wrapMpv`
13 mpv:
15 let
16   # arguments to the function (exposed as `wrapMpv` in all-packages.nix)
17   wrapper = {
18     extraMakeWrapperArgs ? [],
19     youtubeSupport ? true,
20     # a set of derivations (probably from `mpvScripts`) where each is
21     # expected to have a `scriptName` passthru attribute that points to the
22     # name of the script that would reside in the script's derivation's
23     # `$out/share/mpv/scripts/`.
24     # A script can optionally also provide an `extraWrapperArgs` passthru attribute.
25     scripts ? [],
26     extraUmpvWrapperArgs ? []
27   }:
28   let
29     binPath = lib.makeBinPath ([
30       mpv.luaEnv
31     ] ++ lib.optionals youtubeSupport [
32       yt-dlp
33     ] ++ lib.optionals mpv.vapoursynthSupport [
34       mpv.vapoursynth.python3
35     ]);
36     # All arguments besides the input and output binaries (${mpv}/bin/mpv and
37     # $out/bin/mpv). These are used by the darwin specific makeWrapper call
38     # used to wrap $out/Applications/mpv.app/Contents/MacOS/mpv as well.
39     mostMakeWrapperArgs = lib.strings.escapeShellArgs ([ "--inherit-argv0"
40       # These are always needed (TODO: Explain why)
41       "--prefix" "LUA_CPATH" ";" "${mpv.luaEnv}/lib/lua/${mpv.lua.luaversion}/?.so"
42       "--prefix" "LUA_PATH" ";" "${mpv.luaEnv}/share/lua/${mpv.lua.luaversion}/?.lua"
43     ] ++ lib.optionals mpv.vapoursynthSupport [
44       "--prefix" "PYTHONPATH" ":" "${mpv.vapoursynth}/${mpv.vapoursynth.python3.sitePackages}"
45     ] ++ lib.optionals (binPath != "") [
46       "--prefix" "PATH" ":" binPath
47     ] ++ (lib.lists.flatten (map
48       # For every script in the `scripts` argument, add the necessary flags to the wrapper
49       (script:
50         [
51           "--add-flags"
52           # Here we rely on the existence of the `scriptName` passthru
53           # attribute of the script derivation from the `scripts`
54           "--script=${script}/share/mpv/scripts/${script.scriptName}"
55         ]
56         # scripts can also set the `extraWrapperArgs` passthru
57         ++ (script.extraWrapperArgs or [])
58       ) scripts
59     )) ++ extraMakeWrapperArgs)
60     ;
61     umpvWrapperArgs = lib.strings.escapeShellArgs ([
62       "--inherit-argv0"
63       "--set" "MPV" "${placeholder "out"}/bin/mpv"
64     ] ++ extraUmpvWrapperArgs)
65     ;
66   in
67     symlinkJoin {
68       name = "mpv-with-scripts-${mpv.version}";
70       # TODO: don't link all mpv outputs and convert package to mpv-unwrapped?
71       paths = [ mpv.all ];
73       nativeBuildInputs = [ makeWrapper ];
75       passthru.unwrapped = mpv;
77       passthru.tests.mpv-scripts-should-not-collide = buildEnv {
78         name = "mpv-scripts-env";
79         paths = lib.pipe mpvScripts [
80           # filters "override" "overrideDerivation" "recurseForDerivations"
81           (lib.filterAttrs (key: script: lib.isDerivation script))
82           # replaces unfree and meta.broken scripts with decent placeholders
83           (lib.mapAttrsToList (key: script:
84             if (builtins.tryEval script.outPath).success
85             then script
86             else writeTextDir "share/mpv/scripts/${script.scriptName}" "placeholder of ${script.name}"
87           ))
88         ];
89       };
91       postBuild = ''
92         # wrapProgram can't operate on symlinks
93         rm "$out/bin/mpv"
94         makeWrapper "${mpv}/bin/mpv" "$out/bin/mpv" ${mostMakeWrapperArgs}
95         rm "$out/bin/umpv"
96         makeWrapper "${mpv}/bin/umpv" "$out/bin/umpv" ${umpvWrapperArgs}
97       '' + lib.optionalString stdenv.isDarwin ''
98         # wrapProgram can't operate on symlinks
99         rm "$out/Applications/mpv.app/Contents/MacOS/mpv"
100         makeWrapper "${mpv}/Applications/mpv.app/Contents/MacOS/mpv" "$out/Applications/mpv.app/Contents/MacOS/mpv" ${mostMakeWrapperArgs}
101       '';
103       meta = {
104         inherit (mpv.meta) homepage description longDescription maintainers;
105         mainProgram = "mpv";
106       };
107     };
109   lib.makeOverridable wrapper