2024-09-17 10:18:59 +00:00
|
|
|
{ config, lib, pkgs, ... }:
|
|
|
|
|
|
|
|
let
|
|
|
|
cfg = config.files;
|
|
|
|
|
|
|
|
filesModule = { name, lib, config, options, ... }: {
|
|
|
|
options = {
|
|
|
|
target = lib.mkOption {
|
|
|
|
type = lib.types.nonEmptyStr;
|
|
|
|
description = ''
|
|
|
|
Path of the file relative to the derivation output path.
|
|
|
|
'';
|
|
|
|
default = name;
|
|
|
|
example = "share/applications/org.example.App1.desktop";
|
|
|
|
};
|
|
|
|
|
|
|
|
source = lib.mkOption {
|
|
|
|
type = lib.types.path;
|
|
|
|
description = "Path of the file to be linked.";
|
|
|
|
};
|
|
|
|
|
|
|
|
text = lib.mkOption {
|
|
|
|
type = with lib.types; nullOr lines;
|
|
|
|
description = ''
|
|
|
|
Text content of the given filesystem path.
|
|
|
|
'';
|
|
|
|
default = null;
|
|
|
|
example = ''
|
|
|
|
key=value
|
|
|
|
hello=world
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
mode = lib.mkOption {
|
|
|
|
type = lib.types.strMatching "[0-7]{0,4}";
|
|
|
|
default = "0644";
|
|
|
|
example = "0600";
|
|
|
|
description = ''
|
|
|
|
Permissions to be given to the file. By default, it is given with a
|
|
|
|
symlink.
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
config = {
|
|
|
|
source = lib.mkIf (config.text != null) (
|
|
|
|
let
|
|
|
|
name' = "wrapper-manager-filesystem-${lib.replaceStrings ["/"] ["-"] name}";
|
|
|
|
in lib.modules.mkDerivedConfig options.text (pkgs.writeText name')
|
|
|
|
);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
in
|
|
|
|
{
|
|
|
|
options.files = lib.mkOption {
|
|
|
|
type = with lib.types; attrsOf (submodule filesModule);
|
|
|
|
description = ''
|
2024-09-28 11:37:00 +00:00
|
|
|
Extra set of files to be exported within the derivation.
|
|
|
|
|
|
|
|
::: {.caution}
|
|
|
|
Be careful when placing executables in `$out/bin` as it is handled by
|
|
|
|
wrapper-manager build step. Any files in `$out/bin` that have a
|
|
|
|
configured wrapper will be overwritten since building the wrapper comes
|
|
|
|
after installing the files.
|
|
|
|
:::
|
2024-09-17 10:18:59 +00:00
|
|
|
'';
|
|
|
|
default = { };
|
|
|
|
example = lib.literalExpression ''
|
|
|
|
{
|
|
|
|
"share/example-app/docs".source = ./docs;
|
|
|
|
"etc/xdg".source = ./config;
|
|
|
|
|
2024-09-28 11:37:00 +00:00
|
|
|
"share/example-app/example-config".text = ''''
|
2024-09-17 10:18:59 +00:00
|
|
|
hello=world
|
2024-09-28 11:37:00 +00:00
|
|
|
location=INSIDE OF YOUR WALLS
|
|
|
|
'''';
|
2024-09-17 10:18:59 +00:00
|
|
|
}
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
|
|
|
|
config = lib.mkIf (cfg != { }) {
|
|
|
|
build.extraSetup = let
|
|
|
|
installFiles = acc: n: v: let
|
|
|
|
source = lib.escapeShellArg v.source;
|
|
|
|
target = lib.escapeShellArg v.target;
|
|
|
|
target' = "$out/${target}";
|
|
|
|
installFile = let
|
|
|
|
type = lib.filesystem.pathType v.source;
|
|
|
|
in
|
|
|
|
if type == "directory" then ''
|
|
|
|
mkdir -p $(basename ${target'}) && cp --recursive ${source} ${target'}
|
|
|
|
'' else if type == "symlink" then ''
|
|
|
|
ln --symbolic --force ${source} ${target'}
|
|
|
|
'' else ''
|
|
|
|
install -D --mode=${v.mode} ${source} ${target'}
|
|
|
|
'';
|
|
|
|
in ''
|
|
|
|
${acc}
|
|
|
|
${installFile}
|
|
|
|
'';
|
|
|
|
in lib.mkBefore ''
|
|
|
|
${lib.foldlAttrs installFiles "" cfg}
|
|
|
|
'';
|
|
|
|
};
|
|
|
|
}
|