summary refs log blame commit diff
path: root/pkgs/build-support/trivial-builders.nix
blob: 1c9e7fc49f282ad161ea0573e7cec92876bde421 (plain) (tree)






































































                                                                                                                   
{ stdenv, lndir }:

rec {

  # Run the shell command `buildCommand' to produce a store path named
  # `name'.  The attributes in `env' are added to the environment
  # prior to running the command.
  runCommand = name: env: buildCommand:
    stdenv.mkDerivation ({
      inherit name buildCommand;
    } // env);


  # Create a single file.
  writeTextFile =
    { name # the name of the derivation
    , text
    , executable ? false # run chmod +x ?
    , destination ? ""   # relative path appended to $out eg "/bin/foo"
    }:
    runCommand name {inherit text executable; }
      ''
        n=$out${destination}
        mkdir -p "$(dirname "$n")"
        echo -n "$text" > "$n"
        (test -n "$executable" && chmod +x "$n") || true
      '';

    
  # Shorthands for `writeTextFile'.
  writeText = name: text: writeTextFile {inherit name text;};
  writeScript = name: text: writeTextFile {inherit name text; executable = true;};
  writeScriptBin = name: text: writeTextFile {inherit name text; executable = true; destination = "/bin/${name}";};


  # Create a forest of symlinks to the files in `paths'.
  symlinkJoin = name: paths:
    runCommand name { inherit paths; }
      ''
        mkdir -p $out
        for i in $paths; do
          ${lndir}/bin/lndir $i $out
        done
      '';


  # Make a package that just contains a setup hook with the given contents.
  makeSetupHook = script:
    runCommand "hook" {}
      ''
        ensureDir $out/nix-support
        cp ${script} $out/nix-support/setup-hook
      '';


  # Write the references (i.e. the runtime dependencies in the Nix store) of `path' to a file.
  writeReferencesToFile = path: runCommand "runtime-deps"
    {
      exportReferencesGraph = ["graph" path];
    }
    ''
      touch $out
      while read path; do
        echo $path >> $out
        read dummy
        read nrRefs
        for ((i = 0; i < nrRefs; i++)); do read ref; done
      done < graph
    '';

}