diff options
Diffstat (limited to 'build_chromeos.py')
-rwxr-xr-x | build_chromeos.py | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/build_chromeos.py b/build_chromeos.py new file mode 100755 index 00000000..cb68fd00 --- /dev/null +++ b/build_chromeos.py @@ -0,0 +1,280 @@ +#!/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__ = ('asharif@google.com (Ahmad Sharif) ' + 'llozano@google.com (Luis Lozano) ' + 'raymes@google.com (Raymes Khoury) ' + 'shenhan@google.com (Han Shen)') + +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 ChromeOS.""" + # Common initializations + 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('--clobber_chroot', + dest='clobber_chroot', + action='store_true', + help='Delete the chroot and start fresh', + default=False) + parser.add_argument('--clobber_board', + dest='clobber_board', + action='store_true', + help='Delete the board and start fresh', + default=False) + parser.add_argument('--rebuild', + dest='rebuild', + action='store_true', + help='Rebuild all board packages except the toolchain.', + default=False) + 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('--package', + dest='package', + help='The package needs to be built') + parser.add_argument('--label', + dest='label', + help='Optional label symlink to point to build dir.') + parser.add_argument('--dev', + dest='dev', + default=False, + action='store_true', + help=('Make the final image in dev mode (eg writable, ' + 'more space on image). Defaults to False.')) + parser.add_argument('--debug', + dest='debug', + default=False, + action='store_true', + help=("Optional. Build chrome browser with \"-g -O0\". " + "Notice, this also turns on \'--dev\'. " + 'Defaults to False.')) + parser.add_argument('--env', + dest='env', + default='', + help='Env to pass to build_packages.') + parser.add_argument('--vanilla', + dest='vanilla', + default=False, + action='store_true', + help='Use default ChromeOS toolchain.') + parser.add_argument('--vanilla_image', + dest='vanilla_image', + default=False, + action='store_true', + help=('Use prebuild packages for building the image. ' + 'It also implies the --vanilla option is set.')) + + options = parser.parse_args(argv[1:]) + + if options.chromeos_root is None: + Usage(parser, '--chromeos_root must be set') + options.chromeos_root = os.path.expanduser(options.chromeos_root) + scripts_dir = os.path.join(options.chromeos_root, 'src', 'scripts') + if not os.path.isdir(scripts_dir): + Usage(parser, '--chromeos_root must be set up first. Use setup_chromeos.py') + + if options.board is None: + Usage(parser, '--board must be set') + + if options.debug: + options.dev = True + + build_packages_env = options.env + if build_packages_env.find('EXTRA_BOARD_FLAGS=') != -1: + logger.GetLogger().LogFatal( + ('Passing "EXTRA_BOARD_FLAGS" in "--env" is not supported. ' + 'This flags is used internally by this script. ' + 'Contact the author for more detail.')) + + if options.rebuild == True: + build_packages_env += ' EXTRA_BOARD_FLAGS=-e' + # EXTRA_BOARD_FLAGS=-e should clean up the object files for the chrome + # browser but it doesn't. So do it here. + misc.RemoveChromeBrowserObjectFiles(options.chromeos_root, options.board) + + # Build with afdo_use by default. + # To change the default use --env="USE=-afdo_use". + build_packages_env = misc.MergeEnvStringWithDict( + build_packages_env, {'USE': 'chrome_internal afdo_use'}) + + build_packages_command = misc.GetBuildPackagesCommand( + board=options.board, + usepkg=options.vanilla_image, + debug=options.debug) + + if options.package: + build_packages_command += ' {0}'.format(options.package) + + build_image_command = misc.GetBuildImageCommand(options.board, options.dev) + + if options.vanilla or options.vanilla_image: + command = misc.GetSetupBoardCommand(options.board, + usepkg=options.vanilla_image, + force=options.clobber_board) + command += '; ' + build_packages_env + ' ' + build_packages_command + command += '&& ' + build_packages_env + ' ' + build_image_command + ret = cmd_executer.ChrootRunCommand(options.chromeos_root, command) + return ret + + # Setup board + if not os.path.isdir(options.chromeos_root + '/chroot/build/' + + options.board) or options.clobber_board: + # Run build_tc.py from binary package + ret = cmd_executer.ChrootRunCommand(options.chromeos_root, + misc.GetSetupBoardCommand( + options.board, + force=options.clobber_board)) + logger.GetLogger().LogFatalIf(ret, 'setup_board failed') + else: + logger.GetLogger().LogOutput('Did not setup_board ' + 'because it already exists') + + if options.debug: + # Perform 2-step build_packages to build a debug chrome browser. + + # Firstly, build everything that chromeos-chrome depends on normally. + if options.rebuild == True: + # Give warning about "--rebuild" and "--debug". Under this combination, + # only dependencies of "chromeos-chrome" get rebuilt. + logger.GetLogger().LogWarning( + "\"--rebuild\" does not correctly re-build every package when " + "\"--debug\" is enabled. ") + + # Replace EXTRA_BOARD_FLAGS=-e with "-e --onlydeps" + build_packages_env = build_packages_env.replace( + 'EXTRA_BOARD_FLAGS=-e', 'EXTRA_BOARD_FLAGS=\"-e --onlydeps\"') + else: + build_packages_env += ' EXTRA_BOARD_FLAGS=--onlydeps' + + ret = cmd_executer.ChrootRunCommand( + options.chromeos_root, "CFLAGS=\"$(portageq-%s envvar CFLAGS) %s\" " + "CXXFLAGS=\"$(portageq-%s envvar CXXFLAGS) %s\" " + "LDFLAGS=\"$(portageq-%s envvar LDFLAGS) %s\" " + 'CHROME_ORIGIN=SERVER_SOURCE ' + '%s ' + '%s --skip_chroot_upgrade' + 'chromeos-chrome' % (options.board, options.cflags, options.board, + options.cxxflags, options.board, options.ldflags, + build_packages_env, build_packages_command)) + + logger.GetLogger().LogFatalIf(\ + ret, 'build_packages failed while trying to build chromeos-chrome deps.') + + # Secondly, build chromeos-chrome using debug mode. + # Replace '--onlydeps' with '--nodeps'. + if options.rebuild == True: + build_packages_env = build_packages_env.replace( + 'EXTRA_BOARD_FLAGS=\"-e --onlydeps\"', 'EXTRA_BOARD_FLAGS=--nodeps') + else: + build_packages_env = build_packages_env.replace( + 'EXTRA_BOARD_FLAGS=--onlydeps', 'EXTRA_BOARD_FLAGS=--nodeps') + ret = cmd_executer.ChrootRunCommand( + options.chromeos_root, "CFLAGS=\"$(portageq-%s envvar CFLAGS) %s\" " + "CXXFLAGS=\"$(portageq-%s envvar CXXFLAGS) %s\" " + "LDFLAGS=\"$(portageq-%s envvar LDFLAGS) %s\" " + 'CHROME_ORIGIN=SERVER_SOURCE BUILDTYPE=Debug ' + '%s ' + '%s --skip_chroot_upgrade' + 'chromeos-chrome' % (options.board, options.cflags, options.board, + options.cxxflags, options.board, options.ldflags, + build_packages_env, build_packages_command)) + logger.GetLogger().LogFatalIf( + ret, + 'build_packages failed while trying to build debug chromeos-chrome.') + + # Now, we have built chromeos-chrome and all dependencies. + # Finally, remove '-e' from EXTRA_BOARD_FLAGS, + # otherwise, chromeos-chrome gets rebuilt. + build_packages_env = build_packages_env.replace(\ + 'EXTRA_BOARD_FLAGS=--nodeps', '') + + # Up to now, we have a debug built chromos-chrome browser. + # Fall through to build the rest of the world. + + # Build packages + ret = cmd_executer.ChrootRunCommand( + options.chromeos_root, "CFLAGS=\"$(portageq-%s envvar CFLAGS) %s\" " + "CXXFLAGS=\"$(portageq-%s envvar CXXFLAGS) %s\" " + "LDFLAGS=\"$(portageq-%s envvar LDFLAGS) %s\" " + 'CHROME_ORIGIN=SERVER_SOURCE ' + '%s ' + '%s --skip_chroot_upgrade' % (options.board, options.cflags, + options.board, options.cxxflags, + options.board, options.ldflags, + build_packages_env, build_packages_command)) + + logger.GetLogger().LogFatalIf(ret, 'build_packages failed') + if options.package: + return 0 + # Build image + ret = cmd_executer.ChrootRunCommand( + options.chromeos_root, build_packages_env + ' ' + build_image_command) + + logger.GetLogger().LogFatalIf(ret, 'build_image failed') + + flags_file_name = 'flags.txt' + flags_file_path = ('%s/src/build/images/%s/latest/%s' % + (options.chromeos_root, options.board, flags_file_name)) + flags_file = open(flags_file_path, 'wb') + flags_file.write('CFLAGS=%s\n' % options.cflags) + flags_file.write('CXXFLAGS=%s\n' % options.cxxflags) + flags_file.write('LDFLAGS=%s\n' % options.ldflags) + flags_file.close() + + if options.label: + image_dir_path = ('%s/src/build/images/%s/latest' % (options.chromeos_root, + options.board)) + real_image_dir_path = os.path.realpath(image_dir_path) + command = ('ln -sf -T %s %s/%s' % + (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) |