OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 '''Tool to determine inputs and outputs of a grit file. | 6 '''Tool to determine inputs and outputs of a grit file. |
7 ''' | 7 ''' |
8 | 8 |
9 import optparse | 9 import optparse |
10 import os | 10 import os |
11 import posixpath | 11 import posixpath |
12 import sys | 12 import sys |
13 | 13 |
14 from grit import grd_reader | 14 from grit import grd_reader |
15 from grit import util | 15 from grit import util |
16 | 16 |
17 class WrongNumberOfArguments(Exception): | 17 class WrongNumberOfArguments(Exception): |
18 pass | 18 pass |
19 | 19 |
20 | 20 |
21 def Outputs(filename, defines): | 21 def Outputs(filename, defines, ids_file): |
22 # TODO(joi@chromium.org): The first_ids_file can now be specified | |
23 # via an attribute on the <grit> node. Once a change lands in | |
24 # WebKit to use this attribute, we can stop specifying the | |
25 # first_ids_file parameter here and instead specify it in all grd | |
26 # files. For now, since Chrome is the only user of grit_info.py, | |
27 # this is fine. | |
28 grd = grd_reader.Parse( | 22 grd = grd_reader.Parse( |
29 filename, defines=defines, tags_to_ignore=set(['messages']), | 23 filename, defines=defines, tags_to_ignore=set(['messages']), |
30 first_ids_file='GRIT_DIR/../gritsettings/resource_ids') | 24 first_ids_file=ids_file) |
31 | 25 |
32 target = [] | 26 target = [] |
33 lang_folders = {} | 27 lang_folders = {} |
34 # Add all explicitly-specified output files | 28 # Add all explicitly-specified output files |
35 for output in grd.GetOutputFiles(): | 29 for output in grd.GetOutputFiles(): |
36 path = output.GetFilename() | 30 path = output.GetFilename() |
37 target.append(path) | 31 target.append(path) |
38 | 32 |
39 if path.endswith('.h'): | 33 if path.endswith('.h'): |
40 path, filename = os.path.split(path) | 34 path, filename = os.path.split(path) |
(...skipping 19 matching lines...) Expand all Loading... |
60 def GritSourceFiles(): | 54 def GritSourceFiles(): |
61 files = [] | 55 files = [] |
62 grit_root_dir = os.path.relpath(os.path.dirname(__file__), os.getcwd()) | 56 grit_root_dir = os.path.relpath(os.path.dirname(__file__), os.getcwd()) |
63 for root, dirs, filenames in os.walk(grit_root_dir): | 57 for root, dirs, filenames in os.walk(grit_root_dir): |
64 grit_src = [os.path.join(root, f) for f in filenames | 58 grit_src = [os.path.join(root, f) for f in filenames |
65 if f.endswith('.py')] | 59 if f.endswith('.py')] |
66 files.extend(grit_src) | 60 files.extend(grit_src) |
67 return files | 61 return files |
68 | 62 |
69 | 63 |
70 def Inputs(filename, defines): | 64 def Inputs(filename, defines, ids_file): |
71 # TODO(joi@chromium.org): The first_ids_file can now be specified | |
72 # via an attribute on the <grit> node. Once a change lands in | |
73 # WebKit to use this attribute, we can stop specifying the | |
74 # first_ids_file parameter here and instead specify it in all grd | |
75 # files. For now, since Chrome is the only user of grit_info.py, | |
76 # this is fine. | |
77 grd = grd_reader.Parse( | 65 grd = grd_reader.Parse( |
78 filename, debug=False, defines=defines, tags_to_ignore=set(['messages']), | 66 filename, debug=False, defines=defines, tags_to_ignore=set(['messages']), |
79 first_ids_file='GRIT_DIR/../gritsettings/resource_ids') | 67 first_ids_file=ids_file) |
80 files = set() | 68 files = set() |
81 contexts = set(output.GetContext() for output in grd.GetOutputFiles()) | 69 contexts = set(output.GetContext() for output in grd.GetOutputFiles()) |
82 for node in grd: | 70 for node in grd: |
83 if (node.name == 'structure' or node.name == 'skeleton' or | 71 if (node.name == 'structure' or node.name == 'skeleton' or |
84 (node.name == 'file' and node.parent and | 72 (node.name == 'file' and node.parent and |
85 node.parent.name == 'translations')): | 73 node.parent.name == 'translations')): |
86 # TODO(benrg): This is an awful hack. Do dependencies right. | 74 # TODO(benrg): This is an awful hack. Do dependencies right. |
87 for context in contexts: | 75 for context in contexts: |
88 grd.SetOutputContext(context) | 76 grd.SetOutputContext(context) |
89 if node.SatisfiesOutputCondition(): | 77 if node.SatisfiesOutputCondition(): |
(...skipping 15 matching lines...) Expand all Loading... |
105 files.update(node.GetHtmlResourceFilenames()) | 93 files.update(node.GetHtmlResourceFilenames()) |
106 elif node.name == 'part': | 94 elif node.name == 'part': |
107 if node.SatisfiesOutputCondition(): | 95 if node.SatisfiesOutputCondition(): |
108 files.add(grd.ToRealPath(node.GetInputPath())) | 96 files.add(grd.ToRealPath(node.GetInputPath())) |
109 | 97 |
110 cwd = os.getcwd() | 98 cwd = os.getcwd() |
111 return [os.path.relpath(f, cwd) for f in sorted(files)] | 99 return [os.path.relpath(f, cwd) for f in sorted(files)] |
112 | 100 |
113 | 101 |
114 def PrintUsage(): | 102 def PrintUsage(): |
115 print 'USAGE: ./grit_info.py --inputs [-D foo] <grd-file>' | 103 print 'USAGE: ./grit_info.py --inputs [-D foo] [-f resource_ids] <grd-file>' |
116 print ' ./grit_info.py --outputs [-D foo] <out-prefix> <grd-file>' | 104 print (' ./grit_info.py --outputs [-D foo] [-f resource_ids] ' + |
| 105 '<out-prefix> <grd-file>') |
117 | 106 |
118 | 107 |
119 def DoMain(argv): | 108 def DoMain(argv): |
120 parser = optparse.OptionParser() | 109 parser = optparse.OptionParser() |
121 parser.add_option("--inputs", action="store_true", dest="inputs") | 110 parser.add_option("--inputs", action="store_true", dest="inputs") |
122 parser.add_option("--outputs", action="store_true", dest="outputs") | 111 parser.add_option("--outputs", action="store_true", dest="outputs") |
123 parser.add_option("-D", action="append", dest="defines", default=[]) | 112 parser.add_option("-D", action="append", dest="defines", default=[]) |
124 # grit build also supports '-E KEY=VALUE', support that to share command | 113 # grit build also supports '-E KEY=VALUE', support that to share command |
125 # line flags. | 114 # line flags. |
126 parser.add_option("-E", action="append", dest="build_env", default=[]) | 115 parser.add_option("-E", action="append", dest="build_env", default=[]) |
127 parser.add_option("-w", action="append", dest="whitelist_files", default=[]) | 116 parser.add_option("-w", action="append", dest="whitelist_files", default=[]) |
| 117 parser.add_option("-f", dest="ids_file", |
| 118 default="GRIT_DIR/../gritsettings/resource_ids") |
128 | 119 |
129 options, args = parser.parse_args(argv) | 120 options, args = parser.parse_args(argv) |
130 | 121 |
131 defines = {} | 122 defines = {} |
132 for define in options.defines: | 123 for define in options.defines: |
133 name, val = util.ParseDefine(define) | 124 name, val = util.ParseDefine(define) |
134 defines[name] = val | 125 defines[name] = val |
135 | 126 |
136 if options.inputs: | 127 if options.inputs: |
137 if len(args) > 1: | 128 if len(args) > 1: |
138 raise WrongNumberOfArguments("Expected 0 or 1 arguments for --inputs.") | 129 raise WrongNumberOfArguments("Expected 0 or 1 arguments for --inputs.") |
139 | 130 |
140 inputs = [] | 131 inputs = [] |
141 if len(args) == 1: | 132 if len(args) == 1: |
142 filename = args[0] | 133 filename = args[0] |
143 inputs = Inputs(filename, defines) | 134 inputs = Inputs(filename, defines, options.ids_file) |
144 | 135 |
145 # Add in the grit source files. If one of these change, we want to re-run | 136 # Add in the grit source files. If one of these change, we want to re-run |
146 # grit. | 137 # grit. |
147 inputs.extend(GritSourceFiles()) | 138 inputs.extend(GritSourceFiles()) |
148 inputs = [f.replace('\\', '/') for f in inputs] | 139 inputs = [f.replace('\\', '/') for f in inputs] |
149 | 140 |
150 if len(args) == 1: | 141 if len(args) == 1: |
151 # Include grd file as second input (works around gyp expecting it). | 142 # Include grd file as second input (works around gyp expecting it). |
152 inputs.insert(1, args[0]) | 143 inputs.insert(1, args[0]) |
153 if options.whitelist_files: | 144 if options.whitelist_files: |
154 inputs.extend(options.whitelist_files) | 145 inputs.extend(options.whitelist_files) |
155 return '\n'.join(inputs) | 146 return '\n'.join(inputs) |
156 elif options.outputs: | 147 elif options.outputs: |
157 if len(args) != 2: | 148 if len(args) != 2: |
158 raise WrongNumberOfArguments( | 149 raise WrongNumberOfArguments( |
159 "Expected exactly 2 arguments for --outputs.") | 150 "Expected exactly 2 arguments for --outputs.") |
160 | 151 |
161 prefix, filename = args | 152 prefix, filename = args |
162 outputs = [posixpath.join(prefix, f) for f in Outputs(filename, defines)] | 153 outputs = [posixpath.join(prefix, f) |
| 154 for f in Outputs(filename, defines, options.ids_file)] |
163 return '\n'.join(outputs) | 155 return '\n'.join(outputs) |
164 else: | 156 else: |
165 raise WrongNumberOfArguments("Expected --inputs or --outputs.") | 157 raise WrongNumberOfArguments("Expected --inputs or --outputs.") |
166 | 158 |
167 | 159 |
168 def main(argv): | 160 def main(argv): |
169 if sys.version_info < (2, 6): | 161 if sys.version_info < (2, 6): |
170 print "GRIT requires Python 2.6 or later." | 162 print "GRIT requires Python 2.6 or later." |
171 return 1 | 163 return 1 |
172 | 164 |
173 try: | 165 try: |
174 result = DoMain(argv[1:]) | 166 result = DoMain(argv[1:]) |
175 except WrongNumberOfArguments, e: | 167 except WrongNumberOfArguments, e: |
176 PrintUsage() | 168 PrintUsage() |
177 print e | 169 print e |
178 return 1 | 170 return 1 |
179 print result | 171 print result |
180 return 0 | 172 return 0 |
181 | 173 |
182 | 174 |
183 if __name__ == '__main__': | 175 if __name__ == '__main__': |
184 sys.exit(main(sys.argv)) | 176 sys.exit(main(sys.argv)) |
OLD | NEW |