1 #!/usr/bin/env python 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 3 # Use of this source code is governed by a BSD-style license that can be 4 # found in the LICENSE file. 5 6 """Main entry point for the NaCl SDK buildbot. 7 8 The entry point used to be build_sdk.py itself, but we want 9 to be able to simplify build_sdk (for example separating out 10 the test code into test_sdk) and change its default behaviour 11 while being able to separately control excactly what the bots 12 run. 13 """ 14 15 import buildbot_common 16 import os 17 import optparse 18 import subprocess 19 import sys 20 21 from buildbot_common import Run 22 from build_paths import SRC_DIR, SDK_SRC_DIR, SCRIPT_DIR 23 import getos 24 25 26 def StepArmRunHooks(): 27 if getos.GetPlatform() != 'linux': 28 return 29 # Run 'gclient runhooks' for arm, as some arm specific tools are only 30 # installed in that case. 31 buildbot_common.BuildStep('gclient runhooks for arm') 32 env = dict(os.environ) 33 env['GYP_DEFINES'] = 'target_arch=arm' 34 Run(['gclient', 'runhooks'], env=env, cwd=SDK_SRC_DIR) 35 36 37 def StepRunUnittests(): 38 buildbot_common.BuildStep('Run unittests') 39 40 # Our tests shouldn't be using the proxy; they should all be connecting to 41 # localhost. Some slaves can't route HTTP traffic through the proxy to 42 # localhost (we get 504 gateway errors), so we clear it here. 43 env = dict(os.environ) 44 if 'http_proxy' in env: 45 del env['http_proxy'] 46 47 Run([sys.executable, 'test_all.py'], env=env, cwd=SDK_SRC_DIR) 48 49 50 def StepBuildSDK(): 51 is_win = getos.GetPlatform() == 'win' 52 53 # Windows has a path length limit of 255 characters, after joining cwd with a 54 # relative path. Use subst before building to keep the path lengths short. 55 if is_win: 56 subst_drive = 'S:' 57 root_dir = os.path.dirname(SRC_DIR) 58 new_root_dir = subst_drive + '\\' 59 subprocess.check_call(['subst', subst_drive, root_dir]) 60 new_script_dir = os.path.join(new_root_dir, 61 os.path.relpath(SCRIPT_DIR, root_dir)) 62 else: 63 new_script_dir = SCRIPT_DIR 64 65 args = [sys.executable, 'build_sdk.py'] 66 if 'bionic' in os.getenv('BUILDBOT_BUILDERNAME', ''): 67 args.append('--bionic') 68 69 try: 70 Run(args, cwd=new_script_dir) 71 finally: 72 if is_win: 73 subprocess.check_call(['subst', '/D', subst_drive]) 74 75 76 def StepTestSDK(): 77 cmd = [] 78 if getos.GetPlatform() == 'linux': 79 # Run all of test_sdk.py under xvfb-run; it's startup time leaves something 80 # to be desired, so only start it up once. 81 # We also need to make sure that there are at least 24 bits per pixel. 82 # https://code.google.com/p/chromium/issues/detail?id=316687 83 cmd.extend([ 84 'xvfb-run', 85 '--auto-servernum', 86 '--server-args', '-screen 0 1024x768x24' 87 ]) 88 89 cmd.extend([sys.executable, 'test_sdk.py']) 90 91 # TODO(noelallen): crbug 386332 92 # For Bionic SDK, only build do a build test until we have hardware. 93 if 'bionic' in os.getenv('BUILDBOT_BUILDERNAME', ''): 94 cmd.extend(['build_examples', 'copy_tests', 'build_tests']) 95 Run(cmd, cwd=SCRIPT_DIR) 96 97 98 def main(args): 99 # Don't write out .pyc files in the source tree. Without this, incremental 100 # builds can fail when .py files are moved/deleted, since python could load 101 # orphaned .pyc files generated by a previous run. 102 os.environ['PYTHONDONTWRITEBYTECODE'] = '1' 103 104 parser = optparse.OptionParser(description=__doc__) 105 parser.add_option('--build-only', action='store_true', 106 help='Only build the SDK, don\'t build or run tests.') 107 parser.add_option('--build-properties', 108 help='JSON properties passed by buildbot. Currently ignored.') 109 parser.add_option('--factory-properties', 110 help='JSON properties passed by buildbot. Currently ignored.') 111 options, args = parser.parse_args(args) 112 113 # Skip the testing phase if we are running on a build-only bots. 114 if not options.build_only: 115 # Infer build-only from bot name. 116 # TODO(sbc): Remove this once buildbot script have been updated 117 # to pass --build-only argument. 118 if os.getenv('BUILDBOT_BUILDERNAME', '').endswith('build'): 119 options.build_only = True 120 121 StepArmRunHooks() 122 StepRunUnittests() 123 StepBuildSDK() 124 if not options.build_only: 125 StepTestSDK() 126 127 return 0 128 129 130 if __name__ == '__main__': 131 try: 132 sys.exit(main(sys.argv[1:])) 133 except KeyboardInterrupt: 134 buildbot_common.ErrorExit('buildbot_run: interrupted') 135