diff options
Diffstat (limited to 'contrib/dom/scripts/generate-bindings.pl')
-rwxr-xr-x | contrib/dom/scripts/generate-bindings.pl | 217 |
1 files changed, 0 insertions, 217 deletions
diff --git a/contrib/dom/scripts/generate-bindings.pl b/contrib/dom/scripts/generate-bindings.pl deleted file mode 100755 index ecf0218..0000000 --- a/contrib/dom/scripts/generate-bindings.pl +++ /dev/null @@ -1,217 +0,0 @@ -#!/usr/bin/perl -w -# -# Copyright (C) 2005 Apple Computer, Inc. -# Copyright (C) 2006 Anders Carlsson <andersca@mac.com> -# -# This file is part of WebKit -# -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Library General Public -# License as published by the Free Software Foundation; either -# version 2 of the License, or (at your option) any later version. -# -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Library General Public License for more details. -# -# You should have received a copy of the GNU Library General Public License -# along with this library; see the file COPYING.LIB. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -# Boston, MA 02110-1301, USA. -# - -# This script is a temporary hack. -# Files are generated in the source directory, when they really should go -# to the DerivedSources directory. -# This should also eventually be a build rule driven off of .idl files -# however a build rule only solution is blocked by several radars: -# <rdar://problems/4251781&4251785> - -use strict; - -use File::Path; -use File::Basename; -use Getopt::Long; -use Text::ParseWords; -use Data::Dumper; -use Cwd; - -use IDLParser; -use CodeGenerator; - -my @idlDirectories; -my $outputDirectory; -my $outputHeadersDirectory; -my $generator; -my $defines; -my $filename; -my $prefix; -my $preprocessor; -my $writeDependencies; -my $verbose; -my $supplementalDependencyFile; -my $additionalIdlFiles; - -GetOptions('include=s@' => \@idlDirectories, - 'outputDir=s' => \$outputDirectory, - 'outputHeadersDir=s' => \$outputHeadersDirectory, - 'generator=s' => \$generator, - 'defines=s' => \$defines, - 'filename=s' => \$filename, - 'prefix=s' => \$prefix, - 'preprocessor=s' => \$preprocessor, - 'verbose' => \$verbose, - 'write-dependencies' => \$writeDependencies, - 'supplementalDependencyFile=s' => \$supplementalDependencyFile, - 'additionalIdlFiles=s' => \$additionalIdlFiles); - -my $targetIdlFile = $ARGV[0]; - -print "$targetIdlFile\n"; - -die('Must specify input file.') unless defined($targetIdlFile); -die('Must specify generator') unless defined($generator); -die('Must specify output directory.') unless defined($outputDirectory); - -if (!$outputHeadersDirectory) { - $outputHeadersDirectory = $outputDirectory; -} -$targetIdlFile = Cwd::realpath($targetIdlFile); -if ($verbose) { - print "$generator: $targetIdlFile\n"; -} -my $targetInterfaceName = fileparse(basename($targetIdlFile), ".idl"); - -my $idlFound = 0; -my @supplementedIdlFiles; -if ($supplementalDependencyFile) { - # The format of a supplemental dependency file: - # - # DOMWindow.idl P.idl Q.idl R.idl - # Document.idl S.idl - # Event.idl - # ... - # - # The above indicates that DOMWindow.idl is supplemented by P.idl, Q.idl and R.idl, - # Document.idl is supplemented by S.idl, and Event.idl is supplemented by no IDLs. - # The IDL that supplements another IDL (e.g. P.idl) never appears in the dependency file. - open FH, "< $supplementalDependencyFile" or die "Cannot open $supplementalDependencyFile\n"; - while (my $line = <FH>) { - my ($idlFile, @followingIdlFiles) = split(/\s+/, $line); - if ($idlFile and basename($idlFile) eq basename($targetIdlFile)) { - $idlFound = 1; - @supplementedIdlFiles = @followingIdlFiles; - } - } - close FH; - - # $additionalIdlFiles is list of IDL files which should not be included in - # DerivedSources*.cpp (i.e. they are not described in the supplemental - # dependency file) but should generate .h and .cpp files. - if (!$idlFound and $additionalIdlFiles) { - my @idlFiles = shellwords($additionalIdlFiles); - $idlFound = grep { $_ and basename($_) eq basename($targetIdlFile) } @idlFiles; - } - - if (!$idlFound) { - my $codeGen = CodeGenerator->new(\@idlDirectories, $generator, $outputDirectory, $outputHeadersDirectory, 0, $preprocessor, $writeDependencies, $verbose); - - # We generate empty .h and .cpp files just to tell build scripts that .h and .cpp files are created. - generateEmptyHeaderAndCpp($codeGen->FileNamePrefix(), $targetInterfaceName, $outputHeadersDirectory, $outputDirectory); - exit 0; - } -} - -# Parse the target IDL file. -my $targetParser = IDLParser->new(!$verbose); -my $targetDocument = $targetParser->Parse($targetIdlFile, $defines, $preprocessor); - -# print Dumper($targetDocument); -# exit; - -foreach my $idlFile (@supplementedIdlFiles) { - next if $idlFile eq $targetIdlFile; - - my $interfaceName = fileparse(basename($idlFile), ".idl"); - my $parser = IDLParser->new(!$verbose); - my $document = $parser->Parse($idlFile, $defines, $preprocessor); - - foreach my $interface (@{$document->interfaces}) { - if ($interface->extendedAttributes->{"Supplemental"} and $interface->extendedAttributes->{"Supplemental"} eq $targetInterfaceName) { - my $targetDataNode; - foreach my $interface (@{$targetDocument->interfaces}) { - if ($interface->name eq $targetInterfaceName) { - $targetDataNode = $interface; - last; - } - } - die "Not found an interface ${targetInterfaceName} in ${targetInterfaceName}.idl." unless defined $targetDataNode; - - # Support [Supplemental] for attributes. - foreach my $attribute (@{$interface->attributes}) { - # Record that this attribute is implemented by $interfaceName. - $attribute->signature->extendedAttributes->{"ImplementedBy"} = $interfaceName; - - # Add interface-wide extended attributes to each attribute. - foreach my $extendedAttributeName (keys %{$interface->extendedAttributes}) { - next if ($extendedAttributeName eq "Supplemental"); - $attribute->signature->extendedAttributes->{$extendedAttributeName} = $interface->extendedAttributes->{$extendedAttributeName}; - } - push(@{$targetDataNode->attributes}, $attribute); - } - - # Support [Supplemental] for methods. - foreach my $function (@{$interface->functions}) { - # Record that this method is implemented by $interfaceName. - $function->signature->extendedAttributes->{"ImplementedBy"} = $interfaceName; - - # Add interface-wide extended attributes to each method. - foreach my $extendedAttributeName (keys %{$interface->extendedAttributes}) { - next if ($extendedAttributeName eq "Supplemental"); - $function->signature->extendedAttributes->{$extendedAttributeName} = $interface->extendedAttributes->{$extendedAttributeName}; - } - push(@{$targetDataNode->functions}, $function); - } - - # Support [Supplemental] for constants. - foreach my $constant (@{$interface->constants}) { - # Record that this constant is implemented by $interfaceName. - $constant->extendedAttributes->{"ImplementedBy"} = $interfaceName; - - # Add interface-wide extended attributes to each constant. - foreach my $extendedAttributeName (keys %{$interface->extendedAttributes}) { - next if ($extendedAttributeName eq "Supplemental"); - $constant->extendedAttributes->{$extendedAttributeName} = $interface->extendedAttributes->{$extendedAttributeName}; - } - push(@{$targetDataNode->constants}, $constant); - } - } - } -} - -# Generate desired output for the target IDL file. -my $codeGen = CodeGenerator->new(\@idlDirectories, $generator, $outputDirectory, $outputHeadersDirectory, 0, $preprocessor, $writeDependencies, $verbose, $targetIdlFile); -$codeGen->ProcessDocument($targetDocument, $defines); - -sub generateEmptyHeaderAndCpp -{ - my ($prefix, $targetInterfaceName, $outputHeadersDirectory, $outputDirectory) = @_; - - my $headerName = "${prefix}${targetInterfaceName}.h"; - my $cppName = "${prefix}${targetInterfaceName}.cpp"; - my $contents = "/* - This file is generated just to tell build scripts that $headerName and - $cppName are created for ${targetInterfaceName}.idl, and thus - prevent the build scripts from trying to generate $headerName and - $cppName at every build. This file must not be tried to compile. -*/ -"; - open FH, "> ${outputHeadersDirectory}/${headerName}" or die "Cannot open $headerName\n"; - print FH $contents; - close FH; - - open FH, "> ${outputDirectory}/${cppName}" or die "Cannot open $cppName\n"; - print FH $contents; - close FH; -} |