Bug 1284197 - Make icu_sources_data.py runnable on Windows. r=glandium
authorXidorn Quan <me@upsuper.org>
Sat, 16 Jul 2016 11:44:15 +1000
changeset 305182 9a85c5ad60511900628b7a071f095b2e0fc33dd9
parent 305181 fcb08d92807912a6757b8af58ce05d7d5f1f75e0
child 305183 b186c22ef65f7bb183d488e2133ad8641a862c36
push id30455
push usercbook@mozilla.com
push dateSun, 17 Jul 2016 08:08:29 +0000
treeherdermozilla-central@711963e8daa3 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersglandium
bugs1284197
milestone50.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1284197 - Make icu_sources_data.py runnable on Windows. r=glandium MozReview-Commit-ID: JkNIxUUIzAX
intl/icu_sources_data.py
--- a/intl/icu_sources_data.py
+++ b/intl/icu_sources_data.py
@@ -14,21 +14,23 @@ from __future__ import print_function
 
 import glob
 import os
 import shutil
 import subprocess
 import sys
 import tempfile
 
+from mozpack import path as mozpath
+
 
 def find_source_file(dir, filename):
     base = os.path.splitext(filename)[0]
     for ext in ('.cpp', '.c'):
-        f = os.path.join(dir, base + ext)
+        f = mozpath.join(dir, base + ext)
         if os.path.isfile(f):
             return f
     raise Exception("Couldn't find source file for: %s" % filename)
 
 
 def get_sources_from_makefile(makefile):
     import pymake.parser
     from pymake.parserdata import SetVariable
@@ -48,106 +50,109 @@ def write_sources(mozbuild, sources):
                 'DO NOT EDIT\n' +
                 'SOURCES += [\n')
         f.write(''.join("   '/%s',\n" % s for s in sources))
         f.write(']\n')
 
 
 def update_sources(topsrcdir):
     print('Updating ICU sources lists...')
-    sys.path.append(os.path.join(topsrcdir, 'build/pymake'))
+    sys.path.append(mozpath.join(topsrcdir, 'build/pymake'))
     for d in ['common', 'i18n']:
-        makefile = os.path.join(topsrcdir,
+        makefile = mozpath.join(topsrcdir,
                                 'intl/icu/source/%s/Makefile.in' % d)
-        mozbuild = os.path.join(topsrcdir,
+        mozbuild = mozpath.join(topsrcdir,
                                 'config/external/icu/%s/sources.mozbuild' % d)
-        sources = [os.path.relpath(s, topsrcdir)
+        sources = [mozpath.relpath(s, topsrcdir)
                    for s in get_sources_from_makefile(makefile)]
         write_sources(mozbuild, sources)
 
 
 def try_run(name, command, cwd=None, **kwargs):
-    with tempfile.NamedTemporaryFile(prefix=name, delete=False) as f:
-        if subprocess.call(command,
-                           stdout=f,
-                           stderr=subprocess.STDOUT,
-                           cwd=cwd,
-                           **kwargs) == 0:
-            os.unlink(f.name)
-            return True
-    print('''Error running "{}" in directory {}
-See output in {}'''.format(' '.join(command), cwd, f.name),
-          file=sys.stderr)
-    return False
+    try:
+        with tempfile.NamedTemporaryFile(prefix=name, delete=False) as f:
+            subprocess.check_call(command, cwd=cwd, stdout=f,
+                                stderr=subprocess.STDOUT, **kwargs)
+    except subprocess.CalledProcessError:
+        print('''Error running "{}" in directory {}
+    See output in {}'''.format(' '.join(command), cwd, f.name),
+            file=sys.stderr)
+        return False
+    else:
+        os.unlink(f.name)
+        return True
 
 
 def get_data_file(data_dir):
-    files = glob.glob(os.path.join(data_dir, 'icudt*.dat'))
+    files = glob.glob(mozpath.join(data_dir, 'icudt*.dat'))
     return files[0] if files else None
 
 
 def update_data_file(topsrcdir):
     objdir = tempfile.mkdtemp(prefix='icu-obj-')
-    configure = os.path.join(topsrcdir, 'intl/icu/source/configure')
+    configure = mozpath.join(topsrcdir, 'intl/icu/source/configure')
     env = dict(os.environ)
     # bug 1262101 - these should be shared with the moz.build files
     env.update({
         'CPPFLAGS': ('-DU_NO_DEFAULT_INCLUDE_UTF_HEADERS=1 ' +
                      '-DUCONFIG_NO_LEGACY_CONVERSION ' +
                      '-DUCONFIG_NO_TRANSLITERATION ' +
                      '-DUCONFIG_NO_REGULAR_EXPRESSIONS ' +
                      '-DUCONFIG_NO_BREAK_ITERATION ' +
                      '-DU_CHARSET_IS_UTF8')
     })
     print('Running ICU configure...')
     if not try_run(
             'icu-configure',
-            [configure,
+            ['sh', configure,
              '--with-data-packaging=archive',
              '--enable-static',
              '--disable-shared',
              '--disable-extras',
              '--disable-icuio',
              '--disable-layout',
              '--disable-tests',
              '--disable-samples',
              '--disable-strict'],
             cwd=objdir,
             env=env):
         return False
     print('Running ICU make...')
     if not try_run('icu-make', ['make'], cwd=objdir):
         return False
     print('Copying ICU data file...')
-    tree_data_path = os.path.join(topsrcdir,
+    tree_data_path = mozpath.join(topsrcdir,
                                   'config/external/icu/data/')
     old_data_file = get_data_file(tree_data_path)
     if not old_data_file:
         print('Error: no ICU data file in %s' % tree_data_path,
               file=sys.stderr)
         return False
-    new_data_file = get_data_file(os.path.join(objdir, 'data/out'))
+    new_data_file = get_data_file(mozpath.join(objdir, 'data/out'))
     if not new_data_file:
         print('Error: no ICU data in ICU objdir', file=sys.stderr)
         return False
     if os.path.basename(old_data_file) != os.path.basename(new_data_file):
         # Data file name has the major version number embedded.
         os.unlink(old_data_file)
     shutil.copy(new_data_file, tree_data_path)
-    shutil.rmtree(objdir)
+    try:
+        shutil.rmtree(objdir)
+    except:
+        print('Warning: failed to remove %s' % objdir, file=sys.stderr)
     return True
 
 
 def main():
     if len(sys.argv) != 2:
         print('Usage: icu_sources_data.py <mozilla topsrcdir>',
               file=sys.stderr)
         sys.exit(1)
 
-    topsrcdir = os.path.abspath(sys.argv[1])
+    topsrcdir = mozpath.abspath(sys.argv[1])
     update_sources(topsrcdir)
     if not update_data_file(topsrcdir):
         print('Error updating ICU data file', file=sys.stderr)
         sys.exit(1)
 
 
 if __name__ == '__main__':
     main()