# New Ticket Created by Kevin Tew # Please include the string: [perl #39808] # in the subject line of all future correspondence about this issue. # <URL: http://rt.perl.org/rt3/Ticket/Display.html?id=39808 >
example: perl Configure --step=gen::languages Configure.pl | 12 +++ lib/Parrot/Configure.pm | 135 +++++++++++++++++++++++++++---------------- lib/Parrot/Configure/Data.pm | 20 ++++++ 3 files changed, 116 insertions(+), 51 deletions(-)
Index: lib/Parrot/Configure/Data.pm =================================================================== --- lib/Parrot/Configure/Data.pm (revision 13269) +++ lib/Parrot/Configure/Data.pm (working copy) @@ -171,6 +171,26 @@ return keys %{$self->{c}}; } +=item C<slurp()> + +Slurps in Parrot::Config data from previous configure. + +Accepts no arguments. + +=cut + +sub slurp() +{ + my $self = shift; + + my $res = eval { + use Parrot::Config; + \%PConfig + }; + + $self->{c} = $res; +} + =item C<dump()> Provides a L<Data::Dumper> serialized string of the objects key/value pairs Index: lib/Parrot/Configure.pm =================================================================== --- lib/Parrot/Configure.pm (revision 13269) +++ lib/Parrot/Configure.pm (working copy) @@ -197,74 +197,111 @@ my $n = 0; # step number foreach my $task ($self->steps) { - my $step_name = $task->step; - my @step_params = @{$task->params}; - $n++; + $self->_runstep($task, $verbose_step, $ask, $n); + } + return $self; +} - eval "use $step_name;"; - die $@ if $@; +=item * C<runstep()> - my $step = $step_name->new; +The invoking +L<Parrot::Configure> object is passed as the first argument to each steps +C<runstep()> method followed by any parameters that were registered for that +step. - # XXX This works. but is probably not a good design. - # Using $step->description() would be nicer - my $description = $step->description(); - $description = "" unless defined $description; +Accepts no arguments and returns a L<Parrot::Configure> object. - # set per step verbosity - if (defined $verbose_step) { +=cut - # by step number - if ($verbose_step =~ /^\d+$/ && $n == $verbose_step) { - $self->options->set(verbose => 2); - } - # by description - elsif ($description =~ /$verbose_step/) { - $self->options->set(verbose => 2); - } +sub runstep +{ + my $self = shift; + my $taskname = shift; + + my ($verbose, $verbose_step, $ask) = + $self->options->get(qw(verbose verbose-step ask)); + + for my $task ($self->steps()) { + if ( $task->{"Parrot::Configure::Task::step"} eq $taskname ) { + print "$taskname\n"; + $self->_runstep($task, $verbose, $verbose_step, $ask, 1); } + } +} - # XXX cc_build uses this verbose setting, why? - $self->data->set(verbose => $verbose) if $n > 2; +sub _runstep +{ + my $self = shift; + my $task = shift; - print "\n", $description, '...'; - print "\n" if $verbose && $verbose == 2; + my ($verbose, $verbose_step, $ask, $n) = @_; - my $ret; # step return value - eval { - if (@step_params) { - $ret = $step->runstep($self, @step_params); - } else { - $ret = $step->runstep($self); - } - }; - if ($@) { - carp "\nstep $step_name died during execution: [EMAIL PROTECTED]"; - return; + my $step_name = $task->step; + my @step_params = @{$task->params}; + + + eval "use $step_name;"; + die $@ if $@; + + my $step = $step_name->new; + + # XXX This works. but is probably not a good design. + # Using $step->description() would be nicer + my $description = $step->description(); + $description = "" unless defined $description; + + # set per step verbosity + if (defined $verbose_step) { + + # by step number + if ($verbose_step =~ /^\d+$/ && $n == $verbose_step) { + $self->options->set(verbose => 2); } - # did the step return itself? - eval { $ret->can('result'); }; - # if not, report the result and return - if ($@) { - my $result = $step->result || 'no result returned'; - carp "\nstep $step_name failed: " . $result; - return; + # by description + elsif ($description =~ /$verbose_step/) { + $self->options->set(verbose => 2); } + } - my $result = $step->result || 'done'; + # XXX cc_build uses this verbose setting, why? + $self->data->set(verbose => $verbose) if $n > 2; - print "..." if $verbose && $verbose == 2; - print "." x (71 - length($description) - length($result)); - print "$result." unless $step =~ m{^inter/} && $ask; + print "\n", $description, '...'; + print "\n" if $verbose && $verbose == 2; - # reset verbose value for the next step - $self->options->set(verbose => $verbose); + my $ret; # step return value + eval { + if (@step_params) { + $ret = $step->runstep($self, @step_params); + } else { + $ret = $step->runstep($self); + } + }; + if ($@) { + carp "\nstep $step_name died during execution: [EMAIL PROTECTED]"; + return; } - return $self; + # did the step return itself? + eval { $ret->can('result'); }; + # if not, report the result and return + if ($@) { + my $result = $step->result || 'no result returned'; + carp "\nstep $step_name failed: " . $result; + return; + } + + my $result = $step->result || 'done'; + + print "..." if $verbose && $verbose == 2; + print "." x (71 - length($description) - length($result)); + print "$result." unless $step =~ m{^inter/} && $ask; + + # reset verbose value for the next step + $self->options->set(verbose => $verbose); } =back Index: Configure.pl =================================================================== --- Configure.pl (revision 13269) +++ Configure.pl (working copy) @@ -440,9 +445,17 @@ } $conf->add_steps(@steps); $conf->options->set(%args); -# Run the actual steps -$conf->runsteps or exit(1); +if ( exists $args{step} ) { + $conf->data()->slurp(); + $conf->runstep($args{step}); + exit(0); +} +else { + # Run the actual steps + $conf->runsteps or exit(1); +} + # tell users what to do next my $make = $conf->data->get('make');