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.
37 ENABLE_AUTOFILL_DIALOG
= False
38 ENABLE_EXTENSIONS
= False
43 EXTRA_INPUT_FILES
= []
45 class Usage(Exception):
46 def __init__(self
, msg
):
50 def calc_output(locale
):
51 """Determine the file that will be generated for the given locale."""
52 #e.g. '<(INTERMEDIATE_DIR)/repack/da.pak',
53 # For Fake Bidi, generate it at a fixed path so that tests can safely
55 if locale
== 'fake-bidi':
56 return '%s/%s.pak' % (INT_DIR
, locale
)
57 if OS
== 'mac' or OS
== 'ios':
58 # For Cocoa to find the locale at runtime, it needs to use '_' instead
59 # of '-' (http://crbug.com/20441). Also, 'en-US' should be represented
60 # simply as 'en' (http://crbug.com/19165, http://crbug.com/25578).
63 return '%s/repack/%s.lproj/locale.pak' % (INT_DIR
, locale
.replace('-', '_'))
65 return os
.path
.join(INT_DIR
, 'repack', locale
+ '.pak')
68 def calc_inputs(locale
):
69 """Determine the files that need processing for the given locale."""
72 #e.g. '<(grit_out_dir)/generated_resources_da.pak'
73 inputs
.append(os
.path
.join(GRIT_DIR
, 'generated_resources_%s.pak' % locale
))
75 #e.g. '<(grit_out_dir)/locale_settings_da.pak'
76 inputs
.append(os
.path
.join(GRIT_DIR
, 'locale_settings_%s.pak' % locale
))
78 #e.g. '<(grit_out_dir)/platform_locale_settings_da.pak'
79 inputs
.append(os
.path
.join(GRIT_DIR
,
80 'platform_locale_settings_%s.pak' % locale
))
82 #e.g. '<(SHARED_INTERMEDIATE_DIR)/components/strings/
83 # components_strings_da.pak',
84 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'components', 'strings',
85 'components_strings_%s.pak' % locale
))
88 #e.g. '<(SHARED_INTERMEDIATE_DIR)/ash/strings/ash_strings_da.pak',
89 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'ash', 'strings',
90 'ash_strings_%s.pak' % locale
))
93 #e.g. '<(SHARED_INTERMEDIATE_DIR)/athena/strings/athena_strings_da.pak',
94 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'athena', 'strings',
95 'athena_strings_%s.pak' % locale
))
98 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'ui', 'chromeos', 'strings',
99 'ui_chromeos_strings_%s.pak' % locale
))
100 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'remoting', 'resources',
105 # '<(SHARED_INTERMEDIATE_DIR)/content/app/strings/content_strings_da.pak'
106 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'content', 'app', 'strings',
107 'content_strings_%s.pak' % locale
))
109 #e.g. '<(SHARED_INTERMEDIATE_DIR)/ui/strings/ui_strings_da.pak',
110 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'ui', 'strings',
111 'ui_strings_%s.pak' % locale
))
113 #e.g. '<(SHARED_INTERMEDIATE_DIR)/ui/strings/app_locale_settings_da.pak',
114 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'ui', 'strings',
115 'app_locale_settings_%s.pak' % locale
))
117 if ENABLE_AUTOFILL_DIALOG
and OS
!= 'ios' and OS
!= 'android':
118 #e.g. '<(SHARED_INTERMEDIATE_DIR)/third_party/libaddressinput/
119 # address_input_strings_da.pak',
120 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'third_party', 'libaddressinput',
121 'address_input_strings_%s.pak' % locale
))
123 if ENABLE_EXTENSIONS
:
124 #e.g. '<(SHARED_INTERMEDIATE_DIR)/device/bluetooth/strings/
125 # device_bluetooth_strings_da.pak',
126 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'device', 'bluetooth', 'strings',
127 'device_bluetooth_strings_%s.pak' % locale
))
130 # '<(SHARED_INTERMEDIATE_DIR)/extensions/strings/extensions_strings_da.pak
131 # TODO(jamescook): When Android stops building extensions code move this
132 # to the OS != 'ios' and OS != 'android' section below.
133 inputs
.append(os
.path
.join(SHARE_INT_DIR
, 'extensions', 'strings',
134 'extensions_strings_%s.pak' % locale
))
136 #e.g. '<(grit_out_dir)/google_chrome_strings_da.pak'
138 # '<(grit_out_dir)/chromium_strings_da.pak'
139 inputs
.append(os
.path
.join(
140 GRIT_DIR
, '%s_strings_%s.pak' % (BRANDING
, locale
)))
142 # Add any extra input files.
143 for extra_file
in EXTRA_INPUT_FILES
:
144 inputs
.append('%s_%s.pak' % (extra_file
, locale
))
149 def list_outputs(locales
):
150 """Returns the names of files that will be generated for the given locales.
152 This is to provide gyp the list of output files, so build targets can
153 properly track what needs to be built.
156 for locale
in locales
:
157 outputs
.append(calc_output(locale
))
158 # Quote each element so filename spaces don't mess up gyp's attempt to parse
160 return " ".join(['"%s"' % x
for x
in outputs
])
163 def list_inputs(locales
):
164 """Returns the names of files that will be processed for the given locales.
166 This is to provide gyp the list of input files, so build targets can properly
167 track their prerequisites.
170 for locale
in locales
:
171 inputs
+= calc_inputs(locale
)
172 # Quote each element so filename spaces don't mess up gyp's attempt to parse
174 return " ".join(['"%s"' % x
for x
in inputs
])
177 def repack_locales(locales
):
178 """ Loop over and repack the given locales."""
179 for locale
in locales
:
181 inputs
+= calc_inputs(locale
)
182 output
= calc_output(locale
)
183 data_pack
.DataPack
.RePack(output
, inputs
, whitelist_file
=WHITELIST
)
196 global ENABLE_AUTOFILL_DIALOG
197 global ENABLE_EXTENSIONS
198 global EXTRA_INPUT_FILES
200 parser
= optparse
.OptionParser("usage: %prog [options] locales")
201 parser
.add_option("-i", action
="store_true", dest
="inputs", default
=False,
202 help="Print the expected input file list, then exit.")
203 parser
.add_option("-o", action
="store_true", dest
="outputs", default
=False,
204 help="Print the expected output file list, then exit.")
205 parser
.add_option("-g", action
="store", dest
="grit_dir",
206 help="GRIT build files output directory.")
207 parser
.add_option("-x", action
="store", dest
="int_dir",
208 help="Intermediate build files output directory.")
209 parser
.add_option("-s", action
="store", dest
="share_int_dir",
210 help="Shared intermediate build files output directory.")
211 parser
.add_option("-b", action
="store", dest
="branding",
212 help="Branding type of this build.")
213 parser
.add_option("-e", action
="append", dest
="extra_input", default
=[],
214 help="Full path to an extra input pak file without the\
215 locale suffix and \".pak\" extension.")
216 parser
.add_option("-p", action
="store", dest
="os",
217 help="The target OS. (e.g. mac, linux, win, etc.)")
218 parser
.add_option("--use-ash", action
="store", dest
="use_ash",
219 help="Whether to include ash strings")
220 parser
.add_option("--use-athena", action
="store", dest
="use_athena",
221 help="Whether to include athena strings")
222 parser
.add_option("--chromeos", action
="store",
223 help="Whether building for Chrome OS")
224 parser
.add_option("--whitelist", action
="store", help="Full path to the "
225 "whitelist used to filter output pak file resource IDs")
226 parser
.add_option("--enable-autofill-dialog", action
="store",
227 dest
="enable_autofill_dialog",
228 help="Whether to include strings for autofill dialog")
229 parser
.add_option("--enable-extensions", action
="store",
230 dest
="enable_extensions",
231 help="Whether to include strings for extensions")
232 options
, locales
= parser
.parse_args(argv
)
235 parser
.error('Please specificy at least one locale to process.\n')
237 print_inputs
= options
.inputs
238 print_outputs
= options
.outputs
239 GRIT_DIR
= options
.grit_dir
240 INT_DIR
= options
.int_dir
241 SHARE_INT_DIR
= options
.share_int_dir
242 BRANDING
= options
.branding
243 EXTRA_INPUT_FILES
= options
.extra_input
245 CHROMEOS
= options
.chromeos
== '1'
246 USE_ASH
= options
.use_ash
== '1'
247 USE_ATHENA
= options
.use_athena
== '1'
248 WHITELIST
= options
.whitelist
249 ENABLE_AUTOFILL_DIALOG
= options
.enable_autofill_dialog
== '1'
250 ENABLE_EXTENSIONS
= options
.enable_extensions
== '1'
253 if sys
.platform
== 'darwin':
255 elif sys
.platform
.startswith('linux'):
257 elif sys
.platform
in ('cygwin', 'win32'):
262 if not (GRIT_DIR
and INT_DIR
and SHARE_INT_DIR
):
263 parser
.error('Please specify all of "-g" and "-x" and "-s".\n')
264 if print_inputs
and print_outputs
:
265 parser
.error('Please specify only one of "-i" or "-o".\n')
266 # Need to know the branding, unless we're just listing the outputs.
267 if not print_outputs
and not BRANDING
:
268 parser
.error('Please specify "-b" to determine the input files.\n')
271 return list_inputs(locales
)
274 return list_outputs(locales
)
276 return repack_locales(locales
)
278 if __name__
== '__main__':
279 results
= DoMain(sys
.argv
[1:])