summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ci.nix27
-rw-r--r--examples/hello_world.nix36
-rw-r--r--examples/simple.nix48
-rw-r--r--pkgs/default.nix34
4 files changed, 145 insertions, 0 deletions
diff --git a/ci.nix b/ci.nix
new file mode 100644
index 0000000..902d43c
--- /dev/null
+++ b/ci.nix
@@ -0,0 +1,27 @@
+let
+ pkgs = import <nixpkgs> {};
+
+ hello_worlds = import examples/hello_world.nix;
+ simples = import examples/simple.nix;
+
+ writeTest = expectedValue: test: pkgs.writeScript "test" ''
+ #!/bin/sh
+ if test "$(${test})" != "${expectedValue}"; then
+ echo 'test ${test} failed'
+ exit 1
+ fi
+ '';
+
+in
+ pkgs.lib.mapAttrs' (n: v: pkgs.lib.nameValuePair "hello_${n}" (writeTest "hello world" v)) hello_worlds //
+ pkgs.lib.mapAttrs' (n: v: pkgs.lib.nameValuePair "simple_${n}" v) {
+ bash = writeTest "bash features" simples.bash;
+ dash = writeTest "dash features" simples.dash;
+ haskell = writeTest "Rolf" simples.haskell;
+ js = writeTest "function add(n,d){return n+d}" simples.js;
+ perl = writeTest "Howdy!" simples.perl;
+ python2 = writeTest "['some', 'random', 'variables']" simples.python2;
+ python3 = writeTest "['some', 'random', 'variables']" simples.python3;
+ sed = writeTest "hello world" simples.sed;
+ }
+
diff --git a/examples/hello_world.nix b/examples/hello_world.nix
new file mode 100644
index 0000000..4f9330a
--- /dev/null
+++ b/examples/hello_world.nix
@@ -0,0 +1,36 @@
+let
+ pkgs = import <nixpkgs> { overlays = [ (import ../pkgs) ]; };
+in {
+ bash = pkgs.writeBash "hello-world" ''
+ echo 'hello world'
+ '';
+ c = pkgs.writeC "hello-world" {} ''
+ #include <stdio.h>
+ int main() {
+ printf("hello world\n");
+ return 0;
+ }
+ '';
+ dash = pkgs.writeDash "hello-world" ''
+ echo 'hello world'
+ '';
+ haskell = pkgs.writeHaskell "hello-world" [] ''
+ main = do
+ putStrLn "hello world"
+ '';
+ js = pkgs.writeJS "hello-world" {} ''
+ console.log("hello world")
+ '';
+ perl = pkgs.writePerl "hello-world" {} ''
+ print "hello world\n";
+ '';
+ python2 = pkgs.writePython2 "hello-world" {} ''
+ print "hello world"
+ '';
+ python3 = pkgs.writePython3 "hello-world" {} ''
+ print("hello world")
+ '';
+ sed = pkgs.writeDash "sed-example" ''
+ echo xxx | ${pkgs.writeSed "hello-world" "s/xxx/hello world/"}
+ '';
+}
diff --git a/examples/simple.nix b/examples/simple.nix
new file mode 100644
index 0000000..55ccedc
--- /dev/null
+++ b/examples/simple.nix
@@ -0,0 +1,48 @@
+let
+ pkgs = import <nixpkgs> { overlays = [ (import ../pkgs) ]; };
+in {
+ bash = pkgs.writeBash "simple.sh" ''
+ if [[ "test" == "test" ]]; then echo "bash features"; fi
+ '';
+ # cc -L/nix/store/...blah/lib -I/nix/store/...blah/include
+ dash = pkgs.writeDash "simple" ''
+ test '~' = '~' && echo 'dash features'
+ '';
+ haskell = pkgs.writeHaskell "simple" [ "acme-cuteboy" ] ''
+ import Acme.CuteBoy
+
+ main :: IO ()
+ main = print Rolf
+ '';
+ js = pkgs.writeJS "example-js" { deps = [ pkgs.nodePackages.uglify-js ]; } ''
+ var UglifyJS = require("uglify-js");
+ var code = "function add(first, second) { return first + second; }";
+ var result = UglifyJS.minify(code);
+ console.log(result.code);
+ '';
+ perl = pkgs.writePerl "simple.pl" { deps = [ pkgs.perlPackages.boolean ]; } ''
+ use boolean;
+ print "Howdy!\n" if true;
+ '';
+ python2 = pkgs.writePython2 "simple.py" { deps = [ pkgs.python2Packages.pyyaml ]; } ''
+ import yaml
+
+ print yaml.load("""
+ - some
+ - random
+ - variables
+ """)
+ '';
+ python3 = pkgs.writePython3 "simple.py" { deps = [ pkgs.python3Packages.pyyaml ]; } ''
+ import yaml
+
+ print(yaml.load("""
+ - some
+ - random
+ - variables
+ """))
+ '';
+ sed = pkgs.writeDash "sed-example" ''
+ echo hello | ${pkgs.writeSed "hello-world" "s/hello/& world/"}
+ '';
+}
diff --git a/pkgs/default.nix b/pkgs/default.nix
index a5582f3..ea3421b 100644
--- a/pkgs/default.nix
+++ b/pkgs/default.nix
@@ -303,6 +303,23 @@ pkgs: oldpkgs: {
};
};
+ writeJS = name: { deps ? [] }: text:
+ let
+ node-env = pkgs.buildEnv {
+ name = "node";
+ paths = deps;
+ pathsToLink = [
+ "/lib/node_modules"
+ ];
+ };
+ in pkgs.writeDash name ''
+ export NODE_PATH=${node-env}/lib/node_modules
+ exec ${pkgs.nodejs}/bin/node ${pkgs.writeText "js" text}
+ '';
+
+ writeJSBin = name:
+ pkgs.writeJS "/bin/${name}";
+
writeJSON = name: value: pkgs.runCommand name {
json = toJSON value;
passAsFile = [ "json" ];
@@ -319,6 +336,23 @@ pkgs: oldpkgs: {
${pkgs.cabal2nix}/bin/cabal2nix ${path} > $out
'');
+ writePerl = name: { deps ? [] }:
+ let
+ perl-env = pkgs.buildEnv {
+ name = "perl-environment";
+ paths = deps;
+ pathsToLink = [
+ "/lib/perl5/site_perl"
+ ];
+ };
+ in
+ pkgs.makeScriptWriter {
+ interpreter = "${pkgs.perl}/bin/perl -I ${perl-env}/lib/perl5/site_perl";
+ } name;
+
+ writePerlBin = name:
+ pkgs.writePerl "/bin/${name}";
+
writePython2 = name: { deps ? [], flakeIgnore ? [] }:
let
py = pkgs.python2.withPackages (ps: deps);