1
# ResolverBase.pm: build library for sbuild
2
# Copyright © 2005 Ryan Murray <rmurray@debian.org>
3
# Copyright © 2005-2008 Roger Leigh <rleigh@debian.org>
4
# Copyright © 2008 Simon McVittie <smcv@debian.org>
6
# This program is free software: you can redistribute it and/or modify
7
# it under the terms of the GNU General Public License as published by
8
# the Free Software Foundation, either version 2 of the License, or
9
# (at your option) any later version.
11
# This program is distributed in the hope that it will be useful, but
12
# WITHOUT ANY WARRANTY; without even the implied warranty of
13
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
# General Public License for more details.
16
# You should have received a copy of the GNU General Public License
17
# along with this program. If not, see
18
# <http://www.gnu.org/licenses/>.
20
#######################################################################
22
package Sbuild::AptResolver;
26
use File::Temp qw(tempdir);
29
use Sbuild qw(debug copy version_compare);
31
use Sbuild::ResolverBase;
37
@ISA = qw(Exporter Sbuild::ResolverBase);
46
my $self = $class->SUPER::new($builder);
59
my $builder = $self->get('Builder');
60
my $session = $builder->get('Session');
62
my $dummy_pkg_name = 'sbuild-build-depends-' . $name. '-dummy';
63
#Prepare a path to build a dummy package containing our deps:
64
$self->set('Dummy package path',
65
tempdir($builder->get_conf('USERNAME') . '-' . $builder->get('Package') . '-' .
66
$builder->get('Arch') . '-XXXXXX',
67
DIR => $session->get('Build Location')));
68
my $dummy_dir = $self->get('Dummy package path') . '/' . $dummy_pkg_name;
69
my $dummy_deb = $self->get('Dummy package path') . '/' . $dummy_pkg_name . '.deb';
71
$builder->log_subsection("Install $name build dependencies (apt-based resolver)");
73
if (!mkdir $dummy_dir) {
74
$builder->log_warning('Could not create build-depends dummy dir ' . $dummy_dir . ': ' . $!);
77
if (!mkdir $dummy_dir . '/DEBIAN') {
78
$builder->log_warning('Could not create build-depends dummy dir ' . $dummy_dir . '/DEBIAN: ' . $!);
82
if (!open(DUMMY_CONTROL, '>', $dummy_dir . '/DEBIAN/control')) {
83
$builder->log_warning('Could not open ' . $dummy_dir . '/DEBIAN/control for writing: ' . $!);
87
my $arch = $builder->get('Arch');
88
print DUMMY_CONTROL <<"EOF";
89
Package: $dummy_pkg_name
98
my $deps = $self->get('AptDependencies')->{$pkg};
100
push(@positive, $deps->{'Build Depends'})
101
if (defined($deps->{'Build Depends'}) &&
102
$deps->{'Build Depends'} ne "");
103
push(@negative, $deps->{'Build Conflicts'})
104
if (defined($deps->{'Build Conflicts'}) &&
105
$deps->{'Build Conflicts'} ne "");
106
if ($self->get_conf('BUILD_ARCH_ALL')) {
107
push(@positive, $deps->{'Build Depends Indep'})
108
if (defined($deps->{'Build Depends Indep'}) &&
109
$deps->{'Build Depends Indep'} ne "");
110
push(@negative, $deps->{'Build Conflicts Indep'})
111
if (defined($deps->{'Build Conflicts Indep'}) &&
112
$deps->{'Build Conflicts Indep'} ne "");
116
my $positive = deps_parse(join(", ", @positive),
118
host_arch => $builder->get('Arch'));
119
my $negative = deps_parse(join(", ", @negative),
121
host_arch => $builder->get('Arch'));
123
if ($positive ne "") {
124
print DUMMY_CONTROL 'Depends: ' . $positive . "\n";
126
if ($negative ne "") {
127
print DUMMY_CONTROL 'Conflicts: ' . $negative . "\n";
130
debug("DUMMY Depends: $positive \n");
131
debug("DUMMY Conflicts: $negative \n");
133
print DUMMY_CONTROL <<"EOF";
134
Maintainer: Debian buildd-tools Developers <buildd-tools-devel\@lists.alioth.debian.org>
135
Description: Dummy package to satisfy dependencies with apt - created by sbuild
136
This package was created automatically by sbuild and should never appear on
137
a real system. You can safely remove it.
139
close (DUMMY_CONTROL);
141
#Now build and install the package:
142
$session->run_command(
143
{ COMMAND => ['dpkg-deb', '--build', $session->strip_chroot_path($dummy_dir), $session->strip_chroot_path($dummy_deb)],
148
$builder->log("Dummy package creation failed\n");
152
$session->run_command(
153
{ COMMAND => ['dpkg', '--force-depends', '--force-conflicts', '--install', $session->strip_chroot_path($dummy_deb)],
158
$self->set_installed(keys %{$self->get('Changes')->{'installed'}}, $dummy_pkg_name);
161
$builder->log("Dummy package installation failed\n");
162
goto package_cleanup;
166
$builder->log("Installing build dependencies\n");
167
if (!$self->run_apt("-yf", \@instd, \@rmvd, 'install')) {
168
$builder->log("Package installation failed\n");
169
if (defined ($builder->get('Session')->get('Session Purged')) &&
170
$builder->get('Session')->get('Session Purged') == 1) {
171
$builder->log("Not removing build depends: cloned chroot in use\n");
173
$self->set_installed(@instd);
174
$self->set_removed(@rmvd);
175
goto package_cleanup;
179
$self->set_installed(@instd);
180
$self->set_removed(@rmvd);
185
if (defined ($session->get('Session Purged')) &&
186
$session->get('Session Purged') == 1) {
187
$builder->log("Not removing installed packages: cloned chroot in use\n");
189
$self->uninstall_deps();
193
$session->run_command(
194
{ COMMAND => ['rm', $session->strip_chroot_path($dummy_deb)],
200
$session->run_command(
201
{ COMMAND => ['rm', '-rf', $session->strip_chroot_path($dummy_dir)],
206
$self->set('Dummy package path', undef);