1342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch#!/usr/bin/env python 2342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Copyright (c) 2012 Google Inc. All rights reserved. 3342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# Use of this source code is governed by a BSD-style license that can be 4342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch# found in the LICENSE file. 5342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 6342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch"""Argument-less script to select what to run on the buildbots.""" 7342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 8342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochimport os 9342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochimport shutil 10342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochimport subprocess 11342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochimport sys 12342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 13342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 14342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochBUILDBOT_DIR = os.path.dirname(os.path.abspath(__file__)) 15342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochTRUNK_DIR = os.path.dirname(BUILDBOT_DIR) 16342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochROOT_DIR = os.path.dirname(TRUNK_DIR) 17342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochCMAKE_DIR = os.path.join(ROOT_DIR, 'cmake') 18342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochCMAKE_BIN_DIR = os.path.join(CMAKE_DIR, 'bin') 19342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen MurdochOUT_DIR = os.path.join(TRUNK_DIR, 'out') 20342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 21342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 22342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochdef CallSubProcess(*args, **kwargs): 23342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch """Wrapper around subprocess.call which treats errors as build exceptions.""" 24342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch with open(os.devnull) as devnull_fd: 25342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch retcode = subprocess.call(stdin=devnull_fd, *args, **kwargs) 26342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch if retcode != 0: 27342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch print '@@@STEP_EXCEPTION@@@' 28342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch sys.exit(1) 29342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 30342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 31342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochdef PrepareCmake(): 32342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch """Build CMake 2.8.8 since the version in Precise is 2.8.7.""" 33342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch if os.environ['BUILDBOT_CLOBBER'] == '1': 34342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch print '@@@BUILD_STEP Clobber CMake checkout@@@' 35342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch shutil.rmtree(CMAKE_DIR) 36342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 37342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch # We always build CMake 2.8.8, so no need to do anything 38342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch # if the directory already exists. 39342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch if os.path.isdir(CMAKE_DIR): 40342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch return 41342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 42342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch print '@@@BUILD_STEP Initialize CMake checkout@@@' 43342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch os.mkdir(CMAKE_DIR) 44342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 45342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch print '@@@BUILD_STEP Sync CMake@@@' 46342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch CallSubProcess( 47342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch ['git', 'clone', 48342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch '--depth', '1', 49342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch '--single-branch', 50342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch '--branch', 'v2.8.8', 51342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch '--', 52342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 'git://cmake.org/cmake.git', 53342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch CMAKE_DIR], 54342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch cwd=CMAKE_DIR) 55342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 56342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch print '@@@BUILD_STEP Build CMake@@@' 57342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch CallSubProcess( 58342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch ['/bin/bash', 'bootstrap', '--prefix=%s' % CMAKE_DIR], 59342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch cwd=CMAKE_DIR) 60342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 61342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch CallSubProcess( ['make', 'cmake'], cwd=CMAKE_DIR) 62342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 63342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 64342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochdef GypTestFormat(title, format=None, msvs_version=None, tests=[]): 65342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch """Run the gyp tests for a given format, emitting annotator tags. 66342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 67342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch See annotator docs at: 68342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch https://sites.google.com/a/chromium.org/dev/developers/testing/chromium-build-infrastructure/buildbot-annotations 69342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch Args: 70342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch format: gyp format to test. 71342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch Returns: 72342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 0 for sucesss, 1 for failure. 73342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch """ 74342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch if not format: 75342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch format = title 76342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 77342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch print '@@@BUILD_STEP ' + title + '@@@' 78342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch sys.stdout.flush() 79342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch env = os.environ.copy() 80342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch if msvs_version: 81342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch env['GYP_MSVS_VERSION'] = msvs_version 82342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch command = ' '.join( 83342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch [sys.executable, 'gyp/gyptest.py', 84342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch '--all', 85342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch '--passed', 86342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch '--format', format, 87342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch '--path', CMAKE_BIN_DIR, 88342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch '--chdir', 'gyp'] + tests) 89342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch retcode = subprocess.call(command, cwd=ROOT_DIR, env=env, shell=True) 90342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch if retcode: 91342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch # Emit failure tag, and keep going. 92342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch print '@@@STEP_FAILURE@@@' 93342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch return 1 94342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch return 0 95342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 96342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 97342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochdef GypBuild(): 98342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch # Dump out/ directory. 99342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch print '@@@BUILD_STEP cleanup@@@' 100342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch print 'Removing %s...' % OUT_DIR 101342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch shutil.rmtree(OUT_DIR, ignore_errors=True) 102342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch print 'Done.' 103342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 104342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch retcode = 0 105342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch if sys.platform.startswith('linux'): 106342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch retcode += GypTestFormat('ninja') 107342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch retcode += GypTestFormat('make') 108342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch PrepareCmake() 109342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch retcode += GypTestFormat('cmake') 110342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch elif sys.platform == 'darwin': 111342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch retcode += GypTestFormat('ninja') 112342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch retcode += GypTestFormat('xcode') 113342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch retcode += GypTestFormat('make') 114342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch elif sys.platform == 'win32': 115342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch retcode += GypTestFormat('ninja') 116342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch if os.environ['BUILDBOT_BUILDERNAME'] == 'gyp-win64': 117342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch retcode += GypTestFormat('msvs-ninja-2013', format='msvs-ninja', 118342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch msvs_version='2013', 119342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch tests=[ 120342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch r'test\generator-output\gyptest-actions.py', 121342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch r'test\generator-output\gyptest-relocate.py', 122342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch r'test\generator-output\gyptest-rules.py']) 123342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch retcode += GypTestFormat('msvs-2013', format='msvs', msvs_version='2013') 124342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch else: 125342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch raise Exception('Unknown platform') 126342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch if retcode: 127342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch # TODO(bradnelson): once the annotator supports a postscript (section for 128342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch # after the build proper that could be used for cumulative failures), 129342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch # use that instead of this. This isolates the final return value so 130342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch # that it isn't misattributed to the last stage. 131342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch print '@@@BUILD_STEP failures@@@' 132342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch sys.exit(retcode) 133342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 134342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch 135342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdochif __name__ == '__main__': 136342c50ce1624b485728b9a4fc41d8bbf37eb46cfBen Murdoch GypBuild() 137