summaryrefslogtreecommitdiff
path: root/pkgs/os-specific/linux/minimal-bootstrap/utils.nix
blob: 180d55a9149404d312dcae86e4a071eb7dca284d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
{
  lib,
  config,
  buildPlatform,
  callPackage,
  kaem,
  mescc-tools-extra,
  checkMeta,
}:
rec {
  maybeContentAddressed = lib.optionalAttrs config.contentAddressedByDefault {
    __contentAddressed = true;
    outputHashAlgo = "sha256";
    outputHashMode = "recursive";
  };

  derivationWithMeta =
    attrs:
    let
      passthru = attrs.passthru or { };
      validity = checkMeta.assertValidity { inherit meta attrs; };
      meta = checkMeta.commonMeta { inherit validity attrs; };
      baseDrv = derivation (
        {
          inherit (buildPlatform) system;
          inherit (meta) name;
        }
        // maybeContentAddressed
        // (removeAttrs attrs [
          "meta"
          "passthru"
        ])
      );
      passthru' =
        passthru
        // lib.optionalAttrs (passthru ? tests) {
          tests = lib.mapAttrs (_: f: f baseDrv) passthru.tests;
        };
    in
    lib.extendDerivation validity.handled (
      {
        inherit meta;
        passthru = passthru';
      }
      // passthru'
    ) baseDrv;

  writeTextFile =
    {
      name, # the name of the derivation
      text,
      executable ? false, # run chmod +x ?
      destination ? "", # relative path appended to $out eg "/bin/foo"
    }:
    derivationWithMeta {
      inherit name text;
      passAsFile = [ "text" ];

      builder = "${kaem}/bin/kaem";
      args = [
        "--verbose"
        "--strict"
        "--file"
        (builtins.toFile "write-text-file.kaem" (
          ''
            target=''${out}''${destination}
          ''
          + lib.optionalString (dirOf destination == ".") ''
            mkdir -p ''${out}''${destinationDir}
          ''
          + ''
            cp ''${textPath} ''${target}
          ''
          + lib.optionalString executable ''
            chmod 555 ''${target}
          ''
        ))
      ];

      PATH = lib.makeBinPath [ mescc-tools-extra ];
      destinationDir = dirOf destination;
      inherit destination;
    };

  writeText = name: text: writeTextFile { inherit name text; };

}