diff options
Diffstat (limited to 'webkit/build/rule_binding.py')
-rwxr-xr-x | webkit/build/rule_binding.py | 100 |
1 files changed, 100 insertions, 0 deletions
diff --git a/webkit/build/rule_binding.py b/webkit/build/rule_binding.py new file mode 100755 index 0000000..96040ee --- /dev/null +++ b/webkit/build/rule_binding.py @@ -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)) |