sub
new {
my
(
$class
,
%option
) =
@_
;
my
$home
=
$option
{home};
my
$logger
=
$option
{logger} || App::cpm::Logger::File->new(
"$home/build.log.@{[time]}"
);
my
$prebuilt_base
;
if
(
$option
{prebuilt}) {
$prebuilt_base
=
$class
->prebuilt_base(
$home
);
File::Path::mkpath(
$prebuilt_base
)
if
!-d
$prebuilt_base
;
my
$file
=
"$prebuilt_base/version"
;
if
(!-f
$file
) {
open
my
$fh
,
">"
,
$file
or
die
"$file: $!"
;
print
{
$fh
}
"$Config{perlpath}\n"
;
}
}
%option
= (
%option
,
logger
=>
$logger
,
base
=>
"$home/work/"
.
time
.
".$$"
,
cache
=>
"$home/cache"
,
$prebuilt_base
? (
prebuilt_base
=>
$prebuilt_base
) : (),
);
my
$installer
= App::cpm::Worker::Installer->new(
%option
);
my
$resolver
= App::cpm::Worker::Resolver->new(
%option
,
impl
=>
$option
{resolver});
bless
{
%option
,
installer
=>
$installer
,
resolver
=>
$resolver
},
$class
;
}
sub
prebuilt_base {
my
(
$class
,
$home
) =
@_
;
my
$identity
= App::cpm::Util::perl_identity;
File::Spec->catdir(
$home
,
"builds"
,
$identity
);
}
sub
work {
my
(
$self
,
$task
) =
@_
;
my
$type
=
$task
->{type} ||
"(undef)"
;
my
$result
;
my
$start
=
$self
->{verbose} ? [gettimeofday] :
undef
;
if
(
grep
{
$type
eq
$_
}
qw(fetch configure install)
) {
$result
=
eval
{
$self
->{installer}->work(
$task
) };
warn
$@
if
$@;
}
elsif
(
$type
eq
"resolve"
) {
$result
=
eval
{
$self
->{resolver}->work(
$task
) };
warn
$@
if
$@;
}
else
{
die
"Unknown type: $type\n"
;
}
my
$elapsed
=
$start
? tv_interval(
$start
) :
undef
;
$result
||= {
ok
=> 0 };
$task
->merge({
%$result
,
pid
=> $$,
elapsed
=>
$elapsed
});
return
$task
;
}
1;