OLD | NEW |
---|---|
1 #!/usr/bin/python | 1 #!/usr/bin/python |
2 | 2 |
3 # Copyright (c) 2009 The Chromium Authors. All rights reserved. | 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 | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 # usage: rule_binding.py INPUT CPPDIR HDIR -- INPUTS -- OPTIONS | 7 # usage: rule_binding.py INPUT CPPDIR HDIR -- INPUTS -- OPTIONS |
8 # | 8 # |
9 # INPUT is an IDL file, such as Whatever.idl. | 9 # INPUT is an IDL file, such as Whatever.idl. |
10 # | 10 # |
11 # CPPDIR is the directory into which V8Whatever.cpp will be placed. HDIR is | 11 # CPPDIR is the directory into which V8Whatever.cpp will be placed. HDIR is |
12 # the directory into which V8Whatever.h will be placed. | 12 # the directory into which V8Whatever.h will be placed. |
13 # | 13 # |
14 # The first item in INPUTS is the path to generate-bindings.pl. Remaining | 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. | 15 # items in INPUTS are used to build the Perl module include path. |
16 # | 16 # |
17 # OPTIONS are passed as-is to generate-bindings.pl as additional arguments. | 17 # OPTIONS are passed as-is to generate-bindings.pl as additional arguments. |
18 | 18 |
19 | 19 |
20 import errno | 20 import errno |
21 import os | 21 import os |
22 import shlex | |
22 import shutil | 23 import shutil |
23 import subprocess | 24 import subprocess |
24 import sys | 25 import sys |
25 | 26 |
26 | 27 |
27 def SplitArgsIntoSections(args): | 28 def SplitArgsIntoSections(args): |
28 sections = [] | 29 sections = [] |
29 while len(args) > 0: | 30 while len(args) > 0: |
30 if not '--' in args: | 31 if not '--' in args: |
31 # If there is no '--' left, everything remaining is an entire section. | 32 # If there is no '--' left, everything remaining is an entire section. |
(...skipping 29 matching lines...) Expand all Loading... | |
61 assert len(inputs) > 1 | 62 assert len(inputs) > 1 |
62 generate_bindings = inputs[0] | 63 generate_bindings = inputs[0] |
63 perl_modules = inputs[1:] | 64 perl_modules = inputs[1:] |
64 | 65 |
65 include_dirs = [] | 66 include_dirs = [] |
66 for perl_module in perl_modules: | 67 for perl_module in perl_modules: |
67 include_dir = os.path.dirname(perl_module) | 68 include_dir = os.path.dirname(perl_module) |
68 if not include_dir in include_dirs: | 69 if not include_dir in include_dirs: |
69 include_dirs.append(include_dir) | 70 include_dirs.append(include_dir) |
70 | 71 |
72 # The defines come in as one flat string. Split it up into distinct arguments. | |
73 if '--defines' in options: | |
74 defines_index = options.index('--defines') | |
75 if defines_index + 1 < len(options): | |
76 split_options = shlex.split(options[defines_index + 1]) | |
77 if split_options: | |
78 options[defines_index + 1:defines_index + 2] = \ | |
Mark Mentovai
2009/07/06 18:26:47
If we're just doing ' '.join, you don't need to sp
| |
79 [' '.join(split_options)] | |
80 | |
71 # Build up the command. | 81 # Build up the command. |
72 command = ['perl', '-w'] | 82 command = ['perl', '-w'] |
73 for include_dir in include_dirs: | 83 for include_dir in include_dirs: |
74 command.extend(['-I', include_dir]) | 84 command.extend(['-I', include_dir]) |
75 command.append(generate_bindings) | 85 command.append(generate_bindings) |
76 # Remove any qouble qoutes that may have gotten in here. We know that none of | 86 command.extend(options) |
77 # the options will have meaningful double qoutes. | |
78 command.extend([option.replace('"', '') for option in options]) | |
79 command.extend(['--outputDir', cppdir, input]) | 87 command.extend(['--outputDir', cppdir, input]) |
80 | 88 |
81 # Do it. check_call is new in 2.5, so simulate its behavior with call and | 89 # Do it. check_call is new in 2.5, so simulate its behavior with call and |
82 # assert. | 90 # assert. |
83 return_code = subprocess.call(command) | 91 return_code = subprocess.call(command) |
84 assert return_code == 0 | 92 assert return_code == 0 |
85 | 93 |
86 # Both the .cpp and .h were generated in cppdir, but if hdir is different, | 94 # Both the .cpp and .h were generated in cppdir, but if hdir is different, |
87 # the .h needs to move. Copy it instead of using os.rename for maximum | 95 # the .h needs to move. Copy it instead of using os.rename for maximum |
88 # portability in all cases. | 96 # portability in all cases. |
89 if cppdir != hdir: | 97 if cppdir != hdir: |
90 input_basename = os.path.basename(input) | 98 input_basename = os.path.basename(input) |
91 (root, ext) = os.path.splitext(input_basename) | 99 (root, ext) = os.path.splitext(input_basename) |
92 hname = 'V8%s.h' % root | 100 hname = 'V8%s.h' % root |
93 hsrc = os.path.join(cppdir, hname) | 101 hsrc = os.path.join(cppdir, hname) |
94 hdst = os.path.join(hdir, hname) | 102 hdst = os.path.join(hdir, hname) |
95 shutil.copyfile(hsrc, hdst) | 103 shutil.copyfile(hsrc, hdst) |
96 os.unlink(hsrc) | 104 os.unlink(hsrc) |
97 | 105 |
98 return return_code | 106 return return_code |
99 | 107 |
100 | 108 |
101 if __name__ == '__main__': | 109 if __name__ == '__main__': |
102 sys.exit(main(sys.argv)) | 110 sys.exit(main(sys.argv)) |
OLD | NEW |