"""mozbuild contains functions and classes which allow tinderclient to build mozilla products.""" import tempfile import os import sys import tinderclient mswindows = (sys.platform == "win32") def MozconfigFile(mozconfig): """Returns a named temporary file and writes text into it. The file is automatically deleted when it is no longer referenced. 'mozconfig' should either be a string or a list of strings.""" f = tempfile.NamedTemporaryFile(mode="w", prefix="mozconfig") if isinstance(mozconfig, list): mozconfig = "\n".join(mozconfig) print >>f, mozconfig f.flush() return f def get_default_config(): # set up some nice defaults: config = {} config['cvs'] = 'cvs' config['branch'] = None config['cvsroot'] = ':pserver:anonymous@cvs-mirror.mozilla.org:/cvsroot' config['make'] = 'gmake' config['mozconfig'] = [] config['checkout-timeout'] = 60 * 10 # ten minutes to checkout config['build-timeout'] = 60 * 60 # 60 minutes to build config['do_checkout'] = True config['do_build'] = True if mswindows: config['make'] = 'make' return config def get_mozconfig_path(config): return config.setdefault('mozconfig_file', MozconfigFile(config['mozconfig'])).name def do_checkout(log, config): os.path.exists(config['build-directory']) or \ os.mkdir(config['build-directory'], 0775) clientcheckout = [config['cvs'], '-d', config['cvsroot'], 'checkout'] if config['branch']: clientcheckout.append('-r', config['branch']) clientcheckout.append('mozilla/client.mk') tinderclient.log_command(clientcheckout, log, cwd=config['build-directory'], timeout=config['checkout-timeout']) mozconfig = get_mozconfig_path(config) print "mozconfig: %s" % mozconfig tinderclient.log_command( [config['make'], "-C", '%s/mozilla' % config['build-directory'], "-f", "client.mk", "checkout"], log, env=dict(os.environ, MOZCONFIG=mozconfig), timeout=config['checkout-timeout']) def do_build(log, config): mozconfig = get_mozconfig_path(config) tinderclient.log_command( [config['make'], "-C", '%s/mozilla' % config['build-directory'], "-f", "client.mk", "build"], log, env=dict(os.environ, MOZCONFIG=mozconfig), timeout=config['build-timeout']) if __name__ == '__main__': from optparse import OptionParser import re p = OptionParser() p.add_option("--config", dest="config", help="Use configuration file(s), and print to tinderbox log.") p.add_option("--private-config", dest="private_config", help="Use configuration file(s), without printing to tinderbox log.") p.add_option("--skip-checkout", dest="no_checkout", action="store_true", help="Don't checkout before building.") p.add_option("--skip-build", dest="no_build", action="store_true", help="Don't build") (options, args) = p.parse_args() if len(args): p.print_help() exit(2) cfg = get_default_config() if options.config: for file in options.config.split(","): execfile(file, globals(), {'config': cfg}) if options.private_config: for file in options.private_config.split(","): execfile(file, globals(), {'config': cfg}) if options.no_checkout: cfg['do_checkout'] = False if options.no_build: cfg['do_build'] = False def doit(log): if options.config: for file in options.config.split(","): print >>log, "Configuration file '%s'" % file print >>log, open(file, "r").read() if cfg['do_checkout']: do_checkout(log, cfg) if cfg['do_build']: do_build(log, cfg) return "success" tinderclient.TinderBuild(cfg['tree'], doit, administrator=cfg['administrator'], smtpserver=cfg['smtpserver'], smtpuser=cfg['smtpuser'], smtppasswd=cfg['smtppasswd'])