summaryrefslogtreecommitdiffstats
path: root/native_client_sdk/src/build_tools/buildbot_run.py
blob: 70a78def3f04bf8b2d08f11049d07704c24ad227 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/env python
# Copyright (c) 2012 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.

"""Main entry point for the NaCl SDK buildbot.

The entry point used to be build_sdk.py itself, but we want
to be able to simplify build_sdk (for example separating out
the test code into test_sdk) and change its default behaviour
while being able to separately control excactly what the bots
run.
"""

import argparse
import buildbot_common
import os
import subprocess
import sys

from buildbot_common import Run
from build_paths import SRC_DIR, SDK_SRC_DIR, SCRIPT_DIR
import getos


def StepArmRunHooks():
  if getos.GetPlatform() != 'linux':
    return
  # Run 'gclient runhooks' for arm, as some arm specific tools are only
  # installed in that case.
  buildbot_common.BuildStep('gclient runhooks for arm')
  env = dict(os.environ)
  env['GYP_DEFINES'] = 'target_arch=arm'
  env['GYP_CHROMIUM_NO_ACTION'] = '1'
  Run(['gclient', 'runhooks'], env=env, cwd=SDK_SRC_DIR)


def StepRunUnittests():
  buildbot_common.BuildStep('Run unittests')

  # Our tests shouldn't be using the proxy; they should all be connecting to
  # localhost. Some slaves can't route HTTP traffic through the proxy to
  # localhost (we get 504 gateway errors), so we clear it here.
  env = dict(os.environ)
  if 'http_proxy' in env:
    del env['http_proxy']

  Run([sys.executable, 'test_all.py', '-v'], env=env, cwd=SDK_SRC_DIR)


def StepBuildSDK():
  is_win = getos.GetPlatform() == 'win'

  # Windows has a path length limit of 255 characters, after joining cwd with a
  # relative path. Use subst before building to keep the path lengths short.
  if is_win:
    subst_drive = 'S:'
    root_dir = os.path.dirname(SRC_DIR)
    new_root_dir = subst_drive + '\\'
    subprocess.check_call(['subst', subst_drive, root_dir])
    new_script_dir = os.path.join(new_root_dir,
                                  os.path.relpath(SCRIPT_DIR, root_dir))
  else:
    new_script_dir = SCRIPT_DIR

  args = [sys.executable, 'build_sdk.py']

  try:
    Run(args, cwd=new_script_dir)
  finally:
    if is_win:
      subprocess.check_call(['subst', '/D', subst_drive])


def StepTestSDK(args):
  cmd = []
  if getos.GetPlatform() == 'linux':
    # Run all of test_sdk.py under xvfb-run; it's startup time leaves something
    # to be desired, so only start it up once.
    # We also need to make sure that there are at least 24 bits per pixel.
    # https://code.google.com/p/chromium/issues/detail?id=316687
    cmd += [
        'xvfb-run',
        '--auto-servernum',
        '--server-args', '-screen 0 1024x768x24'
    ]

  cmd += [sys.executable, 'test_sdk.py'] + args
  Run(cmd, cwd=SCRIPT_DIR)


def main(args):
  # Don't write out .pyc files in the source tree.  Without this, incremental
  # builds can fail when .py files are moved/deleted, since python could load
  # orphaned .pyc files generated by a previous run.
  os.environ['PYTHONDONTWRITEBYTECODE'] = '1'

  parser = argparse.ArgumentParser(description=__doc__)
  parser.add_argument('--build-only', action='store_true',
      help='Only build the SDK, don\'t build or run tests.')
  parser.add_argument('--build-properties',
      help='JSON properties passed by buildbot. Currently ignored.')
  parser.add_argument('--factory-properties',
      help='JSON properties passed by buildbot. Currently ignored.')
  options = parser.parse_args(args)

  # Skip the testing phase if we are running on a build-only bots.
  if not options.build_only:
    # Infer build-only from bot name.
    # TODO(sbc): Remove this once buildbot script have been updated
    # to pass --build-only argument.
    if os.getenv('BUILDBOT_BUILDERNAME', '').endswith('build'):
      options.build_only = True

  StepArmRunHooks()
  StepRunUnittests()
  StepBuildSDK()
  if not options.build_only:
    # Run sanitizer tests on the asan bot, and on the trybots
    args = []
    if getos.GetPlatform() == 'linux':
      if 'asan' in os.getenv('BUILDBOT_BUILDERNAME', ''):
        args = ['--sanitizer']
    StepTestSDK(args)

  return 0


if __name__ == '__main__':
  try:
    sys.exit(main(sys.argv[1:]))
  except KeyboardInterrupt:
    buildbot_common.ErrorExit('buildbot_run: interrupted')