Package: sbuild
Version: 0.63.2-1
Severity: normal
Tags: patch
User: [email protected]
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 [[email protected]]
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;