#!/usr/bin/env python
#
# Copyright 2014 PDFium 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 script is wrapper for PDFium that adds some support for how GYP
# is invoked by PDFium beyond what can be done in the gclient hooks.

import os
import platform
import sys

script_dir = os.path.dirname(os.path.realpath(__file__))
pdfium_root = os.path.abspath(os.path.join(script_dir, os.pardir))

sys.path.insert(0, os.path.join(pdfium_root, 'build', 'gyp', 'pylib'))
import gyp


def run_gyp(args):
  rc = gyp.main(args)
  if rc != 0:
    print 'Error running GYP'
    sys.exit(rc)


def main():
  args = sys.argv[1:]
  args.append(os.path.join(script_dir, 'all.gyp'))

  args.append('-I')
  args.append(os.path.join(pdfium_root, 'build', 'standalone.gypi'))

  args.extend(['-D', 'gyp_output_dir=out'])

  # Set the GYP DEPTH variable to the root of the PDFium project.
  args.append('--depth=' + os.path.relpath(pdfium_root))

  # GYP does not default to ninja, but PDFium should.
  if not os.environ.get('GYP_GENERATORS', ''):
    print 'GYP_GENERATORS is not set, defaulting to ninja'
    os.environ['GYP_GENERATORS'] = 'ninja'

  print 'Updating projects from gyp files...'
  sys.stdout.flush()

  run_gyp(args)


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