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

Side by Side Diff: Source/bindings/scripts/code_generator_v8.py

Issue 24156003: Revert IDL compiler build flow to Perl, rename 'deprecated' (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase Created 7 years, 3 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 # Copyright (C) 2013 Google Inc. All rights reserved.
2 #
3 # Redistribution and use in source and binary forms, with or without
4 # modification, are permitted provided that the following conditions are
5 # met:
6 #
7 # * Redistributions of source code must retain the above copyright
8 # notice, this list of conditions and the following disclaimer.
9 # * Redistributions in binary form must reproduce the above
10 # copyright notice, this list of conditions and the following disclaimer
11 # in the documentation and/or other materials provided with the
12 # distribution.
13 # * Neither the name of Google Inc. nor the names of its
14 # contributors may be used to endorse or promote products derived from
15 # this software without specific prior written permission.
16 #
17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 """Generate Blink V8 bindings (.h and .cpp files).
30
31 Input: An object of class IdlDefinitions, containing an IDL interface X
32 Output: V8X.h and V8X.cpp
33 """
34
35 import os
36 import posixpath
37 import sys
38
39 # jinja2 is in chromium's third_party directory.
40 module_path, module_name = os.path.split(__file__)
41 third_party = os.path.join(module_path, os.pardir, os.pardir, os.pardir, os.pard ir)
42 # Insert at front to override system libraries, and after path[0] == script dir
43 sys.path.insert(1, third_party)
44 import jinja2
45
46 templates_dir = os.path.join(module_path, os.pardir, 'templates')
47
48 import v8_callback_interface
49 import v8_interface
50 from v8_utilities import cpp_class_name, generate_conditional_string, v8_class_n ame
51
52
53 class CodeGeneratorV8:
54 def __init__(self, definitions, interface_name, output_directory, relative_d ir_posix, idl_directories, verbose=False):
55 self.idl_definitions = definitions
56 self.interface_name = interface_name
57 self.idl_directories = idl_directories
58 self.output_directory = output_directory
59 self.verbose = verbose
60 # FIXME: remove definitions check when remove write_dummy_header_and_cpp
61 if not definitions:
62 return
63 try:
64 self.interface = definitions.interfaces[interface_name]
65 except KeyError:
66 raise Exception('%s not in IDL definitions' % interface_name)
67 if self.interface.is_callback:
68 header_template_filename = 'callback_interface.h'
69 cpp_template_filename = 'callback_interface.cpp'
70 self.generate_contents = v8_callback_interface.generate_callback_int erface
71 else:
72 header_template_filename = 'interface.h'
73 cpp_template_filename = 'interface.cpp'
74 self.generate_contents = v8_interface.generate_interface
75 # FIXME: update to Jinja 2.7 and use:
76 # keep_trailing_newline=True, # newline-terminate generated files
77 # lstrip_blocks=True, # so can indent control flow tags
78 jinja_env = jinja2.Environment(
79 loader=jinja2.FileSystemLoader(templates_dir),
80 trim_blocks=True)
81 self.header_template = jinja_env.get_template(header_template_filename)
82 self.cpp_template = jinja_env.get_template(cpp_template_filename)
83
84 class_name = cpp_class_name(self.interface)
85 self.include_for_cpp_class = posixpath.join(relative_dir_posix, class_na me + '.h')
86
87 def write_dummy_header_and_cpp(self):
88 # FIXME: fix GYP so these files aren't needed and remove this method
89 target_interface_name = self.interface_name
90 header_basename = 'V8%s.h' % target_interface_name
91 cpp_basename = 'V8%s.cpp' % target_interface_name
92 contents = """/*
93 This file is generated just to tell build scripts that {header_basename} and
94 {cpp_basename} are created for {target_interface_name}.idl, and thus
95 prevent the build scripts from trying to generate {header_basename} and
96 {cpp_basename} at every build. This file must not be tried to compile.
97 */
98 """.format(**locals())
99 self.write_file(header_basename, contents)
100 self.write_file(cpp_basename, contents)
101
102 def write_header_and_cpp(self):
103 interface = self.interface
104 template_contents = self.generate_contents(interface)
105 template_contents['conditional_string'] = generate_conditional_string(in terface)
106 template_contents['header_includes'].add(self.include_for_cpp_class)
107 template_contents['header_includes'] = sorted(template_contents['header_ includes'])
108 template_contents['cpp_includes'] = sorted(template_contents['cpp_includ es'])
109
110 header_basename = v8_class_name(interface) + '.h'
111 header_file_text = self.header_template.render(template_contents)
112 self.write_file(header_basename, header_file_text)
113
114 cpp_basename = v8_class_name(interface) + '.cpp'
115 cpp_file_text = self.cpp_template.render(template_contents)
116 self.write_file(cpp_basename, cpp_file_text)
117
118 def write_file(self, basename, file_text):
119 filename = os.path.join(self.output_directory, basename)
120 with open(filename, 'w') as output_file:
121 output_file.write(file_text)
OLDNEW
« no previous file with comments | « Source/bindings/scripts/code_generator_v8.pm ('k') | Source/bindings/scripts/deprecated_code_generator_v8.pm » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698