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