#!/usr/bin/env python
# Copyright 2017 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from __future__ import print_function

import argparse
import os
import subprocess
import sys


# This function is inspired from the one in src/tools/vim/ninja-build.vim in the
# Chromium repository.
def path_to_source_root(path):
  """Returns the absolute path to the chromium source root."""
  candidate = os.path.dirname(path)
  # This is a list of directories that need to identify the src directory. The
  # shorter it is, the more likely it's wrong (checking for just
  # "build/common.gypi" would find "src/v8" for files below "src/v8", as
  # "src/v8/build/common.gypi" exists). The longer it is, the more likely it is
  # to break when we rename directories.
  fingerprints = ['chrome', 'net', 'v8', 'build', 'skia']
  while candidate and not all(
      [os.path.isdir(os.path.join(candidate, fp)) for fp in fingerprints]):
    new_candidate = os.path.dirname(candidate)
    if new_candidate == candidate:
      raise Exception("Couldn't find source-dir from %s" % path)
    candidate = os.path.dirname(candidate)
  return candidate


def main():
  parser = argparse.ArgumentParser()
  parser.add_argument(
      '--file-path',
      help='The file path, could be absolute or relative to the current '
           'directory.',
      required=True)
  parser.add_argument(
      '--build-dir',
      help='The build directory, relative to the source directory. Jumbo '
           'builds aren\'t supported but you can create a non-jumbo build '
           'config just for this script and keep using jumbo in your regular '
           'builds.',
      required=True)

  options = parser.parse_args()

  src_dir = path_to_source_root(os.path.abspath(options.file_path))
  abs_build_dir = os.path.join(src_dir, options.build_dir)
  src_relpath = os.path.relpath(options.file_path, abs_build_dir)

  print('Building %s' % options.file_path)

  ninja_exec = 'ninja'
  carets = '^'
  # We need to make sure that we call the ninja executable, calling |ninja|
  # directly might end up calling a wrapper script that'll remove the caret
  # characters.
  if sys.platform == 'win32':
    ninja_exec = 'ninja.exe'
    # The caret character has to be escaped on Windows as it's an escape
    # character.
    carets = '^^'

  command = [
      ninja_exec,
      '-C', abs_build_dir,
      '%s%s' % (src_relpath, carets)
  ]
  # |shell| should be set to True on Windows otherwise the carets characters
  # get dropped from the command line.
  return subprocess.call(command, shell=sys.platform=='win32')


if __name__ == '__main__':
  sys.exit(main())
