nixpkgs/pkgs/applications/video/mpv/scripts/buildLua.nix

99 lines
2.8 KiB
Nix

{ lib, stdenvNoCC }:
let
# Escape strings for embedding in shell scripts
escaped = s: "'${lib.escape [ "'" ] s}'";
escapedList = lib.concatMapStringsSep " " escaped;
fileName = pathStr: lib.last (lib.splitString "/" pathStr);
scriptsDir = "$out/share/mpv/scripts";
# similar to `lib.extends`, but with inverted precedence and recursive update
extendedBy =
args: orig: self:
let
super = args self;
in
lib.recursiveUpdate (orig super) super;
in
lib.makeOverridable (
args:
stdenvNoCC.mkDerivation (
extendedBy (if lib.isFunction args then args else (_: args)) (
{
pname,
extraScripts ? [ ],
...
}@args:
let
strippedName =
with builtins;
let
groups = match "mpv[-_](.*)" pname;
in
if groups != null then head groups else pname;
# either passthru.scriptName, inferred from scriptPath, or from pname
scriptName =
(args.passthru or { }).scriptName
or (if args ? scriptPath then fileName args.scriptPath else "${strippedName}.lua");
scriptPath = args.scriptPath or "./${scriptName}";
in
{
dontBuild = true;
preferLocalBuild = true;
# Prevent `patch` from emitting `.orig` files (that end up in the output)
patchFlags = [
"--no-backup-if-mismatch"
"-p1"
];
outputHashMode = "recursive";
installPhase = ''
runHook preInstall
if [ -d "${scriptPath}" ]; then
[ -f "${scriptPath}/main.lua" ] || {
echo "Script directory '${scriptPath}' does not contain 'main.lua'" >&2
exit 1
}
[ ${with builtins; toString (length extraScripts)} -eq 0 ] || {
echo "mpvScripts.buildLua does not support 'extraScripts'" \
"when 'scriptPath' is a directory" >&2
exit 1
}
mkdir -p "${scriptsDir}"
cp -a "${scriptPath}" "${scriptsDir}/${scriptName}"
else
install -m644 -Dt "${scriptsDir}" ${escaped scriptPath}
${
lib.optionalString (extraScripts != [ ]) ''cp -at "${scriptsDir}/" ${escapedList extraScripts}''
}
fi
runHook postInstall
'';
passthru = {
inherit scriptName;
};
meta =
{
platforms = lib.platforms.all;
}
// (
let
pos =
if (args.meta or { }) ? description then
builtins.unsafeGetAttrPos "description" args.meta
else
builtins.unsafeGetAttrPos "pname" args;
in
lib.optionalAttrs (pos != null) { position = "${pos.file}:${toString pos.line}"; }
);
}
)
)
)