Home | History | Annotate | Download | only in tools
      1 #!/usr/bin/python -B
      2 
      3 """Regenerates (just) ICU data source files used to build ICU data files."""
      4 
      5 from __future__ import print_function
      6 
      7 import os
      8 import pipes
      9 import shutil
     10 import subprocess
     11 import sys
     12 
     13 import i18nutil
     14 import icuutil
     15 
     16 
     17 # Run with no arguments from any directory, with no special setup required.
     18 # See icu4c/source/data/cldr-icu-readme.txt for the upstream ICU instructions.
     19 def main():
     20   cldr_dir = icuutil.cldrDir()
     21   print('Found cldr in %s ...' % cldr_dir)
     22   icu_dir = icuutil.icuDir()
     23   print('Found icu in %s ...' % icu_dir)
     24 
     25   # Ant doesn't have any mechanism for using a build directory separate from the
     26   # source directory so this build script creates a temporary directory and then
     27   # copies all necessary ICU4J and CLDR source code to here before building it:
     28   i18nutil.SwitchToNewTemporaryDirectory()
     29 
     30   print('Copying ICU4J source code ...')
     31   shutil.copytree(os.path.join(icu_dir, 'icu4j'), 'icu4j', True)
     32   print('Building ICU4J ...')
     33   subprocess.check_call([
     34       'ant',
     35       '-f', 'icu4j/build.xml',
     36       'jar',
     37       'cldrUtil',
     38   ])
     39 
     40   # Append the newly built JAR files to the Java CLASSPATH to use these instead
     41   # of the pre-built JAR files in the CLDR source tree, to ensure that the same
     42   # version of ICU is being used to build the data as will use the data:
     43   cp = []
     44   try:
     45     cp.append(os.environ['CLASSPATH'])
     46   except KeyError:
     47     pass
     48   cp.append('icu4j/icu4j.jar')
     49   cp.append('icu4j/out/cldr_util/lib/utilities.jar')
     50   os.environ['CLASSPATH'] = ':'.join(cp)
     51 
     52   # This is the location of the original CLDR source tree (not the temporary
     53   # copy of the tools source code) from where the data files are to be read:
     54   os.environ['CLDR_DIR'] = cldr_dir
     55 
     56   print('Copying CLDR source code ...')
     57   shutil.copytree(os.path.join(cldr_dir, 'tools/java'), 'cldr-tools-java', True)
     58   print('Building CLDR tools ...')
     59   subprocess.check_call([
     60       'ant',
     61       '-f', 'cldr-tools-java/build.xml',
     62       'tool',
     63       'AddPseudolocales',
     64   ])
     65 
     66   # This is the temporary directory in which the CLDR tools have been built:
     67   os.environ['CLDR_CLASSES'] = os.path.join(
     68       os.getcwd(), 'cldr-tools-java/classes')
     69 
     70   # It's essential to set CLDR_DTD_CACHE for otherwise the repeated requests for
     71   # the same file will cause the unicode.org web server to block this machine:
     72   os.makedirs('cldr-dtd-cache')
     73   os.environ['ANT_OPTS'] = '-DCLDR_DTD_CACHE=%s' % pipes.quote(os.path.join(
     74       os.getcwd(), 'cldr-dtd-cache'))
     75 
     76   print('Building ICU data source files ...')
     77   subprocess.check_call([
     78       'ant',
     79       '-f', os.path.join(icu_dir, 'icu4c/source/data/build.xml'),
     80       'clean',
     81       'all',
     82   ])
     83 
     84   print('Look in %s/icu4c/source/data for new data source files' % icu_dir)
     85   sys.exit(0)
     86 
     87 if __name__ == '__main__':
     88   main()
     89