Revert "[build] Add cb(pre)ignore capabilities to build. Removes dependencies from...
[opensuse:build.git] / expanddeps
1 #!/usr/bin/perl -w
2
3 BEGIN {
4   unshift @INC, ($::ENV{'BUILD_DIR'} || '/usr/lib/build');
5 }
6
7 use strict;
8
9 use Build;
10
11 my ($dist, $rpmdeps, $archs, $configdir, $useusedforbuild);
12
13 while (@ARGV)  {
14   if ($ARGV[0] eq '--dist') {
15     shift @ARGV;
16     $dist = shift @ARGV;
17     next;
18   }
19   if ($ARGV[0] eq '--depfile') {
20     shift @ARGV;
21     $rpmdeps = shift @ARGV;
22     next;
23   }
24   if ($ARGV[0] eq '--archpath') {
25     shift @ARGV;
26     $archs = shift @ARGV;
27     next;
28   }
29   if ($ARGV[0] eq '--configdir') {
30     shift @ARGV;
31     $configdir = shift @ARGV;
32     next;
33   }
34   if ($ARGV[0] eq '--useusedforbuild') {
35     shift @ARGV;
36     $useusedforbuild = 1;
37     next;
38   }
39   if ($ARGV[0] eq '--define') {
40     shift @ARGV;
41     my $def = shift @ARGV;
42     Build::define($def);
43     next;
44   }
45   if ($ARGV[0] eq '--with') {
46     shift @ARGV;
47     my $def = shift @ARGV;
48     Build::define("_with_$def --with-$def");
49     next;
50   }
51   if ($ARGV[0] eq '--without') {
52     shift @ARGV;
53     my $def = shift @ARGV;
54     Build::define("_without_$def --without-$def");
55     next;
56   }
57   last;
58 }
59 $configdir = '.' unless defined $configdir;
60 $archs = '' unless defined $archs;
61 die("you must specfiy a depfile!\n") unless defined $rpmdeps;
62
63 my @extradeps = grep {!/\.(?:spec|dsc|kiwi)$/} @ARGV;
64 my @specs = grep {/\.(?:spec|dsc|kiwi)$/} @ARGV;
65 die("can only work with at most one spec\n") if @specs > 1;
66 my $spec = $specs[0];
67
68 my @archs = split(':', $archs);
69 push @archs, 'noarch' unless grep {$_ eq 'noarch'} @archs;
70
71 my (%fn, %prov, %req);
72
73 my %packs;
74 my %repo;
75 my %ids;
76
77 my %packs_arch;
78 open(F, '<', $rpmdeps) || die("$rpmdeps: $!\n");
79 while(<F>) {
80   chomp;
81   if (/^F:(.*?)-\d+\/\d+\/\d+: (.*)$/) {
82     next if $fn{$1};
83     $fn{$1} = $2;
84     my $pack = $1;
85     $pack =~ /^(.*)\.([^\.]+)$/ or die;
86     push @{$packs_arch{$2}}, $1;
87   } elsif (/^P:(.*?)-\d+\/\d+\/\d+: (.*)$/) {
88     next if $prov{$1};
89     $prov{$1} = $2;
90   } elsif (/^R:(.*?)-\d+\/\d+\/\d+: (.*)$/) {
91     next if $req{$1};
92     $req{$1} = $2;
93   } elsif (/^I:(.*?)-\d+\/\d+\/\d+: (.*)$/) {
94     next if $ids{$1};
95     $ids{$1} = $2;
96   }
97 }
98 close F;
99
100 for my $arch (@archs) {
101   $packs{$_} ||= "$_.$arch" for @{$packs_arch{$arch} || []};
102 }
103
104 # XXX: move to separate tool
105 if (!defined($dist) || $dist eq '') {
106   my $rpmarch = (grep {$fn{"rpm.$_"}} @archs)[0];
107   if (!$rpmarch) {
108     $dist = 'default';
109   } else {
110     my $rpmfn = $fn{"rpm.$rpmarch"};
111     if ($rpmfn =~ /^[a-z]+:\/\//) {
112       require File::Temp;
113       my $tmpdir = File::Temp::tempdir('CLEANUP' => 1);
114       $rpmfn =~ s/.*\//$tmpdir\// unless system("$INC[0]/download", $tmpdir, $rpmfn);
115     }
116     my $rpmdist = '';
117     if ($rpmfn =~ /^\// && -e $rpmfn) {
118       my %res = Build::Rpm::rpmq($rpmfn, 1010);
119       $rpmdist = $res{1010}->[0] || '';
120     }
121     $dist = Build::dist_canon($rpmdist, $archs[0]);
122   }
123   print STDERR "Warning: distribution not specified, assuming '$dist' (see $configdir).\n";
124 }
125
126 my $cf = Build::read_config_dist($dist, $archs[0], $configdir);
127 $cf->{'warnings'} = 1;
128
129 my $dofileprovides = %{$cf->{'fileprovides'}};
130
131 for my $pack (keys %packs) {
132   my $r = {};
133   my (@s, $s, @pr, @re);
134   @s = split(' ', $prov{$packs{$pack}});
135   while (@s) {
136     $s = shift @s;
137     next if !$dofileprovides && $s =~ /^\//;
138     if ($s =~ /^rpmlib\(/) {
139       splice(@s, 0, 2);
140       next;
141     }
142     push @pr, $s;
143     splice(@s, 0, 2) if @s && $s[0] =~ /^[<=>]/;
144   }
145   @s = split(' ', $req{$packs{$pack}});
146   while (@s) {
147     $s = shift @s;
148     next if !$dofileprovides && $s =~ /^\//;
149     if ($s =~ /^rpmlib\(/) {
150       splice(@s, 0, 2);
151       next;
152     }
153     push @re, $s;
154     splice(@s, 0, 2) if @s && $s[0] =~ /^[<=>]/;
155   }
156   $r->{'provides'} = \@pr;
157   $r->{'requires'} = \@re;
158   $repo{$pack} = $r;
159 }
160
161
162 #######################################################################
163
164 sub print_rpmlist
165 {
166   for (@_) {
167     print "$_ $fn{$packs{$_}}\n";
168     print "rpmid: $_:$ids{$packs{$_}}\n" if exists $ids{$packs{$_}};
169   }
170   print "preinstall: @{$cf->{'preinstall'} || []}\n";
171   print "vminstall: @{$cf->{'vminstall'} || []}\n";
172   print "cbpreinstall: @{$cf->{'cbpreinstall'} || []}\n"; # preinstall if is_emulator_arch
173   print "cbinstall: @{$cf->{'cbinstall'} || []}\n";       # install if is_emulator_arch
174   print "runscripts: @{$cf->{'runscripts'} || []}\n";
175   print "dist: $dist\n" if defined $dist;
176 }
177
178 if ($useusedforbuild) {
179   die("Need a specfile/dscfile for --usedforbuild\n") unless defined $spec;
180   local *F;
181   open(F, '<', $spec) || die("$spec: $!\n");
182   my @usedforbuild;
183   my @buildrequires;
184   while(<F>) {
185     chomp;
186     if (/^#\s*usedforbuild\s*(.*)$/) {
187       push @usedforbuild, split(' ', $1);
188     }
189     if (/^buildrequires:\s*(.*)$/i) {
190       push @buildrequires, split(' ', $1);
191     }
192   }
193   close F;
194   @usedforbuild = @buildrequires unless @usedforbuild;
195   @usedforbuild = Build::unify(@usedforbuild) if @usedforbuild;
196   my @errors;
197   for (@usedforbuild) {
198     push @errors, "package $_ not found" unless $packs{$_} && $fn{$packs{$_}};
199   }
200   if (@errors) {
201     print STDERR "expansion error\n";
202     print STDERR "  $_\n" for @errors;
203     exit(1);
204   }
205   print_rpmlist(@usedforbuild);
206   exit(0);
207 }
208
209 #######################################################################
210
211 my ($packname, $packvers, $subpacks, @packdeps);
212 $subpacks = [];
213
214 if ($spec) {
215   my $d;
216   if ($spec =~ /\.kiwi$/) {
217     # just set up kiwi root for now
218     $d = {
219       'deps' => [ 'kiwi', 'zypper', 'createrepo', 'squashfs' ],
220       'subpacks' => [],
221     };
222   } else {
223     $d = Build::parse($cf, $spec);
224   }
225   $packname = $d->{'name'};
226   $packvers = $d->{'version'};
227   $subpacks = $d->{'subpacks'};
228   @packdeps = @{$d->{'deps'} || []};
229 }
230
231 Build::readdeps($cf, undef, \%repo);
232
233 #######################################################################
234
235 my @bdeps = Build::get_build($cf, $subpacks, @packdeps, @extradeps);
236
237 if (!shift @bdeps) {
238   print STDERR "expansion error\n";
239   print STDERR "  $_\n" for @bdeps;
240   exit(1);
241 }
242
243 print_rpmlist(@bdeps);