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;