import subprocess

def getRoot(config):
  if not config.parent:
    return config
  return getRoot(config.parent)


def is_gold_linker_available():

  if not config.gold_executable:
    return False
  try:
    ld_cmd = subprocess.Popen([config.gold_executable, '--help'], stdout = subprocess.PIPE)
    ld_out = ld_cmd.stdout.read().decode()
    ld_cmd.wait()
  except:
    return False

  if not '-plugin' in ld_out:
    return False

  clang_cmd = subprocess.Popen([config.clang, '-fuse-ld=gold', '-xc', '-'],
                               stdin = subprocess.PIPE,
                               stdout = subprocess.PIPE,
                               stderr = subprocess.PIPE)
  clang_err = clang_cmd.communicate('int main() { return 0; }')[1]

  if not 'invalid linker' in clang_err:
    return True

  return False

root = getRoot(config)

if root.host_os not in ['Linux'] or not is_gold_linker_available():
  config.unsupported = True
