On Mon, 14 Jul 2003, Stas Bekman wrote:Here is an example of my Makefile.PL using ModUtils::AutoInstall:
[ ... ]
Are you talking about the dependencies list? by 'the current state of affairs with mod_perl 2.0', you mean that it's not indexed by PAUSE. It's available from CPAN.
Actually, once it gets indexed by CPAN it'll break all the
other modules which specify mod_perl (1.0) as a dependency and
won't work with 2.0.
Perhaps it might be an idea, at this stage, to recommend to module authors that, if their package is for mod_perl 1 only, to use a module like Apache::Constants in their PREREQ_PM (ie, something available only within mod_perl 1), and if it's for mod_perl 2 only, use something like Apache::Const, or something available only with mod_perl 2. This won't help existing packages, but it would at least alert people that a problem is on the horizon.
To help in this, perhaps it would be worthwhile to promote the
use of Module::Install? A package (Module::Install::mod_perl?)
could be made which would make available a function to test for
the mod_perl version a user has, and then decide if this is
appropriate for the package about to be installed. If the
required mod_perl version isn't present, one could either offer
to add the required version to PREREQ_PM, or else just die, as
automated installs of mod_perl can be tricky. A lot of the code
for this could be extracted from Apache::Test; Stas, you've also
worked through this logic in making packages that include
different versions for different mod_perl versions. Only the
package author need have Module::Install::* when constructing the
Makefile.PL - the necessary stuff for the added functionality is
added to the distribution, making it transparent to the user.
# ExtUtils::AutoInstall Bootstrap Code, version 7. BEGIN{my$p='ExtUtils::AutoInstall';my$v=0.52;$p->VERSION||0>=$v or+eval"use $p $v;1"or+do{my$e=$ENV{PERL_EXTUTILS_AUTOINSTALL}; (!defined($e)||$e!~m/--(?:default|skip|testonly)/and-t STDIN or eval"use ExtUtils::MakeMaker;WriteMakefile(PREREQ_PM=>{'$p',$v} );1"and exit)and print"==> $p $v required. Install it from CP". "AN? [Y/n] "and<STDIN>!~/^n/i and print"*** Installing $p\n"and do{if (eval '$>' and lc(`sudo -V`) =~ /version/){system('sudo', $^X,"-MCPANPLUS","-e","CPANPLUS::install $p");eval"use $p $v;1" ||system('sudo', $^X, "-MCPAN", "-e", "CPAN::install $p")}eval{ require CPANPLUS;CPANPLUS::install$p};eval"use $p $v;1"or eval{ require CPAN;CPAN::install$p};eval"use $p $v;1"||die"*** Please manually install $p $v from cpan.org first...\n"}}}
# notify the user about mod_perl 2 BEGIN { print q{ **************** NOTICE ********************* If you are planning to use mod_perl2 and Apache2, please, do not answer yes when prompted to install mod_perl. You will need to download mod_perl2 manually from http://perl.apache.org/download/index.html ********************************************* } }
# optional pre-install handler; takes $module_name and $version # sub MY::preinstall { return 1; } # return false to skip install
# optional post-install handler; takes $module_name, $version, $success # sub MY::postinstall { return; } # the return value doesn't matter
# the above handlers must be declared before the 'use' statement use ExtUtils::AutoInstall ( -version => '0.40', # required AutoInstall version # usually 0.40 is sufficient -config => { make_args => '--hello', # option(s) for CPAN::Config force => 1, # pseudo-option to force install do_once => 1, # skip previously failed modules }, -core => [ Convert::ASN1 => '', Net::LDAP => '', mod_perl => '', ], # core modules; may also be 'all' );
WriteMakefile(
AUTHOR => 'Mark Wilcox ([EMAIL PROTECTED]) and Shannon Eric Peevey ([EMAIL PROTECTED])',
ABSTRACT => 'Apache::AuthNetLDAP -- Perl module which authenticates users via LDAP using the Net::LDAP module.'
,
NAME => 'Apache::AuthNetLDAP',
VERSION_FROM => 'AuthNetLDAP.pm',
DISTNAME => 'Apache-AuthNetLDAP',
);
I then add the necessary code inside of the .pm file to check the version of mod_perl on the machine and perform appropriately. (I hope... ;) ) This allows a module to live in both worlds, and removes the necessity of supporting two code bases. I think that this type of porting will help authors to go ahead and port their modules, expanding the mp2 module base, and alleviate fears of jumping off of a cliff and leaving mp1 behind.
Just my .02... speeves cws