| 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 '''The 'grit build' tool along with integration for this tool with the | 6 '''The 'grit build' tool along with integration for this tool with the |
| 7 SCons build system. | 7 SCons build system. |
| 8 ''' | 8 ''' |
| 9 | 9 |
| 10 import codecs | 10 import codecs |
| 11 import filecmp | 11 import filecmp |
| 12 import getopt | 12 import getopt |
| 13 import os | 13 import os |
| 14 import shutil | 14 import shutil |
| 15 import sys | 15 import sys |
| 16 | 16 |
| 17 from grit import grd_reader | 17 from grit import grd_reader |
| 18 from grit import shortcuts |
| 18 from grit import util | 19 from grit import util |
| 20 from grit.node import include |
| 21 from grit.node import message |
| 22 from grit.node import structure |
| 19 from grit.tool import interface | 23 from grit.tool import interface |
| 20 from grit import shortcuts | |
| 21 | 24 |
| 22 | 25 |
| 23 # It would be cleaner to have each module register itself, but that would | 26 # It would be cleaner to have each module register itself, but that would |
| 24 # require importing all of them on every run of GRIT. | 27 # require importing all of them on every run of GRIT. |
| 25 '''Map from <output> node types to modules under grit.format.''' | 28 '''Map from <output> node types to modules under grit.format.''' |
| 26 _format_modules = { | 29 _format_modules = { |
| 27 'android': 'android_xml', | 30 'android': 'android_xml', |
| 28 'c_format': 'c_format', | 31 'c_format': 'c_format', |
| 29 'chrome_messages_json': 'chrome_messages_json', | 32 'chrome_messages_json': 'chrome_messages_json', |
| 30 'data_package': 'data_pack', | 33 'data_package': 'data_pack', |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 first_ids_file = None | 141 first_ids_file = None |
| 139 whitelist_filenames = [] | 142 whitelist_filenames = [] |
| 140 assert_output_files = [] | 143 assert_output_files = [] |
| 141 target_platform = None | 144 target_platform = None |
| 142 depfile = None | 145 depfile = None |
| 143 depdir = None | 146 depdir = None |
| 144 rc_header_format = None | 147 rc_header_format = None |
| 145 output_all_resource_defines = None | 148 output_all_resource_defines = None |
| 146 write_only_new = False | 149 write_only_new = False |
| 147 depend_on_stamp = False | 150 depend_on_stamp = False |
| 151 replace_ellipsis = True |
| 148 (own_opts, args) = getopt.getopt(args, 'a:o:D:E:f:w:t:h:', | 152 (own_opts, args) = getopt.getopt(args, 'a:o:D:E:f:w:t:h:', |
| 149 ('depdir=','depfile=','assert-file-list=', | 153 ('depdir=','depfile=','assert-file-list=', |
| 150 'output-all-resource-defines', | 154 'output-all-resource-defines', |
| 151 'no-output-all-resource-defines', | 155 'no-output-all-resource-defines', |
| 156 'no-replace-ellipsis', |
| 152 'depend-on-stamp', | 157 'depend-on-stamp', |
| 153 'write-only-new=')) | 158 'write-only-new=')) |
| 154 for (key, val) in own_opts: | 159 for (key, val) in own_opts: |
| 155 if key == '-a': | 160 if key == '-a': |
| 156 assert_output_files.append(val) | 161 assert_output_files.append(val) |
| 157 elif key == '--assert-file-list': | 162 elif key == '--assert-file-list': |
| 158 with open(val) as f: | 163 with open(val) as f: |
| 159 assert_output_files += f.read().splitlines() | 164 assert_output_files += f.read().splitlines() |
| 160 elif key == '-o': | 165 elif key == '-o': |
| 161 self.output_directory = val | 166 self.output_directory = val |
| 162 elif key == '-D': | 167 elif key == '-D': |
| 163 name, val = util.ParseDefine(val) | 168 name, val = util.ParseDefine(val) |
| 164 self.defines[name] = val | 169 self.defines[name] = val |
| 165 elif key == '-E': | 170 elif key == '-E': |
| 166 (env_name, env_value) = val.split('=', 1) | 171 (env_name, env_value) = val.split('=', 1) |
| 167 os.environ[env_name] = env_value | 172 os.environ[env_name] = env_value |
| 168 elif key == '-f': | 173 elif key == '-f': |
| 169 # TODO(joi@chromium.org): Remove this override once change | 174 # TODO(joi@chromium.org): Remove this override once change |
| 170 # lands in WebKit.grd to specify the first_ids_file in the | 175 # lands in WebKit.grd to specify the first_ids_file in the |
| 171 # .grd itself. | 176 # .grd itself. |
| 172 first_ids_file = val | 177 first_ids_file = val |
| 173 elif key == '-w': | 178 elif key == '-w': |
| 174 whitelist_filenames.append(val) | 179 whitelist_filenames.append(val) |
| 175 elif key == '--output-all-resource-defines': | 180 elif key == '--output-all-resource-defines': |
| 176 output_all_resource_defines = True | 181 output_all_resource_defines = True |
| 177 elif key == '--no-output-all-resource-defines': | 182 elif key == '--no-output-all-resource-defines': |
| 178 output_all_resource_defines = False | 183 output_all_resource_defines = False |
| 184 elif key == '--no-replace-ellipsis': |
| 185 replace_ellipsis = False |
| 179 elif key == '-t': | 186 elif key == '-t': |
| 180 target_platform = val | 187 target_platform = val |
| 181 elif key == '-h': | 188 elif key == '-h': |
| 182 rc_header_format = val | 189 rc_header_format = val |
| 183 elif key == '--depdir': | 190 elif key == '--depdir': |
| 184 depdir = val | 191 depdir = val |
| 185 elif key == '--depfile': | 192 elif key == '--depfile': |
| 186 depfile = val | 193 depfile = val |
| 187 elif key == '--write-only-new': | 194 elif key == '--write-only-new': |
| 188 write_only_new = val != '0' | 195 write_only_new = val != '0' |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 220 if output_all_resource_defines is not None: | 227 if output_all_resource_defines is not None: |
| 221 self.res.SetShouldOutputAllResourceDefines(output_all_resource_defines) | 228 self.res.SetShouldOutputAllResourceDefines(output_all_resource_defines) |
| 222 | 229 |
| 223 # Set an output context so that conditionals can use defines during the | 230 # Set an output context so that conditionals can use defines during the |
| 224 # gathering stage; we use a dummy language here since we are not outputting | 231 # gathering stage; we use a dummy language here since we are not outputting |
| 225 # a specific language. | 232 # a specific language. |
| 226 self.res.SetOutputLanguage('en') | 233 self.res.SetOutputLanguage('en') |
| 227 if rc_header_format: | 234 if rc_header_format: |
| 228 self.res.AssignRcHeaderFormat(rc_header_format) | 235 self.res.AssignRcHeaderFormat(rc_header_format) |
| 229 self.res.RunGatherers() | 236 self.res.RunGatherers() |
| 237 |
| 238 # Replace ... with the single-character version. http://crbug.com/621772 |
| 239 if replace_ellipsis: |
| 240 for node in self.res: |
| 241 if isinstance(node, message.MessageNode): |
| 242 node.SetReplaceEllipsis(True) |
| 243 |
| 230 self.Process() | 244 self.Process() |
| 231 | 245 |
| 232 if assert_output_files: | 246 if assert_output_files: |
| 233 if not self.CheckAssertedOutputFiles(assert_output_files): | 247 if not self.CheckAssertedOutputFiles(assert_output_files): |
| 234 return 2 | 248 return 2 |
| 235 | 249 |
| 236 if depfile and depdir: | 250 if depfile and depdir: |
| 237 self.GenerateDepfile(depfile, depdir, first_ids_file, depend_on_stamp) | 251 self.GenerateDepfile(depfile, depdir, first_ids_file, depend_on_stamp) |
| 238 | 252 |
| 239 return 0 | 253 return 0 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 260 # output. | 274 # output. |
| 261 self.whitelist_names = None | 275 self.whitelist_names = None |
| 262 | 276 |
| 263 # Whether to compare outputs to their old contents before writing. | 277 # Whether to compare outputs to their old contents before writing. |
| 264 self.write_only_new = False | 278 self.write_only_new = False |
| 265 | 279 |
| 266 @staticmethod | 280 @staticmethod |
| 267 def AddWhitelistTags(start_node, whitelist_names): | 281 def AddWhitelistTags(start_node, whitelist_names): |
| 268 # Walk the tree of nodes added attributes for the nodes that shouldn't | 282 # Walk the tree of nodes added attributes for the nodes that shouldn't |
| 269 # be written into the target files (skip markers). | 283 # be written into the target files (skip markers). |
| 270 from grit.node import include | |
| 271 from grit.node import message | |
| 272 from grit.node import structure | |
| 273 for node in start_node: | 284 for node in start_node: |
| 274 # Same trick data_pack.py uses to see what nodes actually result in | 285 # Same trick data_pack.py uses to see what nodes actually result in |
| 275 # real items. | 286 # real items. |
| 276 if (isinstance(node, include.IncludeNode) or | 287 if (isinstance(node, include.IncludeNode) or |
| 277 isinstance(node, message.MessageNode) or | 288 isinstance(node, message.MessageNode) or |
| 278 isinstance(node, structure.StructureNode)): | 289 isinstance(node, structure.StructureNode)): |
| 279 text_ids = node.GetTextualIds() | 290 text_ids = node.GetTextualIds() |
| 280 # Mark the item to be skipped if it wasn't in the whitelist. | 291 # Mark the item to be skipped if it wasn't in the whitelist. |
| 281 if text_ids and text_ids[0] not in whitelist_names: | 292 if text_ids and text_ids[0] not in whitelist_names: |
| 282 node.SetWhitelistMarkedAsSkip(True) | 293 node.SetWhitelistMarkedAsSkip(True) |
| (...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 490 self.MakeDirectoriesTo(depfile) | 501 self.MakeDirectoriesTo(depfile) |
| 491 outfile = self.fo_create(depfile, 'w', encoding='utf-8') | 502 outfile = self.fo_create(depfile, 'w', encoding='utf-8') |
| 492 outfile.writelines(depfile_contents) | 503 outfile.writelines(depfile_contents) |
| 493 | 504 |
| 494 @staticmethod | 505 @staticmethod |
| 495 def MakeDirectoriesTo(file): | 506 def MakeDirectoriesTo(file): |
| 496 '''Creates directories necessary to contain |file|.''' | 507 '''Creates directories necessary to contain |file|.''' |
| 497 dir = os.path.split(file)[0] | 508 dir = os.path.split(file)[0] |
| 498 if not os.path.exists(dir): | 509 if not os.path.exists(dir): |
| 499 os.makedirs(dir) | 510 os.makedirs(dir) |
| OLD | NEW |