#!/usr/bin/perl use strict; use ExtUtils::MakeMaker; use ExtUtils::Manifest; use File::Basename; use File::Spec; my $PACKAGE = 'XML-TEMPLATE'; my $package = lc ($PACKAGE); my $NAME = 'XML-Template'; my %config = ( "${PACKAGE}_INSTALL" => "/usr/local/$package", "${PACKAGE}_INSTALL_ADMIN" => 'admin', "${PACKAGE}_INSTALL_DOCS" => 'docs', "${PACKAGE}_VERBOSE" => 0 ); # Update configuration from command line. my %mmconfig = ( NAME => $NAME, VERSION_FROM => 'lib/XML/Template.pm', PREREQ_PM => { 'CGI' => '2.91', 'Data::Dumper' => '2.12', 'DBI::Wrap' => '1.00', 'HTML::Strip' => '1.01', 'IO::String' => '1.02', 'Mail::Sender' => '0.8.06', 'Parse::RecDescent' => '1.80', 'WWW::Auth' => '1.00', 'XML::GDOME' => '0.83', 'XML::SAX' => '0.12', }, ($] >= 5.005 ? (ABSTRACT_FROM => 'lib/XML/Template.pm', AUTHOR => 'Jonathan Waxman ') :()) ); while (my $arg = shift @ARGV) { my ($name, $value) = split (/=/, $arg); if ($name =~ /^$PACKAGE/) { $config{$name} = $value || 0; } else { $mmconfig{$name} = $value || 0; } } # Defined build directory to install directory mappings. my %inst = ( '.' => $config{"${PACKAGE}_INSTALL"}, 'admin' => $config{"${PACKAGE}_INSTALL_ADMIN"}, 'docs' => $config{"${PACKAGE}_INSTALL_DOCS"}, ); # Exclude these MANIFEST files. my @exclude = ( 'CHANGES', 'COPYING', 'INSTALL', 'Makefile.PL', 'MANIFEST', 'README', 'TODO' ); my %exclude = map {$_ => 1} @exclude; # Group files from MANIFEST by directory. my %files; if (! -f 'MANIFEST') { print "Making manifest\n"; ExtUtils::Manifest->mkmanifest (); } open (MANIFEST, "MANIFEST") || die "Could not open MANIFEST: $!"; while (my $line = ) { chomp ($line); $line =~ s/(\s+.*)$//; my $dirname = dirname ($line); my $filename = basename ($line); push (@{$files{$dirname}}, $filename) if ! exists $exclude{$line}; } close (MANIFEST); # Create MakeMaker options. my %opts = (%mmconfig); # Create Makefile. WriteMakefile (%opts); ############################################################################## # MakeMake subroutines. ############################################################################## sub MY::install { package MY; my $inherited = shift->SUPER::install (@_); $inherited =~ s/^(install :: .*)$/$1 inst_$package/gm; return $inherited; } sub MY::clean { package MY; my $inherited = shift->SUPER::clean (@_); $inherited .= " -rm .inst_${package}_*"; return $inherited; } sub MY::postamble { my $postamble; # Create Makefile from MANIFEST files. my $target_list; foreach my $dir (sort keys %files) { my $files = $files{$dir}; # Get install directory for build directory. my $install_dir; if (exists $inst{$dir}) { if ($inst{$dir} =~ m[^/]) { $install_dir = $inst{$dir}; } else { $install_dir = File::Spec->catfile ($config{"${PACKAGE}_INSTALL"}, $inst{$dir}); } } else { next; } # Create makefile target and append to target list. my $target; if ($dir eq '.') { $target = ".inst_${package}_main"; } else { my $tdir = $dir; $tdir =~ s[/][_]; $target = ".inst_${package}_$tdir"; } $target_list .= ' ' if defined $target_list; $target_list .= $target; my $file_list = join (' ', @$files); my $filespec_list = join (' ', map (File::Spec->catfile ($dir, $_), @$files)); $postamble .= qq{ $target: $filespec_list \@echo "Installing $dir -> $install_dir" \@\$(MKPATH) $install_dir \@for file in $file_list; do \\}; if ($config{"${PACKAGE}_VERBOSE"}) { $postamble .= qq{ echo " Installing \$\$file"; \\}; } $postamble .= qq{ \$(CP) $dir/\$\$file $install_dir/\$\$file; \\ done \@touch $target}; } $postamble = qq{ inst_${package}: $target_list} . $postamble; return $postamble; }