Home | History | Annotate | Download | only in build
      1 #!/usr/bin/env python
      2 # Copyright 2013 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.
      5 
      6 """Helper script to repack paks for a list of locales.
      7 
      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 """
     12 
     13 import optparse
     14 import os
     15 import sys
     16 
     17 sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..',
     18                              'tools', 'grit'))
     19 from grit.format import data_pack
     20 
     21 # Some build paths defined by gyp.
     22 GRIT_DIR = None
     23 INT_DIR = None
     24 
     25 # The target platform. If it is not defined, sys.platform will be used.
     26 OS = None
     27 
     28 # Extra input files.
     29 EXTRA_INPUT_FILES = []
     30 
     31 class Usage(Exception):
     32   def __init__(self, msg):
     33     self.msg = msg
     34 
     35 
     36 def calc_output(locale):
     37   """Determine the file that will be generated for the given locale."""
     38   #e.g. '<(INTERMEDIATE_DIR)/remoting_locales/da.pak',
     39   if OS == 'mac' or OS == 'ios':
     40     # For Cocoa to find the locale at runtime, it needs to use '_' instead
     41     # of '-' (http://crbug.com/20441).
     42     return os.path.join(INT_DIR, 'remoting', 'resources',
     43                         '%s.lproj' % locale.replace('-', '_'), 'locale.pak')
     44   else:
     45     return os.path.join(INT_DIR, 'remoting_locales', locale + '.pak')
     46 
     47 
     48 def calc_inputs(locale):
     49   """Determine the files that need processing for the given locale."""
     50   inputs = []
     51 
     52   #e.g. '<(grit_out_dir)/remoting/resources/da.pak'
     53   inputs.append(os.path.join(GRIT_DIR, 'remoting/resources/%s.pak' % locale))
     54 
     55   # Add any extra input files.
     56   for extra_file in EXTRA_INPUT_FILES:
     57     inputs.append('%s_%s.pak' % (extra_file, locale))
     58 
     59   return inputs
     60 
     61 
     62 def list_outputs(locales):
     63   """Returns the names of files that will be generated for the given locales.
     64 
     65   This is to provide gyp the list of output files, so build targets can
     66   properly track what needs to be built.
     67   """
     68   outputs = []
     69   for locale in locales:
     70     outputs.append(calc_output(locale))
     71   # Quote each element so filename spaces don't mess up gyp's attempt to parse
     72   # it into a list.
     73   return " ".join(['"%s"' % x for x in outputs])
     74 
     75 
     76 def list_inputs(locales):
     77   """Returns the names of files that will be processed for the given locales.
     78 
     79   This is to provide gyp the list of input files, so build targets can properly
     80   track their prerequisites.
     81   """
     82   inputs = []
     83   for locale in locales:
     84     inputs += calc_inputs(locale)
     85   # Quote each element so filename spaces don't mess up gyp's attempt to parse
     86   # it into a list.
     87   return " ".join(['"%s"' % x for x in inputs])
     88 
     89 
     90 def repack_locales(locales):
     91   """ Loop over and repack the given locales."""
     92   for locale in locales:
     93     inputs = calc_inputs(locale)
     94     output = calc_output(locale)
     95     data_pack.DataPack.RePack(output, inputs)
     96 
     97 
     98 def DoMain(argv):
     99   global GRIT_DIR
    100   global INT_DIR
    101   global OS
    102   global EXTRA_INPUT_FILES
    103 
    104   parser = optparse.OptionParser("usage: %prog [options] locales")
    105   parser.add_option("-i", action="store_true", dest="inputs", default=False,
    106                     help="Print the expected input file list, then exit.")
    107   parser.add_option("-o", action="store_true", dest="outputs", default=False,
    108                     help="Print the expected output file list, then exit.")
    109   parser.add_option("-g", action="store", dest="grit_dir",
    110                     help="GRIT build files output directory.")
    111   parser.add_option("-x", action="store", dest="int_dir",
    112                     help="Intermediate build files output directory.")
    113   parser.add_option("-e", action="append", dest="extra_input", default=[],
    114                     help="Full path to an extra input pak file without the\
    115                          locale suffix and \".pak\" extension.")
    116   parser.add_option("-p", action="store", dest="os",
    117                     help="The target OS. (e.g. mac, linux, win, etc.)")
    118   options, locales = parser.parse_args(argv)
    119 
    120   if not locales:
    121     parser.error('Please specificy at least one locale to process.\n')
    122 
    123   print_inputs = options.inputs
    124   print_outputs = options.outputs
    125   GRIT_DIR = options.grit_dir
    126   INT_DIR = options.int_dir
    127   EXTRA_INPUT_FILES = options.extra_input
    128   OS = options.os
    129 
    130   if not OS:
    131     if sys.platform == 'darwin':
    132       OS = 'mac'
    133     elif sys.platform.startswith('linux'):
    134       OS = 'linux'
    135     elif sys.platform in ('cygwin', 'win32'):
    136       OS = 'win'
    137     else:
    138       OS = sys.platform
    139 
    140   if print_inputs and print_outputs:
    141     parser.error('Please specify only one of "-i" or "-o".\n')
    142   if print_inputs and not GRIT_DIR:
    143     parser.error('Please specify "-g".\n')
    144   if print_outputs and not INT_DIR:
    145     parser.error('Please specify "-x".\n')
    146   if not (print_inputs or print_outputs  or (GRIT_DIR and INT_DIR)):
    147     parser.error('Please specify both "-g" and "-x".\n')
    148 
    149   if print_inputs:
    150     return list_inputs(locales)
    151 
    152   if print_outputs:
    153     return list_outputs(locales)
    154 
    155   return repack_locales(locales)
    156 
    157 if __name__ == '__main__':
    158   results = DoMain(sys.argv[1:])
    159   if results:
    160     print results
    161