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.
17 sys
.path
.append(os
.path
.join(os
.path
.dirname(__file__
), '..', '..', '..',
19 from grit
.format
import data_pack
21 # The gyp "branding" variable.
24 # Some build paths defined by gyp.
29 # The target platform. If it is not defined, sys.platform will be used.
32 # Note that OS is normally set to 'linux' when building for chromeos.
36 ENABLE_AUTOFILL_DIALOG
= False
37 ENABLE_EXTENSIONS
= False
42 EXTRA_INPUT_FILES
= []
44 class Usage(Exception):
45 def __init__(self
, 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
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).
62 return '%s/repack/%s.lproj/locale.pak' % (INT_DIR
, locale
.replace('-', '_'))
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."""
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 #e.g. '<(SHARED_INTERMEDIATE_DIR)/components/strings/
87 # components_chromium_strings_da.pak'
89 # '<(SHARED_INTERMEDIATE_DIR)/components/strings/
90 # components_google_chrome_strings_da.pak',
91 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'components', 'strings',
92 'components_%s_strings_%s.pak' % (BRANDING
, locale
)))
95 #e.g. '<(SHARED_INTERMEDIATE_DIR)/ash/strings/ash_strings_da.pak',
96 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'ash', 'strings',
97 'ash_strings_%s.pak' % locale
))
100 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'ui', 'chromeos', 'strings',
101 'ui_chromeos_strings_%s.pak' % locale
))
102 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'remoting', 'resources',
107 # '<(SHARED_INTERMEDIATE_DIR)/content/app/strings/content_strings_da.pak'
108 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'content', 'app', 'strings',
109 'content_strings_%s.pak' % locale
))
111 #e.g. '<(SHARED_INTERMEDIATE_DIR)/device/bluetooth/strings/
112 # bluetooth_strings_da.pak',
113 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'device', 'bluetooth', 'strings',
114 'bluetooth_strings_%s.pak' % locale
))
116 #e.g. '<(SHARED_INTERMEDIATE_DIR)/ui/strings/ui_strings_da.pak',
117 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'ui', 'strings',
118 'ui_strings_%s.pak' % locale
))
120 #e.g. '<(SHARED_INTERMEDIATE_DIR)/ui/strings/app_locale_settings_da.pak',
121 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'ui', 'strings',
122 'app_locale_settings_%s.pak' % locale
))
125 #e.g. '<(SHARED_INTERMEDIATE_DIR)/ios/chrome/ios_locale_settings_da.pak'
126 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'ios', 'chrome',
127 'ios_locale_settings_%s.pak' % locale
))
129 #e.g. '<(SHARED_INTERMEDIATE_DIR)/ios/chrome/ios_strings_da.pak'
130 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'ios', 'chrome',
131 'ios_strings_%s.pak' % locale
))
133 #e.g. '<(SHARED_INTERMEDIATE_DIR)/ios/chrome/ios_chromium_strings_da.pak'
134 # or '<(SHARED_INTERMEDIATE_DIR)/ios/chrome/
135 # ios_google_chrome_strings_da.pak'
136 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'ios', 'chrome',
137 'ios_%s_strings_%s.pak' % (BRANDING
, locale
)))
139 if ENABLE_AUTOFILL_DIALOG
:
140 #e.g. '<(SHARED_INTERMEDIATE_DIR)/third_party/libaddressinput/
141 # address_input_strings_da.pak',
142 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'third_party', 'libaddressinput',
143 'address_input_strings_%s.pak' % locale
))
145 if ENABLE_EXTENSIONS
:
147 # '<(SHARED_INTERMEDIATE_DIR)/extensions/strings/extensions_strings_da.pak
148 # TODO(jamescook): When Android stops building extensions code move this
149 # to the OS != 'ios' and OS != 'android' section below.
150 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'extensions', 'strings',
151 'extensions_strings_%s.pak' % locale
))
153 #e.g. '<(grit_out_dir)/google_chrome_strings_da.pak'
155 # '<(grit_out_dir)/chromium_strings_da.pak'
156 inputs
.append(os
.path
.join(
157 GRIT_DIR
, '%s_strings_%s.pak' % (BRANDING
, locale
)))
159 # Add any extra input files.
160 for extra_file
in EXTRA_INPUT_FILES
:
161 inputs
.append('%s_%s.pak' % (extra_file
, locale
))
166 def list_outputs(locales
):
167 """Returns the names of files that will be generated for the given locales.
169 This is to provide gyp the list of output files, so build targets can
170 properly track what needs to be built.
173 for locale
in locales
:
174 outputs
.append(calc_output(locale
))
175 # Quote each element so filename spaces don't mess up gyp's attempt to parse
177 return " ".join(['"%s"' % x
for x
in outputs
])
180 def list_inputs(locales
):
181 """Returns the names of files that will be processed for the given locales.
183 This is to provide gyp the list of input files, so build targets can properly
184 track their prerequisites.
187 for locale
in locales
:
188 inputs
+= calc_inputs(locale
)
189 # Quote each element so filename spaces don't mess up gyp's attempt to parse
191 return " ".join(['"%s"' % x
for x
in inputs
])
194 def repack_locales(locales
):
195 """ Loop over and repack the given locales."""
196 for locale
in locales
:
198 inputs
+= calc_inputs(locale
)
199 output
= calc_output(locale
)
200 data_pack
.DataPack
.RePack(output
, inputs
, whitelist_file
=WHITELIST
)
212 global ENABLE_AUTOFILL_DIALOG
213 global ENABLE_EXTENSIONS
214 global EXTRA_INPUT_FILES
216 parser
= optparse
.OptionParser("usage: %prog [options] locales")
217 parser
.add_option("-i", action
="store_true", dest
="inputs", default
=False,
218 help="Print the expected input file list, then exit.")
219 parser
.add_option("-o", action
="store_true", dest
="outputs", default
=False,
220 help="Print the expected output file list, then exit.")
221 parser
.add_option("-g", action
="store", dest
="grit_dir",
222 help="GRIT build files output directory.")
223 parser
.add_option("-x", action
="store", dest
="int_dir",
224 help="Intermediate build files output directory.")
225 parser
.add_option("-s", action
="store", dest
="share_int_dir",
226 help="Shared intermediate build files output directory.")
227 parser
.add_option("-b", action
="store", dest
="branding",
228 help="Branding type of this build.")
229 parser
.add_option("-e", action
="append", dest
="extra_input", default
=[],
230 help="Full path to an extra input pak file without the\
231 locale suffix and \".pak\" extension.")
232 parser
.add_option("-p", action
="store", dest
="os",
233 help="The target OS. (e.g. mac, linux, win, etc.)")
234 parser
.add_option("--use-ash", action
="store", dest
="use_ash",
235 help="Whether to include ash strings")
236 parser
.add_option("--chromeos", action
="store",
237 help="Whether building for Chrome OS")
238 parser
.add_option("--whitelist", action
="store", help="Full path to the "
239 "whitelist used to filter output pak file resource IDs")
240 parser
.add_option("--enable-autofill-dialog", action
="store",
241 dest
="enable_autofill_dialog",
242 help="Whether to include strings for autofill dialog")
243 parser
.add_option("--enable-extensions", action
="store",
244 dest
="enable_extensions",
245 help="Whether to include strings for extensions")
246 options
, locales
= parser
.parse_args(argv
)
249 parser
.error('Please specificy at least one locale to process.\n')
251 print_inputs
= options
.inputs
252 print_outputs
= options
.outputs
253 GRIT_DIR
= options
.grit_dir
254 INT_DIR
= options
.int_dir
255 SHARE_INT_DIR
= options
.share_int_dir
256 BRANDING
= options
.branding
257 EXTRA_INPUT_FILES
= options
.extra_input
259 CHROMEOS
= options
.chromeos
== '1'
260 USE_ASH
= options
.use_ash
== '1'
261 WHITELIST
= options
.whitelist
262 ENABLE_AUTOFILL_DIALOG
= options
.enable_autofill_dialog
== '1'
263 ENABLE_EXTENSIONS
= options
.enable_extensions
== '1'
266 if sys
.platform
== 'darwin':
268 elif sys
.platform
.startswith('linux'):
270 elif sys
.platform
in ('cygwin', 'win32'):
275 if not (GRIT_DIR
and INT_DIR
and SHARE_INT_DIR
):
276 parser
.error('Please specify all of "-g" and "-x" and "-s".\n')
277 if print_inputs
and print_outputs
:
278 parser
.error('Please specify only one of "-i" or "-o".\n')
279 # Need to know the branding, unless we're just listing the outputs.
280 if not print_outputs
and not BRANDING
:
281 parser
.error('Please specify "-b" to determine the input files.\n')
284 return list_inputs(locales
)
287 return list_outputs(locales
)
289 return repack_locales(locales
)
291 if __name__
== '__main__':
292 results
= DoMain(sys
.argv
[1:])