Index: webkit/build/rule_binding.py |
=================================================================== |
--- webkit/build/rule_binding.py (revision 0) |
+++ webkit/build/rule_binding.py (revision 0) |
@@ -0,0 +1,100 @@ |
+#!/usr/bin/python |
+ |
+# Copyright (c) 2009 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+ |
+# usage: rule_binding.py INPUT CPPDIR HDIR -- INPUTS -- OPTIONS |
+# |
+# INPUT is an IDL file, such as Whatever.idl. |
+# |
+# CPPDIR is the directory into which V8Whatever.cpp will be placed. HDIR is |
+# the directory into which V8Whatever.h will be placed. |
+# |
+# The first item in INPUTS is the path to generate-bindings.pl. Remaining |
+# items in INPUTS are used to build the Perl module include path. |
+# |
+# OPTIONS are passed as-is to generate-bindings.pl as additional arguments. |
+ |
+ |
+import errno |
+import os |
+import shutil |
+import subprocess |
+import sys |
+ |
+ |
+def SplitArgsIntoSections(args): |
+ sections = [] |
+ while len(args) > 0: |
+ if not '--' in args: |
+ # If there is no '--' left, everything remaining is an entire section. |
+ dashes = len(args) |
+ else: |
+ dashes = args.index('--') |
+ |
+ sections.append(args[:dashes]) |
+ |
+ # Next time through the loop, look at everything after this '--'. |
+ if dashes + 1 == len(args): |
+ # If the '--' is at the end of the list, we won't come back through the |
+ # loop again. Add an empty section now corresponding to the nothingness |
+ # following the final '--'. |
+ args = [] |
+ sections.append(args) |
+ else: |
+ args = args[dashes + 1:] |
+ |
+ return sections |
+ |
+ |
+def main(args): |
+ sections = SplitArgsIntoSections(args[1:]) |
+ assert len(sections) == 3 |
+ (base, inputs, options) = sections |
+ |
+ assert len(base) == 3 |
+ input = base[0] |
+ cppdir = base[1] |
+ hdir = base[2] |
+ |
+ assert len(inputs) > 1 |
+ generate_bindings = inputs[0] |
+ perl_modules = inputs[1:] |
+ |
+ include_dirs = [] |
+ for perl_module in perl_modules: |
+ include_dir = os.path.dirname(perl_module) |
+ if not include_dir in include_dirs: |
+ include_dirs.append(include_dir) |
+ |
+ # Build up the command. |
+ command = ['perl', '-w'] |
+ for include_dir in include_dirs: |
+ command.extend(['-I', include_dir]) |
+ command.append(generate_bindings) |
+ command.extend(options) |
+ command.extend(['--outputdir', cppdir, input]) |
+ |
+ # Do it. check_call is new in 2.5, so simulate its behavior with call and |
+ # assert. |
+ return_code = subprocess.call(command) |
+ assert return_code == 0 |
+ |
+ # Both the .cpp and .h were generated in cppdir, but if hdir is different, |
+ # the .h needs to move. Copy it instead of using os.rename for maximum |
+ # portability in all cases. |
+ if cppdir != hdir: |
+ input_basename = os.path.basename(input) |
+ (root, ext) = os.path.splitext(input_basename) |
+ hname = 'V8%s.h' % root |
+ hsrc = os.path.join(cppdir, hname) |
+ hdst = os.path.join(hdir, hname) |
+ shutil.copyfile(hsrc, hdst) |
+ os.unlink(hsrc) |
+ |
+ return return_code |
+ |
+ |
+if __name__ == '__main__': |
+ sys.exit(main(sys.argv)) |
Property changes on: webkit/build/rule_binding.py |
___________________________________________________________________ |
Added: svn:executable |
+ * |
Added: svn:eol-style |
+ LF |