diff --git a/infrastructure/bin/dpb b/infrastructure/bin/dpb index 9c0a3818a4a..16c2c62cd4f 100755 --- a/infrastructure/bin/dpb +++ b/infrastructure/bin/dpb @@ -1,7 +1,7 @@ #! /usr/bin/perl # ex:ts=8 sw=4: -# $OpenBSD: dpb,v 1.28 2011/11/09 08:28:55 espie Exp $ +# $OpenBSD: dpb,v 1.29 2011/11/14 21:57:47 espie Exp $ # # Copyright (c) 2010 Marc Espie # @@ -55,6 +55,7 @@ sub init sub handle_options { my $state = shift; + $state->{dontclean} = {}; $state->{opt} = { a => sub { $state->{all} = 1; @@ -81,6 +82,29 @@ sub handle_options push @main::ARGV, $_; } }, + I => sub { + my $file = shift; + open my $fh, '<', $file or die "Can't open $file\n"; + my $_; + while (<$fh>) { + chomp; + next if m/^\#/; + my $p = DPB::PkgPath->new($_); + $p->{wantinstall} = 1; + push @main::ARGV, $_; + } + }, + C => sub { + my $file = shift; + open my $fh, '<', $file or die "Can't open $file\n"; + my $_; + while (<$fh>) { + chomp; + next if m/^\#/; + s/\,.*//; + $state->{dontclean}{$_} = 1; + } + }, b => sub { push(@{$state->{build_files}}, shift); }, @@ -89,9 +113,10 @@ sub handle_options }, }; - $state->SUPER::handle_options('acCeqrRstuUvh:xA:f:F:j:m:P:b:L:S:', - "[-acCerRsuUvx] [-A arch] [-f N] [-F N][-j N] [-P plist] [-h hosts]", - "[-L logdir] [-b log] [-t ctimeout] [-m threshold] [path ...]"); + $state->SUPER::handle_options('aceqrRstuUvh:xA:C:f:F:I:j:m:P:b:L:S:', + "[-acerRsuUvx] [-A arch] [-C plist] [-f N] [-F N] [-I plist] [-j N]", + "[-P plist] [-h hosts] [-L logdir] [-b log] [-t ctimeout] [-m threshold]", + "[path ...]"); $state->{fullrepo} = join("/", $state->{repo}, $state->arch, "all"); $state->{logdir} //= $ENV{LOGDIR} // join("/", $state->ports, "logs", $state->arch); diff --git a/infrastructure/lib/DPB/Engine.pm b/infrastructure/lib/DPB/Engine.pm index 9526c262d53..bfefd991d33 100644 --- a/infrastructure/lib/DPB/Engine.pm +++ b/infrastructure/lib/DPB/Engine.pm @@ -1,5 +1,5 @@ # ex:ts=8 sw=4: -# $OpenBSD: Engine.pm,v 1.35 2011/11/13 22:18:04 espie Exp $ +# $OpenBSD: Engine.pm,v 1.36 2011/11/14 21:57:47 espie Exp $ # # Copyright (c) 2010 Marc Espie # @@ -78,6 +78,11 @@ sub already_done { } +sub start_install +{ + return 0; +} + sub start { my $self = shift; @@ -86,6 +91,9 @@ sub start $self->{engine}->rebuild_info($core); return; } + if ($self->start_install($core)) { + return $core; + } my $o = $self->sorted($core); while (my $v = $o->next) { $self->remove($v); @@ -153,9 +161,34 @@ sub new my ($class, $engine, $builder) = @_; my $o = $class->SUPER::new($engine); $o->{builder} = $builder; + $o->{toinstall} = []; return $o; } +sub will_install +{ + my ($self, $v) = @_; + push(@{$self->{toinstall}}, $v); +} + +sub start_install +{ + my ($self, $core) = @_; + return 0 unless $core->is_local; + if (my $v = pop @{$self->{toinstall}}) { + $self->{builder}->install($v, $core); + return 1; + } else { + return 0; + } +} + +sub non_empty +{ + my $self = shift; + return $self->SUPER::non_empty || @{$self->{toinstall}} > 0; +} + sub new_queue { my ($class, $engine) = @_; @@ -480,6 +513,9 @@ sub check_buildable if ($self->adjust($v, 'RDEPENDS') == 0) { delete $self->{built}{$v}; $self->{installable}{$v} = $v; + if ($v->{wantinstall}) { + $self->{buildable}->will_install($v); + } $self->log_no_ts('I', $v); $changes++; } elsif (my $d = $self->should_ignore($v, diff --git a/infrastructure/lib/DPB/Job/Port.pm b/infrastructure/lib/DPB/Job/Port.pm index 52c5d854770..e97093b7dd1 100644 --- a/infrastructure/lib/DPB/Job/Port.pm +++ b/infrastructure/lib/DPB/Job/Port.pm @@ -1,5 +1,5 @@ # ex:ts=8 sw=4: -# $OpenBSD: Port.pm,v 1.15 2011/11/12 13:19:26 espie Exp $ +# $OpenBSD: Port.pm,v 1.16 2011/11/14 21:57:47 espie Exp $ # # Copyright (c) 2010 Marc Espie # @@ -195,6 +195,39 @@ sub finalize return 1; } +package DPB::Task::Port::Install; +our @ISA=qw(DPB::Task::Port::NoTime); + +sub run +{ + my ($self, $core) = @_; + my $job = $core->job; + my $v = $job->{v}; + + my $sudo = OpenBSD::Paths->sudo; + $self->redirect($job->{log}); + my @cmd = ('/usr/sbin/pkg_add'); + if ($job->{builder}->{update}) { + push(@cmd, "-rqU", "-Dupdate", "-Dupdatedepends"); + } + if ($job->{builder}->{forceupdate}) { + push(@cmd, "-Dinstalled"); + } + print join(' ', @cmd, $v->fullpkgname, "\n"); + my $path = $job->{builder}->{fullrepo}.'/'; + $ENV{PKG_PATH} = $path; + exec{$sudo}($sudo, @cmd, $v->fullpkgname); + exit(1); +} + +sub finalize +{ + my ($self, $core) = @_; + $self->SUPER::finalize($core); + $core->{status} = 0; + return 1; +} + package DPB::Task::Port::ShowSize; our @ISA = qw(DPB::Task::Port); @@ -330,14 +363,14 @@ sub new push(@{$job->{tasks}}, DPB::Task::Port::Signature->new('signature')); } else { - $job->add_normal_tasks; + $job->add_normal_tasks($builder->{dontclean}{$v->pkgpath}); } return $job; } sub add_normal_tasks { - my $self = shift; + my ($self, $dontclean) = @_; my @todo; my $builder = $self->{builder}; @@ -358,7 +391,7 @@ sub add_normal_tasks if ($builder->{size}) { push @todo, 'show-fake-size'; } - if (!$builder->{dontclean}) { + if (!$dontclean) { push @todo, 'clean'; } $self->add_tasks(map {DPB::Port::TaskFactory->create($_)} @todo); @@ -485,5 +518,23 @@ sub really_watch } return 0; } + +package DPB::Job::Port::Install; +our @ISA = qw(DPB::Job::Port); + +sub new +{ + my ($class, $log, $v, $builder, $e) = @_; + my $job = bless { + tasks => [], + log => $log, v => $v, + builder => $builder, endcode => $e}, + $class; + + push(@{$job->{tasks}}, + DPB::Task::Port::Install->new('install')); + return $job; +} + 1; diff --git a/infrastructure/lib/DPB/PortBuilder.pm b/infrastructure/lib/DPB/PortBuilder.pm index 17fda8acfb9..2dd4ca3c5d0 100644 --- a/infrastructure/lib/DPB/PortBuilder.pm +++ b/infrastructure/lib/DPB/PortBuilder.pm @@ -1,5 +1,5 @@ # ex:ts=8 sw=4: -# $OpenBSD: PortBuilder.pm,v 1.13 2011/11/12 13:19:26 espie Exp $ +# $OpenBSD: PortBuilder.pm,v 1.14 2011/11/14 21:57:47 espie Exp $ # # Copyright (c) 2010 Marc Espie # @@ -31,7 +31,7 @@ sub new my $self = bless { state => $state, clean => $state->opt('c'), - dontclean => $state->opt('C'), + dontclean => $state->{dontclean}, fetch => $state->opt('f'), size => $state->opt('s'), rebuild => $state->opt('R'), @@ -180,4 +180,14 @@ sub build return $core; } +sub install +{ + my ($self, $v, $core) = @_; + my $log = $self->{logger}->make_logs($v); + my $job = DPB::Job::Port::Install->new($log, $v, $self, + sub {$core->mark_ready; }); + $core->start_job($job, $v); + return $core; +} + 1; diff --git a/infrastructure/man/man1/dpb.1 b/infrastructure/man/man1/dpb.1 index 7cca290318e..b30628effd0 100644 --- a/infrastructure/man/man1/dpb.1 +++ b/infrastructure/man/man1/dpb.1 @@ -1,4 +1,4 @@ -.\" $OpenBSD: dpb.1,v 1.17 2011/11/06 15:42:39 espie Exp $ +.\" $OpenBSD: dpb.1,v 1.18 2011/11/14 21:57:47 espie Exp $ .\" .\" Copyright (c) 2010 Marc Espie .\" @@ -14,7 +14,7 @@ .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. .\" -.Dd $Mdocdate: November 6 2011 $ +.Dd $Mdocdate: November 14 2011 $ .Dt DPB 1 .Os .Sh NAME @@ -23,12 +23,14 @@ .Sh SYNOPSIS .Nm dpb .Bk -words -.Op Fl acCeqrRsuUx +.Op Fl aceqrRsuUx .Op Fl A Ar arch .Op Fl b Ar logfile +.Op Fl C Ar pathlist .Op Fl D Ar PARAM Ns = Ns Ar value .Op Fl f Ar m .Op Fl h Ar hosts +.Op Fl I Ar subdirlist .Op Fl j Ar n .Op Fl L Ar logdir .Op Fl m Ar threshold @@ -72,9 +74,10 @@ Prime the heuristics module with a previous build log, so that packages that take a long time to build will happen earlier. .It Fl c Clean port working directory and log before each build. -.It Fl C -Don't clean port working directory after build. -Warning: requires insane amounts of diskspace for a full build. +.It Fl C Ar pathlist +Don't clean port working directories after build. +Use a list of simple pkgpaths, as this does not take multi and flavors into +account. .It Fl D Ar PARAM Ns = Ns Ar value Set defined parameter to value. Known parameters are as follows: @@ -151,6 +154,9 @@ file can also define a start-up script, as STARTUP=path .Ed which will be run at start-up on each machine. +.It Fl I Ar subdirlist +List of pkgpaths to install, on the local box. +This will also add them to the list of things to build. .It Fl j Ar n Number of concurrent local jobs to run (defaults to hw.ncpu if no hosts file). .It Fl L Ar logdir