abd3d8f5bd85805c20046ddbf415206baa958e4f
[WebKit-https.git] / Source / WebCore / bindings / scripts / preprocess-idls.pl
1 #!/usr/bin/perl -w
2 #
3 # Copyright (C) 2011 Google Inc.  All rights reserved.
4 #
5 # This library is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU Library General Public
7 # License as published by the Free Software Foundation; either
8 # version 2 of the License, or (at your option) any later version.
9 #
10 # This library is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 # Library General Public License for more details.
14 #
15 # You should have received a copy of the GNU Library General Public License
16 # along with this library; see the file COPYING.LIB.  If not, write to
17 # the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18 # Boston, MA 02110-1301, USA.
19 #
20
21 use strict;
22
23 use File::Basename;
24 use Getopt::Long;
25 use Cwd;
26
27 my $defines;
28 my $preprocessor;
29 my $idlFilesList;
30 my $supplementalDependencyFile;
31 my $supplementalMakefileDeps;
32
33 GetOptions('defines=s' => \$defines,
34            'preprocessor=s' => \$preprocessor,
35            'idlFilesList=s' => \$idlFilesList,
36            'supplementalDependencyFile=s' => \$supplementalDependencyFile,
37            'supplementalMakefileDeps=s' => \$supplementalMakefileDeps);
38
39 die('Must specify #define macros using --defines.') unless defined($defines);
40 die('Must specify an output file using --supplementalDependencyFile.') unless defined($supplementalDependencyFile);
41 die('Must specify the file listing all IDLs using --idlFilesList.') unless defined($idlFilesList);
42
43 open FH, "< $idlFilesList" or die "Cannot open $idlFilesList\n";
44 my @idlFiles = <FH>;
45 chomp(@idlFiles);
46 close FH;
47
48 # Parse all IDL files.
49 my %interfaceNameToIdlFile;
50 my %idlFileToInterfaceName;
51 my %supplementalDependencies;
52 my %supplementals;
53 foreach my $idlFile (@idlFiles) {
54     my $fullPath = Cwd::realpath($idlFile);
55     my $partialInterfaceName = getPartialInterfaceNameFromIDLFile($fullPath);
56     if ($partialInterfaceName) {
57         $supplementalDependencies{$fullPath} = $partialInterfaceName;
58     }
59     my $interfaceName = fileparse(basename($idlFile), ".idl");
60     $interfaceNameToIdlFile{$interfaceName} = $fullPath;
61     $idlFileToInterfaceName{$fullPath} = $interfaceName;
62     $supplementals{$fullPath} = [];
63 }
64
65 # Resolves partial interfaces dependencies.
66 foreach my $idlFile (keys %supplementalDependencies) {
67     my $baseFile = $supplementalDependencies{$idlFile};
68     my $targetIdlFile = $interfaceNameToIdlFile{$baseFile};
69     push(@{$supplementals{$targetIdlFile}}, $idlFile);
70     delete $supplementals{$idlFile};
71 }
72
73 # Outputs the dependency.
74 # The format of a supplemental dependency file:
75 #
76 # DOMWindow.idl P.idl Q.idl R.idl
77 # Document.idl S.idl
78 # Event.idl
79 # ...
80 #
81 # The above indicates that DOMWindow.idl is supplemented by P.idl, Q.idl and R.idl,
82 # Document.idl is supplemented by S.idl, and Event.idl is supplemented by no IDLs.
83 # The IDL that supplements another IDL (e.g. P.idl) never appears in the dependency file.
84
85 open FH, "> $supplementalDependencyFile" or die "Cannot open $supplementalDependencyFile\n";
86
87 foreach my $idlFile (sort keys %supplementals) {
88     print FH $idlFile, " @{$supplementals{$idlFile}}\n";
89 }
90 close FH;
91
92
93 if ($supplementalMakefileDeps) {
94     open MAKE_FH, "> $supplementalMakefileDeps" or die "Cannot open $supplementalMakefileDeps\n";
95     my @all_dependencies = [];
96     foreach my $idlFile (sort keys %supplementals) {
97         my $basename = $idlFileToInterfaceName{$idlFile};
98
99         my @dependencies = map { basename($_) } @{$supplementals{$idlFile}};
100
101         print MAKE_FH "JS${basename}.h: @{dependencies}\n";
102         print MAKE_FH "DOM${basename}.h: @{dependencies}\n";
103         print MAKE_FH "WebDOM${basename}.h: @{dependencies}\n";
104         foreach my $dependency (@dependencies) {
105             print MAKE_FH "${dependency}:\n";
106         }
107     }
108
109     close MAKE_FH;
110 }
111
112
113 sub getPartialInterfaceNameFromIDLFile
114 {
115     my $idlFile = shift;
116
117     open FILE, "<", $idlFile;
118     my @lines = <FILE>;
119     close FILE;
120
121     my $fileContents = join('', @lines);
122     if ($fileContents =~ /partial\s+interface\s+(\w+)/gs) {
123         return $1;
124     }
125 }