about summary refs log tree commit diff
path: root/scripts/nix-build.in
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2016-05-03T09·14+0200
committerEelco Dolstra <eelco.dolstra@logicblox.com>2016-05-03T09·14+0200
commit80f739b571771b56b9930fbf1ca3e3a4128b46cb (patch)
tree6df58336429b9943537efae0d79dae1dea4c62c5 /scripts/nix-build.in
parenta375326a9788d8a336c3d145e5e685b042ecbed4 (diff)
parent2989783f64fc819b44929c5d0fdbc45550fd0a4e (diff)
Merge pull request #883 from sheenobu/bugfix/ruby_shebang
Workaround to support ruby as an interpreter
Diffstat (limited to 'scripts/nix-build.in')
-rwxr-xr-xscripts/nix-build.in26
1 files changed, 20 insertions, 6 deletions
diff --git a/scripts/nix-build.in b/scripts/nix-build.in
index 78a69c94e561..2d45e37c52d6 100755
--- a/scripts/nix-build.in
+++ b/scripts/nix-build.in
@@ -184,17 +184,31 @@ for (my $n = 0; $n < scalar @ARGV; $n++) {
         $n++;
         die "$0: ‘$arg’ requires an argument\n" unless $n < scalar @ARGV;
         my $interpreter = $ARGV[$n];
-        # Überhack to support Perl. Perl examines the shebang and
-        # executes it unless it contains the string "perl" or "indir",
-        # or (undocumented) argv[0] does not contain "perl". Exploit
-        # the latter by doing "exec -a".
-        my $execArgs = $interpreter =~ /perl/ ? "-a PERL" : "";
+        my $execArgs = "";
+
         sub shellEscape {
             my $s = $_;
             $s =~ s/'/'\\''/g;
             return "'" . $s . "'";
         }
-        $envCommand = "exec $execArgs $interpreter $script ${\(join ' ', (map shellEscape, @savedArgs))}";
+
+        # Überhack to support Perl. Perl examines the shebang and
+        # executes it unless it contains the string "perl" or "indir",
+        # or (undocumented) argv[0] does not contain "perl". Exploit
+        # the latter by doing "exec -a".
+        if ($interpreter =~ /perl/) {
+            $execArgs = "-a PERL";
+        }
+
+        if ($interpreter =~ /ruby/) {
+            # Hack for Ruby. Ruby also examines the shebang. It tries to
+            # read the shebang to understand which packages to read from. Since
+            # this is handled via nix-shell -p, we wrap our ruby script execution
+            # in ruby -e 'load' which ignores the shebangs.
+            $envCommand = "exec $execArgs $interpreter -e 'load(\"$script\")' -- ${\(join ' ', (map shellEscape, @savedArgs))}";
+        } else {
+            $envCommand = "exec $execArgs $interpreter $script ${\(join ' ', (map shellEscape, @savedArgs))}";
+        }
     }
 
     elsif (substr($arg, 0, 1) eq "-") {