#!/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__ = ("asharif@google.com (Ahmad Sharif) "
              "llozano@google.com (Luis Lozano) "
              "raymes@google.com (Raymes Khoury) "
              "shenhan@google.com (Han Shen)")

import optparse
import os
import sys

import tc_enter_chroot
from utils import command_executer
from utils import logger
from utils import misc


def Usage(parser, message):
  print "ERROR: " + message
  parser.print_help()
  sys.exit(0)


def Main(argv):
  """Build ChromeOS."""
  # Common initializations
  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("--clobber_chroot", dest="clobber_chroot",
                    action="store_true", help=
                    "Delete the chroot and start fresh", default=False)
  parser.add_option("--clobber_board", dest="clobber_board",
                    action="store_true",
                    help="Delete the board and start fresh", default=False)
  parser.add_option("--rebuild", dest="rebuild",
                    action="store_true",
                    help="Rebuild all board packages except the toolchain.",
                    default=False)
  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("--package", dest="package",
                    help="The package needs to be built")
  parser.add_option("--label", dest="label",
                    help="Optional label symlink to point to build dir.")
  parser.add_option("--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_option("--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_option("--env",
                    dest="env",
                    default="",
                    help="Env to pass to build_packages.")
  parser.add_option("--vanilla", dest="vanilla",
                    default=False,
                    action="store_true",
                    help="Use default ChromeOS toolchain.")

  options = parser.parse_args(argv[1:])[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.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_packages_env = misc.MergeEnvStringWithDict(build_packages_env,
                                                   {"USE": "chrome_internal"})

  options.chromeos_root = os.path.expanduser(options.chromeos_root)

  build_packages_command = misc.GetBuildPackagesCommand(
    board=options.board, usepkg=False, 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 == True:
    command = misc.GetSetupBoardCommand(options.board,
                                        usepkg=False,
                                        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
    rootdir = misc.GetRoot(argv[0])[0]
    version_number = misc.GetRoot(rootdir)[1]
    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 "
      "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 "
      "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"
      % (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)
