use ExtUtils::MakeMaker; # See lib/ExtUtils/MakeMaker.pm for details of how to influence # the contents of the Makefile that is written. require 5.004; use strict; my @PREREQS = ( # ["","",,]; ["Core Package","SOAP::Lite",{"XML::Parser" => "2.23","MIME::Base64" => 0, "URI" => 0},2], ["Client HTTP support","",{"LWP::UserAgent" => 0},1], ["Client HTTPS support","SOAP::Transport::HTTPS::Client",{"Crypt::SSLeay" => 0},0], ["Client SMTP/sendmail support","SOAP::Transport::MAILTO::Client",{"MIME::Lite" => 0},1], ["Client FTP support","SOAP::Transport::FTP::Client",{"Net::FTP" => 0,"IO::File" => 0},0], ["Standalone HTTP server","SOAP::Transport::HTTP::Daemon",{"HTTP::Daemon" => 0},1], ["Apache/mod_perl server","SOAP::Transport::HTTP::Apache",{"Apache" => 0},0], ["FastCGI server","SOAP::Transport::HTTP::FCGI",{"FCGI" => 0},0], ["POP3 server","SOAP::Transport::POP3::Server",{"Net::POP3" => 0,"MIME::Parser" => 0},1], ["IO server","SOAP::Transport::IO::Server",{"IO::File" => 0},0], ["MQ transport support","SOAP::Transport::MQ",{"MQSeries" => 0},1], ["JABBER transport support","SOAP::Transport::JABBER",{"Net::Jabber" => 0},0], ["MIME messages","SOAP::Packager::MIME",{"MIME::Parser" => 0},1], ["DIME messages","SOAP::Packager::DIME",{"IO::Scalar" => "2.105", "DIME::Tools" => 0.03, "Data::UUID" => "0.11"},0], ["SSL Support for TCP Transport","SOAP::Transport::TCP",{"IO::Socket::SSL" => 0},0], ["Compression support for HTTP","SOAP::Transport::HTTP",{"Compress::Zlib" => 0},0], ["MIME interoperability w/ Axis","SOAP::Lite",{"MIME::Parser" => "6.106"},0], ); use Getopt::Long; my $helptext = < Possible options are: --noprompt Disable interactive dialog --alltests Perform extra testing --help, -? Display this help text [Do not] install prerequisites for appropriate module: EOI # Create config parameters using module names and expand help text # We will create a hash (%config) that has each module => (1|0) for install my(%options, %config, %has_module_cache); # Initialize the prereq table and all help text foreach my $prereq (@PREREQS) { my ($feature,$dep,$modules,$default) = @$prereq; next unless $dep ne ""; $prereq->[3] = has_all_modules($modules) unless $prereq->[3] == 2; my $module = do { $dep =~ s/::/-/g; $dep }; my $shortcut = do { (my $t = $module) =~ s/SOAP-(?:Transport-)?//; $t }; $config{$dep} = has_all_modules($modules); $options{"install-$dep|$shortcut!"} = \$config{$dep}; $helptext .= sprintf " --[no]install-%-28s --[no]%s\n", $dep, $shortcut; } use vars qw($noprompt $alltests $help $intro); #my ($noprompt,$alltests,$help); GetOptions ( "noprompt" => \$noprompt, "alltests" => \$alltests, "help|?" => \$help, ); $help and print($helptext), exit; $intro = < to see the detailed list."); } # This hash will contain a list of all perl modules we would like to # explicitly depend upon in our Makefile my %prereqs; my $proceed = 0; do { print "\n".generate_prereq_table()."\n"; # Ask the user if this is the configuration they desire if ($noprompt) { $proceed = 1; } else { $proceed = ExtUtils::MakeMaker::prompt("Do you want to proceed with this configuration?" => 'yes') =~ /^\s*y/i; } # Loop through each prerequisite and ask the user if they wish to # install it or not - reset prereqs, cause they change each time %prereqs = (); for my $prereq (@PREREQS) { my ($feature,$dep,$modules,$default) = @$prereq; next unless $dep ne ""; unless ($proceed || $prereq->[3] == 2) { # need to use $prereq, because we modify actual value $prereq->[3] = (ExtUtils::MakeMaker::prompt("Do you plan to use ${feature}?" => ($prereq->[3] ? 'yes' : 'no')) =~ /^\s*(y)/i); } (%prereqs = (%prereqs, map { $_,$modules->{$_} } keys %$modules)) if $prereq->[3]; } } while (!$proceed); # Warn the user about the testing that will occur my $noncoretests = !$noprompt ? ExtUtils::MakeMaker::prompt(' During "make test" phase we may run tests with several SOAP servers that may take long and may fail due to server/connectivity problems. Do you want to perform these tests in addition to core tests?', $alltests ? 'yes' : 'no') =~ /^\s*(y)/i : $alltests; my $tests = join ' ', glob ($noncoretests ? 't/*.t' : 't/0*.t'); WriteMakefile( 'NAME' => 'SOAP::Lite', 'VERSION_FROM' => 'lib/SOAP/Lite.pm', 'PREREQ_PM' => \%prereqs, 'EXE_FILES' => ['bin/SOAPsh.pl', 'bin/XMLRPCsh.pl', 'bin/stubmaker.pl'], test => {TESTS => $tests}, ); ###################################################### # Supporting subroutines ###################################################### # Maintains a cache of what 3rd party modules you have # installed sub has_module { my ($mod, $version) = @_; $version ||= ''; # use "require Foo; Exporter::require_version('Foo' => 1)" instead of # obvious "use Foo 1". The later doesn't work with MIME::Parser # wonder why? --PK return ($has_module_cache{"$mod$version"} ||= eval("require $mod; Exporter::require_version('$mod', $version) if ($version); 1")); } # Return 1 if all modules contained in the inputed array # are installed, 0 otherwise sub has_all_modules { my ($mods) = @_; foreach my $mod (keys %$mods) { return 0 if !has_module($mod, $mods->{$mod}); } return 1; } # Print a single prerequisite to the screen sub generate_prereq { my ($feature,$dep,$modules,$install) = @_; my $i = 0; my $buf = ""; foreach my $module (keys %$modules) { my $detected = (has_module($module, $modules->{$module}) ? "*" : " "); $buf .= sprintf("%-29s [%s] %-24s %-8s\n",($i++ ? "" : $feature),$detected,$module . ($modules->{$module} ? " (v$modules->{$module})" : ""),($i == 1 ? ($install ? ($install == 2 ? "always" : "[ yes ]") : "[ no ]") : "")); } return $buf; } # Print the entire prerequisites table sub generate_prereq_table { my $buf = sprintf("%-29s %-28s %-8s\n","Feature","Prerequisites","Install?"); $buf .= sprintf("%s %s %s\n","-" x 29,"-" x 28,"-" x 8); foreach my $pre (@PREREQS) { my ($feature,$dep,$modules,$default) = @{$pre}; $buf .= generate_prereq(@{$pre}); } $buf .= "--- An asterix '[*]' indicates if the module is currently installed.\n"; return $buf; } 1;