Hi Roger,

On Thu, Oct 02, 2008 at 12:36:34AM +0100, Roger Leigh wrote:
> OK.  I think calling external scripts here would be a good idea.  We
> could use run-parts to run all the scripts in e.g. /etc/sbuild/setup.d,
> for example, in a similar manner to the schroot setup scripts, but with
> all of the relevant sbuild state exported in the environment.  This
> would make it trivially extensible by users and other packages.

I'm finally getting back to looking at this.  It does seem likely that
system-wide setup scripts could be good, but I'm not sure the specific
use-case I'm after would really be done here (for example, I don't want to
do this for Debian builds, only Ubuntu builds).  It doesn't seem right to
make those choices in /etc/sbuild/setup.d/something is the right place --
i.e. it should really be up to the sbuild invoker.

> Agreed.  If you haven't already, you might be interested in looking at
> the current sbuild in git:
> 
>   git://git.debian.org/git/buildd-tools/sbuild.git
> 
> Here, the main build state, configuration, chroot information etc. have
> all been object-oriented using perl objects.  We can easily write a few
> lines of perl to dump the object state into the environment so scripts
> can access it.  This would only be possible for scalar and perhaps array
> values realistically, but it would give you all you need to do what you
> want.

Where should this happen?  My particular use-case seems to need details
from both $build and $options.  Should exec_command export all of those
values into the environment in addition to the stuff listed in
Defaults->ENV?  SBUILD_BUILD_...  and SBUILD_OPTION_...  ?

I've updated the patch (untested...) to use all the new calling conventions
in git, just for reference...

Thanks!

-Kees

-- 
Kees Cook                                            @debian.org
diff --git a/bin/sbuild b/bin/sbuild
index 98752ce..9d829d1 100755
--- a/bin/sbuild
+++ b/bin/sbuild
@@ -218,6 +218,26 @@ sub main () {
 	    goto cleanup_close;
 	}
 
+	# Setup command
+	if ($conf->get('SETUP_SCRIPT')) {
+            my $pipe = $session->pipe_command({
+		COMMAND => [$conf->get('SETUP_SCRIPT'),
+			    $build->get('DSC File'),
+			    $options->get('Distribution')],
+		USER => "root",
+		PRIORITY => 0,
+		CHROOT => 1 });
+	    while(<$pipe>) {
+		$build->log($_);
+	    }
+	    close($pipe);
+	    if ($?) {
+		$build->log("setup-cmd ($cmd) failed\n");
+		$build->set('Pkg Status', 'skipped');
+		goto cleanup_packages;
+	    }
+	}
+
 	$build->set('Pkg Fail Stage', 'install-deps');
 	if (!$build->install_deps()) {
 	    $build->log("Source-dependencies not satisfied; skipping " .
diff --git a/lib/Sbuild/Conf.pm b/lib/Sbuild/Conf.pm
index f204d05..c375863 100644
--- a/lib/Sbuild/Conf.pm
+++ b/lib/Sbuild/Conf.pm
@@ -472,6 +472,7 @@ sub read_config {
     our $sbuild_mode = undef;
     our $debug = undef;
     our $force_orig_source = undef;
+    our $setup_script = undef;
     our %individual_stalled_pkg_timeout;
     undef %individual_stalled_pkg_timeout;
     our $path = undef;
@@ -537,6 +538,7 @@ sub read_config {
     $self->set('CHROOT_SPLIT', $chroot_split);
     $self->set('SBUILD_MODE', $sbuild_mode);
     $self->set('FORCE_ORIG_SOURCE', $force_orig_source);
+    $self->set('SETUP_SCRIPT', $setup_script);
     $self->set('INDIVIDUAL_STALLED_PKG_TIMEOUT',
 	       \%individual_stalled_pkg_timeout);
     $self->set('PATH', $path);
diff --git a/lib/Sbuild/Options.pm b/lib/Sbuild/Options.pm
index a66f02c..d930177 100644
--- a/lib/Sbuild/Options.pm
+++ b/lib/Sbuild/Options.pm
@@ -158,6 +158,9 @@ sub parse_options {
 		       "stats-dir=s" => sub {
 			   $self->set_conf('STATS_DIR', $_[1]);
 		       },
+		       "setup-script=s" => sub {
+			   $self->set_conf('SETUP_SCRIPT', $_[1]);
+		       },
 		       "use-snapshot" => sub {
 			   $self->set_conf('GCC_SNAPSHOT', 1);
 			   $self->set_conf('LD_LIBRARY_PATH',

Reply via email to