- add --changelog option
[platform/upstream/build.git] / substitutedeps
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, $release, $changelog);
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 '--archpath') {
20     shift @ARGV;
21     $archs = shift @ARGV;
22     next;
23   }
24   if ($ARGV[0] eq '--configdir') {
25     shift @ARGV;
26     $configdir = shift @ARGV;
27     next;
28   }
29   if ($ARGV[0] eq '--release') {
30     shift @ARGV;
31     $release = shift @ARGV;
32     next;
33   }
34   if ($ARGV[0] eq '--changelog') {
35     shift @ARGV;
36     $changelog = shift @ARGV;
37     next;
38   }
39   last;
40 }
41 die("Usage: substitutedeps --dist <dist> --archpath <archpath> [--configdir <configdir>] <specin> <specout>\n") unless @ARGV == 2;
42 my $spec = $ARGV[0];
43 my $newspec = $ARGV[1];
44
45 my $cf = Build::read_config_dist($dist, $archs, $configdir);
46
47 #######################################################################
48
49 my ($packname, $packvers, $subpacks, @packdeps);
50 $subpacks = [];
51
52 my $xspec = [];
53 ($packname, $packvers, $subpacks, @packdeps) = Build::read_spec($cf, $spec, $xspec);
54 my @sdeps = @packdeps;
55 my @neg = map {substr($_, 1)} grep {/^-/} @packdeps;
56 my %neg = map {$_ => 1} @neg;
57 @sdeps = grep {!$neg{$_}} @sdeps;
58 @sdeps = Build::do_subst($cf, @sdeps);
59 @sdeps = grep {!$neg{$_}} @sdeps;
60 my %sdeps = map {$_ => 1} @sdeps;
61
62 open(F, '>', $newspec) || die("$newspec: $!\n");
63
64 my $used;
65 my $inchangelog = 0;
66 for my $l (@$xspec) {
67   $used = 1;
68   if (ref($l)) {
69     if (!defined($l->[1])) {
70       $used = 0;
71       $l = $l->[0];
72     } else {
73       $l = $l->[1];
74     }
75   }
76
77   if ($inchangelog) {
78     $inchangelog = 0 if $l =~ /^\s*%[^%]/;
79     next if $inchangelog;
80   }
81   if ($changelog && ($l =~ /\s*\%changelog\b/)) {
82     $inchangelog = 1;
83     next;
84   }
85
86   $l =~ s/^(Release:\s*).*/$1$release/i if $release;
87
88   if (!$used || ($l !~ /^BuildRequires:/i)) {
89     print F "$l\n";
90     next;
91   }
92
93   my $r = $l;
94   $r =~ s/^[^:]*:\s*//;
95   my @deps = $r =~ /([^\s\[\(,]+)(\s+[<=>]+\s+[^\s\[,]+)?[\s,]*/g;
96   my @ndeps = ();
97   my $replace = 0;
98   my %f2 = @deps;
99   my @f2 = Build::do_subst($cf, grep {!/^-/} keys %f2);
100   %f2 = map {$_ => 1} @f2;
101   delete $f2{$_} for @neg;
102   while (@deps) {
103     my ($pack, $vers) = splice(@deps, 0, 2);
104     $vers = '' unless defined $vers;
105     if ($sdeps{$pack}) {
106       push @ndeps, "$pack$vers";
107       delete $f2{$pack};
108     } else {
109       $replace = 1;
110     }
111   }
112   if (%f2) {
113     push @ndeps, sort keys %f2;
114     $replace = 1
115   }
116   if ($replace) {
117     print F "BuildRequires:  ".join(' ', @ndeps)."\n" if @ndeps;
118   } else {
119     print F "$l\n";
120   }
121 }
122
123 if ($changelog) {
124   print F "%changelog\n";
125   if (open(CF, '<', $changelog)) {
126     while(<CF>) {
127       print F $_;
128     }
129     close CF;
130   }
131 }
132
133 close(F) || die("close: $!\n");
134
135 exit(0);