Package: sbuild
Version: 0.63.2-1
Severity: normal
Tags: patch
User: ubuntu-de...@lists.ubuntu.com
Usertags: origin-ubuntu ubuntu-patch raring

A known problem (at least Wookey knew about it when implementing it)
with sbuild when cross-building is that it works out build-dependencies
based on the current apt sources rather than on the package you're
actually building.  This is problematic when you're using a bootstrap
repository with different build-dependencies, or when you're testing a
change that involves changing build-dependencies.

As it happens, this is not very difficult to fix.  We do still need to
use 'apt-get -aHOST build-dep', because that has special multiarch logic
we need to preserve.  But, when building its dummy package, sbuild
already constructs a .dsc as well as a .deb, and it adds a deb-src line
for the dummy archive.  This means that all we need to do when
cross-building is to split out the installation of essential and
gcc-snapshot (since they, and core, may not necessarily be resolvable
using 'apt-get -aHOST build-dep - I ran into such a problem in core
while testing this) and then use build-dep against the dummy archive.

This all seems to work nicely: I can add a build-dependency to an
existing package, build a new .dsc, feed it to sbuild, and it pulls in
the new build-dependency as instructed.

If you accept this change, it supersedes #693788.

Thanks,

-- 
Colin Watson                                       [cjwat...@ubuntu.com]
diff --git a/lib/Sbuild/AptResolver.pm b/lib/Sbuild/AptResolver.pm
index 6356394..f2b52d3 100644
--- a/lib/Sbuild/AptResolver.pm
+++ b/lib/Sbuild/AptResolver.pm
@@ -52,6 +52,7 @@ sub new {
 sub install_deps {
     my $self = shift;
     my $name = shift;
+    my $cross = shift;
     my @pkgs = @_;
 
     my $status = 0;
@@ -68,7 +69,16 @@ sub install_deps {
     # Install the dummy package
     my (@instd, @rmvd);
     $self->log("Installing build dependencies\n");
-    if (!$self->run_apt("-yf", \@instd, \@rmvd, 'install', $dummy_pkg_name)) {
+    my @apt_args = ("-yf", \@instd, \@rmvd);
+    if ($cross) {
+	# Cross-building: 'apt-get build-dep' knows how to get the multiarch
+	# details right.
+	push @apt_args,
+	     '-a' . $self->get('Host Arch'), 'build-dep', $dummy_pkg_name;
+    } else {
+	push @apt_args, 'install', $dummy_pkg_name;
+    }
+    if (!$self->run_apt(@apt_args)) {
 	$self->log("Package installation failed\n");
 	if (defined ($self->get('Session')->get('Session Purged')) &&
 	    $self->get('Session')->get('Session Purged') == 1) {
diff --git a/lib/Sbuild/AptitudeResolver.pm b/lib/Sbuild/AptitudeResolver.pm
index 0f729a8..4030382 100644
--- a/lib/Sbuild/AptitudeResolver.pm
+++ b/lib/Sbuild/AptitudeResolver.pm
@@ -53,6 +53,7 @@ sub new {
 sub install_deps {
     my $self = shift;
     my $name = shift;
+    my $cross = shift;
     my @pkgs = @_;
 
 
diff --git a/lib/Sbuild/Build.pm b/lib/Sbuild/Build.pm
index e82e4a7..b083f3a 100644
--- a/lib/Sbuild/Build.pm
+++ b/lib/Sbuild/Build.pm
@@ -631,7 +631,7 @@ sub run_fetch_install_packages {
 	}
 	$resolver->add_dependencies('CORE', join(", ", @coredeps) , "", "", "", "", "");
 
-	if (!$resolver->install_deps('core', 'CORE')) {
+	if (!$resolver->install_core_deps('core', 'CORE')) {
 	    Sbuild::Exception::Build->throw(error => "Core build dependencies not satisfied; skipping",
 					    failstage => "install-deps");
 	}
@@ -653,36 +653,33 @@ sub run_fetch_install_packages {
 				    join(", ", @{$self->get_conf('MANUAL_CONFLICTS_ARCH')}),
 				    join(", ", @{$self->get_conf('MANUAL_CONFLICTS_INDEP')}));
 
+	$resolver->add_dependencies($self->get('Package'),
+				    $self->get('Build Depends'),
+				    $self->get('Build Depends Arch'),
+				    $self->get('Build Depends Indep'),
+				    $self->get('Build Conflicts'),
+				    $self->get('Build Conflicts Arch'),
+				    $self->get('Build Conflicts Indep'));
+
+	my @build_deps;
 	if ($self->get('Host Arch') eq $self->get('Build Arch')) {
-	# for native building make and install dummy-deps package
-		$resolver->add_dependencies($self->get('Package'),
-						$self->get('Build Depends'),
-						$self->get('Build Depends Arch'),
-						$self->get('Build Depends Indep'),
-						$self->get('Build Conflicts'),
-						$self->get('Build Conflicts Arch'),
-						$self->get('Build Conflicts Indep'));
-
-		$self->check_abort();
-		if (!$resolver->install_deps($self->get('Package'),
-						'ESSENTIAL', 'GCC_SNAPSHOT', 'MANUAL',
-						$self->get('Package'))) {
-			Sbuild::Exception::Build->throw(error => "Package build dependencies not satisfied; skipping",
-							failstage => "install-deps");
-						}
-	} else { # cross-building
-		# install cross-deps. Hacked for now - need to generate dummy package
-		$self->log_subsection('Install cross build-dependencies (apt-get -a)');
-		$self->log('Cross-deps: Running apt-get -a' . $self->get('Host Arch') . ' build-dep ' . $self->get('Package') . "\n");
-		$resolver->run_apt_command(
-			{ COMMAND => [$self->get_conf('APT_GET'),  '-a' . $self->get('Host Arch'), 'build-dep', '-yf', $self->get('Package')],
-			ENV => {'DEBIAN_FRONTEND' => 'noninteractive'},
-			USER => 'root',
-			DIR => '/' });
-		if ($?) {
-			$self->log("Failed to get cross build-deps\n");
-			return 1;
-		}
+	    @build_deps = ('ESSENTIAL', 'GCC_SNAPSHOT', 'MANUAL',
+			   $self->get('Package'));
+	} else {
+	    $self->check_abort();
+	    if (!$resolver->install_core_deps('essential',
+					      'ESSENTIAL', 'GCC_SNAPSHOT')) {
+		Sbuild::Exception::Build->throw(error => "Essential dependencies not satisfied; skipping",
+						failstage => "install-essential");
+	    }
+	    @build_deps = ('MANUAL', $self->get('Package'));
+	}
+
+	$self->check_abort();
+	if (!$resolver->install_main_deps($self->get('Package'),
+					  @build_deps)) {
+	    Sbuild::Exception::Build->throw(error => "Package build dependencies not satisfied; skipping",
+					    failstage => "install-deps");
 	}
 	$self->set('Install End Time', time);
 
diff --git a/lib/Sbuild/ResolverBase.pm b/lib/Sbuild/ResolverBase.pm
index a22352b..b3d2cf9 100644
--- a/lib/Sbuild/ResolverBase.pm
+++ b/lib/Sbuild/ResolverBase.pm
@@ -321,6 +321,21 @@ sub add_dependencies {
     $self->get('AptDependencies')->{$pkg} = $deps;
 }
 
+sub install_core_deps {
+    my $self = shift;
+    my $name = shift;
+
+    return $self->install_deps($name, 0, @_);
+}
+
+sub install_main_deps {
+    my $self = shift;
+    my $name = shift;
+
+    my $cross = $self->get('Host Arch') ne $self->get('Build Arch');
+    return $self->install_deps($name, $cross, @_);
+}
+
 sub uninstall_deps {
     my $self = shift;
 
diff --git a/lib/Sbuild/XaptResolver.pm b/lib/Sbuild/XaptResolver.pm
index 139c202..a3f995c 100644
--- a/lib/Sbuild/XaptResolver.pm
+++ b/lib/Sbuild/XaptResolver.pm
@@ -52,6 +52,7 @@ sub new {
 sub install_deps {
     my $self = shift;
     my $name = shift;
+    my $cross = shift;
     my @pkgs = @_;
 
     my $status = 0;

Reply via email to