import os
import pipes
import shlex
import sys

if not 'go' in config.root.llvm_bindings:
    config.unsupported = True

if not config.root.include_go_tests:
    config.unsupported = True

def find_executable(executable, path=None):
    if path is None:
        path = os.environ['PATH']
    paths = path.split(os.pathsep)
    base, ext = os.path.splitext(executable)

    if (sys.platform == 'win32' or os.name == 'os2') and (ext != '.exe'):
        executable = executable + '.exe'

    if not os.path.isfile(executable):
        for p in paths:
            f = os.path.join(p, executable)
            if os.path.isfile(f):
                return f
        return None
    else:
        return executable

# Resolve certain symlinks in the first word of compiler.
#
# This is a Go-specific hack. cgo and other Go tools check $CC and $CXX for the
# substring 'clang' to determine if the compiler is Clang. This won't work if
# $CC is cc and cc is a symlink pointing to clang, as it is on Darwin.
#
# Go tools also have problems with ccache, so we disable it.
def fixup_compiler_path(compiler):
    args = shlex.split(compiler)
    if args[0].endswith('ccache') or args[0].endswith('gomacc'):
        args = args[1:]

    path = find_executable(args[0])

    try:
        if path.endswith('/cc') and os.readlink(path) == 'clang':
            args[0] = path[:len(path)-2] + 'clang'
    except (AttributeError, OSError):
        pass

    try:
        if path.endswith('/c++') and os.readlink(path) == 'clang++':
            args[0] = path[:len(path)-3] + 'clang++'
    except (AttributeError, OSError):
        pass

    return ' '.join([pipes.quote(arg) for arg in args])

config.environment['CC'] = fixup_compiler_path(config.host_cc)
config.environment['CXX'] = fixup_compiler_path(config.host_cxx)
config.environment['CGO_LDFLAGS'] = config.host_ldflags
