Server : Apache/2.4.43 (Win64) OpenSSL/1.1.1g PHP/7.4.6 System : Windows NT USER-PC 6.1 build 7601 (Windows 7 Professional Edition Service Pack 1) AMD64 User : User ( 0) PHP Version : 7.4.6 Disable Function : NONE Directory : C:/xampp/perl/vendor/lib/PAR/Dist/ |
package PAR::Dist::InstallPPD; use 5.006; use strict; use warnings; use PAR::Dist::FromPPD (); use PAR::Dist (); use File::Temp (); use File::Spec; use File::Path; use Cwd; require Config; require Exporter; our @ISA = qw(Exporter); our %EXPORT_TAGS = ( 'all' => [ qw( par_install_ppd ) ] ); our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); our @EXPORT = qw( par_install_ppd ); our $VERSION = '0.02'; our $VERBOSE = 0; sub _verbose { $VERBOSE = shift if (@_); return $VERBOSE } sub _diag { my $msg = shift; return unless _verbose(); print $msg ."\n"; } sub par_install_ppd { die "Uneven number of arguments to 'par_install_ppd'." if @_ % 2; my %args = @_; _verbose($args{'verbose'}); _diag "Creating temporary directory for temporary .par"; my $tdir = $args{out} = File::Temp::tempdir( CLEANUP => 1, DIR => File::Spec->tmpdir(), ); _diag "Preparing meta data for temporary .par"; # should be figured out by ::FromPPD delete $args{$_} for qw( distversion perlversion ); # just need to be defined. $args{arch} = $Config::Config{archname}; $args{perlversion} = sprintf('%vd', $^V); # Accept running perl version (5.8.8) # or main perl version (5.8) # or any other subversions (5.8.6) my $perlver = sprintf('%vd', $^V); my $mainperlver = $perlver; $mainperlver =~ s/^(\d+)\.(\d+)\..*$/$1.$2/; _diag "Setting perl version to ($perlver|$mainperlver|$mainperlver\\.\\d+)" if not defined $args{selectperl}; $args{selectperl} ||= qr/^(?:$perlver|$mainperlver|$mainperlver\.\d+)$/; # Accept running arch my $arch = quotemeta( $Config::Config{archname} ); _diag "Setting architecture to $Config::Config{archname}" if not defined $args{selectarch}; my $perlver_nodots = $mainperlver; $perlver_nodots =~ s/\.//g; $args{selectarch} ||= qr/^(?:$arch-?(?:$perlver_nodots\d*|$mainperlver(?:\.\d+)?)|$arch)$/; _diag "Using temporary directory $tdir."; _diag "Invoking PAR::Dist::FromPPD to create the .par file."; PAR::Dist::FromPPD::ppd_to_par(%args); _diag "Searching for generated .par file."; _diag "chdir() to '$tdir'"; my $cwd = Cwd::cwd(); chdir($tdir); opendir my $dh, '.' or die $!; my @par_files = grep {-f $_ and /\.par$/i} readdir($dh); _diag "Found PAR files: @par_files."; _diag "Installing PAR files."; foreach my $file (@par_files) { _diag "Installing file '$file' with PAR::Dist::install_par()."; PAR::Dist::install_par($file); } _diag "Done installing PAR files."; chdir($cwd); File::Path::rmtree([$tdir]); return(1); } 1; __END__ =head1 NAME PAR::Dist::InstallPPD - Installs PPM packages the PAR way =head1 SYNOPSIS use PAR::Dist::InstallPPD; # Creates a .par distribution of the Tk module in the # current directory based on the Tk.ppd file from the excellent # bribes.org PPM repository. par_install_ppd(uri => 'http://www.bribes.org/perl/ppm/Tk.ppd'); # You could download the .ppd and .tar.gz files first and then do: par_install_ppd(uri => 'Tk.ppd', verbose => 1); =head1 DESCRIPTION This module creates PAR distributions from PPD XML documents which are used by ActiveState's "Perl Package Manager", short PPM. Then, it installs these newly created temporary F<.par> files in the default location using L<PAR::Dist>'s C<install_par> routine. Yes, that means you can install packages for the PPM without PPM. The module uses L<PAR::Dist::FromPPD> to create the F<.par> files. Please note that this code I<works for me> but hasn't been tested to full extent. =head2 EXPORT By default, the C<par_install_ppd> subroutine is exported to the caller's namespace. =head1 SUBROUTINES This is a list of all public subroutines in the module. =head2 par_install_ppd This routine takes the same arguments as C<ppd_to_par> from L<PAR::Dist::FromPPD> except for the output directory and the options that set the meta data for the produced F<.par> file. The details are reproduced below. The only mandatory parameter is an URI for the PPD file to parse. Arguments: uri => 'ftp://foo/bar' or 'file:///home/you/file.ppd', ... verbose => 1/0 (verbose mode on/off) selectarch => Regular Expression. selectperl => Regular Expression. If a regular expression is specified using C<selectarch>, that expression is matched against the architecture settings of each implementation. The first matching implementation is chosen. If none matches, the implementations are tried in order of appearance. C<selectperl> works the same as C<selectarch>, but operates on the (minimum) perl version of an implementation. If both C<selectperl> and C<selectarch> are present, C<selectperl> operates on the implementations matched by C<selectarch>. That means C<selectarch> takes precedence. =head1 SEE ALSO The L<PAR::Dist> module is used to create L<.par> distributions and install them. The L<PAR::Dist::FromPPD> module converts the PPD package descriptions. PAR has a mailing list, <par@perl.org>, that you can write to; send an empty mail to <par-subscribe@perl.org> to join the list and participate in the discussion. Please send bug reports to <bug-par-dist-fromcpan@rt.cpan.org>. The official PAR website may be of help, too: http://par.perl.org For details on the I<Perl Package Manager>, please refer to ActiveState's website at L<http://activestate.com>. =head1 AUTHOR Steffen Mueller, E<lt>smueller at cpan dot orgE<gt> =head1 COPYRIGHT AND LICENSE Copyright (C) 2006 by Steffen Mueller This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.6 or, at your option, any later version of Perl 5 you may have available. =cut