#!/usr/bin/env python
# Copyright (c) 2012 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.

import glob
import os
import shutil
import subprocess
import sys
import tempfile

BUILD_DIR = 'build'


def run_with_vsvars(cmd, tmpdir=None):
  fd, filename = tempfile.mkstemp('.bat', text=True)
  with os.fdopen(fd, 'w') as f:
    print >> f, '@echo off'
    print >> f, r'call "%VS100COMNTOOLS%\vsvars32.bat"'
    if tmpdir:
      print >> f, r'cd %s' % tmpdir
    print >> f, cmd
  try:
    p = subprocess.Popen([filename], shell=True, stdout=subprocess.PIPE,
        universal_newlines=True)
    out, _ = p.communicate()
    return p.returncode, out
  finally:
    os.unlink(filename)


def get_vc_dir():
  _, out = run_with_vsvars('echo VCINSTALLDIR=%VCINSTALLDIR%')
  for line in out.splitlines():  # pylint: disable-msg=E1103
    if line.startswith('VCINSTALLDIR='):
      return line[len('VCINSTALLDIR='):]
  return None


def build(infile):
  if not os.path.exists(BUILD_DIR):
    os.makedirs(BUILD_DIR)
  outfile = 'limiter.exe'
  outpath = os.path.join(BUILD_DIR, outfile)
  cpptime = os.path.getmtime(infile)
  if not os.path.exists(outpath) or cpptime > os.path.getmtime(outpath):
    print 'Building %s...' % outfile
    rc, out = run_with_vsvars(
        'cl /nologo /Ox /Zi /W4 /WX /D_UNICODE /DUNICODE'
        ' /D_CRT_SECURE_NO_WARNINGS /EHsc %s /link /out:%s'
        % (os.path.join('..', infile), outfile), BUILD_DIR)
    if rc:
      print out
      print 'Failed to build %s' % outfile
      sys.exit(1)
  else:
    print '%s already built' % outfile
  return outpath


def main():
  # Switch to our own dir.
  os.chdir(os.path.dirname(os.path.abspath(__file__)))

  if sys.argv[-1] == 'clean':
    if os.path.exists(BUILD_DIR):
      shutil.rmtree(BUILD_DIR)
    for exe in glob.glob('*.exe'):
      os.unlink(exe)
    return 0

  vcdir = os.environ.get('VCINSTALLDIR')
  if not vcdir:
    vcdir = get_vc_dir()
    if not vcdir:
      print 'Could not get VCINSTALLDIR. Run vsvars32.bat?'
      return 1
    os.environ['PATH'] += (';' + os.path.join(vcdir, 'bin') +
                           ';' + os.path.join(vcdir, r'..\Common7\IDE'))

  # Verify that we can find link.exe.
  link = os.path.join(vcdir, 'bin', 'link.exe')
  if not os.path.exists(link):
    print 'link.exe not found at %s' % link
    return 1

  exe_name = build('limiter.cc')
  for shim_exe in ('lib.exe', 'link.exe'):
    newpath = '%s__LIMITER.exe' % shim_exe
    shutil.copyfile(exe_name, newpath)
    print '%s shim built. Use with msbuild like: "/p:LinkToolExe=%s"' \
        % (shim_exe, os.path.abspath(newpath))

  return 0


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