| #!/usr/bin/python |
| # Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
| # for details. All rights reserved. Use of this source code is governed by a |
| # BSD-style license that can be found in the LICENSE file. |
| |
| import os |
| import re |
| import sys |
| |
| import bot |
| |
| GCS_BUCKET = 'gs://dart-cross-compiled-binaries' |
| SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) |
| sys.path.append(os.path.join(SCRIPT_DIR, '..')) |
| |
| import utils |
| |
| CROSS_VM = r'cross-(arm)-vm-linux-(release)' |
| TARGET_VM = r'target-(arm)-vm-linux-(([0-9]+)-([0-9]+))?(release)' |
| GSUTIL = utils.GetBuildbotGSUtilPath() |
| |
| def run(args): |
| print 'Running: %s' % (' '.join(args)) |
| sys.stdout.flush() |
| bot.RunProcess(args) |
| |
| def tarball_name(arch, mode, revision): |
| return 'cross_build_%s_%s_%s.tar.bz2' % (arch, mode, revision) |
| |
| def record_names(name, arch, mode): |
| return ('record_%s_%s_%s.json' % (name, arch, mode), |
| 'record_output_%s_%s_%s.json' % (name, arch, mode)) |
| |
| def cross_compiling_builder(arch, mode): |
| build_py = os.path.join('tools', 'build.py') |
| revision = os.environ['BUILDBOT_GOT_REVISION'] |
| tarball = tarball_name(arch, mode, revision) |
| temporary_files = [tarball] |
| bot.Clobber() |
| try: |
| num_run = int(os.environ['BUILDBOT_ANNOTATED_STEPS_RUN']) |
| if num_run == 1: |
| with bot.BuildStep('Build %s %s' % (arch, mode)): |
| run([sys.executable, build_py, |
| '-m%s' % mode, '--arch=%s' % arch, 'runtime']) |
| |
| with bot.BuildStep('Create build tarball'): |
| run(['tar', '-cjf', tarball, '--exclude=**/obj', |
| '--exclude=**/obj.host', '--exclude=**/obj.target', |
| '--exclude=**/*analyzer*', 'out/']) |
| |
| with bot.BuildStep('Upload build tarball'): |
| uri = "%s/%s" % (GCS_BUCKET, tarball) |
| run([GSUTIL, 'cp', '-a', 'public-read', tarball, uri]) |
| |
| elif num_run == 2: |
| with bot.BuildStep('tests'): |
| print "Please see the target device for results." |
| print "We no longer record/replay tests." |
| else: |
| raise Exception("Invalid annotated steps run") |
| finally: |
| for path in temporary_files: |
| if os.path.exists(path): |
| os.remove(path) |
| |
| def target_builder(arch, mode, total_shards, shard_index): |
| test_py = os.path.join('tools', 'test.py') |
| test_args = [sys.executable, test_py, '--progress=line', '--report', |
| '--time', '--compiler=none', '--runtime=vm', '--write-debug-log', |
| '--write-test-outcome-log', '--mode=' + mode, '--arch=' + arch] |
| if total_shards and shard_index: |
| test_args.append('--shards=%s' % total_shards) |
| test_args.append('--shard=%s' % shard_index) |
| |
| revision = os.environ['BUILDBOT_GOT_REVISION'] |
| tarball = tarball_name(arch, mode, revision) |
| temporary_files = [tarball] |
| bot.Clobber() |
| try: |
| with bot.BuildStep('Fetch build tarball'): |
| run([GSUTIL, 'cp', "%s/%s" % (GCS_BUCKET, tarball), tarball]) |
| |
| with bot.BuildStep('Unpack build tarball'): |
| run(['tar', '-xjf', tarball]) |
| |
| with bot.BuildStep('execute tests'): |
| run(test_args) |
| |
| with bot.BuildStep('execute checked_tests'): |
| run(test_args + ['--checked', '--append_logs']) |
| finally: |
| for path in temporary_files: |
| if os.path.exists(path): |
| os.remove(path) |
| # We always clobber this to save disk on the arm board. |
| bot.Clobber(force=True) |
| |
| def main(): |
| name, is_buildbot = bot.GetBotName() |
| |
| cross_vm_pattern_match = re.match(CROSS_VM, name) |
| target_vm_pattern_match = re.match(TARGET_VM, name) |
| if cross_vm_pattern_match: |
| arch = cross_vm_pattern_match.group(1) |
| mode = cross_vm_pattern_match.group(2) |
| cross_compiling_builder(arch, mode) |
| elif target_vm_pattern_match: |
| arch = target_vm_pattern_match.group(1) |
| mode = target_vm_pattern_match.group(5) |
| shard_index = target_vm_pattern_match.group(3) |
| total_shards = target_vm_pattern_match.group(4) |
| target_builder(arch, mode, total_shards, shard_index) |
| else: |
| raise Exception("Unknown builder name %s" % name) |
| |
| if __name__ == '__main__': |
| try: |
| sys.exit(main()) |
| except OSError as e: |
| sys.exit(e.errno) |