Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add an option to generate self-contained executables
  • Loading branch information
sorear committed Aug 19, 2010
1 parent 4770bf5 commit b284300
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 15 deletions.
18 changes: 12 additions & 6 deletions niecza_eval
Expand Up @@ -21,6 +21,7 @@ my $aot;
my $lang = 'CORE';
my $setting;
my $safe;
my $genapp;

sub usage {
my ($fh, $ex) = @_;
Expand All @@ -34,6 +35,7 @@ usage: niecza -e 'code' # run a one-liner
general options:
-L --language=NAME # select your setting
--gen-app=EXEFILE # make self-contained binary (not with -c)
--setting # precompile target is a setting
-v --stage-stats # detailed timing info
--stop-after=STAGE # stop after STAGE and dump AST
Expand All @@ -44,9 +46,9 @@ EOM
}

GetOptions('evaluate|e=s' => \@evaluate, 'aot' => \$aot,
'compile|c' => \$module, 'language|L=s' => \$lang,
'stage-stats|v' => \$stagestats, 'stop-after=s' => \$stopafter,
'safe' => \$safe, 'setting' => \$setting)
'gen-app=s' => \$genapp, 'compile|c' => \$module,
'language|L=s' => \$lang, 'stage-stats|v' => \$stagestats,
'stop-after=s' => \$stopafter, 'safe' => \$safe, 'setting' => \$setting)
or usage(\*STDERR, 1);

my $excl = 0;
Expand All @@ -56,14 +58,18 @@ if ($excl > 1 || $module && !@ARGV || $safe && ($lang ne 'CORE')) {
usage(\*STDERR, 1);
}

if (defined($genapp) && $module) {
usage(\*STDERR, 1);
}

$lang = 'SAFE' if $safe;

sub run {
compile(stopafter => $stopafter, aot => $aot,
compile(stopafter => $stopafter, aot => $aot, selfcontained => $genapp,
stagetime => $stagestats, lang => $lang, safe => $safe,
setting => $setting, @_);
system 'mono', CompilerDriver->build_file('MAIN.exe')
if !({@_}->{name}) && !$stopafter;
system 'mono', CompilerDriver::build_file('MAIN.exe')
if !({@_}->{name}) && !$stopafter && !$genapp;
}

if ($module) {
Expand Down
39 changes: 30 additions & 9 deletions src/CompilerDriver.pm
Expand Up @@ -40,7 +40,7 @@ my ($srcdir, $rootdir, $builddir, $libdir);
}
File::Path::make_path($builddir);

sub build_file { File::Spec->catfile($builddir, $_[1]) }
sub build_file { File::Spec->catfile($builddir, $_[0]) }

sub metadata_for {
my ($unit) = @_;
Expand Down Expand Up @@ -197,14 +197,23 @@ sub compile {
local $::SAFEMODE = $safe;
$STD::ALL = {};

$::SETTING_RESUME = metadata_for($lang)->{setting} unless $lang eq 'NULL';
$::UNITREFS{$lang} = 1 if $lang ne 'NULL';
if ($lang ne 'NULL') {
my $metasetting = metadata_for($lang);
$::SETTING_RESUME = $metasetting->{setting};
$::UNITREFS{$lang} = 1;
$::UNITREFSTRANS{$lang} = 1;
%::UNITREFSTRANS = (%::UNITREFSTRANS, %{ $metasetting->{trefs} });
}

if (defined($name) && !$setting) {
my $rp = Cwd::realpath($path);
$::UNITDEPSTRANS{$name} = [ $rp, ((stat $rp)[9]) ];
}

if (defined($name)) {
$::UNITREFSTRANS{$name} = 1;
}

my ($m, $a) = defined($path) ? (parsefile => $path) : (parse => $code);

my $ast;
Expand Down Expand Up @@ -249,12 +258,24 @@ EOH
} ],
[ 'gmcs', sub {
delete $::UNITREFS{$basename};
my @args = ("gmcs",
(defined($name) ? ("/target:library") : ()),
"/lib:$builddir",
"/r:Kernel.dll", (map { "/r:$_.dll" } sort keys %::UNITREFS),
"/out:$outfile",
$csfile);
my @args;
if ($args{selfcontained}) {
@args = ("gmcs",
"/out:" . $args{selfcontained},
(map { File::Spec->catfile($libdir, $_) }
"Kernel.cs", "Cursor.cs"),
(map { build_file($_ . ".cs") }
(sort keys %::UNITREFSTRANS)),
$csfile);
} else {
@args = ("gmcs",
(defined($name) ? ("/target:library") : ()),
"/lib:$builddir",
"/r:Kernel.dll",
(map { "/r:$_.dll" } sort keys %::UNITREFS),
"/out:$outfile",
$csfile);
}
print STDERR "@args\n" if $args{stagetime};
system @args;
} ],
Expand Down

0 comments on commit b284300

Please sign in to comment.