Add a new MakeMaker variable PM_FILTER that defines a Unix
Raphael Manfredi [Wed, 3 Jan 2001 22:01:30 +0000 (23:01 +0100)]
filter to be run on each .pm during the pm_to_blib() phase,
a fixed version of

Subject: PATCH (blead 8269) ExtUtils::MakeMaker
Message-ID: <5296.978555690@nice.ram.loc>

p4raw-id: //depot/perl@8311

lib/ExtUtils/Install.pm
lib/ExtUtils/MM_Unix.pm
lib/ExtUtils/MM_VMS.pm
lib/ExtUtils/MM_Win32.pm
lib/ExtUtils/MakeMaker.pm

index 4a148a6..c496aa0 100644 (file)
@@ -262,8 +262,22 @@ sub inc_uninstall {
     }
 }
 
+sub run_filter {
+    my ($cmd, $src, $dest) = @_;
+    local *SRC, *CMD;
+    open(CMD, "|$cmd >$dest") || die "Cannot fork: $!";
+    open(SRC, $src)           || die "Cannot open $src: $!";
+    my $buf;
+    my $sz = 1024;
+    while (my $len = sysread(SRC, $buf, $sz)) {
+       syswrite(CMD, $buf, $len);
+    }
+    close SRC;
+    close CMD or die "Filter command '$cmd' failed for $src";
+}
+
 sub pm_to_blib {
-    my($fromto,$autodir) = @_;
+    my($fromto,$autodir,$pm_filter) = @_;
 
     use File::Basename qw(dirname);
     use File::Copy qw(copy);
@@ -286,23 +300,37 @@ sub pm_to_blib {
 
     mkpath($autodir,0,0755);
     foreach (keys %$fromto) {
-       next if -f $fromto->{$_} && -M $fromto->{$_} < -M $_;
-       unless (compare($_,$fromto->{$_})){
-           print "Skip $fromto->{$_} (unchanged)\n";
+       my $dest = $fromto->{$_};
+       next if -f $dest && -M $dest < -M $_;
+
+       # When a pm_filter is defined, we need to pre-process the source first
+       # to determine whether it has changed or not.  Therefore, only perform
+       # the comparison check when there's no filter to be ran.
+       #    -- RAM, 03/01/2001
+
+       my $need_filtering = defined $pm_filter && length $pm_filter && /\.pm$/;
+
+       if (!$need_filtering && 0 == compare($_,$dest)) {
+           print "Skip $dest (unchanged)\n";
            next;
        }
-       if (-f $fromto->{$_}){
-           forceunlink($fromto->{$_});
+       if (-f $dest){
+           forceunlink($dest);
+       } else {
+           mkpath(dirname($dest),0,0755);
+       }
+       if ($need_filtering) {
+           run_filter($pm_filter, $_, $dest);
+           print "$pm_filter <$_ >$dest\n";
        } else {
-           mkpath(dirname($fromto->{$_}),0,0755);
+           copy($_,$dest);
+           print "cp $_ $dest\n";
        }
-       copy($_,$fromto->{$_});
        my($mode,$atime,$mtime) = (stat)[2,8,9];
-       utime($atime,$mtime+$Is_VMS,$fromto->{$_});
-       chmod(0444 | ( $mode & 0111 ? 0111 : 0 ),$fromto->{$_});
-       print "cp $_ $fromto->{$_}\n";
-       next unless /\.pm\z/;
-       autosplit($fromto->{$_},$autodir);
+       utime($atime,$mtime+$Is_VMS,$dest);
+       chmod(0444 | ( $mode & 0111 ? 0111 : 0 ),$dest);
+       next unless /\.pm$/;
+       autosplit($dest,$autodir);
     }
 }
 
@@ -392,7 +420,9 @@ no-don't-really-do-it-now switch.
 pm_to_blib() takes a hashref as the first argument and copies all keys
 of the hash to the corresponding values efficiently. Filenames with
 the extension pm are autosplit. Second argument is the autosplit
-directory.
+directory.  If third argument is not empty, it is taken as a filter command
+to be ran on each .pm file, the output of the command being what is finally
+copied, and the source for auto-splitting.
 
 You can have an environment variable PERL_INSTALL_ROOT set which will
 be prepended as a directory to each installed file (and directory).
index 8624f11..d7dd720 100644 (file)
@@ -590,7 +590,7 @@ MM_VERSION = $ExtUtils::MakeMaker::VERSION
 
     for $tmp (qw/
              FULLEXT BASEEXT PARENT_NAME DLBASE VERSION_FROM INC DEFINE OBJECT
-             LDFROM LINKTYPE
+             LDFROM LINKTYPE PM_FILTER
              / ) {
        next unless defined $self->{$tmp};
        push @m, "$tmp = $self->{$tmp}\n";
@@ -3050,7 +3050,7 @@ sub pm_to_blib {
 pm_to_blib: $(TO_INST_PM)
        }.$self->{NOECHO}.q{$(PERL) "-I$(INST_ARCHLIB)" "-I$(INST_LIB)" \
        "-I$(PERL_ARCHLIB)" "-I$(PERL_LIB)" -MExtUtils::Install \
-        -e "pm_to_blib({qw{$(PM_TO_BLIB)}},'}.$autodir.q{')"
+        -e "pm_to_blib({qw{$(PM_TO_BLIB)}},'}.$autodir.q{','$(PM_FILTER)')"
        }.$self->{NOECHO}.q{$(TOUCH) $@
 };
 }
index 57d61e9..b753e2a 100644 (file)
@@ -832,7 +832,7 @@ pm_to_blib.ts : $(TO_INST_PM)
     }
     push(@m,"\t\$(NOECHO) \$(PERL) -e \"print '$line'\" >>.MM_tmp\n") if $line;
 
-    push(@m,q[ $(PERL) "-I$(PERL_LIB)" "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[')" <.MM_tmp]);
+    push(@m,q[ $(PERL) "-I$(PERL_LIB)" "-MExtUtils::Install" -e "pm_to_blib({split(' ',<STDIN>)},'].$autodir.q[','$(PM_FILTER)')" <.MM_tmp]);
     push(@m,qq[
        \$(NOECHO) Delete/NoLog/NoConfirm .MM_tmp;
        \$(NOECHO) \$(TOUCH) pm_to_blib.ts
index 513b110..80e247d 100644 (file)
@@ -598,7 +598,7 @@ pm_to_blib: $(TO_INST_PM)
        ($NMAKE ? 'qw[ <<pmfiles.dat ],'
                : $DMAKE ? 'qw[ $(mktmp,pmfiles.dat $(PM_TO_BLIB:s,\\,\\\\,)\n) ],'
                         : '{ qw[$(PM_TO_BLIB)] },'
-        ).q{'}.$autodir.q{')"
+        ).q{'}.$autodir.q{','$(PM_FILTER)')"
        }. ($NMAKE ? q{
 $(PM_TO_BLIB)
 <<
index 78175f9..9680348 100644 (file)
@@ -200,7 +200,8 @@ sub full_setup {
     PERL_MALLOC_OK
     NAME NEEDS_LINKING NOECHO NORECURS NO_VC OBJECT OPTIMIZE PERL PERLMAINCC
     PERL_ARCHLIB PERL_LIB PERL_SRC PERM_RW PERM_RWX
-    PL_FILES PM PMLIBDIRS POLLUTE PPM_INSTALL_EXEC PPM_INSTALL_SCRIPT PREFIX
+    PL_FILES PM PM_FILTER PMLIBDIRS POLLUTE PPM_INSTALL_EXEC
+       PPM_INSTALL_SCRIPT PREFIX
     PREREQ_PM SKIP TYPEMAPS VERSION VERSION_FROM XS XSOPT XSPROTOARG
     XS_VERSION clean depend dist dynamic_lib linkext macro realclean
     tool_autosplit
@@ -239,7 +240,6 @@ sub full_setup {
 
  dir_target libscan makeaperl needs_linking perm_rw perm_rwx
  subdir_x test_via_harness test_via_script
-
                         ];
 
     push @MM_Sections, qw[
@@ -1673,6 +1673,29 @@ Defining PM in the Makefile.PL will override PMLIBDIRS.
 
 (Where BASEEXT is the last component of NAME.)
 
+=item PM_FILTER
+
+A filter program, in the traditional Unix sense (input from stdin, output
+to stdout) that is passed on each .pm file during the build (in the
+pm_to_blib() phase).  It is empty by default, meaning no filtering is done.
+
+Great care is necessary when defining the command if quoting needs to be
+done.  For instance, you would need to say:
+
+  {'PM_FILTER' => 'grep -v \\"^\\#\\"'}
+
+to remove all the leading coments on the fly during the build.  The
+extra \\ are necessary, unfortunately, because this variable is interpolated
+within the context of a Perl program built on the command line, and double
+quotes are what is used with the -e switch to build that command line.  The
+# is escaped for the Makefile, since what is going to be generated will then
+be:
+
+  PM_FILTER = grep -v \"^\#\"
+
+Without the \\ before the #, we'd have the start of a Makefile comment,
+and the macro would be incorrectly defined.
+
 =item POLLUTE
 
 Release 5.005 grandfathered old global symbol names by providing preprocessor