Index: third_party/instrumented_libraries/scripts/build_and_package.py |
diff --git a/third_party/instrumented_libraries/scripts/build_and_package.py b/third_party/instrumented_libraries/scripts/build_and_package.py |
new file mode 100755 |
index 0000000000000000000000000000000000000000..386cfc8fed3ce62f89276dd3c1e9883a3e9685df |
--- /dev/null |
+++ b/third_party/instrumented_libraries/scripts/build_and_package.py |
@@ -0,0 +1,114 @@ |
+#!/usr/bin/python |
+# Copyright 2016 The Chromium Authors. All rights reserved. |
+# Use of this source code is governed by a BSD-style license that can be |
+# found in the LICENSE file. |
+"""Builds and packages instrumented libraries for dynamic tools.""" |
+ |
+import argparse |
+import contextlib |
+import os |
+import shutil |
+import subprocess |
+import tarfile |
+ |
+BUILD_TYPES = { |
+ 'msan-no-origins': [ |
+ 'is_msan = true', |
+ 'msan_track_origins = 0', |
+ ], |
+ 'msan-chained-origins': [ |
+ 'is_msan = true', |
+ 'msan_track_origins = 2', |
+ ], |
+ 'tsan': ['is_tsan = true'], |
+ 'asan': ['is_asan = true'] |
+} |
+SUPPORTED_RELEASES = frozenset(['trusty']) |
+ |
+ |
+class Error(Exception): |
+ pass |
+ |
+ |
+class UnsupportedReleaseError(Error): |
+ pass |
+ |
+ |
+def _get_release(): |
+ return subprocess.check_output(['lsb_release', '-cs']).strip() |
+ |
+ |
+def _tar_filter(tar_info): |
+ if tar_info.name.endswith('.txt'): |
+ return None |
+ return tar_info |
+ |
+ |
+def build_libraries(build_type, ubuntu_release, jobs, use_goma): |
+ archive_name = '%s-%s' % (build_type, ubuntu_release) |
+ build_dir = 'out/Instrumented-%s' % archive_name |
+ if not os.path.exists(build_dir): |
+ os.makedirs(build_dir) |
+ |
+ gn_args = [ |
+ 'is_debug = false', |
+ 'use_goma = %s' % str(use_goma).lower(), |
+ 'instrumented_libraries_jobs = %d' % jobs, |
+ 'use_locally_built_instrumented_libraries = true', |
+ ] + BUILD_TYPES[build_type] |
+ with open(os.path.join(build_dir, 'args.gn'), 'w') as f: |
+ f.write('\n'.join(gn_args)) |
+ subprocess.check_call(['gn', 'gen', build_dir, '--check']) |
+ subprocess.check_call(['ninja', '-j2', '-C', build_dir, |
+ 'third_party/instrumented_libraries:locally_built']) |
+ with tarfile.open('%s.tgz' % archive_name, mode='w:gz') as f: |
+ prefix = build_type.split('-', 1)[0] |
+ f.add('%s/instrumented_libraries/%s' % (build_dir, prefix), |
+ arcname=prefix, |
+ filter=_tar_filter) |
+ f.add('%s/instrumented_libraries/sources' % build_dir, |
+ arcname='sources', |
+ filter=_tar_filter) |
+ return archive_name |
+ |
+ |
+def main(): |
+ parser = argparse.ArgumentParser( |
+ description=__doc__, |
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter) |
+ parser.add_argument( |
+ '--jobs', |
+ '-j', |
+ type=int, |
+ default=8, |
+ help='the default number of jobs to use when running make') |
+ parser.add_argument('--use_goma', |
+ action='store_true', |
+ default=False, |
+ help='whether to use goma to compile') |
+ parser.add_argument('build_type', |
+ nargs='*', |
+ default='all', |
+ choices=BUILD_TYPES.keys() + ['all'], |
+ help='the type of instrumented library to build') |
+ args = parser.parse_args() |
+ if args.build_type == 'all' or 'all' in args.build_type: |
+ args.build_type = BUILD_TYPES.keys() |
+ |
+ ubuntu_release = _get_release() |
+ if ubuntu_release not in SUPPORTED_RELEASES: |
+ raise UnsupportedReleaseError('%s is not a supported release' % |
+ _get_release()) |
+ archive_names = [ |
+ build_libraries(build_type, ubuntu_release, args.jobs, args.use_goma) |
+ for build_type in sorted(set(args.build_type)) |
+ ] |
+ print 'To upload, run:' |
+ for archive_name in archive_names: |
+ print('upload_to_google_storage.py -b ' |
+ 'chromium-instrumented-libraries %s.tgz') % archive_name |
+ print 'You should then commit the resulting .sha1 files.' |
+ |
+ |
+if __name__ == '__main__': |
+ main() |