| Index: third_party/instrumented_libraries/scripts/download_build_install.py
|
| diff --git a/third_party/instrumented_libraries/scripts/download_build_install.py b/third_party/instrumented_libraries/scripts/download_build_install.py
|
| index 9902b2bd696435a8e410c57792b9a2df89d6902d..68511a507ab966954423fec22634430bc335d8da 100755
|
| --- a/third_party/instrumented_libraries/scripts/download_build_install.py
|
| +++ b/third_party/instrumented_libraries/scripts/download_build_install.py
|
| @@ -6,6 +6,7 @@
|
| """Downloads, builds (with instrumentation) and installs shared libraries."""
|
|
|
| import argparse
|
| +import ast
|
| import os
|
| import platform
|
| import re
|
| @@ -23,7 +24,12 @@ def unescape_flags(s):
|
| line, wrapping each flag in double quotes. When flags are passed via
|
| CFLAGS/LDFLAGS instead, double quotes must be dropped.
|
| """
|
| - return ' '.join(shlex.split(s))
|
| + if not s:
|
| + return ''
|
| + try:
|
| + return ' '.join(ast.literal_eval(s))
|
| + except (SyntaxError, ValueError):
|
| + return ' '.join(shlex.split(s))
|
|
|
|
|
| def real_path(path_relative_to_gyp):
|
| @@ -42,7 +48,7 @@ class InstrumentedPackageBuilder(object):
|
| def __init__(self, args, clobber):
|
| self._cc = args.cc
|
| self._cxx = args.cxx
|
| - self._extra_configure_flags = args.extra_configure_flags
|
| + self._extra_configure_flags = unescape_flags(args.extra_configure_flags)
|
| self._jobs = args.jobs
|
| self._libdir = args.libdir
|
| self._package = args.package
|
| @@ -115,7 +121,7 @@ class InstrumentedPackageBuilder(object):
|
| """
|
| get_fresh_source = self._clobber or not os.path.exists(self._working_dir)
|
| if get_fresh_source:
|
| - self.shell_call('rm -rf %s' % self._working_dir)
|
| + shutil.rmtree(self._working_dir, ignore_errors=True)
|
| os.makedirs(self._working_dir)
|
| self.shell_call('apt-get source %s' % self._package,
|
| cwd=self._working_dir)
|
| @@ -148,7 +154,7 @@ class InstrumentedPackageBuilder(object):
|
| For license compliance purposes, every Chromium build that includes
|
| instrumented libraries must include their full source code.
|
| """
|
| - self.shell_call('rm -rf %s' % self._source_archives_dir)
|
| + shutil.rmtree(self._source_archives_dir, ignore_errors=True)
|
| os.makedirs(self._source_archives_dir)
|
| for filename in self._source_archives:
|
| shutil.copy(filename, self._source_archives_dir)
|
| @@ -161,7 +167,8 @@ class InstrumentedPackageBuilder(object):
|
| self.patch_source()
|
| self.copy_source_archives()
|
|
|
| - self.shell_call('mkdir -p %s' % self.dest_libdir())
|
| + if not os.path.exists(self.dest_libdir()):
|
| + os.makedirs(self.dest_libdir())
|
|
|
| try:
|
| self.build_and_install()
|
| @@ -366,7 +373,12 @@ class NSSBuilder(InstrumentedPackageBuilder):
|
|
|
| # Parallel build is not supported. Also, the build happens in
|
| # <source_dir>/nss.
|
| - self.make(make_args, jobs=1, cwd=temp_dir)
|
| + try:
|
| + self.make(make_args, jobs=1, cwd=temp_dir)
|
| + except Exception:
|
| + # Building fails after all the required DSOs have been built, so ignore
|
| + # the error.
|
| + pass
|
|
|
| self.fix_rpaths(temp_libdir)
|
|
|
| @@ -380,6 +392,16 @@ class NSSBuilder(InstrumentedPackageBuilder):
|
| shutil.copy(full_path, self.dest_libdir())
|
|
|
|
|
| +class StubBuilder(InstrumentedPackageBuilder):
|
| + def download_build_install(self):
|
| + self._touch(os.path.join(self._destdir, '%s.txt' % self._package))
|
| + self._touch(os.path.join(self.dest_libdir(), '%s.so.0' % self._package))
|
| +
|
| + def _touch(self, path):
|
| + with open(path, 'w'):
|
| + pass
|
| +
|
| +
|
| def main():
|
| parser = argparse.ArgumentParser(
|
| description='Download, build and install an instrumented package.')
|
| @@ -427,6 +449,8 @@ def main():
|
| builder = LibcapBuilder(args, clobber)
|
| elif args.build_method == 'custom_libpci3':
|
| builder = Libpci3Builder(args, clobber)
|
| + elif args.build_method == 'stub':
|
| + builder = StubBuilder(args, clobber)
|
| else:
|
| raise Exception('Unrecognized build method: %s' % args.build_method)
|
|
|
|
|