# -*- Python -*-

import shlex
import lit.util

from lit.llvm import llvm_config
from lit.llvm.subst import ToolSubst, FindTool


def shjoin(args, sep=" "):
    return sep.join([shlex.quote(arg) for arg in args])


# Configuration file for the 'lit' test runner.

# name: The name of this test suite.
config.name = "flang-rt"

# TODO: Consolidate the logic for turning on the internal shell by default for all LLVM test suites.
# See https://github.com/llvm/llvm-project/issues/106636 for more details.
#
# We prefer the lit internal shell which provides a better user experience on failures
# unless the user explicitly disables it with LIT_USE_INTERNAL_SHELL=0 env var.
use_lit_shell = True
lit_shell_env = os.environ.get("LIT_USE_INTERNAL_SHELL")
if lit_shell_env:
    use_lit_shell = lit.util.pythonize_bool(lit_shell_env)

# testFormat: The test format to use to interpret tests.
#
# For now we require '&&' between commands, until they get globally killed and
# the test runner updated.
config.test_format = lit.formats.ShTest(not use_lit_shell)

# suffixes: A list of file extensions to treat as test files.
config.suffixes = [
    ".c",
    ".cpp",
    ".f",
    ".F",
    ".ff",
    ".FOR",
    ".for",
    ".f77",
    ".f90",
    ".F90",
    ".ff90",
    ".f95",
    ".F95",
    ".ff95",
    ".fpp",
    ".FPP",
    ".cuf",
    ".CUF",
    ".f18",
    ".F18",
    ".f03",
    ".F03",
    ".f08",
    ".F08",
    ".ll",
    ".fir",
    ".mlir",
]

llvm_config.use_default_substitutions()

# test_source_root: The root path where tests are located.
config.test_source_root = os.path.dirname(__file__)

# test_exec_root: The root path where tests should be run.
# lit writes a '.lit_test_times.txt' file into this directory.
config.test_exec_root = config.flang_rt_binary_test_dir

# On MacOS, some tests need -isysroot to build binaries.
isysroot_flag = []
if config.osx_sysroot:
    isysroot_flag = ["-isysroot", config.osx_sysroot]
config.substitutions.append(("%isysroot", " ".join(isysroot_flag)))

flang_args = []
if not config.llvm_tree_available:
    flang_args.append(
        f"-fintrinsic-modules-path={config.flang_rt_output_resource_mod_dir}"
    )

tools = [
    ToolSubst(
        "%flang",
        command=config.flang,
        extra_args=flang_args,
        unresolved="fatal",
    ),
    ToolSubst(
        "%clang",
        command=FindTool("clang"),
        unresolved="fatal",
    ),
    ToolSubst("%cc", command=config.cc, unresolved="fatal"),
]
llvm_config.add_tool_substitutions(tools)

# Let tests find LLVM's standard tools (FileCheck, split-file, not, ...)
llvm_config.with_environment("PATH", config.llvm_tools_dir, append_path=True)

# Include path for C headers that define Flang's Fortran ABI.
config.substitutions.append(
    ("%include", os.path.join(config.flang_source_dir, "include"))
)

# Library path of libflang_rt.runtime.a/.so (for lib search path when using non-Flang driver for linking and LD_LIBRARY_PATH)
config.substitutions.append(("%libdir", config.flang_rt_output_resource_lib_dir))

# For CUDA offloading, additional steps (device linking) and libraries (cudart) are needed.
if config.flang_rt_experimental_offload_support == "CUDA":
    config.available_features.add("offload-cuda")

if config.flang_rt_fortran_modules:
    config.available_features.add("fortran-modules")

# Tools that support OBJECT_MODE default to 32-bit on AIX. Set
# OBJECT_MODE=any to handle both 32-bit and 64-bit objects.
if "system-aix" in config.available_features:
    config.environment["OBJECT_MODE"] = "any"
