#!/usr/bin/env python
# Copyright (c) 2012 The Native Client Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""
Determine OS

Determine the name of the platform used to determine the correct Toolchain to
invoke.
"""

import optparse
import os
import re
import subprocess
import sys


TOOL_PATH=os.path.dirname(os.path.abspath(__file__))


def ErrOut(text):
  sys.stderr.write(text + '\n')
  sys.exit(1)
  


def GetSDKPath():
  return os.getenv('NACL_SDK_ROOT', os.path.dirname(TOOL_PATH))


def GetPlatform():
  if sys.platform.startswith('cygwin') or sys.platform.startswith('win'):
    return 'win'

  if sys.platform.startswith('darwin'):
    return 'mac'

  if sys.platform.startswith('linux'):
    return 'linux'
  return None


def UseWin64():
  arch32 = os.environ.get('PROCESSOR_ARCHITECTURE', 'unk')
  arch64 = os.environ.get('PROCESSOR_ARCHITEW6432', 'unk')

  if arch32 == 'AMD64' or arch64 == 'AMD64':
    return True
  return False


def GetSystemArch(platform):
  if platform == 'win':
    if UseWin64():
      return 'x86_64'
    return 'x86_32'

  if platform in ['mac', 'linux']:
    try:
      pobj = subprocess.Popen(['uname', '-m'],stdout= subprocess.PIPE)
      arch, serr = pobj.communicate()
      arch = arch.split()[0]
    except:
      arch = None
  return arch


def GetChromeArch(platform):
  if platform == 'win':
    if UseWin64():
      return 'x86_64'
    return 'x86_32'

  if platform in ['mac', 'linux']:
    chrome_path = os.getenv('CHROME_PATH', None)
    if not chrome_path:
      ErrOut('CHROME_PATH is undefined.')

    try:
      pobj = subprocess.Popen(['objdump', '-f', chrome_path],
                              stdout=subprocess.PIPE,
                              stderr=subprocess.PIPE)
      arch, serr = pobj.communicate()
      format = re.compile(r'(file format) ([a-zA-Z0-9_\-]+)')
      arch = format.search(arch).group(2)
      if '64' in arch:
        return 'x86_64'
      return 'x86_32'
    except:
      print "FAILED"
      arch = None
  return arch


def GetLoaderPath(platform):
  sdk_path = GetSDKPath()
  arch = GetChromeArch(platform)
  return os.path.join(sdk_path, 'tools', 'sel_ldr_' + arch)


def GetHelperPath(platform):
  sdk_path = GetSDKPath()
  if platform != 'linux':
    return ''
  arch = GetChromeArch(platform)
  return os.path.join(sdk_path, 'tools', 'nacl_helper_bootstrap_' + arch)


def GetIrtBinPath(platform):
  sdk_path = GetSDKPath()
  arch = GetChromeArch(platform)
  return os.path.join(sdk_path, 'tools', 'irt_%s.nexe' % arch)


def GetPluginPath(platform):
  sdk_path = GetSDKPath()
  arch = GetChromeArch(platform)
  if platform == 'win':
    return os.path.join(sdk_path, 'tools', 'ppNaClPlugin_x86_32.dll')
  else:
    return os.path.join(sdk_path, 'tools', 'ppNaClPlugin_%s.so' % arch)


def main(args):
  parser = optparse.OptionParser()
  parser.add_option('--arch', help='Return architecture type.',
      action='store_true', dest='arch', default=False)
  parser.add_option('--chrome', help='Return chrome architecture type.',
      action='store_true', dest='chrome', default=False)
  parser.add_option('--helper', help='Return chrome helper path.',
      action='store_true', dest='helper', default=False)
  parser.add_option('--irtbin', help='Return irt binary path.',
      action='store_true', dest='irtbin', default=False)
  parser.add_option('--loader', help='Return NEXE loader path.',
      action='store_true', dest='loader', default=False)
  parser.add_option('--plugin', help='Return NaCl plugin path.',
      action='store_true', dest='plugin', default=False)

  options, _ = parser.parse_args(args[1:])

  platform = GetPlatform()
  if platform is None:
    print 'Unknown platform.'
    return 1

  if len(args) > 2:
    print 'Only specify one platform item.'
    return 1

  if len(args) == 1:
    print platform
    return 0

  if len(args) == 2:
    if options.arch:
      out = GetSystemArch(platform)
    if options.chrome:
      out = GetChromeArch(platform)
    if options.helper:
      out = GetHelperPath(platform)
    if options.irtbin:
      out = GetIrtBinPath(platform)
    if options.loader:
      out = GetLoaderPath(platform)
    if options.plugin:
      out = GetPluginPath(platform)
    print out
    return 0

  print 'Failed with args: ' + ' '.join(args)
  return 1


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