summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeon Timmermans <fawaka@gmail.com>2019-04-25 11:11:05 +0200
committerKarl Williamson <khw@cpan.org>2020-07-30 15:21:41 -0600
commitd972df9bef49b70675f8f6fb7f35ec49ae9fbc15 (patch)
tree160fc35406f02e72449e15cf89ce1e22c9e7af42
parent63251dfcefea5e9fccdae8e0095a6a479c25aab1 (diff)
downloadperl-d972df9bef49b70675f8f6fb7f35ec49ae9fbc15.tar.gz
Import ExtUtils::PL2Bat
-rw-r--r--MANIFEST2
-rwxr-xr-xPorting/Maintainers.pl8
-rw-r--r--cpan/ExtUtils-PL2Bat/lib/ExtUtils/PL2Bat.pm194
-rw-r--r--cpan/ExtUtils-PL2Bat/t/make_executable.t33
-rw-r--r--lib/.gitignore1
5 files changed, 238 insertions, 0 deletions
diff --git a/MANIFEST b/MANIFEST
index e335240376..990a75ad52 100644
--- a/MANIFEST
+++ b/MANIFEST
@@ -876,6 +876,8 @@ cpan/ExtUtils-MakeMaker/t/writemakefile_args.t See if WriteMakefile works
cpan/ExtUtils-Manifest/lib/ExtUtils/Manifest.pm Utilities to write MANIFEST files
cpan/ExtUtils-Manifest/lib/ExtUtils/MANIFEST.SKIP The default MANIFEST.SKIP
cpan/ExtUtils-Manifest/t/Manifest.t See if ExtUtils::Manifest works
+cpan/ExtUtils-PL2Bat/lib/ExtUtils/PL2Bat.pm Implement pl2bat
+cpan/ExtUtils-PL2Bat/t/make_executable.t Tests if ExtUtils::PL2Bat makes bat files that are executable
cpan/File-Fetch/lib/File/Fetch.pm File::Fetch
cpan/File-Fetch/t/01_File-Fetch.t File::Fetch tests
cpan/File-Fetch/t/null_subclass.t
diff --git a/Porting/Maintainers.pl b/Porting/Maintainers.pl
index 3f81c7713c..089795c2ce 100755
--- a/Porting/Maintainers.pl
+++ b/Porting/Maintainers.pl
@@ -485,6 +485,14 @@ use File::Glob qw(:case);
],
},
+ 'ExtUtils::PL2Bat' => {
+ 'DISTRIBUTION' => 'LEONT/ExtUtils-PL2Bat-0.002.tar.gz',
+ 'FILES' => q[cpan/ExtUtils-PL2Bat],
+ 'EXCLUDED' => [
+ 't/00-compile.t',
+ ],
+ },
+
'ExtUtils::Manifest' => {
'DISTRIBUTION' => 'ETHER/ExtUtils-Manifest-1.72.tar.gz',
'FILES' => q[cpan/ExtUtils-Manifest],
diff --git a/cpan/ExtUtils-PL2Bat/lib/ExtUtils/PL2Bat.pm b/cpan/ExtUtils-PL2Bat/lib/ExtUtils/PL2Bat.pm
new file mode 100644
index 0000000000..054b47f423
--- /dev/null
+++ b/cpan/ExtUtils-PL2Bat/lib/ExtUtils/PL2Bat.pm
@@ -0,0 +1,194 @@
+package ExtUtils::PL2Bat;
+$ExtUtils::PL2Bat::VERSION = '0.002';
+use strict;
+use warnings;
+
+use 5.006;
+
+use Config;
+use Carp qw/croak/;
+
+# In core, we can't use any other modules except those that already live in
+# lib/, so Exporter is not available to us.
+sub import {
+ my ($self, @functions) = @_;
+ @functions = 'pl2bat' if not @functions;
+ my $caller = caller;
+ for my $function (@functions) {
+ no strict 'refs';
+ *{"$caller\::$function"} = \&{$function};
+ }
+}
+
+sub pl2bat {
+ my %opts = @_;
+
+ # NOTE: %0 is already enclosed in doublequotes by cmd.exe, as appropriate
+ $opts{ntargs} = '-x -S %0 %*' unless exists $opts{ntargs};
+ $opts{otherargs} = '-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9' unless exists $opts{otherargs};
+
+ $opts{stripsuffix} = qr/\.plx?/ unless exists $opts{stripsuffix};
+
+ if (not exists $opts{out}) {
+ $opts{out} = $opts{in};
+ $opts{out} =~ s/$opts{stripsuffix}$//i;
+ $opts{out} .= '.bat' unless $opts{in} =~ /\.bat$/i or $opts{in} eq '-';
+ }
+
+ my $head = <<"EOT";
+ \@rem = '--*-Perl-*--
+ \@set "ErrorLevel="
+ \@if "%OS%" == "Windows_NT" \@goto WinNT
+ \@perl $opts{otherargs}
+ \@set ErrorLevel=%ErrorLevel%
+ \@goto endofperl
+ :WinNT
+ \@perl $opts{ntargs}
+ \@set ErrorLevel=%ErrorLevel%
+ \@if NOT "%COMSPEC%" == "%SystemRoot%\\system32\\cmd.exe" \@goto endofperl
+ \@if %ErrorLevel% == 9009 \@echo You do not have Perl in your PATH.
+ \@goto endofperl
+ \@rem ';
+EOT
+
+ $head =~ s/^\s+//gm;
+ my $headlines = 2 + ($head =~ tr/\n/\n/);
+ my $tail = <<'EOT';
+ __END__
+ :endofperl
+ @set "ErrorLevel=" & @goto _undefined_label_ 2>NUL || @"%COMSPEC%" /d/c @exit %ErrorLevel%
+EOT
+ $tail =~ s/^\s+//gm;
+
+ my $linedone = 0;
+ my $taildone = 0;
+ my $linenum = 0;
+ my $skiplines = 0;
+
+ my $start = $Config{startperl};
+ $start = '#!perl' unless $start =~ /^#!.*perl/;
+
+ open my $in, '<', $opts{in} or croak "Can't open $opts{in}: $!";
+ my @file = <$in>;
+ close $in;
+
+ foreach my $line ( @file ) {
+ $linenum++;
+ if ( $line =~ /^:endofperl\b/ ) {
+ if (!exists $opts{update}) {
+ warn "$opts{in} has already been converted to a batch file!\n";
+ return;
+ }
+ $taildone++;
+ }
+ if ( not $linedone and $line =~ /^#!.*perl/ ) {
+ if (exists $opts{update}) {
+ $skiplines = $linenum - 1;
+ $line .= '#line '.(1+$headlines)."\n";
+ } else {
+ $line .= '#line '.($linenum+$headlines)."\n";
+ }
+ $linedone++;
+ }
+ if ( $line =~ /^#\s*line\b/ and $linenum == 2 + $skiplines ) {
+ $line = '';
+ }
+ }
+
+ open my $out, '>', $opts{out} or croak "Can't open $opts{out}: $!";
+ print $out $head;
+ print $out $start, ( $opts{usewarnings} ? ' -w' : '' ),
+ "\n#line ", ($headlines+1), "\n" unless $linedone;
+ print $out @file[$skiplines..$#file];
+ print $out $tail unless $taildone;
+ close $out;
+
+ return $opts{out};
+}
+
+1;
+
+# ABSTRACT: Batch file creation to run perl scripts on Windows
+
+__END__
+
+=pod
+
+=encoding UTF-8
+
+=head1 NAME
+
+ExtUtils::PL2Bat - Batch file creation to run perl scripts on Windows
+
+=head1 VERSION
+
+version 0.002
+
+=head1 OVERVIEW
+
+This module converts a perl script into a batch file that can be executed on Windows/DOS-like operating systems. This is intended to allow you to use a Perl script like regular programs and batch files where you just enter the name of the script [probably minus the extension] plus any command-line arguments and the script is found in your B<PATH> and run.
+
+=head1 FUNCTIONS
+
+=head2 pl2bat(%opts)
+
+This function takes a perl script and write a batch file that contains the script. This is sometimes necessary
+
+=over 8
+
+=item * C<in>
+
+The name of the script that is to be batchified. This argument is mandatory.
+
+=item * C<out>
+
+The name of the output batch file. If not given, it will be generated using C<in> and C<stripsuffix>.
+
+=item * C<ntargs>
+
+Arguments to invoke perl with in generated batch file when run from
+Windows NT. Defaults to S<'-x -S %0 %*'>.
+
+=item * C<otherargs>
+
+Arguments to invoke perl with in generated batch file except when
+run from Windows NT (ie. when run from DOS, Windows 3.1, or Windows 95).
+Defaults to S<'-x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9'>.
+
+=item * C<stripsuffix>
+
+Strip a suffix string from file name before appending a ".bat"
+suffix. The suffix is not case-sensitive. It can be a regex or a string and a trailing
+C<$> is always assumed). Defaults to C<qr/\.plx?/>.
+
+=item * C<usewarnings>
+
+With the C<usewarnings>
+option, C<" -w"> is added after the value of C<$Config{startperl}>.
+If a line matching C</^#!.*perl/> already exists in the script,
+then it is not changed and the B<-w> option is ignored.
+
+=item * C<update>
+
+If the script appears to have already been processed by B<pl2bat>,
+then the script is skipped and not processed unless C<update> was
+specified. If C<update> is specified, the existing preamble is replaced.
+
+=back
+
+=head1 ACKNOWLEDGEMENTS
+
+This code was taken from Module::Build and then modified; which had taken it from perl's pl2bat script. This module is an attempt at unifying all three implementations.
+
+=head1 AUTHOR
+
+Leon Timmermans <leont@cpan.org>
+
+=head1 COPYRIGHT AND LICENSE
+
+This software is copyright (c) 2015 by Leon Timmermans.
+
+This is free software; you can redistribute it and/or modify it under
+the same terms as the Perl 5 programming language system itself.
+
+=cut
diff --git a/cpan/ExtUtils-PL2Bat/t/make_executable.t b/cpan/ExtUtils-PL2Bat/t/make_executable.t
new file mode 100644
index 0000000000..fb4ba6adb0
--- /dev/null
+++ b/cpan/ExtUtils-PL2Bat/t/make_executable.t
@@ -0,0 +1,33 @@
+#!/usr/bin/perl
+
+use strict;
+use warnings FATAL => 'all';
+
+use Config;
+use Test::More;
+use ExtUtils::PL2Bat;
+use Cwd qw/cwd/;
+
+plan($^O eq 'MSWin32' ? (tests => 7) : skip_all => 'Only usable on Windows');
+
+my $filename = 'test_exec';
+my @files;
+
+open my $out, '>', $filename or die "Couldn't create $filename: $!";
+print $out "#! perl -w\nexit \$ARGV[0];\n";
+close $out;
+
+pl2bat(in => $filename);
+
+foreach my $i (42, 51, 0) {
+ my $cwd = cwd;
+ local $ENV{PATH} = join $Config{path_sep}, $cwd, $ENV{PATH};
+ my $ret = system $filename, $i;
+ is $ret & 0xff, 0, 'test_exec executed successfully';
+ is $ret >> 8, $i, "test_exec $i return value ok";
+}
+
+push @files, grep { -f } map { $filename.$_ } split / $Config{path_sep} /x, $ENV{PATHEXT} || '';
+is scalar(@files), 1, "Executable file exists";
+
+unlink $filename, @files;
diff --git a/lib/.gitignore b/lib/.gitignore
index 4b0d2633a7..7386d36824 100644
--- a/lib/.gitignore
+++ b/lib/.gitignore
@@ -73,6 +73,7 @@
/ExtUtils/Miniperl.pm
/ExtUtils/Mkbootstrap.pm
/ExtUtils/Mksymlists.pm
+/ExtUtils/PL2Bat.pm
/ExtUtils/Packlist.pm
/ExtUtils/ParseXS.pm
/ExtUtils/ParseXS.pod