aboutsummaryrefslogtreecommitdiff
path: root/modules/build.nix
diff options
context:
space:
mode:
Diffstat (limited to 'modules/build.nix')
-rw-r--r--modules/build.nix174
1 files changed, 174 insertions, 0 deletions
diff --git a/modules/build.nix b/modules/build.nix
new file mode 100644
index 0000000..dfff338
--- /dev/null
+++ b/modules/build.nix
@@ -0,0 +1,174 @@
+{ config, pkgs, lib, ... }:
+with builtins // lib;
+let
+ cfg = config.build;
+
+ copyFileFunc = ''
+ function copyFile() {
+ local SOURCE="$1"
+ local RELTARGET="$2"
+ local EXECUTABLE="3"
+
+ local TARGET
+ TARGET="$(realpath -m "$REALOUT/$RELTARGET")"
+ if [[ ! $TARGET == $REALOUT* ]]; then
+ echo "Error installing file $RELTARGET outside of kobo src" >&2
+ exit 1
+ fi
+
+ mkdir -pv "$(dirname "$TARGET")"
+ if [[ -d "$SOURCE" ]]; then
+ if [[ -d "$TARGET" ]]; then
+ cp -rfv "$SOURCE/." "$TARGET/"
+ else
+ cp -rfv "$SOURCE" "$TARGET"
+ fi
+ else
+ cp -fv "$SOURCE" "$TARGET"
+ fi
+
+ if [[ "$EXECUTABLE" == "inherit" ]]; then
+ :
+ elif [[ "$EXECUTABLE" ]]; then
+ chmod +x "$TARGET"
+ else
+ chmod -x "$TARGET"
+ fi
+ }
+ '';
+
+ copyFile = { source, executable, target, ... }: ''
+ copyFile ${escapeShellArgs [
+ source
+ (if executable == null then "inherit" else toString executable)
+ ]}
+ '';
+
+ installFile = writeShellApplication {
+ name = "kobo-install-file";
+ runtimeInputs = [ pkgs.coreutils ];
+ text = ''
+ DRY_RUN_ARG="''${1-}"
+ LOCAL_DIR="''${2-}"
+ KOBO_DIR="''${3-}"
+ LOCAL_FILE="''${4-}"
+
+ FILENAME="''${LOCAL_FILE/#$LOCAL_DIR}"
+ KOBO_FILE="$KOBO_DIR/$FILENAME"
+
+ ${toShellVar "MANIFEST" (cfg.manifestLookupFor "$LOCAL_FILE" "$KOBO_FILE")}
+
+ ACTION="''${MANIFEST["$FILENAME"]}"
+
+ if [[ -n "$ACTION" ]]; then
+ $DRY_RUN_ARG eval "$ACTION"
+ elif [[ -d "$LOCAL_FILE" ]]; then
+ $DRY_RUN_ARG mkdir -p "$KOBO_FILE"
+ else
+ $DRY_RUN_ARG mkdir -p "$(dirname "$KOBO_FILE")"
+ $DRY_RUN_ARG cp -f "$LOCAL_FILE" "$KOBO_FILE"
+ fi
+ '';
+ };
+in {
+ options.build = {
+ allFiles = mkOption {
+ readOnly = true;
+ internal = true;
+ default = with config; concatMap (_: attrValues) [
+ file
+ kfmon.file
+ kobo.file
+ koreader.file
+ nickel.file
+ plato.file
+ ];
+ apply = filter (v: v.enable);
+ };
+
+ allManifests = mkOption {
+ readOnly = true;
+ internal = true;
+ default = with config; concatMap (_: attrValues) [
+ manifest
+ kfmon.manifest
+ kobo.manifest
+ koreader.manifest
+ nickel.manifest
+ plato.manifest
+ ];
+ apply = filter (v: v.enable);
+ };
+
+ manifestLookup = mkOption {
+ readOnly = true;
+ internal = true;
+ type = with types; attrsOf (functionTo (functionTo str));
+ default =
+ let
+ split = concatMap ({ targets, mergeTool, ... }: map (name: { inherit name; value = mergeTool; }) targets);
+ in listToAttrs split;
+ };
+
+ manifestLookupFor = mkOption {
+ readOnly = true;
+ internal = true;
+ type = with types; functionTo (functionTo (attrsOf str));
+ default = x: y: mapAttrs (_: f: f x y) cfg.manifestLookup;
+ };
+
+ src = mkOption {
+ type = types.package;
+ readOnly = true;
+ internal = true;
+ default = pkgs.stdenv.mkDerivation {
+ inherit (config) src;
+ name = "kobo_src";
+ phases = [ "installPhase" ];
+ installPhase = ''
+ mkdir -pv $out
+ cp -rv $src/. $out/
+ chmod -R +w $out
+
+ REALOUT="$(realpath -m "$out")"
+
+ ${copyFileFunc}
+
+ ${concatStringsSep "\n" (
+ mapAttrsToList (_: copyFile) cfg.allFiles
+ )}
+ '';
+ };
+ };
+
+ installer = mkOption {
+ type = types.package;
+ readOnly = true;
+ internal = true;
+ default = pkgs.writeShellApplication {
+ name = "kobo-installer";
+ runtimeInputs = [
+ pkgs.coreutils
+ pkgs.util-linux
+ ];
+ text = '' #TODO DRY_RUN_ARG
+ KOBO_LABEL="''${1:-KOBOeReader}"
+
+ KOBO_MOUNTPOINT="$(findmnt -nlo TARGET LABEL="$KOBO_LABEL")"
+ if [[ -z "$KOBO_MOUNTPOINT" ]]; then
+ echo "Couldn't find a Kobo eReader volume with label $KOBO_LABEL. Are you sure one is actually mounted?"
+ exit 255
+ fi
+
+ KOBO_DIR="$KOBO_MOUNTPOINT/.kobo"
+ if [[ ! -d "$KOBO_DIR" ]]; then
+ echo "It doesn't seem like $KOBO_MOUNTPOINT actually points to a Kobo eReader since it doesn't contain a .kobo directory . . . "
+ exit 255
+ fi
+
+ find "${cfg.src}/" -not -path "${cfg.src}/" -exec ${installFile}/bin/kobo-install-file "" "${cfg.src}" "$KOBO_DIR" {} \;
+ '';
+ };
+ };
+ };
+}