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

84 lines
2.4 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}"; }
);
})
))