#!/usr/bin/python -B """Regenerates (just) ICU data source files used to build ICU data files.""" from __future__ import print_function import os 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(): if subprocess.call(["which", "mvn"]) != 0 or subprocess.call(["which", "ant"]) != 0: print("Can't find the required tools. Run `sudo apt-get install maven ant` to install") exit(1) 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() build_dir = os.getcwd() cldr_build_dir = os.path.join(build_dir, 'cldr') icu4c_build_dir = os.path.join(build_dir, 'icu4c') icu4j_build_dir = os.path.join(build_dir, 'icu4j') icu_tools_build_dir = os.path.join(build_dir, 'icu_tools') print('Copying CLDR source code ...') shutil.copytree(cldr_dir, cldr_build_dir, symlinks=True) print('Copying ICU4C source code ...') shutil.copytree(os.path.join(icu_dir, 'icu4c'), icu4c_build_dir, symlinks=True) print('Copying ICU4J source code ...') shutil.copytree(os.path.join(icu_dir, 'icu4j'), icu4j_build_dir, symlinks=True) print('Copying ICU tools source code ...') shutil.copytree(os.path.join(icu_dir, 'tools'), icu_tools_build_dir, symlinks=True) # Setup environment variables for all subshell os.environ['ANT_OPTS'] = '-Xmx4096m' # 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_build_dir # os.path.join(os.getcwd(), 'cldr') os.environ['ICU4C_ROOT'] = icu4c_build_dir os.environ['ICU4J_ROOT'] = icu4j_build_dir os.environ['TOOLS_ROOT'] = icu_tools_build_dir cldr_tmp_dir = os.path.join(build_dir, 'cldr-staging') os.environ['CLDR_TMP_DIR'] = cldr_tmp_dir icu_tools_cldr_dir = os.path.join(icu_tools_build_dir, 'cldr') print('Installing CLDR tools ...') os.chdir(icu_tools_cldr_dir) subprocess.check_call(['ant', 'install-cldr-libs']) print('Building ICU data...') icu4c_data_build_dir = os.path.join(icu4c_build_dir, 'source/data') os.chdir(icu4c_data_build_dir) subprocess.check_call(['ant', 'cleanprod']) subprocess.check_call(['ant', 'setup']) subprocess.check_call(['ant', 'proddata']) # Finally we "compile" CLDR-data to a "production" form and place it in ICU os.chdir(os.path.join(icu_tools_build_dir, 'cldr', 'cldr-to-icu')) cldr_production_tmp_dir = os.path.join(cldr_tmp_dir, 'production') subprocess.check_call([ 'ant', '-f', 'build-icu-data.xml', '-DcldrDataDir=' + cldr_production_tmp_dir, '-DforceDelete=true', '-DincludePseudoLocales=true' ]) os.chdir(icu_tools_cldr_dir) subprocess.check_call([ 'ant', 'copy-cldr-testdata', ]) # Copy the generated data files from the temporary directory into AOSP. icu4c_data_source_dir = os.path.join(icu_dir, 'icu4c/source/data') rmAndCopyTree(icu4c_data_build_dir, icu4c_data_source_dir) rmAndCopyTree( os.path.join(icu4c_build_dir, 'source/test/testdata/cldr'), os.path.join(icu_dir, 'icu4c/source/test/testdata/cldr')) rmAndCopyTree( os.path.join(icu4j_build_dir, 'main/tests/core/src/com/ibm/icu/dev/data/cldr'), os.path.join(icu_dir, 'icu4j/main/tests/core/src/com/ibm/icu/dev/data/cldr')) localeCanonicalization_src = os.path.join( cldr_production_tmp_dir, 'common/testData/localeIdentifiers/localeCanonicalization.txt') shutil.copy(localeCanonicalization_src, os.path.join( icu_dir, 'icu4c/source/test/testdata/localeCanonicalization.txt')) shutil.copy(localeCanonicalization_src, os.path.join( icu_dir, 'icu4j/main/tests/core/src/com/ibm/icu/dev/data/unicode/localeCanonicalization.txt')) print('Look in %s for new data source files' % icu4c_data_source_dir) sys.exit(0) def rmAndCopyTree(src, dst): if os.path.exists(dst): shutil.rmtree(dst) shutil.copytree(src, dst) if __name__ == '__main__': main()