summaryrefslogtreecommitdiffstats
path: root/pkgs/build-support/substitute/substitute.nix
blob: 050e259f4eb1b6667e4f059bd471562a1ffc081d (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
{ lib, stdenvNoCC }:
/*
  This is a wrapper around `substitute` in the stdenv.

  Attribute arguments:
  - `name` (optional): The name of the resulting derivation
  - `src`: The path to the file to substitute
  - `substitutions`: The list of substitution arguments to pass
    See https://nixos.org/manual/nixpkgs/stable/#fun-substitute
  - `replacements`: Deprecated version of `substitutions`
    that doesn't support spaces in arguments.

  Example:

  ```nix
  { substitute }:
  substitute {
    src = ./greeting.txt;
    substitutions = [
      "--replace"
      "world"
      "paul"
    ];
  }
  ```

  See ../../test/substitute for tests
*/
args:

let
  name = args.name or (baseNameOf args.src);
  deprecationReplacement = lib.pipe args.replacements [
    lib.toList
    (map (lib.splitString " "))
    lib.concatLists
    (lib.concatMapStringsSep " " lib.strings.escapeNixString)
  ];
  optionalDeprecationWarning =
    # substitutions is only available starting 24.05.
    # TODO: Remove support for replacements sometime after the next release
    lib.warnIf (args ? replacements && lib.oldestSupportedReleaseIsAtLeast 2405) ''
      pkgs.substitute: For "${name}", `replacements` is used, which is deprecated since it doesn't support arguments with spaces. Use `substitutions` instead:
        substitutions = [ ${deprecationReplacement} ];'';
in
optionalDeprecationWarning stdenvNoCC.mkDerivation (
  {
    inherit name;
    builder = ./substitute.sh;
    inherit (args) src;
    preferLocalBuild = true;
    allowSubstitutes = false;
  }
  // args
  // lib.optionalAttrs (args ? substitutions) {
    substitutions =
      assert
        lib.isList args.substitutions
        || throw ''pkgs.substitute: For "${name}", `substitutions` is passed, which is expected to be a list, but it's a ${builtins.typeOf args.substitutions} instead.'';
      lib.escapeShellArgs args.substitutions;
  }
)