OLD | NEW |
(Empty) | |
| 1 #!/usr/bin/python |
| 2 |
| 3 # Copyright (c) 2009 The Chromium Authors. All rights reserved. |
| 4 # Use of this source code is governed by a BSD-style license that can be |
| 5 # found in the LICENSE file. |
| 6 |
| 7 # usage: rule_binding.py INPUT CPPDIR HDIR -- INPUTS -- OPTIONS |
| 8 # |
| 9 # INPUT is an IDL file, such as Whatever.idl. |
| 10 # |
| 11 # CPPDIR is the directory into which V8Whatever.cpp will be placed. HDIR is |
| 12 # the directory into which V8Whatever.h will be placed. |
| 13 # |
| 14 # The first item in INPUTS is the path to generate-bindings.pl. Remaining |
| 15 # items in INPUTS are used to build the Perl module include path. |
| 16 # |
| 17 # OPTIONS are passed as-is to generate-bindings.pl as additional arguments. |
| 18 |
| 19 |
| 20 import errno |
| 21 import os |
| 22 import shutil |
| 23 import subprocess |
| 24 import sys |
| 25 |
| 26 |
| 27 def SplitArgsIntoSections(args): |
| 28 sections = [] |
| 29 while len(args) > 0: |
| 30 if not '--' in args: |
| 31 # If there is no '--' left, everything remaining is an entire section. |
| 32 dashes = len(args) |
| 33 else: |
| 34 dashes = args.index('--') |
| 35 |
| 36 sections.append(args[:dashes]) |
| 37 |
| 38 # Next time through the loop, look at everything after this '--'. |
| 39 if dashes + 1 == len(args): |
| 40 # If the '--' is at the end of the list, we won't come back through the |
| 41 # loop again. Add an empty section now corresponding to the nothingness |
| 42 # following the final '--'. |
| 43 args = [] |
| 44 sections.append(args) |
| 45 else: |
| 46 args = args[dashes + 1:] |
| 47 |
| 48 return sections |
| 49 |
| 50 |
| 51 def main(args): |
| 52 sections = SplitArgsIntoSections(args[1:]) |
| 53 assert len(sections) == 3 |
| 54 (base, inputs, options) = sections |
| 55 |
| 56 assert len(base) == 3 |
| 57 input = base[0] |
| 58 cppdir = base[1] |
| 59 hdir = base[2] |
| 60 |
| 61 assert len(inputs) > 1 |
| 62 generate_bindings = inputs[0] |
| 63 perl_modules = inputs[1:] |
| 64 |
| 65 include_dirs = [] |
| 66 for perl_module in perl_modules: |
| 67 include_dir = os.path.dirname(perl_module) |
| 68 if not include_dir in include_dirs: |
| 69 include_dirs.append(include_dir) |
| 70 |
| 71 # Build up the command. |
| 72 command = ['perl', '-w'] |
| 73 for include_dir in include_dirs: |
| 74 command.extend(['-I', include_dir]) |
| 75 command.append(generate_bindings) |
| 76 command.extend(options) |
| 77 command.extend(['--outputdir', cppdir, input]) |
| 78 |
| 79 # Do it. check_call is new in 2.5, so simulate its behavior with call and |
| 80 # assert. |
| 81 return_code = subprocess.call(command) |
| 82 assert return_code == 0 |
| 83 |
| 84 # Both the .cpp and .h were generated in cppdir, but if hdir is different, |
| 85 # the .h needs to move. Copy it instead of using os.rename for maximum |
| 86 # portability in all cases. |
| 87 if cppdir != hdir: |
| 88 input_basename = os.path.basename(input) |
| 89 (root, ext) = os.path.splitext(input_basename) |
| 90 hname = 'V8%s.h' % root |
| 91 hsrc = os.path.join(cppdir, hname) |
| 92 hdst = os.path.join(hdir, hname) |
| 93 shutil.copyfile(hsrc, hdst) |
| 94 os.unlink(hsrc) |
| 95 |
| 96 return return_code |
| 97 |
| 98 |
| 99 if __name__ == '__main__': |
| 100 sys.exit(main(sys.argv)) |
OLD | NEW |