mirror of
https://github.com/foo-dogsquared/nix-module-wrapper-manager-fds.git
synced 2025-01-31 10:58:24 +00:00
Gabriel Arazas
5714c1b8c6
Welp, we escape the arguments properly this time since it doesn't work anymore for some reason but at least it is consistent for both binary- and shell-based wrappers.
184 lines
5.2 KiB
Nix
184 lines
5.2 KiB
Nix
{ config, lib, ... }:
|
|
|
|
let
|
|
envConfig = config;
|
|
|
|
wrapperType = { name, lib, config, pkgs, ... }:
|
|
let
|
|
toStringType = with lib.types; coercedTo anything (x: builtins.toString x) str;
|
|
flagType = with lib.types; listOf toStringType;
|
|
in
|
|
{
|
|
options = {
|
|
prependArgs = lib.mkOption {
|
|
type = flagType;
|
|
description = ''
|
|
A list of arguments to be prepended to the user-given argument for the
|
|
wrapper script.
|
|
'';
|
|
default = [ ];
|
|
example = lib.literalExpression ''
|
|
[
|
|
"--config" ./config.conf
|
|
]
|
|
'';
|
|
};
|
|
|
|
appendArgs = lib.mkOption {
|
|
type = flagType;
|
|
description = ''
|
|
A list of arguments to be appended to the user-given argument for the
|
|
wrapper script.
|
|
'';
|
|
default = [ ];
|
|
example = lib.literalExpression ''
|
|
[
|
|
"--name" "doggo"
|
|
"--location" "Your mom's home"
|
|
]
|
|
'';
|
|
};
|
|
|
|
arg0 = lib.mkOption {
|
|
type = lib.types.str;
|
|
description = ''
|
|
The first argument of the wrapper script. This option is used when the
|
|
{option}`build.variant` is `executable`.
|
|
'';
|
|
example = lib.literalExpression "lib.getExe' pkgs.neofetch \"neofetch\"";
|
|
};
|
|
|
|
executableName = lib.mkOption {
|
|
type = lib.types.nonEmptyStr;
|
|
description = "The name of the executable.";
|
|
default = name;
|
|
example = "custom-name";
|
|
};
|
|
|
|
env = lib.mkOption {
|
|
type = with lib.types; attrsOf toStringType;
|
|
description = ''
|
|
A set of environment variables to be declared in the wrapper script.
|
|
'';
|
|
default = { };
|
|
example = {
|
|
"FOO_TYPE" = "custom";
|
|
"FOO_LOG_STYLE" = "systemd";
|
|
};
|
|
};
|
|
|
|
unset = lib.mkOption {
|
|
type = with lib.types; listOf nonEmptyStr;
|
|
description = ''
|
|
A list of environment variables to be unset into the wrapper script.
|
|
'';
|
|
default = [ ];
|
|
example = [ "NO_COLOR" ];
|
|
};
|
|
|
|
pathAdd = lib.mkOption {
|
|
type = with lib.types; listOf path;
|
|
description = ''
|
|
A list of paths to be added as part of the `PATH` environment variable.
|
|
'';
|
|
default = [ ];
|
|
example = lib.literalExpression ''
|
|
wrapperManagerLib.getBin (with pkgs; [
|
|
yt-dlp
|
|
gallery-dl
|
|
])
|
|
'';
|
|
};
|
|
|
|
preScript = lib.mkOption {
|
|
type = lib.types.lines;
|
|
description = ''
|
|
Script fragments to run before the main executable.
|
|
|
|
::: {.note}
|
|
This option is only used when {option}`build.isBinary` is set to
|
|
`false`.
|
|
:::
|
|
'';
|
|
default = "";
|
|
example = lib.literalExpression ''
|
|
echo "HELLO WORLD!"
|
|
'';
|
|
};
|
|
|
|
makeWrapperArgs = lib.mkOption {
|
|
type = with lib.types; listOf str;
|
|
description = ''
|
|
A list of extra arguments to be passed as part of `makeWrapper`
|
|
build step.
|
|
'';
|
|
example = [ "--inherit-argv0" ];
|
|
};
|
|
};
|
|
|
|
config = lib.mkMerge [
|
|
{
|
|
makeWrapperArgs = [
|
|
"--argv0" config.arg0
|
|
]
|
|
++ (builtins.map (v: "--unset ${lib.escapeShellArg v}") config.unset)
|
|
++ (lib.mapAttrsToList (n: v: "--set ${lib.escapeShellArg n} ${lib.escapeShellArg v}") config.env)
|
|
++ (builtins.map (v: "--add-flags ${lib.escapeShellArg v}") config.prependArgs)
|
|
++ (builtins.map (v: "--append-flags ${lib.escapeShellArg v}") config.appendArgs)
|
|
++ (lib.optionals (!envConfig.build.isBinary && config.preScript != "") (
|
|
let
|
|
preScript =
|
|
pkgs.runCommand "wrapper-script-prescript-${config.executableName}" { } config.preScript;
|
|
in
|
|
[ "--run" preScript ]));
|
|
}
|
|
|
|
(lib.mkIf (config.pathAdd != [ ]) {
|
|
env.PATH = lib.concatStringsSep ":" config.pathAdd;
|
|
|
|
})
|
|
|
|
];
|
|
};
|
|
in
|
|
{
|
|
options = {
|
|
wrappers = lib.mkOption {
|
|
type = with lib.types; attrsOf (submodule wrapperType);
|
|
description = ''
|
|
A set of wrappers to be included in the resulting derivation from
|
|
wrapper-manager evaluation.
|
|
'';
|
|
default = { };
|
|
example = lib.literalExpression ''
|
|
{
|
|
yt-dlp-audio = {
|
|
arg0 = lib.getExe' pkgs.yt-dlp "yt-dlp";
|
|
prependArgs = [
|
|
"--config-location" ./config/yt-dlp/audio.conf
|
|
];
|
|
};
|
|
}
|
|
'';
|
|
};
|
|
|
|
basePackages = lib.mkOption {
|
|
type = with lib.types; listOf package;
|
|
description = ''
|
|
A list of packages to be included in the wrapper package.
|
|
|
|
::: {.note}
|
|
This can override some of the binaries included in this list which is
|
|
typically intended to be used as a wrapped package.
|
|
:::
|
|
'';
|
|
default = [ ];
|
|
example = lib.literalExpression ''
|
|
with pkgs; [
|
|
yt-dlp
|
|
]
|
|
'';
|
|
};
|
|
};
|
|
}
|