#!/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)
