
# Locate and load the lldb python module

import os, sys

def import_lldb():
  """ Find and import the lldb modules. This function tries to find the lldb module by:
      1. Simply by doing "import lldb" in case the system python installation is aware of lldb. If that fails,
      2. Executes the lldb executable pointed to by the LLDB environment variable (or if unset, the first lldb
         on PATH") with the -P flag to determine the PYTHONPATH to set. If the lldb executable returns a valid
         path, it is added to sys.path and the import is attempted again. If that fails, 3. On Mac OS X the
         default Xcode 4.5 installation path.
  """

  # Try simple 'import lldb', in case of a system-wide install or a pre-configured PYTHONPATH
  try:
    import lldb
    return True
  except ImportError:
    pass

  # Allow overriding default path to lldb executable with the LLDB environment variable
  lldb_executable = 'lldb'
  if 'LLDB' in os.environ and os.path.exists(os.environ['LLDB']):
    lldb_executable = os.environ['LLDB']

  # Try using builtin module location support ('lldb -P')
  from subprocess import check_output, CalledProcessError
  try:
    with open(os.devnull, 'w') as fnull:
      lldb_minus_p_path = check_output("%s -P" % lldb_executable, shell=True, stderr=fnull).strip()
    if not os.path.exists(lldb_minus_p_path):
      #lldb -P returned invalid path, probably too old
      pass
    else:
      sys.path.append(lldb_minus_p_path)
      import lldb
      return True
  except CalledProcessError:
    # Cannot run 'lldb -P' to determine location of lldb python module
    pass
  except ImportError:
    # Unable to import lldb module from path returned by `lldb -P`
    pass

  # On Mac OS X, use the try the default path to XCode lldb module
  if "darwin" in sys.platform:
    xcode_python_path = "/Applications/Xcode.app/Contents/SharedFrameworks/LLDB.framework/Versions/Current/Resources/Python/"
    sys.path.append(xcode_python_path)
    try:
      import lldb
      return True
    except ImportError:
      # Unable to import lldb module from default Xcode python path
      pass

  return False

if not import_lldb():
  import vim
  vim.command('redraw | echo "%s"' % " Error loading lldb module; vim-lldb will be disabled. Check LLDB installation or set LLDB environment variable.")
