#!/usr/bin/env python
# Copyright 2014 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.

# This file isn't officially supported by the Chromium project. It's maintained
# on a best-effort basis by volunteers, so some things may be broken from time
# to time. If you encounter errors, it's most often due to files in base that
# have been added or moved since somebody last tried this script. Generally
# such errors are easy to diagnose.
"""Builds gn and generates Chromium's build files.

This script should only be run from a Chromium tarball.  It will not work in a
regular git checkout.  In a regular git checkout, a gn binary is pulled via
DEPS.  To build gn from source in a regular checkout, see
https://gn.googlesource.com/gn/
"""

# This script may be removed if/when gn becomes available in the standard
# repositories for several mainstream Linux distributions.

import optparse
import os
import shutil
import subprocess
import sys

BOOTSTRAP_DIR = os.path.dirname(os.path.abspath(__file__))
GN_ROOT = os.path.dirname(BOOTSTRAP_DIR)
SRC_ROOT = os.path.dirname(os.path.dirname(GN_ROOT))


def main(argv):
  parser = optparse.OptionParser(description=sys.modules[__name__].__doc__)
  parser.add_option(
      '-d',
      '--debug',
      action='store_true',
      help='Do a debug build. Defaults to release build.')
  parser.add_option(
      '-o', '--output', help='place output in PATH', metavar='PATH')
  parser.add_option('-s', '--no-rebuild', help='ignored')
  parser.add_option('--no-clean', help='ignored')
  parser.add_option('--gn-gen-args', help='Args to pass to gn gen --args')
  parser.add_option(
      '--build-path',
      help='The directory in which to build gn, '
      'relative to the src directory. (eg. out/Release)')
  parser.add_option('-v', '--verbose', help='ignored')
  parser.add_option(
      '--skip-generate-buildfiles',
      action='store_true',
      help='Do not run GN after building it. Causes --gn-gen-args '
      'to have no effect.')
  parser.add_option(
      '--use-custom-libcxx',
      action='store_true',
      help='Build with in-tree libc++. This may be necessary if the system '
      'libstdc++ does not support C++14 features.')
  options, args = parser.parse_args(argv)
  if args:
    parser.error('Unrecognized command line arguments: %s.' % ', '.join(args))

  if options.build_path:
    build_rel = options.build_path
  elif options.debug:
    build_rel = os.path.join('out', 'Debug')
  else:
    build_rel = os.path.join('out', 'Release')
  out_dir = os.path.join(SRC_ROOT, build_rel)
  gn_path = options.output or os.path.join(out_dir, 'gn')
  gn_build_dir = os.path.join(out_dir, 'gn_build')

  # TODO(thomasanderson): Remove this once Ubuntu Trusty reaches EOL, or when
  # Chromium's infrastructure is upgraded from Trusty to Xenial, whichever comes
  # second ideally.  This can be done by reverting this CL:
  # https://chromium-review.googlesource.com/c/chromium/src/+/1460187/
  if options.use_custom_libcxx:
    libcxx_dir = os.path.join(gn_build_dir, 'libc++')
    if not os.path.exists(libcxx_dir):
      os.makedirs(libcxx_dir)
    shutil.copy2(
        os.path.join(BOOTSTRAP_DIR, 'libc++.ninja'),
        os.path.join(libcxx_dir, 'build.ninja'))
    with open(os.path.join(libcxx_dir, 'toolchain.ninja'), 'w') as f:
      f.write('\n'.join([
          'cxx = ' + os.environ.get('CXX', 'clang++'),
          'ar = ' + os.environ.get('AR', 'ar'),
          'cxxflags = ' + ' '.join(
              os.environ.get('CFLAGS', '').split() +
              os.environ.get('CXXFLAGS', '').split()),
      ]) + '\n')
    subprocess.check_call(['ninja', '-C', libcxx_dir])

    def append_to_env(var, vals):
      os.putenv(var, os.environ.get(var, '') + ' ' + ' '.join(vals))

    append_to_env('LDFLAGS', [
        '-nodefaultlibs', 'libc++.so', '-lc', '-lm', '-Wl,-rpath="\$$ORIGIN/."',
        '-Wl,-rpath-link=.'
    ])
    append_to_env('CXXFLAGS', [
        '-nostdinc++',
        ' -isystem../../../buildtools/third_party/libc++/trunk/include',
        '-isystem../../../buildtools/third_party/libc++abi/trunk/include'
    ])

  cmd = [
      sys.executable,
      os.path.join(GN_ROOT, 'build', 'gen.py'),
      '--no-last-commit-position',
      '--out-path=' + gn_build_dir,
  ]
  if options.debug:
    cmd.append('--debug')
  subprocess.check_call(cmd)

  shutil.copy2(
      os.path.join(BOOTSTRAP_DIR, 'last_commit_position.h'), gn_build_dir)
  subprocess.check_call(
      ['ninja', '-C', gn_build_dir, 'gn', '-w', 'dupbuild=err'])
  shutil.copy2(os.path.join(gn_build_dir, 'gn'), gn_path)

  if not options.skip_generate_buildfiles:
    gn_gen_args = options.gn_gen_args or ''
    if not options.debug:
      gn_gen_args += ' is_debug=false'
    subprocess.check_call([
        gn_path, 'gen', out_dir,
        '--args=%s' % gn_gen_args, "--root=" + SRC_ROOT
    ])


if __name__ == '__main__':
  sys.exit(main(sys.argv[1:]))
