develooper Front page | perl.perl5.porters | Postings from January 2001

PATCH (blead 8269) ExtUtils::MakeMaker

Thread Next
From:
Raphael Manfredi
Date:
January 3, 2001 13:02
Subject:
PATCH (blead 8269) ExtUtils::MakeMaker
Message ID:
5296.978555690@nice.ram.loc
Jarkko,

This patch add a new variable PM_FILTER that defines a Unix filter to
be run on each .pm during the pm_to_blib() phase.

I had first implemented it more "minimally" by redefining pm_to_blib()
privately, but I think it's more powerful to open filtering via a defined
variable... that also means less code to write for the users, and is more
data-driven.

Tested only locally, via

	perl@8269/perl -I perl@8269/lib Makefile.PL PERL_SRC=perl@8269

and only on Linux.  I changed other MM_* files, but not tested the
(trivial) change.  I don't see any typo there, but...

Raphael

diff -ru perl@8269/lib/ExtUtils/Install.pm perl@8269.new/lib/ExtUtils/Install.pm
--- perl@8269/lib/ExtUtils/Install.pm	Tue Dec 12 04:30:41 2000
+++ perl@8269.new/lib/ExtUtils/Install.pm	Wed Jan  3 21:17:42 2001
@@ -262,13 +262,26 @@
     }
 }
 
+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);
     use File::Path qw(mkpath);
-    use File::Compare qw(compare);
     use AutoSplit;
     # my $my_req = $self->catfile(qw(auto ExtUtils Install forceunlink.al));
     # require $my_req; # Hairy, but for the first
@@ -286,23 +299,37 @@
 
     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 +419,9 @@
 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).
diff -ru perl@8269/lib/ExtUtils/MM_Unix.pm perl@8269.new/lib/ExtUtils/MM_Unix.pm
--- perl@8269/lib/ExtUtils/MM_Unix.pm	Fri Dec 15 16:17:13 2000
+++ perl@8269.new/lib/ExtUtils/MM_Unix.pm	Wed Jan  3 21:39:56 2001
@@ -582,7 +582,7 @@
 
     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";
@@ -3042,7 +3042,7 @@
 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) $@
 };
 }
diff -ru perl@8269/lib/ExtUtils/MM_VMS.pm perl@8269.new/lib/ExtUtils/MM_VMS.pm
--- perl@8269/lib/ExtUtils/MM_VMS.pm	Tue Dec 12 04:30:42 2000
+++ perl@8269.new/lib/ExtUtils/MM_VMS.pm	Wed Jan  3 21:24:18 2001
@@ -832,7 +832,7 @@
     }
     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
diff -ru perl@8269/lib/ExtUtils/MM_Win32.pm perl@8269.new/lib/ExtUtils/MM_Win32.pm
--- perl@8269/lib/ExtUtils/MM_Win32.pm	Tue Dec 12 04:30:42 2000
+++ perl@8269.new/lib/ExtUtils/MM_Win32.pm	Wed Jan  3 21:25:26 2001
@@ -598,7 +598,7 @@
 	($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)
 <<
diff -ru perl@8269/lib/ExtUtils/MakeMaker.pm perl@8269.new/lib/ExtUtils/MakeMaker.pm
--- perl@8269/lib/ExtUtils/MakeMaker.pm	Tue Dec 12 04:30:43 2000
+++ perl@8269.new/lib/ExtUtils/MakeMaker.pm	Wed Jan  3 21:48:43 2001
@@ -200,7 +200,8 @@
     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 @@
 
  dir_target libscan makeaperl needs_linking perm_rw perm_rwx
  subdir_x test_via_harness test_via_script
-
 			 ];
 
     push @MM_Sections, qw[
@@ -1672,6 +1672,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
 

Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About