Adds sys_mkdir() and sys_rmdir() (XCC)
[akaros.git] / scripts / mergedep.pl
1 #!/usr/bin/perl
2 # Copyright 2003 Bryan Ford
3 # Distributed under the GNU General Public License.
4 #
5 # Usage: mergedep <main-depfile> [<new-depfiles> ...]
6 #
7 # This script merges the contents of all <new-depfiles> specified
8 # on the command line into the single file <main-depfile>,
9 # which may or may not previously exist.
10 # Dependencies in the <new-depfiles> will override
11 # any existing dependencies for the same targets in <main-depfile>.
12 # The <new-depfiles> are deleted after <main-depfile> is updated.
13 #
14 # The <new-depfiles> are typically generated by GCC with the -MD option,
15 # and the <main-depfile> is typically included from a Makefile,
16 # as shown here for GNU 'make':
17 #
18 #       .deps: $(wildcard *.d)
19 #               perl mergedep $@ $^
20 #       -include .deps
21 #
22 # This script properly handles multiple dependencies per <new-depfile>,
23 # including dependencies having no target,
24 # so it is compatible with GCC3's -MP option.
25 #
26
27 sub makedirname($) 
28 {
29         my $file = shift; 
30         $file =~ s!/?[^/]*/*$!!; 
31         $file =~ s!^[^/]*/!!; 
32         return $file; 
33 }
34
35 sub readdeps {
36         my $filename = shift;
37         my $use_filename = shift;
38
39         open(DEPFILE, $filename) or return 0;
40         while (<DEPFILE>) {
41                 if (/([^:]*):([^\\:]*)([\\]?)$/) {
42                         my $target = $1;
43                         my $deplines = $2;
44                         my $slash = $3;
45                         if($use_filename) {
46                                 $target = $filename;
47                                 $target =~ s/\.d$/\.o/;
48                         }
49                         while ($slash ne '') {
50                                 $_ = <DEPFILE>;
51                                 defined($_) or die
52                                         "Unterminated dependency in $filename";
53                                 /(^[ \t][^\\]*)([\\]?)$/ or die
54                                         "Bad continuation line in $filename";
55                                 $deplines = "$deplines\\\n$1";
56                                 $slash = $2;
57                         }
58                         #print "DEPENDENCY [[$target]]: [[$deplines]]\n";
59                         my $new_deplines = $deplines;
60                         if($use_filename) {
61                                 my $makelocal = "Makelocal";
62                                 my $sim_makelocal = "sim/Makelocal";
63                                 if (! -e $makelocal) {
64                                         $makelocal = ""
65                                 }
66                                 if (! -e $sim_makelocal) {
67                                         $sim_makelocal = ""
68                                 }
69                                 $new_deplines = 
70                                       " " . $makelocal . " " . $sim_makelocal . " " 
71                                           . makedirname($filename) . "/Makefrag" . $deplines;
72                         }
73                         $dephash{$target} = $new_deplines;
74                 } elsif (/^[#]?[ \t]*$/) {
75                         # ignore blank lines and comments
76                 } else {
77                         die "Bad dependency line in $filename: $_";
78                 }
79         }
80         close DEPFILE;
81         return 1;
82 }
83
84
85 if ($#ARGV < 0) {
86         print "Usage: mergedep <main-depfile> [<new-depfiles> ..]\n";
87         exit(1);
88 }
89
90 %dephash = ();
91
92 # Read the main dependency file
93 $maindeps = $ARGV[0];
94 readdeps($maindeps, 0);
95
96 # Read and merge in the new dependency files
97 foreach $i (1 .. $#ARGV) {
98         readdeps($ARGV[$i], 1) or die "Can't open $ARGV[$i]";
99 }
100
101 # Update the main dependency file
102 open(DEPFILE, ">$maindeps.tmp") or die "Can't open output file $maindeps.tmp";
103 foreach $target (keys %dephash) {
104         print DEPFILE "$target:$dephash{$target}";
105 }
106 close DEPFILE;
107 rename("$maindeps.tmp", "$maindeps") or die "Can't overwrite $maindeps";
108
109 # Finally, delete the new dependency files
110 foreach $i (1 .. $#ARGV) {
111         unlink($ARGV[$i]) or print "Error removing $ARGV[$i]\n";
112 }
113