our
@ISA
=
qw(Exporter)
;
our
$Is_VMS
= $^O eq
'VMS'
;
our
$Is_MacOS
= $^O eq
'MacOS'
;
our
$Is_FreeBSD
= $^O eq
'freebsd'
;
our
@EXPORT
=
qw(which_perl perl_lib makefile_name makefile_backup
make make_run run make_macro calibrate_mtime
have_compiler slurp write_file
$Is_VMS $Is_MacOS
run_ok
hash2files
in_dir
)
;
{
my
@delete_env_keys
=
qw(
PERL_MM_OPT
PERL_MM_USE_DEFAULT
HARNESS_TIMER
HARNESS_OPTIONS
HARNESS_VERBOSE
PREFIX
MAKEFLAGS
PERL_INSTALL_QUIET
)
;
my
%default_env_keys
;
$default_env_keys
{PORTOBJFORMAT} = 1
if
$Is_FreeBSD
;
$default_env_keys
{ACTIVEPERL_CONFIG_SILENT} = 1;
my
%restore_env_keys
;
sub
clean_env {
for
my
$key
(
keys
%default_env_keys
) {
$ENV
{
$key
} =
$default_env_keys
{
$key
}
unless
$ENV
{
$key
};
}
for
my
$key
(
@delete_env_keys
) {
if
(
exists
$ENV
{
$key
} ) {
$restore_env_keys
{
$key
} =
delete
$ENV
{
$key
};
}
else
{
delete
$ENV
{
$key
};
}
}
}
END {
while
(
my
(
$key
,
$val
) =
each
%restore_env_keys
) {
$ENV
{
$key
} =
$val
;
}
}
}
clean_env();
sub
which_perl {
my
$perl
= $^X;
$perl
||=
'perl'
;
return
$perl
if
$Is_VMS
;
$perl
.=
$Config
{exe_ext}
unless
$perl
=~ m/
$Config
{exe_ext}$/i;
my
$perlpath
= File::Spec->rel2abs(
$perl
);
unless
(
$Is_MacOS
|| -x
$perlpath
) {
die
"Can't find a perl to use (\$^X=$^X), (\$perlpath=$perlpath)"
if
$ENV
{PERL_CORE};
foreach
my
$path
(File::Spec->path) {
$perlpath
= File::Spec->catfile(
$path
,
$perl
);
last
if
-x
$perlpath
;
}
}
$perlpath
=
qq{"$perlpath"}
;
return
$perlpath
;
}
my
$old5lib
=
$ENV
{PERL5LIB};
my
$had5lib
=
exists
$ENV
{PERL5LIB};
sub
perl_lib {
my
$basecwd
= (File::Spec->splitdir(getcwd))[-1];
croak
"Basename of cwd needs to be 't' but is '$basecwd'\n"
unless
$basecwd
eq
't'
;
my
$lib
=
$ENV
{PERL_CORE} ?
qq{../lib}
:
qq{../blib/lib}
;
$lib
= File::Spec->rel2abs(
$lib
);
my
@libs
= (
$lib
);
push
@libs
,
$ENV
{PERL5LIB}
if
exists
$ENV
{PERL5LIB};
$ENV
{PERL5LIB} =
join
(
$Config
{path_sep},
@libs
);
unshift
@INC
,
$lib
;
}
END {
if
(
$had5lib
) {
$ENV
{PERL5LIB} =
$old5lib
;
}
else
{
delete
$ENV
{PERL5LIB};
}
}
sub
makefile_name {
return
$Is_VMS
?
'Descrip.MMS'
:
'Makefile'
;
}
sub
makefile_backup {
my
$makefile
= makefile_name;
return
$Is_VMS
?
"$makefile"
.
'_old'
:
"$makefile.old"
;
}
sub
make {
my
$make
=
$Config
{make};
$make
=
$ENV
{MAKE}
if
exists
$ENV
{MAKE};
return
$Is_VMS
?
$make
:
qq{"$make"}
;
}
sub
make_run {
my
$make
= make;
$make
.=
' -nologo'
if
$make
eq
'nmake'
;
return
$make
;
}
sub
make_macro {
my
(
$make
,
$target
) = (
shift
,
shift
);
my
$is_mms
=
$make
=~ /^MM(K|S)/i;
my
@macros
;
while
(
my
(
$key
,
$val
) =
splice
(
@_
, 0, 2) ) {
push
@macros
,
qq{$key=$val}
;
}
my
$macros
=
''
;
if
(
scalar
(
@macros
)) {
if
(
$is_mms
) {
map
{
$_
=
qq{"$_"}
}
@macros
;
$macros
=
'/MACRO=('
.
join
(
','
,
@macros
) .
')'
;
}
else
{
$macros
=
join
(
' '
,
@macros
);
}
}
return
$is_mms
?
"$make$macros $target"
:
"$make $target $macros"
;
}
sub
calibrate_mtime {
my
$file
=
"calibrate_mtime-$$.tmp"
;
open
(FILE,
">$file"
) ||
die
$!;
print
FILE
"foo"
;
close
FILE;
my
(
$mtime
) = (
stat
(
$file
))[9];
unlink
$file
;
return
$mtime
;
}
sub
run {
my
$cmd
=
shift
;
if
(MM->can_redirect_error) {
return
`
$cmd
2>&1`;
}
else
{
return
`
$cmd
`;
}
}
sub
run_ok {
my
$tb
= Test::Builder->new;
my
@out
= run(
@_
);
$tb
->cmp_ok( $?,
'=='
, 0,
"run(@_)"
) ||
$tb
->diag(
@out
);
return
wantarray
?
@out
:
join
""
,
@out
;
}
sub
have_compiler {
return
1
if
$ENV
{PERL_CORE};
my
$have_compiler
= 0;
in_dir(
sub
{
eval
{
my
$cb
= ExtUtils::CBuilder->new(
quiet
=>1);
$have_compiler
=
$cb
->have_compiler;
};
});
return
$have_compiler
;
}
sub
slurp {
my
$filename
=
shift
;
local
$/ =
undef
;
open
my
$fh
,
$filename
or
die
"Can't open $filename for reading: $!"
;
my
$text
= <
$fh
>;
close
$fh
;
return
$text
;
}
sub
write_file {
my
(
$file
,
@contents
) =
@_
;
my
$utf8
= (
"$]"
< 5.008 or !
$Config
{useperlio}) ?
""
:
":utf8"
;
open
my
$fh
,
">$utf8"
,
$file
or
die
"Can't create $file: $!"
;
print
$fh
@contents
or
die
"Can't write to $file: $!"
;
close
$fh
or
die
"Can't close $file: $!"
;
}
sub
hash2files {
my
(
$prefix
,
$hashref
) =
@_
;
while
(
my
(
$file
,
$text
) =
each
%$hashref
) {
$file
= File::Spec->catfile(File::Spec->curdir,
$prefix
,
split
m{\/},
$file
);
my
$dir
= dirname(
$file
);
mkpath
$dir
;
write_file(
$file
,
$text
);
my
$time
= calibrate_mtime();
utime
$time
,
$time
- 1,
$file
;
}
}
sub
in_dir(&;$) {
my
$code
=
shift
;
my
$dir
=
shift
|| File::Temp::tempdir(
TMPDIR
=> 1,
CLEANUP
=> 1);
my
$orig_dir
= getcwd();
chdir
$dir
or
die
"Can't chdir to $dir: $!"
;
my
$return
;
my
$ok
=
eval
{
$return
=
$code
->(); 1; };
my
$err
= $@;
chdir
$orig_dir
or
die
"Can't chdir to $orig_dir: $!"
;
die
$err
unless
$ok
;
return
$return
;
}
1;