Generate stub header files for h/*.h files included in libuafs
[openafs.git] / src / libuafs / make_h_tree.pl
1 #!/usr/bin/perl
2 # make_h_tree.pl
3 # Generate an h tree that includes the appropriate sys headers
4 #
5 # Usage: make_h_tree.pl ${SRC} ...
6 #
7 # The specified makefiles will be scanned for variable values.  The h
8 # directory will be created under the current directory and populated with
9 # stubs that include the actual header file for every header included by any
10 # source file in the ${SRC} directories.  This is an ugly hack to work around
11 # the naming of header files using h instead of their proper names elsewhere
12 # in the code.
13
14 use IO::File;
15
16 if (@ARGV < 1) {
17   die "Usage: $0 SRC ...\n";
18 }
19
20 %remap = ('h' => 'sys');
21 foreach $src (keys %remap) {
22     mkdir($src, 0777) or die "$src: $!\n";
23 %seen = ();
24 @q = map { glob ("$_/*.[Sc]") } @ARGV;
25   while (@q) {
26     $src = shift @q;
27     $content = new IO::File($src, O_RDONLY) or die "$src: $!\n";
28   LINE:
29     while (<$content>) {
30       chomp;
31       if (/^\s*\#\s*include\s*[<\"](?:\.\.\/)?([^\/>\"]*)(.*?)[>\"]/) {
32         $inc = "$1$2";
33         if (exists $seen{$inc}) {
34           next;
35         } elsif (exists $remap{$1}  &&  $2 !~ /.\//) {
36           $H = new IO::File("$inc", O_WRONLY|O_CREAT|O_TRUNC, 0666)
37             or die "$inc: $!\n";
38           print $H "#include <sys$2>\n";
39           $H->close() or die "$inc: $!\n";
40           $seen{$inc} = 1;
41         }
42       }
43     }
44   }
45 }