write_buildcustomize.pl no longer writes to STDOUT
authorNicholas Clark <nick@ccl4.org>
Wed, 12 Jun 2013 12:42:15 +0000 (14:42 +0200)
committerNicholas Clark <nick@ccl4.org>
Thu, 13 Jun 2013 13:19:21 +0000 (15:19 +0200)
write_buildcustomize.pl now opens lib/buildcustomize.pl itself, instead of
writing to STDOUT and relying on the Makefile to set up redirection. This
means that an empty lib/buildcustomize.pl is not created if
write_buildcustomize.pl fails to compile (for whatever reason), and permits
write_buildcustomize.pl to delete (or attempt to delete) the output file if
it detects an error.

Hard code the output file name (lib/buildcustomize.pl), as it's the same on
all platforms, and @ARGV is already used to optionally pass a directory for
write_buildcustomize.pl to change to before running.

Experimentation suggests that various make utilities don't delete a file
created by redirection even if an error occurs. Hence this should be more
robust.

Add -f to the miniperl commandline when running write_buildcustomize.pl to
avoid reading in any existing lib/buildcustomize.pl. write_buildcustomize.pl
doesn't need the setup provided by lib/buildcustomize.pl, and running it
might cause errors which prevents writing out a correct version, making an
incomplete build harder to recover from.

Makefile.SH
vms/descrip_mms.template
win32/Makefile
win32/makefile.mk
write_buildcustomize.pl

index 17707a1..cac96e7 100755 (executable)
@@ -866,15 +866,15 @@ $(MINIPERL_EXE): lib/buildcustomize.pl
 lib/buildcustomize.pl: $& $(mini_obj)
        $(CC) -o $(MINIPERL_EXE) $(CLDFLAGS) $(mini_obj) $(libs)
        $(LDLIBPTH) $(RUN) ./miniperl$(HOST_EXE_EXT) -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
-       $(MINIPERL) write_buildcustomize.pl >lib/buildcustomize.pl
+       $(MINIPERL) -f write_buildcustomize.pl
 !NO!SUBS!
                ;;
        next4*)
                $spitshell >>$Makefile <<'!NO!SUBS!'
-lib/buildcustomize.pl: $& $(mini_obj) write_buildcustomize.pl
-       $(CC) -o $(MINIPERL_EXE) $(mini_obj) $(libs)
-       $(LDLIBPTH) $(RUN) ./miniperl$(HOST_EXE_EXT) -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
-       $(MINIPERL) write_buildcustomize.pl >lib/buildcustomize.pl
+lib/buildcustomize.pl: $& $(mini_obj) write    ldcustomize.pl
+       $(CC) -o $(MINIPERL_EXE) $(mini_obj    libs)
+       $(LDLIBPTH) $(RUN) ./miniperl$(HOST    _EXT) -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
+       $(MINIPERL) -f write_buildcustomize.pl    
 !NO!SUBS!
                ;;
        darwin*)
@@ -896,7 +896,7 @@ lib/buildcustomize.pl: $& $(mini_obj) write_buildcustomize.pl
        $(CC) $(CLDFLAGS) $(NAMESPACEFLAGS) -o $(MINIPERL_EXE) \
            $(mini_obj) $(libs)
        $(LDLIBPTH) $(RUN) ./miniperl$(HOST_EXE_EXT) -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
-       $(MINIPERL) write_buildcustomize.pl >lib/buildcustomize.pl
+       $(MINIPERL) -f write_buildcustomize.pl
 !NO!SUBS!
                ;;
        *)
@@ -906,7 +906,7 @@ lib/buildcustomize.pl: $& $(mini_obj) write_buildcustomize.pl
        $(LDLIBPTH) $(CC) $(CLDFLAGS) -o $(MINIPERL_EXE) \
            $(mini_obj) $(libs)
        $(LDLIBPTH) $(RUN) ./miniperl$(HOST_EXE_EXT) -w -Ilib -MExporter -e '<?>' || $(MAKE) minitest
-       $(MINIPERL) write_buildcustomize.pl >lib/buildcustomize.pl
+       $(MINIPERL) -f write_buildcustomize.pl
 !NO!SUBS!
                ;;
        esac
