PAX
view release on metacpan or search on metacpan
lib/PAX/CLI.pm view on Meta::CPAN
use PAX::HIR;
use PAX::GuardedSSA;
use PAX::GuardManager;
use PAX::Tier1;
use PAX::ArtifactCache;
use PAX::Mode;
use PAX::Differential;
use PAX::Benchmark;
use PAX::NativeRunner;
use PAX::Corpus;
use PAX::RuntimeDispatcher;
use PAX::ProfileStore;
use PAX::Gatekeeper;
use PAX::InlineCache;
use PAX::BenchmarkMatrix;
use PAX::CoreSuite;
use PAX::CPANMatrix;
use PAX::AppImage;
use PAX::AppServer;
use PAX::Paxfile;
use PAX::StandaloneImage;
use PAX::StandaloneDispatch;
sub run {
my ($class, @argv) = @_;
my $command = shift @argv // 'help';
if ($command eq 'run') {
return $class->_run(@argv);
}
if ($command eq 'build') {
return $class->_build(@argv);
}
if ($command eq 'help' || $command eq '--help' || $command eq '-h') {
print _usage();
return 0;
}
if ($class->_looks_like_interpreter_script($command)) {
return $class->_run_interpreter_script($command, @argv);
}
print STDERR "unknown command: $command\n";
print STDERR _usage();
return 2;
}
# Treat a plain script path as interpreter-mode execution so a built pax binary
# can be used directly from a shebang line.
sub _looks_like_interpreter_script {
my ($class, $candidate) = @_;
return 0 if !defined $candidate || $candidate eq q{};
return 0 if $candidate =~ /\A-/;
return -f $candidate ? 1 : 0;
}
# Execute a shebang-target script as package main while preserving the expected
# process-facing script path and argument vector.
sub _run_interpreter_script {
my ($class, $script, @argv) = @_;
my $script_path = File::Spec->rel2abs($script);
local @ARGV = @argv;
local $0 = $script_path;
require FindBin;
local $FindBin::Bin;
local $FindBin::RealBin;
local $FindBin::Script;
local $FindBin::RealScript;
FindBin::again();
my $runner = sub {
package main;
my ($path) = @_;
return do $path;
};
my $rv = $runner->($script_path);
if (!defined $rv) {
my $error = $@ || $! || "unknown interpreter failure";
print STDERR "pax interpreter failed for $script_path: $error\n";
return 255;
}
return 0;
}
sub _run {
my ($class, @argv) = @_;
return $class->_run_standalone(@argv);
}
sub _run_dispatch {
my ($class, @argv) = @_;
my ($left, $right, $region, $pretty, $entrypoint) = (10, 32, undef, 1);
while (@argv) {
my $arg = shift @argv;
if ($arg eq '--left') {
$left = shift @argv // return _missing('--left');
next;
}
if ($arg eq '--right') {
$right = shift @argv // return _missing('--right');
next;
}
if ($arg eq '--region') {
$region = shift @argv // return _missing('--region');
next;
}
if ($arg eq '--compact') {
$pretty = 0;
next;
}
if (!defined $entrypoint) {
$entrypoint = $arg;
next;
}
print STDERR "unexpected argument: $arg\n";
return 2;
}
if (!defined $entrypoint) {
print STDERR "run requires a Perl entrypoint\n";
return 2;
( run in 1.112 second using v1.01-cache-2.11-cpan-5c0b1e786e0 )