build_projects.py revision 90dce4d38c5ff5333bea97d859d4e484e27edf0c
1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#!/usr/bin/env python
2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# Copyright (c) 2013 The Chromium Authors. All rights reserved.
3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)# found in the LICENSE file.
5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import optparse
7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import os
8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import sys
9c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import buildbot_common
11c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import build_version
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import generate_make
13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import parse_dsc
14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from build_paths import NACL_DIR, SDK_SRC_DIR, OUT_DIR, SDK_EXAMPLE_DIR
16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from build_paths import GSTORE
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from generate_index import LandingPage
18c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)sys.path.append(os.path.join(SDK_SRC_DIR, 'tools'))
20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)sys.path.append(os.path.join(NACL_DIR, 'build'))
21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import getos
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import http_download
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)MAKE = 'nacl_sdk/make_3_81/make.exe'
26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LIB_DICT = {
27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  'linux': [],
28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  'mac': [],
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  'win': ['x86_32']
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
32c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def CopyFilesFromTo(filelist, srcdir, dstdir):
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for filename in filelist:
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    srcpath = os.path.join(srcdir, filename)
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dstpath = os.path.join(dstdir, filename)
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    buildbot_common.CopyFile(srcpath, dstpath)
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def UpdateHelpers(pepperdir, platform, clobber=False):
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if not os.path.exists(os.path.join(pepperdir, 'tools')):
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    buildbot_common.ErrorExit('Examples depend on missing tools.')
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  exampledir = os.path.join(pepperdir, 'examples')
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if clobber:
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    buildbot_common.RemoveDir(exampledir)
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  buildbot_common.MakeDir(exampledir)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  # Copy files for individual bild and landing page
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  files = ['favicon.ico', 'httpd.cmd']
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CopyFilesFromTo(files, SDK_EXAMPLE_DIR, exampledir)
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  resourcesdir = os.path.join(SDK_EXAMPLE_DIR, 'resources')
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  files = ['index.css', 'index.js', 'button_close.png',
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      'button_close_hover.png']
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  CopyFilesFromTo(files, resourcesdir, exampledir)
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  # Copy tools scripts and make includes
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  buildbot_common.CopyDir(os.path.join(SDK_SRC_DIR, 'tools', '*.py'),
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      os.path.join(pepperdir, 'tools'))
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  buildbot_common.CopyDir(os.path.join(SDK_SRC_DIR, 'tools', '*.mk'),
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      os.path.join(pepperdir, 'tools'))
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  # On Windows add a prebuilt make
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if platform == 'win':
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    buildbot_common.BuildStep('Add MAKE')
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    http_download.HttpDownload(GSTORE + MAKE,
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                               os.path.join(pepperdir, 'tools', 'make.exe'))
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def UpdateProjects(pepperdir, platform, project_tree, toolchains,
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                   clobber=False, configs=None, first_toolchain=False):
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if configs is None:
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    configs = ['Debug', 'Release']
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if not os.path.exists(os.path.join(pepperdir, 'tools')):
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    buildbot_common.ErrorExit('Examples depend on missing tools.')
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if not os.path.exists(os.path.join(pepperdir, 'toolchain')):
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    buildbot_common.ErrorExit('Examples depend on missing toolchains.')
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  # Create the library output directories
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  libdir = os.path.join(pepperdir, 'lib')
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for config in configs:
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for arch in LIB_DICT[platform]:
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      dirpath = os.path.join(libdir, '%s_%s_host' % (platform, arch), config)
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if clobber:
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        buildbot_common.RemoveDir(dirpath)
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      buildbot_common.MakeDir(dirpath)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  landing_page = None
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for branch, projects in project_tree.iteritems():
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    dirpath = os.path.join(pepperdir, branch)
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if clobber:
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      buildbot_common.RemoveDir(dirpath)
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    buildbot_common.MakeDir(dirpath)
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    targets = [desc['NAME'] for desc in projects]
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # Generate master make for this branch of projects
99a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    generate_make.GenerateMasterMakefile(pepperdir,
100a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                         os.path.join(pepperdir, branch),
101a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                         targets)
102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
103c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if branch.startswith('examples') and not landing_page:
104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      landing_page = LandingPage()
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # Generate individual projects
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    for desc in projects:
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      srcroot = os.path.dirname(desc['FILEPATH'])
109a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)      generate_make.ProcessProject(pepperdir, srcroot, pepperdir, desc,
110a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                   toolchains, configs=configs,
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                   first_toolchain=first_toolchain)
112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      if branch.startswith('examples'):
114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        landing_page.AddDesc(desc)
115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if landing_page:
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # Generate the landing page text file.
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    index_html = os.path.join(pepperdir, 'examples', 'index.html')
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    example_resources_dir = os.path.join(SDK_EXAMPLE_DIR, 'resources')
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    index_template = os.path.join(example_resources_dir,
121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                                  'index.html.template')
122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    with open(index_html, 'w') as fh:
123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      out = landing_page.GeneratePage(index_template)
124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      fh.write(out)
125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  # Generate top Make for examples
127b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  targets = ['api', 'demo', 'getting_started', 'tutorial']
128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  targets = [x for x in targets if 'examples/'+x in project_tree]
129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  branch_name = 'examples'
130a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  generate_make.GenerateMasterMakefile(pepperdir,
131a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                       os.path.join(pepperdir, branch_name),
132a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)                                       targets)
133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
13590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)def BuildProjectsBranch(pepperdir, platform, branch, deps, clean, config):
136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  make_dir = os.path.join(pepperdir, branch)
137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  print "\n\nMake: " + make_dir
138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if platform == 'win':
139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # We need to modify the environment to build host on Windows.
140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    make = os.path.join(make_dir, 'make.bat')
141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  else:
142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    make = 'make'
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  extra_args = ['CONFIG='+config]
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if not deps:
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    extra_args += ['IGNORE_DEPS=1']
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  try:
149a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    buildbot_common.Run([make, '-j8', 'TOOLCHAIN=all'] + extra_args,
150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        cwd=make_dir)
151c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  except:
152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    print 'Failed to build ' + branch
153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    raise
154c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
155c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if clean:
156c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    # Clean to remove temporary files but keep the built
157a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    buildbot_common.Run([make, '-j8', 'clean', 'TOOLCHAIN=all'] + extra_args,
158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                        cwd=make_dir)
159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def BuildProjects(pepperdir, platform, project_tree, deps=True,
162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                  clean=False, config='Debug'):
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  # First build libraries
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  build_order = ['src', 'testlibs']
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for branch in build_order:
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if branch in project_tree:
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      BuildProjectsBranch(pepperdir, platform, branch, deps, clean, config)
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  # Build everything else.
170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  for branch in project_tree:
171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if branch not in build_order:
172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      BuildProjectsBranch(pepperdir, platform, branch, deps, clean, config)
173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
174c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def main(args):
176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  parser = optparse.OptionParser()
17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  parser.add_option('-c', '--clobber',
178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      help='Clobber project directories before copying new files',
179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      action='store_true', default=False)
180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  parser.add_option('-b', '--build',
181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      help='Build the projects.', action='store_true')
18290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  parser.add_option('--config',
18390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      help='Choose configuration to build (Debug or Release).  Builds both '
18490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)           'by default')
185c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  parser.add_option('-x', '--experimental',
186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      help='Build experimental projects', action='store_true')
187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  parser.add_option('-t', '--toolchain',
188c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      help='Build using toolchain. Can be passed more than once.',
189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      action='append', default=[])
190c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  parser.add_option('-d', '--dest',
191c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      help='Select which build destinations (project types) are valid.',
192c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      action='append')
193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  parser.add_option('-p', '--project',
194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      help='Select which projects are valid.',
195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      action='append')
196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  parser.add_option('-v', '--verbose', action='store_true')
197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
19890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  options, args = parser.parse_args(args[1:])
19990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if args:
20090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    parser.error('Not expecting any arguments.')
20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  if 'NACL_SDK_ROOT' in os.environ:
20390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    # We don't want the currently configured NACL_SDK_ROOT to have any effect
20490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    # on the build.
20590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    del os.environ['NACL_SDK_ROOT']
206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pepper_ver = str(int(build_version.ChromeMajorVersion()))
208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  pepperdir = os.path.join(OUT_DIR, 'pepper_' + pepper_ver)
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  platform = getos.GetPlatform()
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if not options.toolchain:
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    options.toolchain = ['newlib', 'glibc', 'pnacl', 'host']
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if 'host' in options.toolchain:
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    options.toolchain.append(platform)
216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    print 'Adding platform: ' + platform
217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  filters = {}
219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if options.toolchain:
220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    filters['TOOLS'] = options.toolchain
221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    print 'Filter by toolchain: ' + str(options.toolchain)
222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if not options.experimental:
223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    filters['EXPERIMENTAL'] = False
224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if options.dest:
225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    filters['DEST'] = options.dest
226c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    print 'Filter by type: ' + str(options.dest)
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if options.project:
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    filters['NAME'] = options.project
229c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    print 'Filter by name: ' + str(options.project)
230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
231a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  project_tree = parse_dsc.LoadProjectTree(SDK_SRC_DIR, filters=filters)
232c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  parse_dsc.PrintProjectTree(project_tree)
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateHelpers(pepperdir, platform, clobber=options.clobber)
235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  UpdateProjects(pepperdir, platform, project_tree, options.toolchain,
236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 clobber=options.clobber)
23790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
238c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if options.build:
23990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    if options.config:
24090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      configs = [options.config]
24190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    else:
24290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      configs = ['Debug', 'Release']
24390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    for config in configs:
24490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      BuildProjects(pepperdir, platform, project_tree, config=config)
24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
246c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return 0
247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
248c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)if __name__ == '__main__':
25090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  try:
25190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    sys.exit(main(sys.argv))
25290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  except KeyboardInterrupt:
25390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    buildbot_common.ErrorExit('%s: interrupted' % os.path.basename(sys.argv[0]))
254