Index: third_party/instrumented_libraries/download_build_install.py |
diff --git a/third_party/instrumented_libraries/download_build_install.py b/third_party/instrumented_libraries/download_build_install.py |
index 50945d2ec41af27fa93f0e3d7592678f8ca56873..48694fa4446a19ed924056589d0785d5396f4dad 100755 |
--- a/third_party/instrumented_libraries/download_build_install.py |
+++ b/third_party/instrumented_libraries/download_build_install.py |
@@ -58,6 +58,8 @@ class InstrumentedPackageBuilder(object): |
product_dir = real_path(args.product_dir) |
self._destdir = os.path.join( |
product_dir, 'instrumented_libraries', self._sanitizer) |
+ self._source_archives_dir = os.path.join( |
+ product_dir, 'instrumented_libraries', 'sources', self._package) |
self._cflags = unescape_flags(args.cflags) |
if args.sanitizer_blacklist: |
@@ -70,6 +72,7 @@ class InstrumentedPackageBuilder(object): |
# Initialized later. |
self._source_dir = None |
+ self._source_archives = None |
def init_build_env(self): |
self._build_env = os.environ.copy() |
@@ -105,7 +108,11 @@ class InstrumentedPackageBuilder(object): |
raise Exception('Failed to run: %s' % command) |
def maybe_download_source(self): |
- """Checks out the source code (if needed) and sets self._source_dir.""" |
+ """Checks out the source code (if needed). |
+ |
+ Checks out the source code for the package, if required (i.e. unless running |
+ in no-clobber mode). Initializes self._source_dir and self._source_archives. |
+ """ |
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) |
@@ -114,11 +121,19 @@ class InstrumentedPackageBuilder(object): |
cwd=self._working_dir) |
(dirpath, dirnames, filenames) = os.walk(self._working_dir).next() |
+ |
if len(dirnames) != 1: |
- raise Exception('apt-get source %s must create exactly one subdirectory.' |
- % self._package) |
+ raise Exception( |
+ '`apt-get source %s\' must create exactly one subdirectory.' |
+ % self._package) |
self._source_dir = os.path.join(dirpath, dirnames[0], '') |
+ if len(filenames) == 0: |
+ raise Exception('Can\'t find source archives after `apt-get source %s\'.' |
+ % self._package) |
+ self._source_archives = \ |
+ [os.path.join(dirpath, filename) for filename in filenames] |
+ |
return get_fresh_source |
def patch_source(self): |
@@ -127,10 +142,24 @@ class InstrumentedPackageBuilder(object): |
if self._run_before_build: |
self.shell_call(self._run_before_build, cwd=self._source_dir) |
+ def copy_source_archives(self): |
+ """Copies the downloaded source archives to the output dir. |
+ |
+ 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) |
+ os.makedirs(self._source_archives_dir) |
+ for filename in self._source_archives: |
+ shutil.copy(filename, self._source_archives_dir) |
+ if self._patch: |
+ shutil.copy(self._patch, self._source_archives_dir) |
+ |
def download_build_install(self): |
got_fresh_source = self.maybe_download_source() |
if got_fresh_source: |
self.patch_source() |
+ self.copy_source_archives() |
self.shell_call('mkdir -p %s' % self.dest_libdir()) |