#!/usr/bin/python # # Copyright 2010 Google Inc. All Rights Reserved. """Script to checkout the ChromeOS source. This script sets up the ChromeOS source in the given directory, matching a particular release of ChromeOS. """ __author__ = "raymes@google.com (Raymes Khoury)" import optparse import os import shutil import sys import build_chromeos from utils import command_executer from utils import logger from utils import misc cmd_executer = None def Usage(parser, message): print "ERROR: " + message parser.print_help() sys.exit(0) def Main(argv): """Build Chrome browser.""" # Common initializations global cmd_executer cmd_executer = command_executer.GetCommandExecuter() parser = optparse.OptionParser() parser.add_option("--chromeos_root", dest="chromeos_root", help="Target directory for ChromeOS installation.") parser.add_option("--version", dest="version") parser.add_option("--clean", dest="clean", default=False, action="store_true", help=("Clean the /var/cache/chromeos-chrome/" "chrome-src/src/out_$board dir")) parser.add_option("--env", dest="env", default="", help="Use the following env") parser.add_option("--ebuild_version", dest="ebuild_version", help="Use this ebuild instead of the default one.") parser.add_option("--cflags", dest="cflags", default="", help="CFLAGS for the ChromeOS packages") parser.add_option("--cxxflags", dest="cxxflags", default="", help="CXXFLAGS for the ChromeOS packages") parser.add_option("--ldflags", dest="ldflags", default="", help="LDFLAGS for the ChromeOS packages") parser.add_option("--board", dest="board", help="ChromeOS target board, e.g. x86-generic") parser.add_option("--no_build_image", dest="no_build_image", default=False, action="store_true", help=("Skip build image after building browser." "Defaults to False.")) parser.add_option("--label", dest="label", help="Optional label to apply to the ChromeOS image.") parser.add_option("--build_image_args", default="", dest="build_image_args", help="Optional arguments to build_image.") parser.add_option("--cros_workon", dest="cros_workon", help="Build using external source tree.") parser.add_option("--dev", dest="dev", default=False, action="store_true", help=("Build a dev (eg. writable/large) image. " "Defaults to False.")) parser.add_option("--debug", dest="debug", default=False, action="store_true", help=("Build chrome browser using debug mode. " "This option implies --dev. Defaults to false.")) parser.add_option("--verbose", dest="verbose", default=False, action="store_true", help="Build with verbose information.") options = parser.parse_args(argv)[0] if options.chromeos_root is None: Usage(parser, "--chromeos_root must be set") if options.board is None: Usage(parser, "--board must be set") if options.version is None: logger.GetLogger().LogOutput("No Chrome version given so " "using the default checked in version.") chrome_version = "" else: chrome_version = "CHROME_VERSION=%s" % options.version if options.dev and options.no_build_image: logger.GetLogger().LogOutput( "\"--dev\" is meaningless if \"--no_build_image\" is given.") if options.debug: options.dev = True options.chromeos_root = misc.CanonicalizePath(options.chromeos_root) unmask_env = "ACCEPT_KEYWORDS=~*" if options.ebuild_version: ebuild_version = "=%s" % options.ebuild_version options.env = "%s %s" % (options.env, unmask_env) else: ebuild_version = "chromeos-chrome" if options.cros_workon and not ( os.path.isdir(options.cros_workon) and os.path.exists( os.path.join(options.cros_workon, "src/chromeos/chromeos.gyp"))): Usage(parser, "--cros_workon must be a valid chromium browser checkout.") if options.verbose: options.env = misc.MergeEnvStringWithDict( options.env, {"USE": "chrome_internal verbose"}) else: options.env = misc.MergeEnvStringWithDict(options.env, {"USE": "chrome_internal"}) if options.debug: options.env = misc.MergeEnvStringWithDict(options.env, {"BUILDTYPE": "Debug"}) if options.clean: misc.RemoveChromeBrowserObjectFiles(options.chromeos_root, options.board) chrome_origin = "SERVER_SOURCE" if options.cros_workon: chrome_origin = "LOCAL_SOURCE" command = 'cros_workon --board={0} start chromeos-chrome'.format( options.board) ret = cmd_executer.ChrootRunCommand( options.chromeos_root, command, return_output=True) # cros_workon start returns non-zero if chromeos-chrome is already a # cros_workon package. if ret[0] and ret[2].find( "WARNING : Already working on chromeos-base/chromeos-chrome") == -1: logger.GetLogger().LogFatal("cros_workon chromeos-chrome failed.") # Return value is non-zero means we do find the "Already working on..." # message, keep the information, so later on we do not revert the # cros_workon status. cros_workon_keep = (ret[0] != 0) # Emerge the browser emerge_browser_command = \ ("CHROME_ORIGIN={0} {1} " "CFLAGS=\"$(portageq-{2} envvar CFLAGS) {3}\" " "LDFLAGS=\"$(portageq-{2} envvar LDFLAGS) {4}\" " "CXXFLAGS=\"$(portageq-{2} envvar CXXFLAGS) {5}\" " "{6} emerge-{2} --buildpkg {7}").format( chrome_origin, chrome_version, options.board, options.cflags, options.ldflags, options.cxxflags, options.env, ebuild_version) cros_sdk_options = '' if options.cros_workon: cros_sdk_options = '--chrome_root={0}'.format(options.cros_workon) ret = cmd_executer.ChrootRunCommand(options.chromeos_root, emerge_browser_command, cros_sdk_options=cros_sdk_options) logger.GetLogger().LogFatalIf(ret, "build_packages failed") if options.cros_workon and not cros_workon_keep: command = 'cros_workon --board={0} stop chromeos-chrome'.format( options.board) ret = cmd_executer.ChrootRunCommand(options.chromeos_root, command) # cros_workon failed, not a fatal one, just report it. if ret: print "cros_workon stop chromeos-chrome failed." if options.no_build_image: return ret # Finally build the image ret = cmd_executer.ChrootRunCommand( options.chromeos_root, "{0} {1} {2} {3}".format( unmask_env, options.env, misc.GetBuildImageCommand( options.board, dev=options.dev), options.build_image_args)) logger.GetLogger().LogFatalIf(ret, "build_image failed") flags_file_name = "chrome_flags.txt" flags_file_path = "{0}/src/build/images/{1}/latest/{2}".format( options.chromeos_root, options.board, flags_file_name) flags_file = open(flags_file_path, "wb") flags_file.write("CFLAGS={0}\n".format(options.cflags)) flags_file.write("CXXFLAGS={0}\n".format(options.cxxflags)) flags_file.write("LDFLAGS={0}\n".format(options.ldflags)) flags_file.close() if options.label: image_dir_path = "{0}/src/build/images/{1}/latest".format( options.chromeos_root, options.board) real_image_dir_path = os.path.realpath(image_dir_path) command = "ln -sf -T {0} {1}/{2}".format( os.path.basename(real_image_dir_path),\ os.path.dirname(real_image_dir_path),\ options.label) ret = cmd_executer.RunCommand(command) logger.GetLogger().LogFatalIf(ret, "Failed to apply symlink label %s" % options.label) return ret if __name__ == "__main__": retval = Main(sys.argv) sys.exit(retval)