our
$VERSION
=
"0.09"
;
sub
import
{
my
$class
=
shift
;
my
$orig
= \
&ExtUtils::MakeMaker::WriteMakefile
;
my
$writer
=
sub
{
my
%params
=
@_
;
my
(
$caller
,
$file
,
$line
) =
caller
;
(
my
$root
= rel2abs(
$file
)) =~ s/Makefile\.PL$//i or
return
;
if
(
my
$file
=
eval
{ Module::CPANfile->load(catfile(
$root
,
"cpanfile"
)) }) {
my
$prereqs
=
$file
->prereqs;
_merge(
\
%params
,
_get(
$prereqs
,
'runtime'
,
'requires'
),
'PREREQ_PM'
,
);
_merge(
\
%params
,
_get(
$prereqs
,
'build'
,
'requires'
),
_eumm(
'6.56'
) ?
'BUILD_REQUIRES'
:
'PREREQ_PM'
,
);
_merge(
\
%params
,
_get(
$prereqs
,
'test'
,
'requires'
),
_eumm(
'6.63_03'
) ?
'TEST_REQUIRES'
:
_eumm(
'6.56'
) ?
'BUILD_REQUIRES'
:
'PREREQ_PM'
,
);
_merge(
\
%params
,
_get(
$prereqs
,
'configure'
,
'requires'
),
_eumm(
'6.52'
) ?
'CONFIGURE_REQUIRES'
:
undef
,
);
_merge(
\
%params
,
{
'ExtUtils::MakeMaker::CPANfile'
=>
$VERSION
},
_eumm(
'6.52'
) ?
'CONFIGURE_REQUIRES'
:
undef
,
);
if
(!
exists
$params
{META_ADD}{dynamic_config} &&
!
exists
$params
{META_MERGE}{dynamic_config}) {
$params
{META_MERGE}{dynamic_config} = 0;
}
my
$requires_2_0
;
for
my
$type
(
qw/recommends suggests conflicts/
) {
for
my
$phase
(
qw/configure build test runtime develop/
) {
my
%tmp
= %{
$params
{META_MERGE}{prereqs}{
$phase
} || {}};
_merge(
\
%tmp
,
_get(
$prereqs
,
$phase
,
$type
),
$type
,
);
if
(
$tmp
{
$type
}) {
$params
{META_MERGE}{prereqs}{
$phase
} = \
%tmp
;
$requires_2_0
= 1;
}
}
}
if
(
$requires_2_0
) {
my
$tmp_prereqs
=
delete
$params
{META_MERGE}{prereqs};
for
my
$key
(
qw/META_ADD META_MERGE/
) {
next
unless
%{
$params
{
$key
} || {}};
my
$converter
= CPAN::Meta::Converter->new(
$params
{
$key
},
default_version
=> 1.4);
$params
{
$key
} =
$converter
->upgrade_fragment;
}
if
(
$params
{META_MERGE}{prereqs}) {
for
my
$phase
(
keys
%{
$tmp_prereqs
|| {}}) {
for
my
$rel
(
keys
%{
$tmp_prereqs
->{
$phase
} || {}}) {
my
$req1
= CPAN::Meta::Requirements->from_string_hash(
$tmp_prereqs
->{
$phase
}{
$rel
});
my
$req2
= CPAN::Meta::Requirements->from_string_hash(
$params
{META_MERGE}{prereqs}{
$phase
}{
$rel
});
$req1
->add_requirements(
$req2
);
$params
{META_MERGE}{prereqs}{
$phase
} =
$req1
->as_string_hash;
}
}
}
else
{
$params
{META_MERGE}{prereqs} =
$tmp_prereqs
;
}
}
{
last
if
_eumm(
'6.66_03'
);
if
(
my
$r
=
delete
$params
{TEST_REQUIRES}) {
_merge(\
%params
,
$r
,
'BUILD_REQUIRES'
);
}
last
if
_eumm(
'6.56'
);
if
(
my
$r
=
delete
$params
{BUILD_REQUIRES}) {
_merge(\
%params
,
$r
,
'PREREQ_PM'
);
}
last
if
_eumm(
'6.52'
);
delete
$params
{CONFIGURE_REQUIRES};
last
if
_eumm(
'6.47_01'
);
delete
$params
{MIN_PERL_VERSION};
last
if
_eumm(
'6.45_01'
);
delete
$params
{META_ADD};
delete
$params
{META_MERGE};
last
if
_eumm(
'6.30_01'
);
delete
$params
{LICENSE};
}
}
else
{
print
"cpanfile is not available: $@\n"
;
exit
0;
}
$orig
->(
%params
);
};
{
no
warnings
'redefine'
;
*main::WriteMakefile
=
*ExtUtils::MakeMaker::WriteMakefile
=
$writer
;
}
}
sub
_eumm {
my
$version
=
shift
;
eval
{ ExtUtils::MakeMaker->VERSION(
$version
) } ? 1 : 0;
}
sub
_get {
my
$prereqs
=
shift
;
eval
{
$prereqs
->requirements_for(
@_
)->as_string_hash };
}
sub
_merge {
my
(
$params
,
$requires
,
$key
) =
@_
;
return
unless
$key
;
for
(
keys
%{
$requires
|| {}}) {
my
$version
= _normalize_version(
$requires
->{
$_
});
next
unless
defined
$version
;
if
(not
exists
$params
->{
$key
}{
$_
}) {
$params
->{
$key
}{
$_
} =
$version
;
}
else
{
my
$prev
=
$params
->{
$key
}{
$_
};
if
(version->parse(
$prev
) < version->parse(
$version
)) {
$params
->{
$key
}{
$_
} =
$version
;
}
}
}
}
sub
_normalize_version {
my
$version
=
shift
;
return
unless
defined
$version
;
return
$version
unless
$version
=~ /\s/;
$version
=~ s/(?:>=|==)\s*//;
$version
=~ s/,.+$//;
return
$version
unless
$version
=~ /\s/;
return
;
}
1;