Supervised users: Don't URLEscape extension update requests
[chromium-blink-merge.git] / chrome / tools / build / repack_locales.py
blobbc9983071f5971d534d89bdc0eb8291ea49f5781
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 if ENABLE_AUTOFILL_DIALOG:
112 #e.g. '<(SHARED_INTERMEDIATE_DIR)/third_party/libaddressinput/
113 # address_input_strings_da.pak',
114 inputs.append(os.path.join(SHARE_INT_DIR, 'third_party', 'libaddressinput',
115 'address_input_strings_%s.pak' % locale))
117 if ENABLE_EXTENSIONS:
118 #e.g. '<(SHARED_INTERMEDIATE_DIR)/device/bluetooth/strings/
119 # device_bluetooth_strings_da.pak',
120 inputs.append(os.path.join(SHARE_INT_DIR, 'device', 'bluetooth', 'strings',
121 'device_bluetooth_strings_%s.pak' % locale))
123 # For example:
124 # '<(SHARED_INTERMEDIATE_DIR)/extensions/strings/extensions_strings_da.pak
125 # TODO(jamescook): When Android stops building extensions code move this
126 # to the OS != 'ios' and OS != 'android' section below.
127 inputs.append(os.path.join(SHARE_INT_DIR, 'extensions', 'strings',
128 'extensions_strings_%s.pak' % locale))
130 #e.g. '<(grit_out_dir)/google_chrome_strings_da.pak'
131 # or
132 # '<(grit_out_dir)/chromium_strings_da.pak'
133 inputs.append(os.path.join(
134 GRIT_DIR, '%s_strings_%s.pak' % (BRANDING, locale)))
136 # Add any extra input files.
137 for extra_file in EXTRA_INPUT_FILES:
138 inputs.append('%s_%s.pak' % (extra_file, locale))
140 return inputs
143 def list_outputs(locales):
144 """Returns the names of files that will be generated for the given locales.
146 This is to provide gyp the list of output files, so build targets can
147 properly track what needs to be built.
149 outputs = []
150 for locale in locales:
151 outputs.append(calc_output(locale))
152 # Quote each element so filename spaces don't mess up gyp's attempt to parse
153 # it into a list.
154 return " ".join(['"%s"' % x for x in outputs])
157 def list_inputs(locales):
158 """Returns the names of files that will be processed for the given locales.
160 This is to provide gyp the list of input files, so build targets can properly
161 track their prerequisites.
163 inputs = []
164 for locale in locales:
165 inputs += calc_inputs(locale)
166 # Quote each element so filename spaces don't mess up gyp's attempt to parse
167 # it into a list.
168 return " ".join(['"%s"' % x for x in inputs])
171 def repack_locales(locales):
172 """ Loop over and repack the given locales."""
173 for locale in locales:
174 inputs = []
175 inputs += calc_inputs(locale)
176 output = calc_output(locale)
177 data_pack.DataPack.RePack(output, inputs, whitelist_file=WHITELIST)
180 def DoMain(argv):
181 global BRANDING
182 global GRIT_DIR
183 global SHARE_INT_DIR
184 global INT_DIR
185 global OS
186 global CHROMEOS
187 global USE_ASH
188 global WHITELIST
189 global ENABLE_AUTOFILL_DIALOG
190 global ENABLE_EXTENSIONS
191 global EXTRA_INPUT_FILES
193 parser = optparse.OptionParser("usage: %prog [options] locales")
194 parser.add_option("-i", action="store_true", dest="inputs", default=False,
195 help="Print the expected input file list, then exit.")
196 parser.add_option("-o", action="store_true", dest="outputs", default=False,
197 help="Print the expected output file list, then exit.")
198 parser.add_option("-g", action="store", dest="grit_dir",
199 help="GRIT build files output directory.")
200 parser.add_option("-x", action="store", dest="int_dir",
201 help="Intermediate build files output directory.")
202 parser.add_option("-s", action="store", dest="share_int_dir",
203 help="Shared intermediate build files output directory.")
204 parser.add_option("-b", action="store", dest="branding",
205 help="Branding type of this build.")
206 parser.add_option("-e", action="append", dest="extra_input", default=[],
207 help="Full path to an extra input pak file without the\
208 locale suffix and \".pak\" extension.")
209 parser.add_option("-p", action="store", dest="os",
210 help="The target OS. (e.g. mac, linux, win, etc.)")
211 parser.add_option("--use-ash", action="store", dest="use_ash",
212 help="Whether to include ash strings")
213 parser.add_option("--chromeos", action="store",
214 help="Whether building for Chrome OS")
215 parser.add_option("--whitelist", action="store", help="Full path to the "
216 "whitelist used to filter output pak file resource IDs")
217 parser.add_option("--enable-autofill-dialog", action="store",
218 dest="enable_autofill_dialog",
219 help="Whether to include strings for autofill dialog")
220 parser.add_option("--enable-extensions", action="store",
221 dest="enable_extensions",
222 help="Whether to include strings for extensions")
223 options, locales = parser.parse_args(argv)
225 if not locales:
226 parser.error('Please specificy at least one locale to process.\n')
228 print_inputs = options.inputs
229 print_outputs = options.outputs
230 GRIT_DIR = options.grit_dir
231 INT_DIR = options.int_dir
232 SHARE_INT_DIR = options.share_int_dir
233 BRANDING = options.branding
234 EXTRA_INPUT_FILES = options.extra_input
235 OS = options.os
236 CHROMEOS = options.chromeos == '1'
237 USE_ASH = options.use_ash == '1'
238 WHITELIST = options.whitelist
239 ENABLE_AUTOFILL_DIALOG = options.enable_autofill_dialog == '1'
240 ENABLE_EXTENSIONS = options.enable_extensions == '1'
242 if not OS:
243 if sys.platform == 'darwin':
244 OS = 'mac'
245 elif sys.platform.startswith('linux'):
246 OS = 'linux'
247 elif sys.platform in ('cygwin', 'win32'):
248 OS = 'win'
249 else:
250 OS = sys.platform
252 if not (GRIT_DIR and INT_DIR and SHARE_INT_DIR):
253 parser.error('Please specify all of "-g" and "-x" and "-s".\n')
254 if print_inputs and print_outputs:
255 parser.error('Please specify only one of "-i" or "-o".\n')
256 # Need to know the branding, unless we're just listing the outputs.
257 if not print_outputs and not BRANDING:
258 parser.error('Please specify "-b" to determine the input files.\n')
260 if print_inputs:
261 return list_inputs(locales)
263 if print_outputs:
264 return list_outputs(locales)
266 return repack_locales(locales)
268 if __name__ == '__main__':
269 results = DoMain(sys.argv[1:])
270 if results:
271 print results