Home | History | Annotate | Download | only in build_tools
      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