about summary refs log tree commit diff
path: root/pkgs/os-specific/linux/minimal-bootstrap/utils.nix
blob: 1cc56654d7b0f0f0839f53e579f23ce5987f47a8 (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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
{ lib
, buildPlatform
, callPackage
, kaem
, mescc-tools
, mescc-tools-extra
}:

let
  checkMeta = callPackage ../../../stdenv/generic/check-meta.nix { };
in
rec {
  fetchurl = import ../../../build-support/fetchurl/boot.nix {
    inherit (buildPlatform) system;
  };

  derivationWithMeta = attrs:
    let
      passthru = attrs.passthru or {};
      validity = checkMeta.assertValidity { inherit meta attrs; };
      meta = checkMeta.commonMeta { inherit validity attrs; };
    in
    lib.extendDerivation
      validity.handled
      ({ inherit meta passthru; } // passthru)
      (derivation ({
        inherit (buildPlatform) system;
        inherit (meta) name;
      } // (builtins.removeAttrs attrs [ "meta" "passthru" ])));

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

      builder = "${kaem}/bin/kaem";
      args = [
        "--verbose"
        "--strict"
        "--file"
        (builtins.toFile "write-text-file.kaem" ''
          target=''${out}''${destination}
          if match x''${mkdirDestination} x1; then
            mkdir -p ''${out}''${destinationDir}
          fi
          cp ''${textPath} ''${target}
          if match x''${executable} x1; then
            chmod 555 ''${target}
          fi
        '')
      ];

      PATH = lib.makeBinPath [ mescc-tools-extra ];
      mkdirDestination = if builtins.dirOf destination == "." then "0" else "1";
      destinationDir = builtins.dirOf destination;
      inherit destination;
    };

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

  runCommand = name: env: buildCommand:
    derivationWithMeta ({
      inherit name;

      builder = "${kaem}/bin/kaem";
      args = [
        "--verbose"
        "--strict"
        "--file"
        (writeText "${name}-builder" buildCommand)
      ];

      PATH = lib.makeBinPath ((env.nativeBuildInputs or []) ++ [ kaem mescc-tools mescc-tools-extra ]);
    } // (builtins.removeAttrs env [ "nativeBuildInputs" ]));

}