our
$VERSION
=
'0.001'
;
our
@EXPORT_OK
=
qw/
has_module whereis
get_avail_tar get_avail_patchers
get_avail_posters get_avail_sync get_avail_mailers
get_avail_w32compilers
get_avail_vms_make
/
;
our
%EXPORT_TAGS
= (
all
=> [
@EXPORT_OK
],
);
sub
has_module {
my
(
$module
) =
@_
;
{
local
$^W;
eval
"require $module"
; }
return
!$@;
}
sub
get_avail_patchers {
my
@patchers
;
foreach
my
$patcher
(
qw( gpatch npatch patch )
) {
if
(
my
$patch_bin
= whereis(
$patcher
)) {
my
$version
= `
$patch_bin
-version`;
$? or
push
@patchers
,
$patch_bin
;
}
}
return
@patchers
;
}
sub
get_avail_posters {
my
@posters
;
my
@modules
=
qw/HTTP::Tiny LWP::UserAgent/
;
for
my
$module
(
@modules
) {
push
@posters
,
$module
if
has_module(
$module
);
}
push
@posters
,
'curl'
,
if
whereis(
'curl'
);
return
@posters
;
}
sub
get_avail_sync {
my
@synctype
=
qw(copy hardlink snapshot)
;
unshift
@synctype
,
'rsync'
if
whereis(
'rsync'
);
unshift
@synctype
,
'git'
if
whereis(
'git'
);
return
@synctype
;
}
sub
get_avail_tar {
my
$use_modules
= 0;
my
$has_archive_tar
= has_module(
'Archive::Tar'
);
if
(
$has_archive_tar
) {
if
(
eval
"$Archive::Tar::VERSION"
>= 0.99 ) {
$use_modules
= has_module(
'IO::Zlib'
);
}
else
{
$use_modules
= has_module(
'Compress::Zlib'
);
}
}
my
$fmt
= tar_fmt();
return
$fmt
&&
$use_modules
? (
$fmt
,
'Archive::Tar'
)
:
$fmt
? (
$fmt
) :
$use_modules
? (
'Archive::Tar'
) : ();
}
sub
tar_fmt {
my
$tar
= whereis(
'tar'
);
my
$gzip
= whereis(
'gzip'
);
return
$tar
&&
$gzip
?
"$gzip -cd %s | $tar -xf -"
:
$tar
?
"tar -xzf %s"
:
""
;
}
sub
get_avail_mailers {
my
%map
;
for
my
$mailer
(
qw/mail mailx sendmail sendemail/
) {
local
$ENV
{PATH} =
"$ENV{PATH}$Config{path_sep}/usr/sbin"
;
if
(
my
$mailer_bin
= whereis(
$mailer
)) {
$map
{
$mailer
} =
$mailer_bin
;
}
}
for
my
$module
(
qw/Mail::Sendmail MIME::Lite/
) {
$map
{
$module
} =
$module
if
has_module(
$module
);
}
return
%map
;
}
sub
get_avail_w32compilers {
my
%map
= (
MSVC
=> {
ccname
=>
'cl'
,
maker
=> [
'nmake'
] },
BCC
=> {
ccname
=>
'bcc32'
,
maker
=> [
'dmake'
] },
GCC
=> {
ccname
=>
'gcc'
,
maker
=> [
'dmake'
,
'gmake'
] },
);
my
$CC
=
'MSVC'
;
if
(
$map
{
$CC
}->{ccbin} = whereis(
$map
{
$CC
}->{ccname} ) ) {
my
$output
=`
$map
{
$CC
}->{ccbin} --version 2>&1`;
my
$ccvers
=
$output
=~ /^.
*Version
\s+([\d.]+)/ ? $1 :
'?'
;
$map
{
$CC
}->{ccversarg} =
"ccversion=$ccvers"
;
my
$mainvers
=
$ccvers
=~ /^(\d+)/ ? $1 : 1;
$map
{
$CC
}->{CCTYPE} =
$mainvers
< 12 ?
'MSVC'
:
'MSVC60'
;
}
$CC
=
'BCC'
;
if
(
$map
{
$CC
}->{ccbin} = whereis(
$map
{
$CC
}->{ccname} ) ) {
my
$output
= `
$map
{
$CC
}->{ccbin} --version 2>&1`;
my
$ccvers
=
$output
=~ /([\d.]+)/ ? $1 :
'?'
;
$map
{
$CC
}->{ccversarg} =
"ccversion=$ccvers"
;
$map
{
$CC
}->{CCTYPE} =
'BORLAND'
;
}
$CC
=
'GCC'
;
if
(
$map
{
$CC
}->{ccbin} = whereis(
$map
{
$CC
}->{ccname} ) ) {
local
*STDERR
;
open
STDERR,
">&STDOUT"
;
select
( (
select
( STDERR ), $|++ )[0] );
my
$output
= `
$map
{
$CC
}->{ccbin} --version`;
my
$ccvers
=
$output
=~ /(\d+.*)/ ? $1 :
'?'
;
$ccvers
=~ s/\s+copyright.*//i;
$map
{
$CC
}->{ccversarg} =
"gccversion=$ccvers"
;
$map
{
$CC
}->{CCTYPE} =
$CC
}
return
map
{
(
$map
{
$_
}->{CCTYPE} =>
$map
{
$_
} )
}
grep
length
$map
{
$_
}->{ccbin} =>
keys
%map
;
}
sub
get_avail_vms_make {
return
map
+(
$_
=>
undef
) =>
grep
defined
$_
&&
length
(
$_
)
=>
map
whereis(
$_
) =>
qw( MMK MMS )
;
local
*QXERR
;
open
*QXERR
,
">&STDERR"
;
close
STDERR;
my
%makers
=
map
{
my
$maker
=
$_
;
map
+(
$maker
=> /V([\d.-]+)/ ? $1 :
''
)
=>
grep
/\b
$maker
\b/ && /V[\d.-]+/ =>
qx($maker/IDENT)
}
qw( MMK MMS )
;
open
STDERR,
">&QXERR"
;
close
QXERR;
return
%makers
;
}
1;