summary refs log tree commit diff
path: root/pkgs/misc
diff options
context:
space:
mode:
authorShea Levy <shea@shealevy.com>2014-03-14 18:52:50 -0400
committerShea Levy <shea@shealevy.com>2014-03-14 18:52:50 -0400
commit3cc2b243c7f2d906ce77968e75fd84a3f65a09e0 (patch)
tree42553a9d492e48c3cb5db271525594b33f50f9d7 /pkgs/misc
parent4d5d6aed29a0ee10a471fd870fa2fdb61408e4eb (diff)
parent8685278f11f809af52710f165257fb5808018182 (diff)
downloadnixlib-3cc2b243c7f2d906ce77968e75fd84a3f65a09e0.tar
nixlib-3cc2b243c7f2d906ce77968e75fd84a3f65a09e0.tar.gz
nixlib-3cc2b243c7f2d906ce77968e75fd84a3f65a09e0.tar.bz2
nixlib-3cc2b243c7f2d906ce77968e75fd84a3f65a09e0.tar.lz
nixlib-3cc2b243c7f2d906ce77968e75fd84a3f65a09e0.tar.xz
nixlib-3cc2b243c7f2d906ce77968e75fd84a3f65a09e0.tar.zst
nixlib-3cc2b243c7f2d906ce77968e75fd84a3f65a09e0.zip
Merge branch 'nix-run' of git://github.com/rickynils/nixpkgs
Add nix-run and myEnvRun
Diffstat (limited to 'pkgs/misc')
-rw-r--r--pkgs/misc/nix-run/default.nix72
1 files changed, 72 insertions, 0 deletions
diff --git a/pkgs/misc/nix-run/default.nix b/pkgs/misc/nix-run/default.nix
new file mode 100644
index 000000000000..ef83ec2a1f3d
--- /dev/null
+++ b/pkgs/misc/nix-run/default.nix
@@ -0,0 +1,72 @@
+{ stdenv, bash, writeScript }:
+
+let
+
+  nix-run = writeScript "nix-run" ''
+    #!${bash}/bin/bash
+
+    # Runs nix-build and executes the result
+    # All arguments before "--" are given to nix-build,
+    # and all arguments after "--" are given to the
+    # executed command. stdin is redirected to the executed
+    # command.
+
+    out=$(mktemp)
+    rm "$out"
+
+    # parse args into args1 and args2, separated by --
+    # args1 goes to nix-build, args2 goes to the built command
+    args1=("$@")
+    args2=()
+    for i in "''${!args1[@]}"; do
+      if [ "''${args1[$i]}" == "--" ]; then
+        args2=("''${args1[@]:$((i+1))}")
+        args1=("''${args1[@]:0:$((i))}")
+        break
+      fi
+    done
+
+    if nix-build -o "$out" "''${args1[@]}" >/dev/null; then
+      target=$(readlink -m "$out")
+      unlink "$out"
+      if test -f "$target" && test -x "$target"; then
+        exec "$target" "''${args2[@]}" <&0
+      else
+        echo "nix-run: No executable target produced by nix-build"
+        exit 1
+      fi
+    else
+      echo "nix-run: nix-build failed"
+      exit 1
+    fi
+  '';
+
+in stdenv.mkDerivation {
+  name = "nix-run";
+  phases = [ "installPhase" ];
+  installPhase = ''
+    mkdir -p $out/bin
+    ln -s ${nix-run} $out/bin/nix-run
+  '';
+  meta = {
+    description = ''
+      Wrapper around nix-build that automatically executes the binary
+      produced by the provided Nix expression.
+    '';
+    longDescription = ''
+      nix-run invokes nix-build with any options given to it. It then
+      expects one executable file to be produced by nix-build. If this
+      is the case, that file is executed with any options that is given
+      to nix-run after a <literal>--</literal> option separator. If no
+      executable file is produced by nix-build, nix-run will exit with
+      an error. An example invocation of nix-run is <literal>nix-run -A
+      myattr mynix.nix -- -o opt</literal>. nix-run will then build the
+      attribute <literal>myattr</literal> from the Nix expression given
+      in the file <literal>mynix.nix</literal>. If a single executable
+      file is produced, that file is executed with the option
+      <literal>-o opt</literal>.
+    '';
+    maintainers = [ stdenv.lib.maintainers.rickynils ];
+    platforms = stdenv.lib.platforms.linux;
+  };
+}