@@ -472,6 +472,17 @@ if (-s "$builddir/.pbuild/_lastcheck") {
472472 }
473473}
474474
475+ # load genbuildreqs cache
476+ my %genbuildreqs ;
477+ if (-s " $builddir /.pbuild/_genbuildreqs" ) {
478+ my $oldgenbuildreqs = PBuild::Util::retrieve(" $builddir /.pbuild/_genbuildreqs" , 1) || {};
479+ for my $pkg (grep {$oldgenbuildreqs -> {$_ }} @pkgs ) {
480+ my $old = $oldgenbuildreqs -> {$pkg };
481+ my $p = $pkgsrc {$pkg };
482+ $genbuildreqs {$pkg } = $p -> {' genbuildreqs' } = $old if @$old == 3 && $old -> [2] eq ($p -> {' verifymd5' } || $p -> {' srcmd5' });
483+ }
484+ }
485+
475486# tweak package list if we're just looking at one package
476487if ($opts -> {' single' }) {
477488 my $pkg = $opts -> {' single' };
@@ -510,6 +521,7 @@ while (1) {
510521 # create and setup checker
511522 if (!$ctx ) {
512523 $ctx = PBuild::Checker::create($bconf , $myarch , $buildtype , \%pkgsrc , $builddir , $opts , $repomgr , $assetmgr );
524+ $ctx -> {' genbuildreqs' } = \%genbuildreqs ;
513525 $ctx -> {' hostarch' } = $hostarch ;
514526 $ctx -> {' bconf_host' } = $bconf_host if $cross ;
515527 print " preparing package pool\n " unless $runs ;
@@ -538,14 +550,18 @@ while (1) {
538550 if ($opts -> {' extra-packs' }) {
539551 my $pkg = $opts -> {' single' };
540552 die unless $pkg ;
541- my $code = $result -> {$pkg }-> {' code' };
542- my $details = ' ' ;
553+ my ($code , $details ) = ($result -> {$pkg }-> {' code' }, $result -> {$pkg }-> {' details' });
543554 if ($code eq ' building' ) {
544- my @building = map {$_ -> {' job' }} grep {$_ -> {' job' }} @builders ;
545- my $job = PBuild::Job::waitjob($opts , @building );
546- ($code ) = PBuild::Job::finishjob($job );
547- } else {
548- $details = " : $result ->{$pkg }->{'details'}" if $result -> {$pkg }-> {' details' };
555+ my $job = $ctx -> waitjob(\@builders );
556+ my $buildresult ;
557+ ($code , $buildresult ) = PBuild::Job::finishjob($job );
558+ $details = undef ;
559+ if ($code eq ' genbuildreqs' ) {
560+ print " $pkg : $code$details \n " ;
561+ $ctx -> set_genbuildreqs($job -> {' pdata' }, $buildresult -> {' _generated_buildreqs' });
562+ undef $ctx ;
563+ next ;
564+ }
549565 }
550566 print " $pkg : $code$details \n " ;
551567 exit PBuild::Result::has_failed_code($opts , $code );
@@ -557,10 +573,9 @@ while (1) {
557573 my $oldresult = PBuild::Util::retrieve(" $builddir /.pbuild/_result" , 1) || {};
558574 $oldresult -> {$pkg } = $result -> {$pkg };
559575 $result = $oldresult ;
560- my $code = $result -> {$pkg }-> {' code' };
576+ my ( $code , $details ) = ( $result -> {$pkg }-> {' code' }, $result -> { $pkg } -> { ' details ' }) ;
561577 if ($code ne ' failed' && $code ne ' succeeded' && $code ne ' building' ) {
562- $code .= " : $result ->{$pkg }->{'details'}" if $result -> {$pkg }-> {' details' };
563- print " $pkg : $code \n " ;
578+ print " $pkg : $code " .($details ? " ($details )" : ' ' )." \n " ;
564579 }
565580 }
566581
@@ -569,15 +584,10 @@ while (1) {
569584 PBuild::Util::store(" $builddir /.pbuild/._result.$$ " , " $builddir /.pbuild/_result" , $result );
570585 PBuild::Util::store(" $builddir /.pbuild/._lastcheck.$$ " , " $builddir /.pbuild/_lastcheck" , \%lastcheck );
571586
572- # get list of building jobs
573- my @building = map {$_ -> {' job' }} grep {$_ -> {' job' }} @builders ;
574- last unless @building ;
575-
576587 # wait for one job to finish
577- my $job = PBuild::Job::waitjob($opts , @building );
578- for (@builders ) {
579- delete $_ -> {' job' } if $_ -> {' job' } && $_ -> {' job' } == $job ;
580- }
588+ my $job = $ctx -> waitjob(\@builders );
589+ last unless $job ;
590+
581591 # process finished job
582592 my ($code , $buildresult ) = PBuild::Job::finishjob($job );
583593 my $p = $job -> {' pdata' };
@@ -596,6 +606,13 @@ while (1) {
596606 my $jobhist = PBuild::BuildResult::makejobhist($p , $code , $job -> {' readytime' }, $job -> {' starttime' }, $job -> {' endtime' }, $job -> {' reason' }, $job -> {' hostarch' });
597607 PBuild::BuildResult::addjobhist($builddir , $jobhist );
598608
609+ if ($code eq ' genbuildreqs' ) {
610+ $ctx -> set_genbuildreqs($p , $buildresult -> {' _generated_buildreqs' });
611+ # write genbuildreqs cache
612+ PBuild::Util::store(" $builddir /.pbuild/._genbuildreqs.$$ " , " $builddir /.pbuild/_genbuildreqs" , \%genbuildreqs );
613+ undef $ctx ; # we need a new checker as we have to expand again
614+ next ;
615+ }
599616 # integrate build artifacts and extra files
600617 my $bininfo = PBuild::BuildResult::integrate_job($builddir , $job , $code , $buildresult );
601618
0 commit comments