diff options
author | Sheena Artrip <sheena.artrip@gmail.com> | 2016-04-17T19·05-0400 |
---|---|---|
committer | Sheena Artrip <sheena.artrip@gmail.com> | 2016-04-18T17·16-0400 |
commit | 2989783f64fc819b44929c5d0fdbc45550fd0a4e (patch) | |
tree | 8fa39ff8877fd2dc2aa4cb95de1feb87571a91c1 | |
parent | 04237870866faaf7dce7c21332b47fef5d79ce65 (diff) |
Workaround to support ruby as an interpreter
-rwxr-xr-x | scripts/nix-build.in | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/scripts/nix-build.in b/scripts/nix-build.in index b93e5ab1390a..45f138d25e4c 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 "-") { |