App-BCSSH
view release on metacpan or search on metacpan
#!/usr/bin/env perl
use strict;
use warnings;
use File::Temp ();
use File::Find;
use File::Path;
use File::Basename;
use File::Copy;
use Module::CoreList;
use Config;
use autodie qw(:all);
use Pod::Strip;
use JSON;
use version ();
my ($in_file) = @ARGV;
$in_file && -f $in_file or die "Input file must be specified!";
my $mymeta = decode_json(do { open my $fh, '<', 'MYMETA.json'; local $/; +<$fh> });
$ENV{PERL_STRICTURES_EXTRA} = 0;
# never pack these
my @exclude = qw(
^Sub::Name$
^JSON::XS
^Class::XSAccessor
^Variable::Magic$
^Package::Stash::XS$
^IO::Tty
^IO::Pty$
);
# these have optional XS components
my @dual = qw(
List::MoreUtils
Params::Util
);
# only include traced files, not entire dist
my @traceonly = qw(
Pod::Simple
Pod::Perldoc
);
my ($exclude) = map { qr{$_} } join '|', map { "^$_(?:\$|::)" } @exclude;
my @modules;
find({no_chdir => 1, wanted => sub {
-f or return;
s/\.pm$// or return;
s{^lib/}{};
s{/}{::}g;
push @modules, $_;
}}, 'lib');
{
local $ENV{PERL5LIB} = "lib:" . ($ENV{PERL5LIB}||'');
system 'fatpack', 'trace', (map { "--use=$_" } @modules), $in_file;
}
my @trace_in = do {
open my $fh, '<', 'fatpacker.trace';
<$fh>;
};
chomp @trace_in;
my $prereqs = $mymeta->{prereqs}{runtime}{requires};
my $perl_version = version->parse($prereqs->{perl})->numify;
warn $perl_version;
my @trace_extras;
my @trace;
for my $file (@trace_in) {
my $mod = $file;
$mod =~ s/\.pm$//;
$mod =~ s{/}{::}g;
next
if $mod =~ $exclude;
next
if grep { $mod eq $_ } @modules;
if (my $first_release = Module::CoreList->first_release($mod)) {
if ($first_release <= $perl_version && !Module::CoreList->removed_from($mod)) {
my $version = eval($Module::CoreList::version{$perl_version}{$mod} || 0);
my $required = eval($prereqs->{$mod} || 0);
if ($required <= $version) {
next;
}
( run in 0.776 second using v1.01-cache-2.11-cpan-9581c071862 )