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

"""Builds and optionally uploads the mojom generators to Google Cloud Storage.

This script works the same as build_mojom_tool.
"""

import os
import sys

import builder


def main():
  all_generators = set(['deps'])
  parser = builder.get_arg_parser('Build the mojom generators.')
  parser.add_argument('--generators', dest='generators', type=str,
      default=all_generators.join(','), action='store',
      help='Comma-separated list of generators to be built by this build '
      'script. These should be directories under mojom/generators. By default '
      'every generator known to the build script will be built.')
  args = parser.parse_args()

  generators = args.generators.split(',')
  for generator in generators:
    if generator not in all_generators:
      print "The only allowed generators are: %s" % all_generators.join(',')
      return -1

  final_result = 0
  for generator in generators:
    generator_builder = builder.get_builder(
        args=args,
        target_dir='generators',
        binary_name=generator,
        src_path=os.path.join('mojom', 'generators', generator))

    if args.upload:
      result = generator_builder.build_and_upload()
    result = generator_builder.build()
    if result != 0:
      final_result = result
      if not args.keep_going:
        return result

  return final_result


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