Material throbber: use in tabstrip
[chromium-blink-merge.git] / chrome / tools / build / repack_locales.py
blobb953bb8818ab1de8aeb45203267c8b8601b63cfc
1 #!/usr/bin/env python
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
4 # found in the LICENSE file.
6 """Helper script to repack paks for a list of locales.
8 Gyp doesn't have any built-in looping capability, so this just provides a way to
9 loop over a list of locales when repacking pak files, thus avoiding a
10 proliferation of mostly duplicate, cut-n-paste gyp actions.
11 """
13 import optparse
14 import os
15 import sys
17 sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..',
18 'tools', 'grit'))
19 from grit.format import data_pack
21 # The gyp "branding" variable.
22 BRANDING = None
24 # Some build paths defined by gyp.
25 GRIT_DIR = None
26 SHARE_INT_DIR = None
27 INT_DIR = None
29 # The target platform. If it is not defined, sys.platform will be used.
30 OS = None
32 # Note that OS is normally set to 'linux' when building for chromeos.
33 CHROMEOS = False
35 USE_ASH = False
36 ENABLE_AUTOFILL_DIALOG = False
37 ENABLE_EXTENSIONS = False
39 WHITELIST = None
41 # Extra input files.
42 EXTRA_INPUT_FILES = []
44 class Usage(Exception):
45 def __init__(self, msg):
46 self.msg = msg
49 def calc_output(locale):
50 """Determine the file that will be generated for the given locale."""
51 #e.g. '<(INTERMEDIATE_DIR)/repack/da.pak',
52 # For Fake Bidi, generate it at a fixed path so that tests can safely
53 # reference it.
54 if locale == 'fake-bidi':
55 return '%s/%s.pak' % (INT_DIR, locale)
56 if OS == 'mac' or OS == 'ios':
57 # For Cocoa to find the locale at runtime, it needs to use '_' instead
58 # of '-' (http://crbug.com/20441). Also, 'en-US' should be represented
59 # simply as 'en' (http://crbug.com/19165, http://crbug.com/25578).
60 if locale == 'en-US':
61 locale = 'en'
62 return '%s/repack/%s.lproj/locale.pak' % (INT_DIR, locale.replace('-', '_'))
63 else:
64 return os.path.join(INT_DIR, 'repack', locale + '.pak')
67 def calc_inputs(locale):
68 """Determine the files that need processing for the given locale."""
69 inputs = []
71 #e.g. '<(grit_out_dir)/generated_resources_da.pak'
72 inputs.append(os.path.join(GRIT_DIR, 'generated_resources_%s.pak' % locale))
74 #e.g. '<(grit_out_dir)/locale_settings_da.pak'
75 inputs.append(os.path.join(GRIT_DIR, 'locale_settings_%s.pak' % locale))
77 #e.g. '<(grit_out_dir)/platform_locale_settings_da.pak'
78 inputs.append(os.path.join(GRIT_DIR,
79 'platform_locale_settings_%s.pak' % locale))
81 #e.g. '<(SHARED_INTERMEDIATE_DIR)/components/strings/
82 # components_strings_da.pak',
83 inputs.append(os.path.join(SHARE_INT_DIR, 'components', 'strings',
84 'components_strings_%s.pak' % locale))
86 if USE_ASH:
87 #e.g. '<(SHARED_INTERMEDIATE_DIR)/ash/strings/ash_strings_da.pak',
88 inputs.append(os.path.join(SHARE_INT_DIR, 'ash', 'strings',
89 'ash_strings_%s.pak' % locale))
91 if CHROMEOS:
92 inputs.append(os.path.join(SHARE_INT_DIR, 'ui', 'chromeos', 'strings',
93 'ui_chromeos_strings_%s.pak' % locale))
94 inputs.append(os.path.join(SHARE_INT_DIR, 'remoting', 'resources',
95 '%s.pak' % locale))
97 if OS != 'ios':
98 #e.g.
99 # '<(SHARED_INTERMEDIATE_DIR)/content/app/strings/content_strings_da.pak'
100 inputs.append(os.path.join(SHARE_INT_DIR, 'content', 'app', 'strings',
101 'content_strings_%s.pak' % locale))
103 #e.g. '<(SHARED_INTERMEDIATE_DIR)/ui/strings/ui_strings_da.pak',
104 inputs.append(os.path.join(SHARE_INT_DIR, 'ui', 'strings',
105 'ui_strings_%s.pak' % locale))
107 #e.g. '<(SHARED_INTERMEDIATE_DIR)/ui/strings/app_locale_settings_da.pak',
108 inputs.append(os.path.join(SHARE_INT_DIR, 'ui', 'strings',
109 'app_locale_settings_%s.pak' % locale))
111 else:
112 #e.g. '<(SHARED_INTERMEDIATE_DIR)/ios/chrome/ios_strings_resources_da.pak'
113 inputs.append(os.path.join(SHARE_INT_DIR, 'ios', 'chrome',
114 'ios_strings_resources_%s.pak' % locale))
116 if ENABLE_AUTOFILL_DIALOG:
117 #e.g. '<(SHARED_INTERMEDIATE_DIR)/third_party/libaddressinput/
118 # address_input_strings_da.pak',
119 inputs.append(os.path.join(SHARE_INT_DIR, 'third_party', 'libaddressinput',
120 'address_input_strings_%s.pak' % locale))
122 if ENABLE_EXTENSIONS:
123 #e.g. '<(SHARED_INTERMEDIATE_DIR)/device/bluetooth/strings/
124 # device_bluetooth_strings_da.pak',
125 inputs.append(os.path.join(SHARE_INT_DIR, 'device', 'bluetooth', 'strings',
126 'device_bluetooth_strings_%s.pak' % locale))
128 # For example:
129 # '<(SHARED_INTERMEDIATE_DIR)/extensions/strings/extensions_strings_da.pak
130 # TODO(jamescook): When Android stops building extensions code move this
131 # to the OS != 'ios' and OS != 'android' section below.
132 inputs.append(os.path.join(SHARE_INT_DIR, 'extensions', 'strings',
133 'extensions_strings_%s.pak' % locale))
135 #e.g. '<(grit_out_dir)/google_chrome_strings_da.pak'
136 # or
137 # '<(grit_out_dir)/chromium_strings_da.pak'
138 inputs.append(os.path.join(
139 GRIT_DIR, '%s_strings_%s.pak' % (BRANDING, locale)))
141 # Add any extra input files.
142 for extra_file in EXTRA_INPUT_FILES:
143 inputs.append('%s_%s.pak' % (extra_file, locale))
145 return inputs
148 def list_outputs(locales):
149 """Returns the names of files that will be generated for the given locales.
151 This is to provide gyp the list of output files, so build targets can
152 properly track what needs to be built.
154 outputs = []
155 for locale in locales:
156 outputs.append(calc_output(locale))
157 # Quote each element so filename spaces don't mess up gyp's attempt to parse
158 # it into a list.
159 return " ".join(['"%s"' % x for x in outputs])
162 def list_inputs(locales):
163 """Returns the names of files that will be processed for the given locales.
165 This is to provide gyp the list of input files, so build targets can properly
166 track their prerequisites.
168 inputs = []
169 for locale in locales:
170 inputs += calc_inputs(locale)
171 # Quote each element so filename spaces don't mess up gyp's attempt to parse
172 # it into a list.
173 return " ".join(['"%s"' % x for x in inputs])
176 def repack_locales(locales):
177 """ Loop over and repack the given locales."""
178 for locale in locales:
179 inputs = []
180 inputs += calc_inputs(locale)
181 output = calc_output(locale)
182 data_pack.DataPack.RePack(output, inputs, whitelist_file=WHITELIST)
185 def DoMain(argv):
186 global BRANDING
187 global GRIT_DIR
188 global SHARE_INT_DIR
189 global INT_DIR
190 global OS
191 global CHROMEOS
192 global USE_ASH
193 global WHITELIST
194 global ENABLE_AUTOFILL_DIALOG
195 global ENABLE_EXTENSIONS
196 global EXTRA_INPUT_FILES
198 parser = optparse.OptionParser("usage: %prog [options] locales")
199 parser.add_option("-i", action="store_true", dest="inputs", default=False,
200 help="Print the expected input file list, then exit.")
201 parser.add_option("-o", action="store_true", dest="outputs", default=False,
202 help="Print the expected output file list, then exit.")
203 parser.add_option("-g", action="store", dest="grit_dir",
204 help="GRIT build files output directory.")
205 parser.add_option("-x", action="store", dest="int_dir",
206 help="Intermediate build files output directory.")
207 parser.add_option("-s", action="store", dest="share_int_dir",
208 help="Shared intermediate build files output directory.")
209 parser.add_option("-b", action="store", dest="branding",
210 help="Branding type of this build.")
211 parser.add_option("-e", action="append", dest="extra_input", default=[],
212 help="Full path to an extra input pak file without the\
213 locale suffix and \".pak\" extension.")
214 parser.add_option("-p", action="store", dest="os",
215 help="The target OS. (e.g. mac, linux, win, etc.)")
216 parser.add_option("--use-ash", action="store", dest="use_ash",
217 help="Whether to include ash strings")
218 parser.add_option("--chromeos", action="store",
219 help="Whether building for Chrome OS")
220 parser.add_option("--whitelist", action="store", help="Full path to the "
221 "whitelist used to filter output pak file resource IDs")
222 parser.add_option("--enable-autofill-dialog", action="store",
223 dest="enable_autofill_dialog",
224 help="Whether to include strings for autofill dialog")
225 parser.add_option("--enable-extensions", action="store",
226 dest="enable_extensions",
227 help="Whether to include strings for extensions")
228 options, locales = parser.parse_args(argv)
230 if not locales:
231 parser.error('Please specificy at least one locale to process.\n')
233 print_inputs = options.inputs
234 print_outputs = options.outputs
235 GRIT_DIR = options.grit_dir
236 INT_DIR = options.int_dir
237 SHARE_INT_DIR = options.share_int_dir
238 BRANDING = options.branding
239 EXTRA_INPUT_FILES = options.extra_input
240 OS = options.os
241 CHROMEOS = options.chromeos == '1'
242 USE_ASH = options.use_ash == '1'
243 WHITELIST = options.whitelist
244 ENABLE_AUTOFILL_DIALOG = options.enable_autofill_dialog == '1'
245 ENABLE_EXTENSIONS = options.enable_extensions == '1'
247 if not OS:
248 if sys.platform == 'darwin':
249 OS = 'mac'
250 elif sys.platform.startswith('linux'):
251 OS = 'linux'
252 elif sys.platform in ('cygwin', 'win32'):
253 OS = 'win'
254 else:
255 OS = sys.platform
257 if not (GRIT_DIR and INT_DIR and SHARE_INT_DIR):
258 parser.error('Please specify all of "-g" and "-x" and "-s".\n')
259 if print_inputs and print_outputs:
260 parser.error('Please specify only one of "-i" or "-o".\n')
261 # Need to know the branding, unless we're just listing the outputs.
262 if not print_outputs and not BRANDING:
263 parser.error('Please specify "-b" to determine the input files.\n')
265 if print_inputs:
266 return list_inputs(locales)
268 if print_outputs:
269 return list_outputs(locales)
271 return repack_locales(locales)
273 if __name__ == '__main__':
274 results = DoMain(sys.argv[1:])
275 if results:
276 print results