#!/usr/bin/python2 # # 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. """ from __future__ import print_function __author__ = 'raymes@google.com (Raymes Khoury)' import argparse import os import sys from cros_utils import command_executer from cros_utils import logger from cros_utils import misc def Usage(parser, message): print('ERROR: %s' % message) parser.print_help() sys.exit(0) def Main(argv): """Build Chrome browser.""" cmd_executer = command_executer.GetCommandExecuter() parser = argparse.ArgumentParser() parser.add_argument('--chromeos_root', dest='chromeos_root', help='Target directory for ChromeOS installation.') parser.add_argument('--version', dest='version') parser.add_argument('--clean', dest='clean', default=False, action='store_true', help=('Clean the /var/cache/chromeos-chrome/' 'chrome-src/src/out_$board dir')) parser.add_argument('--env', dest='env', default='', help='Use the following env') parser.add_argument('--ebuild_version', dest='ebuild_version', help='Use this ebuild instead of the default one.') parser.add_argument('--cflags', dest='cflags', default='', help='CFLAGS for the ChromeOS packages') parser.add_argument('--cxxflags', dest='cxxflags', default='', help='CXXFLAGS for the ChromeOS packages') parser.add_argument('--ldflags', dest='ldflags', default='', help='LDFLAGS for the ChromeOS packages') parser.add_argument('--board', dest='board', help='ChromeOS target board, e.g. x86-generic') parser.add_argument('--no_build_image', dest='no_build_image', default=False, action='store_true', help=('Skip build image after building browser.' 'Defaults to False.')) parser.add_argument('--label', dest='label', help='Optional label to apply to the ChromeOS image.') parser.add_argument('--build_image_args', default='', dest='build_image_args', help='Optional arguments to build_image.') parser.add_argument('--cros_workon', dest='cros_workon', help='Build using external source tree.') parser.add_argument('--dev', dest='dev', default=False, action='store_true', help=('Build a dev (eg. writable/large) image. ' 'Defaults to False.')) parser.add_argument('--debug', dest='debug', default=False, action='store_true', help=('Build chrome browser using debug mode. ' 'This option implies --dev. Defaults to false.')) parser.add_argument('--verbose', dest='verbose', default=False, action='store_true', help='Build with verbose information.') options = parser.parse_args(argv) 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.ChrootRunCommandWOutput(options.chromeos_root, command) # 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[1:]) sys.exit(retval)