This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
ExtUtils::Miniperl::writemain()'s first argument can also be a filename.
authorNicholas Clark <nick@ccl4.org>
Mon, 8 Jul 2013 14:41:30 +0000 (16:41 +0200)
committerNicholas Clark <nick@ccl4.org>
Tue, 9 Jul 2013 05:54:32 +0000 (07:54 +0200)
Treat a reference to a scalar as the name of a file to open for output.
Any other reference is used as an output filehandle.
Otherwise the default remains to write to STDOUT.

ext/ExtUtils-Miniperl/lib/ExtUtils/Miniperl.pm

index 68a4940..9aaf954 100644 (file)
@@ -10,9 +10,24 @@ use vars qw($VERSION @ISA @EXPORT);
 @EXPORT = qw(writemain);
 $VERSION = 1;
 
+# blead will run this with miniperl, hence we can't use autodie or File::Temp
+my $temp;
+
+END {
+    return if !defined $temp || !-e $temp;
+    unlink $temp or warn "Can't unlink '$temp': $!";
+}
+
 sub writemain{
-    my $fh;
-    if (ref $_[0]) {
+    my ($fh, $real);
+
+    if (ref $_[0] eq 'SCALAR') {
+        $real = ${+shift};
+        $temp = $real;
+        $temp =~ s/(?:.c)?\z/.new/;
+        open $fh, '>', $temp
+            or die "Can't open '$temp' for writing: $!";
+    } elsif (ref $_[0]) {
         $fh = shift;
     } else {
         $fh = \*STDOUT;
@@ -178,6 +193,11 @@ static void
 xs_init(pTHX)
 {
 EOT
+
+    if ($real) {
+        close $fh or die "Can't close '$temp': $!";
+        rename $temp, $real or die "Can't rename '$temp' to '$real': $!";
+    }
 }
 
 1;
@@ -193,6 +213,8 @@ ExtUtils::Miniperl - write the C code for perlmain.c
     writemain(@directories);
     # or
     writemain($fh, @directories);
+    # or
+    writemain(\$filename, @directories);
 
 =head1 DESCRIPTION
 
@@ -200,9 +222,9 @@ C<writemain()> takes an argument list of directories containing archive
 libraries that relate to perl modules and should be linked into a new
 perl binary. It writes a corresponding F<perlmain.c> file that
 is a plain C file containing all the bootstrap code to make the
-modules associated with the libraries available from within perl.
-If the first argument to C<writemain()> is a reference, it
-is used as the file handle to write to. Otherwise output is to C<STDOUT>.
+If the first argument to C<writemain()> is a reference to a scalar it is
+used as the filename to open for ouput. Any other reference is used as
+the filehandle to write to. Otherwise output defaults to C<STDOUT>.
 
 The typical usage is from within a Makefile generated by
 L<ExtUtils::MakeMaker>. So under normal circumstances you won't have to