#!/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__ = "raymes@google.com (Raymes Khoury)"

import optparse
import os
import shutil
import sys

import build_chromeos
from utils import command_executer
from utils import logger
from utils import misc

cmd_executer = None


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


def Main(argv):
  """Build Chrome browser."""
  # Common initializations
  global cmd_executer
  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("--version", dest="version")
  parser.add_option("--clean",
                    dest="clean",
                    default=False,
                    action="store_true",
                    help=("Clean the /var/cache/chromeos-chrome/"
                          "chrome-src/src/out_$board dir"))
  parser.add_option("--env",
                    dest="env",
                    default="",
                    help="Use the following env")
  parser.add_option("--ebuild_version",
                    dest="ebuild_version",
                    help="Use this ebuild instead of the default one.")
  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("--no_build_image", dest="no_build_image", default=False,
                    action="store_true",
                    help=("Skip build image after building browser."
                          "Defaults to False."))
  parser.add_option("--label", dest="label",
                    help="Optional label to apply to the ChromeOS image.")
  parser.add_option("--build_image_args",
                    default="",
                    dest="build_image_args",
                    help="Optional arguments to build_image.")
  parser.add_option("--cros_workon", dest="cros_workon",
                    help="Build using external source tree.")
  parser.add_option("--dev", dest="dev", default=False, action="store_true",
                    help=("Build a dev (eg. writable/large) image. "
                          "Defaults to False."))
  parser.add_option("--debug", dest="debug", default=False, action="store_true",
                    help=("Build chrome browser using debug mode. "
                          "This option implies --dev. Defaults to false."))
  parser.add_option("--verbose", dest="verbose", default=False,
                    action="store_true",
                    help="Build with verbose information.")

  options = parser.parse_args(argv)[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.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.ChrootRunCommand(
      options.chromeos_root, command, return_output=True)

    # 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)
  sys.exit(retval)
