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) 6eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochimport multiprocessing 7c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import optparse 8c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import os 9a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import posixpath 10c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import sys 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import urllib2 12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import buildbot_common 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import build_version 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import generate_make 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import parse_dsc 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)from build_paths import SDK_SRC_DIR, OUT_DIR, SDK_RESOURCE_DIR 19c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from build_paths import GSTORE 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)from generate_index import LandingPage 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)sys.path.append(os.path.join(SDK_SRC_DIR, 'tools')) 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)import getos 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 26ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben MurdochMAKE = 'nacl_sdk/make_3.99.90-26-gf80222c/make.exe' 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)LIB_DICT = { 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 'linux': [], 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 'mac': [], 30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 'win': ['x86_32'] 31c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)VALID_TOOLCHAINS = [ 335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 'bionic', 345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 'newlib', 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 'glibc', 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 'pnacl', 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 'win', 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 'linux', 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 'mac', 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)] 41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 42eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# Global verbosity setting. 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)# If set to True (normally via a command line arg) then build_projects will 44eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch# add V=1 to all calls to 'make' 45eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochverbose = False 46eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 47eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)def Trace(msg): 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if verbose: 50cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) sys.stderr.write(str(msg) + '\n') 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)def CopyFilesFromTo(filelist, srcdir, dstdir): 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for filename in filelist: 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) srcpath = os.path.join(srcdir, filename) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dstpath = os.path.join(dstdir, filename) 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) buildbot_common.CopyFile(srcpath, dstpath) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 60eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdef UpdateHelpers(pepperdir, clobber=False): 61eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tools_dir = os.path.join(pepperdir, 'tools') 62eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if not os.path.exists(tools_dir): 63eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buildbot_common.ErrorExit('SDK tools dir is missing: %s' % tools_dir) 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) exampledir = os.path.join(pepperdir, 'examples') 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if clobber: 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) buildbot_common.RemoveDir(exampledir) 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) buildbot_common.MakeDir(exampledir) 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) # Copy files for individual build and landing page 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) files = ['favicon.ico', 'httpd.cmd', 'index.css', 'index.js', 7258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 'button_close.png', 'button_close_hover.png'] 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CopyFilesFromTo(files, SDK_RESOURCE_DIR, exampledir) 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) # Copy tools scripts and make includes 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) buildbot_common.CopyDir(os.path.join(SDK_SRC_DIR, 'tools', '*.py'), 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tools_dir) 78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) buildbot_common.CopyDir(os.path.join(SDK_SRC_DIR, 'tools', '*.mk'), 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch tools_dir) 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) # Copy tools/lib scripts 82a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) tools_lib_dir = os.path.join(pepperdir, 'tools', 'lib') 83a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) buildbot_common.MakeDir(tools_lib_dir) 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) buildbot_common.CopyDir(os.path.join(SDK_SRC_DIR, 'tools', 'lib', '*.py'), 85a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) tools_lib_dir) 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) # On Windows add a prebuilt make 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if getos.GetPlatform() == 'win': 89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) buildbot_common.BuildStep('Add MAKE') 90a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) make_url = posixpath.join(GSTORE, MAKE) 91a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) make_exe = os.path.join(tools_dir, 'make.exe') 92a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) with open(make_exe, 'wb') as f: 93a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) f.write(urllib2.urlopen(make_url).read()) 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 967d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)def ValidateToolchains(toolchains): 977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) invalid_toolchains = set(toolchains) - set(VALID_TOOLCHAINS) 987d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) if invalid_toolchains: 997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) buildbot_common.ErrorExit('Invalid toolchain(s): %s' % ( 1007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ', '.join(invalid_toolchains))) 1017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liudef GetDeps(projects): 1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu out = {} 1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu # Build list of all project names 1065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu localtargets = [proj['NAME'] for proj in projects] 1075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu # For each project 1095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for proj in projects: 1105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu deplist = [] 1115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu # generate a list of dependencies 1125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu for targ in proj.get('TARGETS', []): 1135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu deplist.extend(targ.get('DEPS', []) + targ.get('LIBS', [])) 1145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu # and add dependencies to targets built in this subtree 1165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu localdeps = [dep for dep in deplist if dep in localtargets] 1175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu if localdeps: 1185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu out[proj['NAME']] = localdeps 1195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu return out 1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu 1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 123eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdef UpdateProjects(pepperdir, project_tree, toolchains, 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) clobber=False, configs=None, first_toolchain=False): 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if configs is None: 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) configs = ['Debug', 'Release'] 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if not os.path.exists(os.path.join(pepperdir, 'tools')): 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) buildbot_common.ErrorExit('Examples depend on missing tools.') 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if not os.path.exists(os.path.join(pepperdir, 'toolchain')): 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) buildbot_common.ErrorExit('Examples depend on missing toolchains.') 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ValidateToolchains(toolchains) 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) # Create the library output directories 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) libdir = os.path.join(pepperdir, 'lib') 136eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch platform = getos.GetPlatform() 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for config in configs: 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for arch in LIB_DICT[platform]: 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dirpath = os.path.join(libdir, '%s_%s_host' % (platform, arch), config) 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if clobber: 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) buildbot_common.RemoveDir(dirpath) 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) buildbot_common.MakeDir(dirpath) 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) landing_page = None 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for branch, projects in project_tree.iteritems(): 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dirpath = os.path.join(pepperdir, branch) 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if clobber: 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) buildbot_common.RemoveDir(dirpath) 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) buildbot_common.MakeDir(dirpath) 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) targets = [desc['NAME'] for desc in projects] 1515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu deps = GetDeps(projects) 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) # Generate master make for this branch of projects 154a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) generate_make.GenerateMasterMakefile(pepperdir, 155a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) os.path.join(pepperdir, branch), 1565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu targets, deps) 157c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 158c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if branch.startswith('examples') and not landing_page: 159c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) landing_page = LandingPage() 160c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 161c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) # Generate individual projects 162c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for desc in projects: 163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) srcroot = os.path.dirname(desc['FILEPATH']) 164a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) generate_make.ProcessProject(pepperdir, srcroot, pepperdir, desc, 165a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) toolchains, configs=configs, 166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) first_toolchain=first_toolchain) 167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if branch.startswith('examples'): 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) landing_page.AddDesc(desc) 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 171c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if landing_page: 172c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) # Generate the landing page text file. 173c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) index_html = os.path.join(pepperdir, 'examples', 'index.html') 17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) index_template = os.path.join(SDK_RESOURCE_DIR, 'index.html.template') 175c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) with open(index_html, 'w') as fh: 176c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) out = landing_page.GeneratePage(index_template) 177c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) fh.write(out) 178c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 179c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) # Generate top Make for examples 180b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) targets = ['api', 'demo', 'getting_started', 'tutorial'] 181c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) targets = [x for x in targets if 'examples/'+x in project_tree] 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) branch_name = 'examples' 183a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) generate_make.GenerateMasterMakefile(pepperdir, 184a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) os.path.join(pepperdir, branch_name), 1855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu targets, {}) 186c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 187c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdef BuildProjectsBranch(pepperdir, branch, deps, clean, config, args=None): 189c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) make_dir = os.path.join(pepperdir, branch) 1907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch print "\nMake: " + make_dir 191eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 192eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if getos.GetPlatform() == 'win': 193c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) # We need to modify the environment to build host on Windows. 194c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) make = os.path.join(make_dir, 'make.bat') 195c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) else: 196c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) make = 'make' 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 198eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch env = None 199eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if os.environ.get('USE_GOMA') == '1': 200eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch env = dict(os.environ) 201eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch env['NACL_COMPILER_PREFIX'] = 'gomacc' 202eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch # Add -m32 to the CFLAGS when building using i686-nacl-gcc 203eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch # otherwise goma won't recognise it as different to the x86_64 204eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch # build. 205eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch env['X86_32_CFLAGS'] = '-m32' 206eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch env['X86_32_CXXFLAGS'] = '-m32' 207eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch jobs = '50' 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch else: 209eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch jobs = str(multiprocessing.cpu_count()) 210eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch make_cmd = [make, '-j', jobs] 212eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 213eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch make_cmd.append('CONFIG='+config) 214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch # We always ENABLE_BIONIC in case we need it. If neither --bionic nor 215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch # -t bionic have been provided on the command line, then VALID_TOOLCHAINS 216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch # will not contain a bionic target. 217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch make_cmd.append('ENABLE_BIONIC=1') 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if not deps: 219eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch make_cmd.append('IGNORE_DEPS=1') 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 221eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch if verbose: 222eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch make_cmd.append('V=1') 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch if args: 2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch make_cmd += args 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch else: 2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch make_cmd.append('TOOLCHAIN=all') 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 229eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buildbot_common.Run(make_cmd, cwd=make_dir, env=env) 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if clean: 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) # Clean to remove temporary files but keep the built 232eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch buildbot_common.Run(make_cmd + ['clean'], cwd=make_dir, env=env) 233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 235eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochdef BuildProjects(pepperdir, project_tree, deps=True, 236c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) clean=False, config='Debug'): 2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch # Make sure we build libraries (which live in 'src') before 2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch # any of the examples. 2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch build_first = [p for p in project_tree if p != 'src'] 2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch build_second = [p for p in project_tree if p == 'src'] 2417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch for branch in build_first + build_second: 2437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch BuildProjectsBranch(pepperdir, branch, deps, clean, config) 244c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 245c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 246424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)def main(argv): 247c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parser = optparse.OptionParser() 24890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) parser.add_option('-c', '--clobber', 249c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) help='Clobber project directories before copying new files', 250c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) action='store_true', default=False) 251c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parser.add_option('-b', '--build', 252cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) help='Build the projects. Otherwise the projects are only copied.', 253cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) action='store_true') 25490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) parser.add_option('--config', 25590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) help='Choose configuration to build (Debug or Release). Builds both ' 25690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 'by default') 257c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch parser.add_option('--bionic', 258c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch help='Enable bionic projects', action='store_true') 259c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parser.add_option('-x', '--experimental', 260c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) help='Build experimental projects', action='store_true') 261c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parser.add_option('-t', '--toolchain', 262c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) help='Build using toolchain. Can be passed more than once.', 263c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) action='append', default=[]) 264c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parser.add_option('-d', '--dest', 265c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) help='Select which build destinations (project types) are valid.', 266c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) action='append') 267c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) parser.add_option('-v', '--verbose', action='store_true') 268c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 2690f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) # To setup bash completion for this command first install optcomplete 2700f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) # and then add this line to your .bashrc: 2710f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) # complete -F _optcomplete build_projects.py 2720f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) try: 2730f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) import optcomplete 2740f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) optcomplete.autocomplete(parser) 2750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) except ImportError: 2760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) pass 2770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 278424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) options, args = parser.parse_args(argv[1:]) 27990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 280cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) global verbose 281cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if options.verbose: 282cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) verbose = True 283cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 284cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) buildbot_common.verbose = verbose 285cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 28690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if 'NACL_SDK_ROOT' in os.environ: 28790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # We don't want the currently configured NACL_SDK_ROOT to have any effect 28890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) # on the build. 28990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) del os.environ['NACL_SDK_ROOT'] 290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 291c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pepper_ver = str(int(build_version.ChromeMajorVersion())) 292c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) pepperdir = os.path.join(OUT_DIR, 'pepper_' + pepper_ver) 293c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 294c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if not options.toolchain: 29568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) # Order matters here: the default toolchain for an example's Makefile will 29668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) # be the first toolchain in this list that is available in the example. 29768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) # e.g. If an example supports newlib and glibc, then the default will be 29868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) # newlib. 29968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) options.toolchain = ['pnacl', 'newlib', 'glibc', 'host'] 300c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch if options.experimental or options.bionic: 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) options.toolchain.append('bionic') 302c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 303c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if 'host' in options.toolchain: 3047d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) options.toolchain.remove('host') 305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch options.toolchain.append(getos.GetPlatform()) 306cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Trace('Adding platform: ' + getos.GetPlatform()) 307c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) ValidateToolchains(options.toolchain) 3097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 310c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) filters = {} 311c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if options.toolchain: 312c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) filters['TOOLS'] = options.toolchain 313cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Trace('Filter by toolchain: ' + str(options.toolchain)) 314c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if not options.experimental: 315c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) filters['EXPERIMENTAL'] = False 316c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if options.dest: 317c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) filters['DEST'] = options.dest 318cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Trace('Filter by type: ' + str(options.dest)) 319424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) if args: 320424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) filters['NAME'] = args 321cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Trace('Filter by name: ' + str(args)) 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch try: 324ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch project_tree = parse_dsc.LoadProjectTree(SDK_SRC_DIR, include=filters) 3257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch except parse_dsc.ValidationError as e: 3267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch buildbot_common.ErrorExit(str(e)) 327cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 328cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) if verbose: 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) parse_dsc.PrintProjectTree(project_tree) 330c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 331eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateHelpers(pepperdir, clobber=options.clobber) 332eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch UpdateProjects(pepperdir, project_tree, options.toolchain, 333c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) clobber=options.clobber) 33490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) if options.build: 33690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) if options.config: 33790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) configs = [options.config] 33890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) else: 33990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) configs = ['Debug', 'Release'] 34090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) for config in configs: 341cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) BuildProjects(pepperdir, project_tree, config=config, deps=False) 34290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 343c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return 0 344c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 345c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 346c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)if __name__ == '__main__': 3477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch script_name = os.path.basename(sys.argv[0]) 34890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) try: 34990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) sys.exit(main(sys.argv)) 3507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch except parse_dsc.ValidationError as e: 3517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch buildbot_common.ErrorExit('%s: %s' % (script_name, e)) 35290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) except KeyboardInterrupt: 3537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch buildbot_common.ErrorExit('%s: interrupted' % script_name) 354