#!/usr/bin/python -B """Regenerates (just) ICU data source files used to build ICU data files.""" from __future__ import print_function import os import pipes import shutil import subprocess import sys import i18nutil import icuutil # Run with no arguments from any directory, with no special setup required. # See icu4c/source/data/cldr-icu-readme.txt for the upstream ICU instructions. def main(): cldr_dir = icuutil.cldrDir() print('Found cldr in %s ...' % cldr_dir) icu_dir = icuutil.icuDir() print('Found icu in %s ...' % icu_dir) # Ant doesn't have any mechanism for using a build directory separate from the # source directory so this build script creates a temporary directory and then # copies all necessary ICU4J and CLDR source code to here before building it: i18nutil.SwitchToNewTemporaryDirectory() print('Copying ICU4J source code ...') shutil.copytree(os.path.join(icu_dir, 'icu4j'), 'icu4j', True) print('Building ICU4J ...') subprocess.check_call([ 'ant', '-f', 'icu4j/build.xml', 'jar', 'cldrUtil', ]) # Append the newly built JAR files to the Java CLASSPATH to use these instead # of the pre-built JAR files in the CLDR source tree, to ensure that the same # version of ICU is being used to build the data as will use the data: cp = [] try: cp.append(os.environ['CLASSPATH']) except KeyError: pass cp.append('icu4j/icu4j.jar') cp.append('icu4j/out/cldr_util/lib/utilities.jar') os.environ['CLASSPATH'] = ':'.join(cp) # This is the location of the original CLDR source tree (not the temporary # copy of the tools source code) from where the data files are to be read: os.environ['CLDR_DIR'] = cldr_dir print('Copying CLDR source code ...') shutil.copytree(os.path.join(cldr_dir, 'tools/java'), 'cldr-tools-java', True) print('Building CLDR tools ...') subprocess.check_call([ 'ant', '-f', 'cldr-tools-java/build.xml', 'tool', 'AddPseudolocales', ]) # This is the temporary directory in which the CLDR tools have been built: os.environ['CLDR_CLASSES'] = os.path.join( os.getcwd(), 'cldr-tools-java/classes') # It's essential to set CLDR_DTD_CACHE for otherwise the repeated requests for # the same file will cause the unicode.org web server to block this machine: os.makedirs('cldr-dtd-cache') os.environ['ANT_OPTS'] = '-DCLDR_DTD_CACHE=%s' % pipes.quote(os.path.join( os.getcwd(), 'cldr-dtd-cache')) print('Building ICU data source files ...') subprocess.check_call([ 'ant', '-f', os.path.join(icu_dir, 'icu4c/source/data/build.xml'), 'clean', 'all', ]) print('Look in %s/icu4c/source/data for new data source files' % icu_dir) sys.exit(0) if __name__ == '__main__': main()