{ 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}"; } ); } ) ) )