Merge branch 'master' of ssh://git.onelab.eu/git/sliver-openvswitch
[sliver-openvswitch.git] / build-aux / sodepends.pl
1 # Copyright (c) 2008, 2011 Nicira, Inc.
2 #
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at:
6 #
7 #     http://www.apache.org/licenses/LICENSE-2.0
8 #
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
14
15 use strict;
16 use warnings;
17 use Getopt::Long;
18
19 our ($exit_code) = 0;
20
21 our (@include_dirs);
22 Getopt::Long::Configure ("bundling");
23 GetOptions("I|include=s" => \@include_dirs) or exit(1);
24 @include_dirs = ('.') if !@include_dirs;
25
26 sub find_file {
27     my ($name) = @_;
28     foreach my $dir (@include_dirs, '.') {
29         my $file = "$dir/$name";
30         if (stat($file)) {
31             return $file;
32         }
33     }
34     print STDERR "$name not found in: ", join(' ', @include_dirs), "\n";
35     $exit_code = 1;
36     return;
37 }
38
39 print "# Generated automatically -- do not modify!    -*- buffer-read-only: t -*-\n";
40 for my $toplevel (sort(@ARGV)) {
41     # Skip names that don't end in .in.
42     next if $toplevel !~ /\.in$/;
43
44     # Open file.
45     my ($fn) = find_file($toplevel);
46     next if !defined($fn);
47     if (!open(OUTER, '<', $fn)) {
48         print "$fn: open: $!\n";
49         $exit_code = 1;
50         next;
51     }
52
53     my (@dependencies);
54   OUTER:
55     while (<OUTER>) {
56         if (my ($name) = /^\.so (\S+)$/) {
57             push(@dependencies, $name) if find_file($name);
58         }
59     }
60     close(OUTER);
61
62     my ($output) = $toplevel;
63     $output =~ s/\.in//;
64
65     print "\n$output:";
66     print " \\\n\t$_" foreach $toplevel, sort(@dependencies);
67     print "\n";
68     print "$_:\n" foreach $toplevel, sort(@dependencies);
69 }
70 exit $exit_code;