aboutsummaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorSheena Artrip <sheena.artrip@gmail.com>2016-04-17 15:05:59 -0400
committerSheena Artrip <sheena.artrip@gmail.com>2016-04-18 13:16:59 -0400
commit2989783f64fc819b44929c5d0fdbc45550fd0a4e (patch)
tree8fa39ff8877fd2dc2aa4cb95de1feb87571a91c1 /scripts
parent04237870866faaf7dce7c21332b47fef5d79ce65 (diff)
Workaround to support ruby as an interpreter
Diffstat (limited to 'scripts')
-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 b93e5ab13..45f138d25 100755
--- a/scripts/nix-build.in
+++ b/scripts/nix-build.in
@@ -191,17 +191,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 "-") {