summaryrefslogtreecommitdiffstats
path: root/Source/WebKit2/Scripts/generate-forwarding-headers.pl
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/Scripts/generate-forwarding-headers.pl')
-rwxr-xr-xSource/WebKit2/Scripts/generate-forwarding-headers.pl103
1 files changed, 103 insertions, 0 deletions
diff --git a/Source/WebKit2/Scripts/generate-forwarding-headers.pl b/Source/WebKit2/Scripts/generate-forwarding-headers.pl
new file mode 100755
index 0000000..6e2b2c2
--- /dev/null
+++ b/Source/WebKit2/Scripts/generate-forwarding-headers.pl
@@ -0,0 +1,103 @@
+#!/usr/bin/perl -w
+# Copyright (C) 2010 Andras Becsi (abecsi@inf.u-szeged.hu), University of Szeged
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# A script which searches for headers included by WebKit2 files
+# and generates forwarding headers for these headers.
+
+use strict;
+use Cwd qw(abs_path realpath);
+use File::Find;
+use File::Basename;
+use File::Path qw(mkpath);
+use File::Spec::Functions;
+
+my $srcRoot = realpath(File::Spec->catfile(dirname(abs_path($0)), "../.."));
+my $incFromRoot = abs_path($ARGV[0]);
+my @platformPrefixes = ("android", "brew", "cf", "chromium", "curl", "efl", "gtk", "haiku", "mac", "qt", "soup", "v8", "win", "wx");
+my @frameworks = ( "JavaScriptCore", "WebCore", "WebKit2");
+my @skippedPrefixes;
+my @frameworkHeaders;
+my $framework;
+my %neededHeaders;
+
+shift;
+my $outputDirectory = $ARGV[0];
+shift;
+my $platform = $ARGV[0];
+
+foreach my $prefix (@platformPrefixes) {
+ push(@skippedPrefixes, $prefix) unless ($prefix =~ $platform);
+}
+
+foreach (@frameworks) {
+ $framework = $_;
+
+ find(\&collectNeededHeaders, $incFromRoot);
+ find(\&collectFameworkHeaderPaths, File::Spec->catfile($srcRoot, $framework));
+ createForwardingHeadersForFramework();
+}
+
+sub collectNeededHeaders {
+ my $filePath = $File::Find::name;
+ my $file = $_;
+ if ($filePath =~ '\.h$|\.cpp$') {
+ open(FILE, "<$file") or die "Could not open $filePath.\n";
+ while (<FILE>) {
+ if (m/^#.*<$framework\/(.*\.h)/) {
+ $neededHeaders{$1} = 1;
+ }
+ }
+ close(FILE);
+ }
+}
+
+sub collectFameworkHeaderPaths {
+ my $filePath = $File::Find::name;
+ my $file = $_;
+ if ($filePath =~ '\.h$' && $filePath !~ "ForwardingHeaders" && grep{$file eq $_} keys %neededHeaders) {
+ my $headerPath = substr($filePath, length(File::Spec->catfile($srcRoot, $framework)) + 1 );
+ push(@frameworkHeaders, $headerPath) unless (grep($headerPath =~ "$_/", @skippedPrefixes));
+ }
+}
+
+sub createForwardingHeadersForFramework {
+ my $targetDirectory = File::Spec->catfile($outputDirectory, $framework);
+ mkpath($targetDirectory);
+ foreach my $header (@frameworkHeaders) {
+ my $forwardingHeaderPath = File::Spec->catfile($targetDirectory, basename($header));
+ my $expectedIncludeStatement = "#include \"$header\"";
+ my $foundIncludeStatement = 0;
+ $foundIncludeStatement = <EXISTING_HEADER> if open(EXISTING_HEADER, "<$forwardingHeaderPath");
+ chomp($foundIncludeStatement);
+ if (! $foundIncludeStatement || $foundIncludeStatement ne $expectedIncludeStatement) {
+ print "[Creating forwarding header for $framework/$header]\n";
+ open(FORWARDING_HEADER, ">$forwardingHeaderPath") or die "Could not open $forwardingHeaderPath.";
+ print FORWARDING_HEADER "$expectedIncludeStatement\n";
+ close(FORWARDING_HEADER);
+ }
+ close(EXISTING_HEADER);
+ }
+}
+