• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#!/usr/bin/python
2
3"""Regenerates ICU data files."""
4
5import glob
6import os
7import shutil
8import subprocess
9import sys
10
11import i18nutil
12
13# Find the icu directory.
14android_build_top = i18nutil.GetAndroidRootOrDie()
15icu_dir = os.path.realpath('%s/external/icu' % android_build_top)
16icu4c_dir = os.path.realpath('%s/icu4c/source' % icu_dir)
17icu4j_dir = os.path.realpath('%s/icu4j' % icu_dir)
18i18nutil.CheckDirExists(icu4c_dir, 'external/icu/icu4c/source')
19i18nutil.CheckDirExists(icu4j_dir, 'external/icu/icu4j')
20
21def PrepareIcuBuild(icu_build_dir):
22  # Keep track of the original cwd so we can go back to it at the end.
23  original_working_dir = os.getcwd()
24
25  # Create a directory to run 'make' from.
26  os.mkdir(icu_build_dir)
27  os.chdir(icu_build_dir)
28
29  # Build the ICU tools.
30  print 'Configuring ICU tools...'
31  subprocess.check_call(['%s/runConfigureICU' % icu4c_dir, 'Linux'])
32
33  os.chdir(original_working_dir)
34
35def icuDir():
36  return icu_dir
37
38def MakeTzDataFiles(icu_build_dir, data_filename):
39  # Keep track of the original cwd so we can go back to it at the end.
40  original_working_dir = os.getcwd()
41
42  # Fix missing files.
43  os.chdir('%s/tools/tzcode' % icu_build_dir)
44
45  # The tz2icu tool only picks up icuregions and icuzones in they are in the CWD
46  for icu_data_file in [ 'icuregions', 'icuzones']:
47    icu_data_file_source = '%s/tools/tzcode/%s' % (icu4c_dir, icu_data_file)
48    icu_data_file_symlink = './%s' % icu_data_file
49    os.symlink(icu_data_file_source, icu_data_file_symlink)
50
51  shutil.copyfile('%s/%s' % (original_working_dir, data_filename),
52                  data_filename)
53
54  print 'Making ICU tz data files...'
55  # The Makefile assumes the existence of the bin directory.
56  os.mkdir('%s/bin' % icu_build_dir)
57  subprocess.check_call(['make'])
58
59  # Copy the source file to its ultimate destination.
60  icu_txt_data_dir = '%s/data/misc' % icu4c_dir
61  print 'Copying zoneinfo64.txt to %s ...' % icu_txt_data_dir
62  shutil.copy('zoneinfo64.txt', icu_txt_data_dir)
63
64  os.chdir(original_working_dir)
65
66
67def MakeAndCopyIcuDataFiles(icu_build_dir):
68  # Keep track of the original cwd so we can go back to it at the end.
69  original_working_dir = os.getcwd()
70
71  # Regenerate the .dat file.
72  os.chdir(icu_build_dir)
73  subprocess.check_call(['make', 'INCLUDE_UNI_CORE_DATA=1', '-j32'])
74
75  # Copy the .dat file to its ultimate destination.
76  icu_dat_data_dir = '%s/stubdata' % icu4c_dir
77  datfiles = glob.glob('data/out/tmp/icudt??l.dat')
78  if len(datfiles) != 1:
79    print 'ERROR: Unexpectedly found %d .dat files (%s). Halting.' % (len(datfiles), datfiles)
80    sys.exit(1)
81  datfile = datfiles[0]
82  print 'Copying %s to %s ...' % (datfile, icu_dat_data_dir)
83  shutil.copy(datfile, icu_dat_data_dir)
84
85  # Generate the ICU4J .jar files
86  os.chdir('%s/data' % icu_build_dir)
87  subprocess.check_call(['make', 'icu4j-data'])
88
89  # Copy the ICU4J .jar files to their ultimate destination.
90  icu_jar_data_dir = '%s/main/shared/data' % icu4j_dir
91  jarfiles = glob.glob('out/icu4j/*.jar')
92  if len(jarfiles) != 2:
93    print 'ERROR: Unexpectedly found %d .jar files (%s). Halting.' % (len(jarfiles), jarfiles)
94    sys.exit(1)
95  for jarfile in jarfiles:
96    print 'Copying %s to %s ...' % (jarfile, icu_jar_data_dir)
97    shutil.copy(jarfile, icu_jar_data_dir)
98
99  # Switch back to the original working cwd.
100  os.chdir(original_working_dir)
101
102# Run with no arguments from any directory, with no special setup required.
103def main():
104  i18nutil.SwitchToNewTemporaryDirectory()
105  icu_build_dir = '%s/icu' % os.getcwd()
106
107  print 'Found icu in %s ...' % icu_dir
108
109  PrepareIcuBuild(icu_build_dir)
110
111  MakeAndCopyIcuDataFiles(icu_build_dir)
112
113  print 'Look in %s for new data files' % icu_dir
114  sys.exit(0)
115
116if __name__ == '__main__':
117  main()
118