diff options
Diffstat (limited to 'build_chromeos.py')
-rwxr-xr-x | build_chromeos.py | 596 |
1 files changed, 342 insertions, 254 deletions
diff --git a/build_chromeos.py b/build_chromeos.py index e275da1f..84ee0b84 100755 --- a/build_chromeos.py +++ b/build_chromeos.py @@ -1,7 +1,7 @@ #!/usr/bin/env python3 # -*- coding: utf-8 -*- # -# Copyright 2020 The Chromium OS Authors. All rights reserved. +# Copyright 2020 The ChromiumOS Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. @@ -11,12 +11,13 @@ 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)') +__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 @@ -28,262 +29,349 @@ from cros_utils import misc def Usage(parser, message): - print('ERROR: %s' % message) - parser.print_help() - sys.exit(0) + 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". ' + """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: - 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 -cros-debug'}) - - 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') + "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.debug: - # Perform 2-step build_packages to build a debug chrome browser. - - # Firstly, build everything that chromeos-chrome depends on normally. if options.rebuild: - # 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"') + 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 -cros-debug"} + ) + + 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: - build_packages_env += ' EXTRA_BOARD_FLAGS=--onlydeps' - + 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: + # 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: + 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" ' + 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: - 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') + "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, '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)) - with open(flags_file_path, 'w', encoding='utf-8') as flags_file: - flags_file.write('CFLAGS=%s\n' % options.cflags) - flags_file.write('CXXFLAGS=%s\n' % options.cxxflags) - flags_file.write('LDFLAGS=%s\n' % options.ldflags) - - 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) + 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, + ) + with open(flags_file_path, "w", encoding="utf-8") as flags_file: + flags_file.write("CFLAGS=%s\n" % options.cflags) + flags_file.write("CXXFLAGS=%s\n" % options.cxxflags) + flags_file.write("LDFLAGS=%s\n" % options.ldflags) + + 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) |