PAR-Packer

 view release on metacpan or  search on metacpan

lib/PAR/Packer.pm  view on Meta::CPAN


sub set_par_file {
    my ($self, $file) = @_;

    $self->{par_file} = $file;
    $self->_check_write($file);
}

sub pack_manifest_hash {
    my ($self) = @_;

    my @SharedLibs;
    return ($self->{pack_manifest}) if ($self->{pack_manifest});

    $self->{pack_manifest} ||= {};
    $self->{full_manifest} ||= {};
    my $full_manifest = $self->{full_manifest};
    my $dep_manifest  = $self->{pack_manifest};

    my $sn = $self->{script_name};
    my $fe = $self->{frontend};

    my $opt    = $self->{options};
    my $input  = $self->{input};
    my $output = $self->{output};

    my $root = '';
    $root = "$Config{archname}/" if ($opt->{m});
    $self->{pack_attrib}{root} = '';

    my $par_file = $self->{par_file};
    my (@modules, @data, @exclude);

    # Search for scannable code in all -I'd paths
    # NOTE: We need this early, because Module::ScanDeps::_find_in_inc
    # and others refer to @IncludeLibs.
    push @Module::ScanDeps::IncludeLibs, @{$opt->{I}} if $opt->{I};

    foreach my $name (@{ $opt->{M} || [] }) {
        if ($name =~ s/^([\w:]+)::(\*{0,2})$/$1/) {
            my $ns = length $2;        # namespace depth indicator

            if ($ns == 0) {
                # "-MFoo::" shorthand for "-MFoo -MFoo::**"
                $self->_name2moddata($name, \@modules, \@data);
                $ns = 2;
            }

            (my $mod = $name) =~ s/::/\//g;
            my @mods_in_ns = $ns == 1
                ? Module::ScanDeps::_glob_in_inc_1($mod, 1)
                : Module::ScanDeps::_glob_in_inc($mod, 1);
            $self->_name2moddata($_, \@modules, \@data) foreach @mods_in_ns;
        }
        else {
            $self->_name2moddata($name, \@modules, \@data);
        }
    }

    if ($opt->{u}) {
        if ($] lt '5.031006') {
            push @modules, "utf8_heavy.pl";
        }
        else {
            $self->_warn("'-u' is not needed for Perl >= 5.31.6");
        }
    }

    # Skip either
    # a) all files from a .par file or
    # b) A module
    foreach my $name ('PAR', @{ $opt->{X} || [] }) {
        if (-f $name and my $dep_zip = Archive::Zip->new($name)) {
            for ($dep_zip->memberNames()) {
                next if ( /MANIFEST/ or /META.yml/ or /^script\// );
                $dep_zip_files{$_} ||= $name;
            }
        }
        else {
            $self->_name2moddata($name, \@exclude, \@exclude);
        }
    }

    my %map;

    unshift(@INC, @{ $opt->{I} || [] });
    unshift(@SharedLibs, map $self->_find_shlib($_), @{ $opt->{l} || [] });

    # Note: _find_in_inc() may return ()
    my %skip = map { $_ => 1 } grep { defined } map { Module::ScanDeps::_find_in_inc($_) } @exclude;
    if ($^O eq 'MSWin32') {
        %skip = (%skip, map { s{\\}{/}g; lc($_) => 1 } @SharedLibs);
    }
    else {
        %skip = (%skip, map { $_ => 1 } @SharedLibs);
    }

    my $add_deps = $self->_obj_function($fe, 'add_deps');

    if ($opt->{x} && defined $opt->{xargs}) {
        require Text::ParseWords;
        $opt->{x} = [ Text::ParseWords::shellwords($opt->{xargs}) ];
    }

    if (!$opt->{n}) {
        my @files = @$input;

        # apply %Preload to the -M'd modules and add them to the list of files to scan
        foreach my $module (@modules) {
            my $file = Module::ScanDeps::_find_in_inc($module)
              or $self->_die("Cannot find module $module (specified with -M)\n");
            push @files, $file;

            my @preload = Module::ScanDeps::_get_preload($module) or next;

            $add_deps->(
                used_by => $file,
                rv      => \%map,
                modules => \@preload,
                skip    => \%skip,
            );



( run in 1.891 second using v1.01-cache-2.11-cpan-a49fcb8fa48 )