#!/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))
output_rel_dir = 'out'

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

# vs_toolchain needs to be after gyp path setting since it also uses gyp.
sys.path.insert(0, os.path.join(pdfium_root, 'build'))
import vs_toolchain

def run_gyp(args):
  rc = gyp.main(args)

  # Copy Windows toolchain DLLs.
  vs_runtime_dll_dirs = vs_toolchain.SetEnvironmentAndGetRuntimeDllDirs()
  if vs_runtime_dll_dirs:
    x64_runtime, x86_runtime = vs_runtime_dll_dirs
    vs_toolchain.CopyVsRuntimeDlls(
      os.path.join(pdfium_root, output_rel_dir), (x86_runtime, x64_runtime))

  if rc != 0:
    print 'Error running GYP'
    sys.exit(rc)


def main():
  if int(os.environ.get('GYP_PDFIUM_NO_ACTION', 0)):
    print 'Skipping gyp_pdfium due to GYP_PDFIUM_NO_ACTION env var.'
    sys.exit(0)

  args = sys.argv[1:]
  args.append(os.path.join(pdfium_root, 'build_gyp', 'all.gyp'))

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

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

  # 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'

  # Set up the environment variables.
  vs_toolchain.SetEnvironmentAndGetRuntimeDllDirs()

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

  run_gyp(args)


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