summaryrefslogtreecommitdiffstats
path: root/krebs/5pkgs/builders.nix
diff options
context:
space:
mode:
authormakefu <github@syntax-fehler.de>2016-06-14 01:36:15 +0200
committermakefu <github@syntax-fehler.de>2016-06-14 01:36:15 +0200
commiteb710a17e28bbec2a4f7877533f101fa78ece209 (patch)
tree591878b08c6d051418928e7dd94bd0d21853157f /krebs/5pkgs/builders.nix
parent618684954207feed26b1b85f0721d41d5ca4c5c3 (diff)
parent5bc3fa88543cdf3aa5b9103f7423a2af490b3d08 (diff)
Merge remote-tracking branch 'cd/master'
Diffstat (limited to 'krebs/5pkgs/builders.nix')
-rw-r--r--krebs/5pkgs/builders.nix86
1 files changed, 44 insertions, 42 deletions
diff --git a/krebs/5pkgs/builders.nix b/krebs/5pkgs/builders.nix
index 8ba0ab5a7..924e0c086 100644
--- a/krebs/5pkgs/builders.nix
+++ b/krebs/5pkgs/builders.nix
@@ -2,16 +2,16 @@
with config.krebs.lib;
rec {
execve = name: { filename, argv ? null, envp ? {}, destination ? "" }: let
- in writeC name { inherit destination; } ''
+ in writeC name { inherit destination; } /* c */ ''
#include <unistd.h>
static char *const filename = ${toC filename};
${if argv == null
- then /* Propagate arguments */ ''
+ then /* Propagate arguments */ /* c */ ''
#define MAIN_ARGS int argc, char **argv
''
- else /* Provide fixed arguments */ ''
+ else /* Provide fixed arguments */ /* c */ ''
#define MAIN_ARGS void
static char *const argv[] = ${toC (argv ++ [null])};
''}
@@ -28,22 +28,22 @@ rec {
execveBin = name: cfg: execve name (cfg // { destination = "/bin/${name}"; });
- writeBash = name: text: pkgs.writeScript name ''
- #! ${pkgs.bash}/bin/bash
- ${text}
- '';
+ makeScriptWriter = interpreter: name: text:
+ assert (with types; either absolute-pathname filename).check name;
+ pkgs.writeOut (baseNameOf name) {
+ ${optionalString (types.absolute-pathname.check name) name} = {
+ executable = true;
+ text = "#! ${interpreter}\n${text}";
+ };
+ };
- writeBashBin = name: text: pkgs.writeTextFile {
- executable = true;
- destination = "/bin/${name}";
- name = name;
- text = ''
- #! ${pkgs.bash}/bin/bash
- ${text}
- '';
- };
+ writeBash = makeScriptWriter "${pkgs.bash}/bin/bash";
- writeC = name: { destination ? "" }: src: pkgs.runCommand name {} ''
+ writeBashBin = name:
+ assert types.filename.check name;
+ pkgs.writeBash "/bin/${name}";
+
+ writeC = name: { destination ? "" }: src: pkgs.runCommand name {} /* sh */ ''
PATH=${makeBinPath (with pkgs; [
binutils
coreutils
@@ -56,37 +56,39 @@ rec {
strip --strip-unneeded "$exe"
'';
- writeDash = name: text: pkgs.writeScript name ''
- #! ${pkgs.dash}/bin/dash
- ${text}
- '';
+ writeDash = makeScriptWriter "${pkgs.dash}/bin/dash";
- writeDashBin = name: text: pkgs.writeTextFile {
- executable = true;
- destination = "/bin/${name}";
- name = name;
- text = ''
- #! ${pkgs.dash}/bin/dash
- ${text}
- '';
- };
+ writeDashBin = name:
+ assert types.filename.check name;
+ pkgs.writeDash "/bin/${name}";
writeEximConfig = name: text: pkgs.runCommand name {
inherit text;
passAsFile = [ "text" ];
- } ''
+ } /* sh */ ''
# TODO validate exim config even with config.nix.useChroot == true
# currently doing so will fail because "user exim was not found"
#${pkgs.exim}/bin/exim -C "$textPath" -bV >/dev/null
mv "$textPath" $out
'';
- writeFiles = name: specs0:
+ writeOut = name: specs0:
let
- specs = mapAttrsToList (path: spec0: {
- path = assert types.pathname.check path; path;
+ specs = mapAttrsToList (path0: spec0: rec {
+ path = guard {
+ type = types.pathname;
+ value = path0;
+ };
var = "file_${hashString "sha1" path}";
text = spec0.text;
+ executable = guard {
+ type = types.bool;
+ value = spec0.executable or false;
+ };
+ mode = guard {
+ type = types.file-mode;
+ value = spec0.mode or (if executable then "0755" else "0644");
+ };
}) specs0;
filevars = genAttrs' specs (spec: nameValuePair spec.var spec.text);
@@ -97,7 +99,7 @@ rec {
set -efu
PATH=${makeBinPath [pkgs.coreutils]}
${concatMapStrings (spec: /* sh */ ''
- install -D ''$${spec.var}Path $out${spec.path}
+ install -m ${spec.mode} -D ''$${spec.var}Path $out${spec.path}
'') specs}
'';
@@ -119,7 +121,7 @@ rec {
isExecutable = executables != {};
isLibrary = library != null;
- cabal-file = pkgs.writeText "${name}-${version}.cabal" ''
+ cabal-file = pkgs.writeText "${name}-${version}.cabal" /* cabal */ ''
build-type: Simple
cabal-version: >= 1.2
name: ${name}
@@ -135,7 +137,7 @@ rec {
, text
, ... }:
if types.filename.check exe-name
- then "install -D ${file} $out/${relpath}"
+ then /* sh */ "install -D ${file} $out/${relpath}"
else throw "argument ‘exe-name’ is not a ${types.filename.name}";
exe-section =
@@ -145,7 +147,7 @@ rec {
, file ? pkgs.writeText "${name}-${exe-name}.hs" text
, relpath ? "${exe-name}.hs"
, text
- , ... }: ''
+ , ... }: /* cabal */ ''
executable ${exe-name}
build-depends: ${concatStringsSep "," build-depends}
ghc-options: ${toString ghc-options}
@@ -168,7 +170,7 @@ rec {
{ build-depends ? base-depends ++ extra-depends
, extra-depends ? []
, exposed-modules
- , ... }: ''
+ , ... }: /* cabal */ ''
library
build-depends: ${concatStringsSep "," build-depends}
ghc-options: ${toString ghc-options}
@@ -182,7 +184,7 @@ rec {
, text
, ... }:
if types.haskell.modid.check mod-name
- then "install -D ${file} $out/${relpath}"
+ then /* sh */ "install -D ${file} $out/${relpath}"
else throw "argument ‘mod-name’ is not a ${types.haskell.modid.name}";
in
haskellPackages.mkDerivation {
@@ -196,7 +198,7 @@ rec {
(optionals isLibrary (get-depends library))
haskellPackages;
pname = name;
- src = pkgs.runCommand "${name}-${version}-src" {} ''
+ src = pkgs.runCommand "${name}-${version}-src" {} /* sh */ ''
install -D ${cabal-file} $out/${cabal-file.name}
${optionalString isLibrary (lib-install library)}
${concatStringsSep "\n" (mapAttrsToList exe-install executables)}
@@ -208,7 +210,7 @@ rec {
"The function `writeNixFromCabal` has been deprecated in favour of"
"`writeHaskell`."
])
- (name: path: pkgs.runCommand name {} ''
+ (name: path: pkgs.runCommand name {} /* sh */ ''
${pkgs.cabal2nix}/bin/cabal2nix ${path} > $out
'');
}