index 7f91971..7ccc84b 100644 (file)
@@ -350,7 +350,7 @@ miniperl : $(DBG)miniperl$(E)  vmspipe.com
 
 [.lib]buildcustomize.pl :  miniperlmain$(O), $(DBG)libperlmini$(OLB) $(CRTL) write_buildcustomize.pl [.lib.VMS]Filespec.pm
        Link $(LINKFLAGS)/NoDebug/Trace/NoMap/NoFull/NoCross/Exe=$(MINIPERL_EXE) miniperlmain$(O), $(DBG)libperlmini$(OLB)/Library/Include=globals $(CRTLOPTS)
-       $(MINIPERL) write_buildcustomize.pl > [.lib]buildcustomize.pl
+       $(MINIPERL) "-f" write_buildcustomize.pl
 
 $(DBG)miniperl$(E) :  miniperlmain$(O), $(DBG)libperlmini$(OLB) $(CRTL)
        Link $(LINKFLAGS)/Trace/Exe=$(MMS$TARGET) miniperlmain$(O), $(DBG)libperlmini$(OLB)/Library/Include=globals  $(CRTLOPTS)
index c7acd9c..8adf7f0 100644 (file)
@@ -960,7 +960,7 @@ $(MINIPERL) : ..\lib\buildcustomize.pl
        $(LINK_FLAGS) $(DELAYLOAD) $(LIBFILES) $(MINI_OBJ)
 <<
        $(EMBED_EXE_MANI)
-       $(MINIPERL) -I..\lib ..\write_buildcustomize.pl .. >..\lib\buildcustomize.pl
+       $(MINIPERL) -I..\lib -f ..\write_buildcustomize.pl ..
 
 $(MINIDIR) :
        if not exist "$(MINIDIR)" mkdir "$(MINIDIR)"
index 4d11255..4c449db 100644 (file)
@@ -1094,7 +1094,7 @@ $(MINIPERL) : ..\lib\buildcustomize.pl
            @$(mktmp $(DELAYLOAD) $(LIBFILES) $(MINI_OBJ))
        $(EMBED_EXE_MANI)
 .ENDIF
-       $(MINIPERL) -I..\lib ..\write_buildcustomize.pl .. >..\lib\buildcustomize.pl
+       $(MINIPERL) -I..\lib -f ..\write_buildcustomize.pl ..
 
 $(MINIDIR) :
        if not exist "$(MINIDIR)" mkdir "$(MINIDIR)"
index 018e60e..709923b 100644 (file)
@@ -10,6 +10,8 @@ if (@ARGV) {
 unshift @INC, ('dist/Cwd', 'dist/Cwd/lib');
 require File::Spec::Functions;
 
+my $file = 'lib/buildcustomize.pl';
+
 # To clarify, this isn't the entire suite of modules considered "toolchain"
 # It's not even all modules needed to build ext/
 # It's just the source paths of the (minimum complete set of) modules in ext/
@@ -42,10 +44,15 @@ my $inc = join ",\n        ",
     map { "q\0$_\0" }
     (map {File::Spec::Functions::rel2abs($_)} @toolchain, 'lib'), '.';
 
+open my $fh, '>', $file
+    or die "Can't open $file: $!";
+
+my $error;
+
 # If any of the system's build tools are written in Perl, then this module
 # may well be loaded by a much older version than we are building. So keep it
 # as backwards compatible as is easy.
-print <<"EOT";
+print $fh <<"EOT" or $error = "Can't print to $file: $!";
 #!perl
 
 # We are miniperl, building extensions
@@ -53,3 +60,24 @@ print <<"EOT";
 # installed directories (which we don't need to read, and may confuse us)
 \@INC = ($inc);
 EOT
+
+if ($error) {
+    close $fh
+        or warn "Can't unlink $file after error: $!";
+} else {
+    close $fh and exit;
+    $error = "Can't close $file: $!";
+}
+
+# It's going very wrong, so try to remove the botched file.
+
+unlink $file
+    or warn "Can't unlink $file after error: $!";
+die $error;
+
+# Local variables:
+# cperl-indent-level: 4
+# indent-tabs-mode: nil
+# End:
+#
+# ex: set ts=8 sts=4 sw=4 et: