import os
import glob

import lit.util

# python 2.7 backwards compatibility
try:
    from shlex import quote as shell_quote
except ImportError:
    from pipes import quote as shell_quote


if config.standalone_build:
    # These tests require the update_cc_test_checks.py script from the llvm
    # source tree, so skip these tests if we are doing standalone builds.
    # These tests are only relevant to developers working with the
    # update_cc_test_checks.py tool; they don't provide any coverage
    # for any of the clang source code.
    config.unsupported = True
else:

    config.test_format = lit.formats.ShTest(execute_external=False)
    config.suffixes = [".test"]

    clang_path = os.path.join(config.clang_tools_dir, "clang")
    extra_args = "--clang " + shell_quote(clang_path)
    opt_path = os.path.join(config.llvm_tools_dir, "opt")
    extra_args += " --opt " + shell_quote(opt_path)
    # Specify an explicit default version in UTC tests, so that the --version
    # embedded in UTC_ARGS does not change in all test expectations every time
    # the default is bumped.
    extra_args += " --version=1"
    script_path = os.path.join(
        config.llvm_src_root, "utils", "update_cc_test_checks.py"
    )
    assert os.path.isfile(script_path)
    # Windows: llvm-lit.py, Linux: llvm-lit
    if config.llvm_external_lit:
        lit = config.llvm_external_lit
    else:
        lit = shell_quote(
            glob.glob(os.path.join(config.llvm_tools_dir, "llvm-lit*"))[0]
        )
    python = shell_quote(config.python_executable)
    config.substitutions.append(
        (
            "%update_cc_test_checks",
            "%s %s %s" % (python, shell_quote(script_path), extra_args),
        )
    )
    config.substitutions.append(
        ("%clang_tools_dir", shell_quote(config.clang_tools_dir))
    )
    config.substitutions.append(
        (
            "%lit",
            "%s %s -Dclang_lit_site_cfg=%s -j1 -vv"
            % (python, lit, shell_quote(config.clang_lit_site_cfg)),
        )
    )
