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 330246 9a85c5ad60511900628b7a071f095b2e0fc33dd9
parent 330245 fcb08d92807912a6757b8af58ce05d7d5f1f75e0
child 330247 b186c22ef65f7bb183d488e2133ad8641a862c36
push id9858
push userjlund@mozilla.com
push dateMon, 01 Aug 2016 14:37:10 +0000
treeherdermozilla-aurora@203106ef6cb6 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersglandium
bugs1284197
milestone50.0a1
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()