summary refs log tree commit diff
path: root/pkgs/os-specific/linux/minimal-bootstrap/utils.nix
blob: cc8c04619169e5aa35bddd8346fa7d458d9cdfd5 (plain) (blame)
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
{ lib
, buildPlatform
, callPackage
, kaem
, mescc-tools-extra
, checkMeta
}:
rec {
  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;
      } // (builtins.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 (builtins.dirOf destination == ".") ''
          mkdir -p ''${out}''${destinationDir}
        '' + ''
          cp ''${textPath} ''${target}
        '' + lib.optionalString executable ''
          chmod 555 ''${target}
        ''))
      ];

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

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

}