source: soft/build_system/build_system/mkcd/tags/V3_4_2_1mdk/gendeps @ 1

Last change on this file since 1 was 1, checked in by fasma, 12 years ago

Initial Import from Mandriva's soft revision 224062 and package revision 45733

File size: 2.4 KB
Line 
1#!/usr/bin/perl
2
3use strict;
4
5my $a = shift @ARGV or usage();
6getdeps($a, \@ARGV);
7
8exit;
9
10sub usage{
11        print "
12        usage:
13                $0 basedir packages_list\n
14";
15        exit
16}
17
18sub getdeps{
19        my ($topdir,$listrpms) = @_;
20        my ($pkg,$name,$deps) = gendeps($topdir);
21        $listrpms = deps($pkg,$name,$deps,[0,$listrpms],1);
22        foreach (@{$listrpms->[1]}) { ref $_ and print "@$_\n" or print "$_\n"}
23}
24
25sub gendeps{
26        my ($topdir) = @_;
27        my %log;
28        -f "$topdir/depslist.ordered" or die "cannot find $topdir/depslist.ordered\n";
29        open DEP, "$topdir/depslist.ordered";
30
31        print LOG "getting dependencies\n";
32        my @deps;
33        my @rdeps;
34        my %pkg;
35        my $i = 0;
36        my @name;
37        foreach (<DEP>){
38                chomp;
39                my ($name, $size, @de) = split " ", $_; 
40                ($name, my $version, my $release) = $name =~ /(.*)-([^-]*)-([^-]*)/;
41                if ($name){
42                        foreach my $d (@de) {
43                                if ($d =~ s/^NOTFOUND_//) { 
44                                        push @{$log{"$name"}}, $d;
45                                }else{
46                                        if ($d =~ /\|/){ 
47                                                my @t = split '\|',$d ; my @u; 
48                                                foreach my $t (@t) { if ($t =~ s/NOTFOUND_//) {push @{$log{"$name"}}, $d} else { push @u, $t; push @{$rdeps[$t]}, $i} }
49                                                push @{$deps[$i]}, \@u
50                                        }else { push @{$deps[$i]}, $d; push @{$rdeps[$d]}, $i}
51                                }
52                        }
53                        $name[$i] = $name;
54                        $pkg{$name} = $i;
55                        $i++;
56                }
57        }
58        print LOG "FAILING DEPS\n";
59        foreach my $k (keys %log){
60                print LOG "$k @{$log{$k}}\n";
61        }
62        return (\%pkg,\@name,\@deps,\@rdeps)
63}
64
65sub deps{
66        my ($pkg,$name,$deps,$listrpms,$alt) = @_;
67                my @listlin;
68                my %listalt;
69                for(my $i=1; $i < @$listrpms; $i++){
70                        foreach my $p (@{$listrpms->[$i]}){
71                                $listlin[$pkg->{$p}] = $i; 
72                        }
73                }       
74                $listlin[$pkg->{"basesystem"}] = 1;
75                my $n=1;
76                my $lo=0;
77                while ($n){
78                        $lo++;
79                        $n=0;
80                        for(my $i = 0; $i < @listlin; $i++){
81                                if ($listlin[$i]){
82                                        foreach (@{$deps->[$i]}){
83                                                if (!ref) { if ((! $listlin[$_]) or ($listlin[$i] < $listlin[$_])) { $listlin[$_] = $listlin[$i] ; $n = 1} }
84                                                elsif ($alt){
85                                                        my $ok;
86                                                        foreach (@{$_}){
87                                                                if ($listlin[$_] and ($listlin[$i] > $listlin[$_])) { $ok=1; last} 
88                                                        }
89                                                        !$ok and do {
90                                                                        my $l = [map $name->[$_],@{$_}];
91                                                                        if (!$listalt{"@$l"} or $listalt{"@$l"}->[0] > $listlin[$i]){
92                                                                                $listalt{"@$l"} = [$listlin[$i],$l]
93                                                                        }
94                                                        }
95                                                }
96                                        }
97                                }
98                        }       
99                }
100                for(my $i = 0; $i < @listlin; $i++){
101                                $listlin[$i] and push @{$listrpms->[$listlin[$i]]}, $name->[$i]
102                }
103                if ($alt) {
104                        foreach (keys %listalt){
105                                push @{$listrpms->[$listalt{$_}->[0]]}, $listalt{$_}->[1];
106                        }
107                }
108        return $listrpms;
109}
Note: See TracBrowser for help on using the repository browser.