blob: 6ed039f150f1f0833910e2f2341a6626a45d2541 [file] [log] [blame]
#!/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 multiprocessing
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(),
'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) + '\n')
subprocess.check_call(['gn', 'gen', build_dir, '--check'])
subprocess.check_call(['ninja', '-j%d' % jobs, '-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)
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 ninja')
parser.add_argument('--parallel',
action='store_true',
default=False,
help='whether to run all instrumented builds in parallel')
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())
build_types = sorted(set(args.build_type))
if args.parallel:
procs = []
for build_type in build_types:
proc = multiprocessing.Process(target=build_libraries,
args=(build_type, ubuntu_release,
args.jobs, args.use_goma))
proc.start()
procs.append(proc)
for proc in procs:
proc.join()
else:
for build_type in build_types:
build_libraries(build_type, ubuntu_release, args.jobs, args.use_goma)
print 'To upload, run:'
for build_type in build_types:
print('upload_to_google_storage.py -b '
'chromium-instrumented-libraries %s-%s.tgz' %
(build_type, ubuntu_release))
print 'You should then commit the resulting .sha1 files.'
if __name__ == '__main__':
main()