~ubuntu-branches/ubuntu/natty/sbuild/natty

« back to all changes in this revision

Viewing changes to lib/Sbuild/AptResolver.pm

  • Committer: Bazaar Package Importer
  • Author(s): Angel Abad
  • Date: 2010-11-22 16:28:20 UTC
  • mfrom: (8.1.16 upstream) (3.3.9 sid)
  • Revision ID: james.westby@ubuntu.com-20101122162820-usokwmjnyd1m222q
Tags: 0.60.5-1ubuntu1
* Merge from debian unstable (LP: #680099). Remaining changes:
  - bin/sbuild-createchroot: do not install debfoster into the chroots
    because it is in universe and not needed for package building itself.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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>
 
5
#
 
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.
 
10
#
 
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.
 
15
#
 
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/>.
 
19
#
 
20
#######################################################################
 
21
 
 
22
package Sbuild::AptResolver;
 
23
 
 
24
use strict;
 
25
use warnings;
 
26
use File::Temp qw(tempdir);
 
27
 
 
28
use Dpkg::Deps;
 
29
use Sbuild qw(debug copy version_compare);
 
30
use Sbuild::Base;
 
31
use Sbuild::ResolverBase;
 
32
 
 
33
BEGIN {
 
34
    use Exporter ();
 
35
    our (@ISA, @EXPORT);
 
36
 
 
37
    @ISA = qw(Exporter Sbuild::ResolverBase);
 
38
 
 
39
    @EXPORT = qw();
 
40
}
 
41
 
 
42
sub new {
 
43
    my $class = shift;
 
44
    my $builder = shift;
 
45
 
 
46
    my $self = $class->SUPER::new($builder);
 
47
    bless($self, $class);
 
48
 
 
49
    return $self;
 
50
}
 
51
 
 
52
sub install_deps {
 
53
    my $self = shift;
 
54
    my $name = shift;
 
55
    my @pkgs = @_;
 
56
 
 
57
    my $status = 0;
 
58
 
 
59
    my $builder = $self->get('Builder');
 
60
    my $session = $builder->get('Session');
 
61
 
 
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';
 
70
 
 
71
    $builder->log_subsection("Install $name build dependencies (apt-based resolver)");
 
72
 
 
73
    if (!mkdir $dummy_dir) {
 
74
        $builder->log_warning('Could not create build-depends dummy dir ' . $dummy_dir . ': ' . $!);
 
75
        goto cleanup;
 
76
    }
 
77
    if (!mkdir $dummy_dir . '/DEBIAN') {
 
78
        $builder->log_warning('Could not create build-depends dummy dir ' . $dummy_dir . '/DEBIAN: ' . $!);
 
79
        goto cleanup;
 
80
    }
 
81
 
 
82
    if (!open(DUMMY_CONTROL, '>', $dummy_dir . '/DEBIAN/control')) {
 
83
        $builder->log_warning('Could not open ' . $dummy_dir . '/DEBIAN/control for writing: ' . $!);
 
84
        goto cleanup;
 
85
    }
 
86
 
 
87
    my $arch = $builder->get('Arch');
 
88
    print DUMMY_CONTROL <<"EOF";
 
89
Package: $dummy_pkg_name
 
90
Version: 0.invalid.0
 
91
Architecture: $arch
 
92
EOF
 
93
 
 
94
    my @positive;
 
95
    my @negative;
 
96
 
 
97
    for my $pkg (@pkgs) {
 
98
        my $deps = $self->get('AptDependencies')->{$pkg};
 
99
 
 
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 "");
 
113
        }
 
114
    }
 
115
 
 
116
    my $positive = deps_parse(join(", ", @positive),
 
117
                              reduce_arch => 1,
 
118
                              host_arch => $builder->get('Arch'));
 
119
    my $negative = deps_parse(join(", ", @negative),
 
120
                              reduce_arch => 1,
 
121
                              host_arch => $builder->get('Arch'));
 
122
 
 
123
    if ($positive ne "") {
 
124
        print DUMMY_CONTROL 'Depends: ' . $positive . "\n";
 
125
    }
 
126
    if ($negative ne "") {
 
127
        print DUMMY_CONTROL 'Conflicts: ' . $negative . "\n";
 
128
    }
 
129
 
 
130
    debug("DUMMY Depends: $positive \n");
 
131
    debug("DUMMY Conflicts: $negative \n");
 
132
 
 
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.
 
138
EOF
 
139
    close (DUMMY_CONTROL);
 
140
 
 
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)],
 
144
          USER => 'root',
 
145
          CHROOT => 1,
 
146
          PRIORITY => 0});
 
147
    if ($?) {
 
148
        $builder->log("Dummy package creation failed\n");
 
149
        goto cleanup;
 
150
    }
 
151
 
 
152
    $session->run_command(
 
153
        { COMMAND => ['dpkg', '--force-depends', '--force-conflicts', '--install', $session->strip_chroot_path($dummy_deb)],
 
154
          USER => 'root',
 
155
          CHROOT => 1,
 
156
          PRIORITY => 0});
 
157
 
 
158
    $self->set_installed(keys %{$self->get('Changes')->{'installed'}}, $dummy_pkg_name);
 
159
 
 
160
    if ($?) {
 
161
        $builder->log("Dummy package installation failed\n");
 
162
        goto package_cleanup;
 
163
    }
 
164
 
 
165
    my (@instd, @rmvd);
 
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");
 
172
        } else {
 
173
            $self->set_installed(@instd);
 
174
            $self->set_removed(@rmvd);
 
175
            goto package_cleanup;
 
176
        }
 
177
        return 0;
 
178
    }
 
179
    $self->set_installed(@instd);
 
180
    $self->set_removed(@rmvd);
 
181
    $status = 1;
 
182
 
 
183
  package_cleanup:
 
184
    if ($status == 0) {
 
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");
 
188
        } else {
 
189
            $self->uninstall_deps();
 
190
        }
 
191
    }
 
192
 
 
193
    $session->run_command(
 
194
        { COMMAND => ['rm', $session->strip_chroot_path($dummy_deb)],
 
195
          USER => 'root',
 
196
          CHROOT => 1,
 
197
          PRIORITY => 0});
 
198
 
 
199
  cleanup:
 
200
    $session->run_command(
 
201
        { COMMAND => ['rm', '-rf', $session->strip_chroot_path($dummy_dir)],
 
202
          USER => 'root',
 
203
          CHROOT => 1,
 
204
          PRIORITY => 0});
 
205
 
 
206
    $self->set('Dummy package path', undef);
 
207
 
 
208
    return $status;
 
209
}
 
210
 
 
211
1;