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
