Chromium Code Reviews| 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 68511a507ab966954423fec22634430bc335d8da..63719ae53cdad45471a828d771e61aebd1cfc795 100755 |
| --- a/third_party/instrumented_libraries/scripts/download_build_install.py |
| +++ b/third_party/instrumented_libraries/scripts/download_build_install.py |
| @@ -7,6 +7,7 @@ |
| import argparse |
| import ast |
| +import fcntl |
| import os |
| import platform |
| import re |
| @@ -49,7 +50,6 @@ class InstrumentedPackageBuilder(object): |
| self._cc = args.cc |
| self._cxx = args.cxx |
| self._extra_configure_flags = unescape_flags(args.extra_configure_flags) |
| - self._jobs = args.jobs |
| self._libdir = args.libdir |
| self._package = args.package |
| self._patch = real_path(args.patch) if args.patch else None |
| @@ -98,7 +98,7 @@ class InstrumentedPackageBuilder(object): |
| # libappindicator1 needs this. |
| self._build_env['CSC'] = '/usr/bin/mono-csc' |
| - def shell_call(self, command, env=None, cwd=None): |
| + def shell_call(self, command, env=None, cwd=None, ignore_ret_code=False): |
| """Wrapper around subprocess.Popen(). |
| Calls command with specific environment and verbosity using |
| @@ -108,6 +108,10 @@ class InstrumentedPackageBuilder(object): |
| command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, |
| env=env, shell=True, cwd=cwd) |
| stdout, stderr = child.communicate() |
| + if ignore_ret_code: |
| + if self._verbose: |
| + print stdout |
| + return |
| if self._verbose or child.returncode: |
| print stdout |
| if child.returncode: |
| @@ -123,8 +127,15 @@ class InstrumentedPackageBuilder(object): |
| if get_fresh_source: |
| shutil.rmtree(self._working_dir, ignore_errors=True) |
| os.makedirs(self._working_dir) |
| + |
| + # Download one source package at a time, otherwise, there will |
| + # be connection errors in gnutls_handshake(). |
| + self.shell_call('touch apt-source-lock') |
|
Evgeniy Stepanov
2017/03/07 22:42:02
Why not open('apt-source-lock', 'w') ?
Tom (Use chromium acct)
2017/03/08 00:24:58
Done.
|
| + lock = open('apt-source-lock') |
| + fcntl.flock(lock, fcntl.LOCK_EX) |
| self.shell_call('apt-get source %s' % self._package, |
| cwd=self._working_dir) |
| + fcntl.flock(lock, fcntl.LOCK_UN) |
| (dirpath, dirnames, filenames) = os.walk(self._working_dir).next() |
| @@ -215,20 +226,19 @@ class InstrumentedPackageBuilder(object): |
| # .pc files are not needed. |
| self.shell_call('rm %s/pkgconfig -rf' % self.temp_libdir()) |
| - def make(self, args, jobs=None, env=None, cwd=None): |
| + def make(self, args, env=None, cwd=None, ignore_ret_code=False): |
| """Invokes `make'. |
| Invokes `make' with the specified args, using self._build_env and |
| self._source_dir by default. |
| """ |
| - if jobs is None: |
| - jobs = self._jobs |
| if cwd is None: |
| cwd = self._source_dir |
| if env is None: |
| env = self._build_env |
| - cmd = ['make', '-j%s' % jobs] + args |
| - self.shell_call(' '.join(cmd), env=env, cwd=cwd) |
| + cmd = ['make'] + args |
| + self.shell_call(' '.join(cmd), env=env, cwd=cwd, |
| + ignore_ret_code=ignore_ret_code) |
| def make_install(self, args, **kwargs): |
| """Invokes `make install'.""" |
| @@ -238,7 +248,7 @@ class InstrumentedPackageBuilder(object): |
| """Builds and installs the DSOs. |
| Builds the package with ./configure + make, installs it to a temporary |
| - location, then moves the relevant files to their permanent location. |
| + location, then moves the relevant files to their permanent location. |
| """ |
| configure_cmd = './configure --libdir=/%s/ %s' % ( |
| self._libdir, self._extra_configure_flags) |
| @@ -249,8 +259,7 @@ class InstrumentedPackageBuilder(object): |
| make_args = ['%s=%s' % (name, self.temp_dir()) for name in args] |
| self.make(make_args) |
| - # Some packages don't support parallel install. Use -j1 always. |
| - self.make_install(make_args, jobs=1) |
| + self.make_install(make_args) |
| self.cleanup_after_install() |
| @@ -371,14 +380,9 @@ class NSSBuilder(InstrumentedPackageBuilder): |
| temp_dir = os.path.join(self._source_dir, 'nss') |
| temp_libdir = os.path.join(temp_dir, 'lib') |
| - # Parallel build is not supported. Also, the build happens in |
| - # <source_dir>/nss. |
| - 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 |
| + # The build happens in <source_dir>/nss. Building fails after all |
| + # the required DSOs have been built, so ignore the error. |
| + self.make(make_args, cwd=temp_dir, ignore_ret_code=True) |
| self.fix_rpaths(temp_libdir) |
| @@ -395,6 +399,7 @@ class NSSBuilder(InstrumentedPackageBuilder): |
| class StubBuilder(InstrumentedPackageBuilder): |
| def download_build_install(self): |
| self._touch(os.path.join(self._destdir, '%s.txt' % self._package)) |
| + self.shell_call('mkdir -p %s' % self.dest_libdir()) |
| self._touch(os.path.join(self.dest_libdir(), '%s.so.0' % self._package)) |
| def _touch(self, path): |
| @@ -406,7 +411,6 @@ def main(): |
| parser = argparse.ArgumentParser( |
| description='Download, build and install an instrumented package.') |
| - parser.add_argument('-j', '--jobs', type=int, default=1) |
| parser.add_argument('-p', '--package', required=True) |
| parser.add_argument( |
| '-i', '--product-dir', default='.', |