Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(337)

Unified Diff: Source/bindings/scripts/generate-bindings.pl

Issue 18190004: Add Python flow to bindings generation, move dummy-generating IDL files over (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebased Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/bindings/scripts/deprecated_idl_serializer.pm ('k') | Source/bindings/scripts/idl_compiler.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/bindings/scripts/generate-bindings.pl
diff --git a/Source/bindings/scripts/generate-bindings.pl b/Source/bindings/scripts/generate-bindings.pl
deleted file mode 100755
index e14e5e2b00675879a398fa44e47cad0cfa023d4c..0000000000000000000000000000000000000000
--- a/Source/bindings/scripts/generate-bindings.pl
+++ /dev/null
@@ -1,311 +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 Cwd;
-
-use IDLParser;
-use CodeGeneratorV8;
-use IDLSerializer;
-
-my @idlDirectories;
-my $outputDirectory;
-my $defines;
-my $filename;
-my $preprocessor;
-my $verbose;
-my $interfaceDependenciesFile;
-my $additionalIdlFiles;
-my $idlAttributesFile;
-my $writeFileOnlyIfChanged;
-
-GetOptions('include=s@' => \@idlDirectories,
- 'outputDir=s' => \$outputDirectory,
- 'defines=s' => \$defines,
- 'filename=s' => \$filename,
- 'preprocessor=s' => \$preprocessor,
- 'verbose' => \$verbose,
- 'interfaceDependenciesFile=s' => \$interfaceDependenciesFile,
- 'additionalIdlFiles=s' => \$additionalIdlFiles,
- 'idlAttributesFile=s' => \$idlAttributesFile,
- 'write-file-only-if-changed=s' => \$writeFileOnlyIfChanged);
-
-my $targetIdlFile = $ARGV[0];
-
-die('Must specify input file.') unless defined($targetIdlFile);
-die('Must specify output directory.') unless defined($outputDirectory);
-$defines = "" unless defined($defines);
-
-$targetIdlFile = Cwd::realpath($targetIdlFile);
-if ($verbose) {
- print "$targetIdlFile\n";
-}
-my $targetInterfaceName = fileparse(basename($targetIdlFile), ".idl");
-
-my $idlFound = 0;
-my @dependencyIdlFiles;
-if ($interfaceDependenciesFile) {
- # The format of the interface dependencies file:
- #
- # Window.idl P.idl Q.idl R.idl
- # Document.idl S.idl
- # Event.idl
- # ...
- #
- # The above indicates that Window.idl depends on P.idl, Q.idl, and R.idl,
- # Document.idl depends on S.idl, and Event.idl depends on no IDLs.
- # A dependency IDL file (one that is depended on by another IDL, e.g. P.idl
- # in the above) does not have its own entry in the dependency file.
- open FH, "< $interfaceDependenciesFile" or die "Cannot open $interfaceDependenciesFile\n";
- while (my $line = <FH>) {
- my ($idlFile, @followingIdlFiles) = split(/\s+/, $line);
- if ($idlFile and basename($idlFile) eq basename($targetIdlFile)) {
- $idlFound = 1;
- # We sort the dependency IDL files so that the corresponding code is generated
- # in a consistent order. This is important for the bindings tests.
- @dependencyIdlFiles = sort @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 interface
- # dependencies 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) {
- # We generate empty .h and .cpp files just to tell build scripts that .h and .cpp files are created.
- generateEmptyHeaderAndCpp($targetInterfaceName, $outputDirectory);
- exit 0;
- }
-}
-
-# Parse the target IDL file.
-my $targetParser = IDLParser->new(!$verbose);
-my $targetDocument = $targetParser->Parse($targetIdlFile, $defines, $preprocessor);
-
-if ($idlAttributesFile) {
- my $idlAttributes = loadIDLAttributes($idlAttributesFile);
- checkIDLAttributes($idlAttributes, $targetDocument, basename($targetIdlFile));
-}
-
-foreach my $idlFile (@dependencyIdlFiles) {
- 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->isPartial || $interface->name 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 for attributes of partial interfaces.
- foreach my $attribute (@{$interface->attributes}) {
- # Record that this attribute is implemented by $interfaceName.
- $attribute->extendedAttributes->{"ImplementedBy"} = $interfaceName if $interface->isPartial;
-
- # Add interface-wide extended attributes to each attribute.
- applyInterfaceExtendedAttributes($interface, $attribute->extendedAttributes);
-
- push(@{$targetDataNode->attributes}, $attribute);
- }
-
- # Support for methods of partial interfaces.
- foreach my $function (@{$interface->functions}) {
- # Record that this method is implemented by $interfaceName.
- $function->extendedAttributes->{"ImplementedBy"} = $interfaceName if $interface->isPartial;
-
- # Add interface-wide extended attributes to each method.
- applyInterfaceExtendedAttributes($interface, $function->extendedAttributes);
-
- push(@{$targetDataNode->functions}, $function);
- }
-
- # Support for constants of partial interfaces.
- foreach my $constant (@{$interface->constants}) {
- # Record that this constant is implemented by $interfaceName.
- $constant->extendedAttributes->{"ImplementedBy"} = $interfaceName if $interface->isPartial;
-
- # Add interface-wide extended attributes to each constant.
- applyInterfaceExtendedAttributes($interface, $constant->extendedAttributes);
-
- push(@{$targetDataNode->constants}, $constant);
- }
- } else {
- die "$idlFile is not a dependency of $targetIdlFile. There maybe a bug in the dependency computer (compute_dependencies.py).\n";
- }
- }
-}
-
-# FIXME: This code will be removed once IDLParser.pm and CodeGeneratorV8.pm
-# are connected via JSON files. See http://crbug.com/242795
-$targetDocument = deserializeJSON(serializeJSON($targetDocument));
-
-# Generate desired output for the target IDL file.
-my @interfaceIdlFiles = ($targetDocument->fileName(), @dependencyIdlFiles);
-my $codeGenerator = CodeGeneratorV8->new($targetDocument, \@idlDirectories, $preprocessor, $defines, $verbose, \@interfaceIdlFiles, $writeFileOnlyIfChanged);
-my $interfaces = $targetDocument->interfaces;
-foreach my $interface (@$interfaces) {
- print "Generating bindings code for IDL interface \"" . $interface->name . "\"...\n" if $verbose;
- $codeGenerator->GenerateInterface($interface);
- $codeGenerator->WriteData($interface, $outputDirectory);
-}
-
-sub generateEmptyHeaderAndCpp
-{
- my ($targetInterfaceName, $outputDirectory) = @_;
-
- my $headerName = "V8${targetInterfaceName}.h";
- my $cppName = "V8${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, "> ${outputDirectory}/${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;
-}
-
-sub loadIDLAttributes
-{
- my $idlAttributesFile = shift;
-
- my %idlAttributes;
- open FH, "<", $idlAttributesFile or die "Couldn't open $idlAttributesFile: $!";
- while (my $line = <FH>) {
- chomp $line;
- next if $line =~ /^\s*#/;
- next if $line =~ /^\s*$/;
-
- if ($line =~ /^\s*([^=\s]*)\s*=?\s*(.*)/) {
- my $name = $1;
- $idlAttributes{$name} = {};
- if ($2) {
- foreach my $rightValue (split /\|/, $2) {
- $rightValue =~ s/^\s*|\s*$//g;
- $rightValue = "VALUE_IS_MISSING" unless $rightValue;
- $idlAttributes{$name}{$rightValue} = 1;
- }
- } else {
- $idlAttributes{$name}{"VALUE_IS_MISSING"} = 1;
- }
- } else {
- die "The format of " . basename($idlAttributesFile) . " is wrong: line $.\n";
- }
- }
- close FH;
-
- return \%idlAttributes;
-}
-
-sub checkIDLAttributes
-{
- my $idlAttributes = shift;
- my $document = shift;
- my $idlFile = shift;
-
- foreach my $interface (@{$document->interfaces}) {
- checkIfIDLAttributesExists($idlAttributes, $interface->extendedAttributes, $idlFile);
-
- foreach my $attribute (@{$interface->attributes}) {
- checkIfIDLAttributesExists($idlAttributes, $attribute->extendedAttributes, $idlFile);
- }
-
- foreach my $function (@{$interface->functions}) {
- checkIfIDLAttributesExists($idlAttributes, $function->extendedAttributes, $idlFile);
- foreach my $parameter (@{$function->parameters}) {
- checkIfIDLAttributesExists($idlAttributes, $parameter->extendedAttributes, $idlFile);
- }
- }
- }
-}
-
-sub applyInterfaceExtendedAttributes
-{
- my $interface = shift;
- my $extendedAttributes = shift;
-
- foreach my $extendedAttributeName (keys %{$interface->extendedAttributes}) {
- next if $extendedAttributeName eq "ImplementedAs";
- $extendedAttributes->{$extendedAttributeName} = $interface->extendedAttributes->{$extendedAttributeName};
- }
-}
-
-sub checkIfIDLAttributesExists
-{
- my $idlAttributes = shift;
- my $extendedAttributes = shift;
- my $idlFile = shift;
-
- my $error;
- OUTER: for my $name (keys %$extendedAttributes) {
- if (!exists $idlAttributes->{$name}) {
- $error = "Unknown IDL attribute [$name] is found at $idlFile.";
- last OUTER;
- }
- if ($idlAttributes->{$name}{"*"}) {
- next;
- }
- for my $rightValue (split /\s*[|&]\s*/, $extendedAttributes->{$name}) {
- if (!exists $idlAttributes->{$name}{$rightValue}) {
- $error = "Unknown IDL attribute [$name=" . $extendedAttributes->{$name} . "] is found at $idlFile.";
- last OUTER;
- }
- }
- }
- if ($error) {
- die "IDL ATTRIBUTE CHECKER ERROR: $error
-If you want to add a new IDL attribute, you need to add it to bindings/scripts/IDLAttributes.txt and add explanations to the Blink IDL document (http://chromium.org/blink/webidl).
-";
- }
-}
« no previous file with comments | « Source/bindings/scripts/deprecated_idl_serializer.pm ('k') | Source/bindings/scripts/idl_compiler.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698