blob: 453570a5a9c51b3a6d74a742b99b5e47e6cb260a (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
#!/usr/bin/perl -w
use strict;
my $gnumake;
my $makefile_build;
sub read_deps()
{
my $p;
my $invalid_tolerance = 100;
my $line_count = 0;
my %deps;
open ($p, "ENABLE_PRINT_DEPS=1 $gnumake -n -f $makefile_build all|") || die "can't launch make: $!";
# open ($p, "/tmp/deps") || die "can't read deps: $!";
$|=1;
print STDERR "reading deps ";
while (<$p>) {
my $line = $_;
$line_count++;
print STDERR '.' if ($line_count % 10 == 0);
# print STDERR $line;
chomp ($line);
if ($line =~ m/^LibraryDep:\s+(\S+) links against (.*)$/) {
# if ($line =~ m/^LibraryDep:\s+(\S+)\s+links against/) {
$deps{$1} = ' ' if (!defined $deps{$1});
$deps{$1} = $deps{$1} . ' ' . $2;
} elsif ($line =~ m/^LibraryDep:\s+links against/) {
# these need fixing, we call gb_LinkTarget__use_$...
# and get less than normal data back to gb_LinkTarget_use_libraries
# print STDERR "ignoring unhelpful external dep\n";
} elsif ($invalid_tolerance < 0) {
# print "read all dependencies to: '$line'\n";
last;
} else {
# print "no match '$line'\n";
$invalid_tolerance--;
}
}
close ($p);
print STDERR " done\n";
return \%deps;
}
# first create nodes for each entry
sub build_tree($)
{
my $deps = shift;
for my $name (sort keys %{$deps}) {
my $need_str = $deps->{$name};
$need_str =~ s/^\s+//g;
$need_str =~ s/\s+$//g;
my @needs = split /\s+/, $need_str;
$name =~ m/^([^_]+)_(\S+)$/ || die "invalid target name: '$name'";
my $type = $1;
my $target = $2;
$type eq 'Executable' || $type eq 'Library' ||
$type eq 'CppunitTest' || die "Unknown type '$type'";
print "$target ($type): " . join (',', @needs) . "\n";
}
}
while (my $arg = shift @ARGV) {
if (!defined $gnumake) {
$gnumake = $arg;
} elsif (!defined $makefile_build) {
$makefile_build = $arg;
} else {
die "un-needed argument '$arg'";
}
}
$gnumake = 'make' if (!defined $gnumake);
$makefile_build = 'Makefile.gbuild' if (!defined $makefile_build);
my $deps = read_deps();
my $tree = build_tree($deps);
|