# -*- Python -*- vim: set ft=python ts=4 sw=4 expandtab tw=79:
# Configuration file for the 'lit' test runner.

import os
import lit.formats

# Tell pylint that we know config and lit_config exist somewhere.
if 'PYLINT_IMPORT' in os.environ:
    config = object()
    lit_config = object()

def prepend_library_path(name, value, sep):
    if name in config.environment:
        config.environment[name] = value + sep + config.environment[name]
    else:
        config.environment[name] = value

# name: The name of this test suite.
config.name = 'libomptarget-nvptx'

# suffixes: A list of file extensions to treat as test files.
config.suffixes = ['.c', '.cpp', '.cc']

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

# test_exec_root: The root object directory where output is placed
config.test_exec_root = config.binary_dir

# test format
config.test_format = lit.formats.ShTest()

# compiler flags
config.test_flags = " -I " + config.omp_header_directory + \
    " -L " + config.library_dir

if config.omp_host_rtl_directory:
    config.test_flags = config.test_flags + \
        " -L " + config.omp_host_rtl_directory

config.test_flags = config.test_flags + " " + config.test_extra_flags

# Setup environment to find dynamic library at runtime.
prepend_library_path('LIBRARY_PATH', config.library_dir, ":")
prepend_library_path('LD_LIBRARY_PATH', config.library_dir, ":")
prepend_library_path('LD_LIBRARY_PATH', config.omp_host_rtl_directory, ":")
if config.cuda_libdir:
    prepend_library_path('LD_LIBRARY_PATH', config.cuda_libdir, ":")

# Forbid fallback to host.
config.environment["OMP_TARGET_OFFLOAD"] = "MANDATORY"

# substitutions
config.substitutions.append(("%compilexx-run-and-check",
    "%compilexx-and-run | " + config.libomptarget_filecheck + " %s"))
config.substitutions.append(("%compile-run-and-check",
    "%compile-and-run | " + config.libomptarget_filecheck + " %s"))
config.substitutions.append(("%compilexx-and-run", "%compilexx && %run"))
config.substitutions.append(("%compile-and-run", "%compile && %run"))

config.substitutions.append(("%compilexx",
    "%clangxx %openmp_flags %cuda_flags %flags %s -o %t"))
config.substitutions.append(("%compile",
    "%clang %openmp_flags %cuda_flags %flags %s -o %t"))

config.substitutions.append(("%clangxx", config.test_cxx_compiler))
config.substitutions.append(("%clang", config.test_c_compiler))
config.substitutions.append(("%openmp_flags", config.test_openmp_flags))
if config.cuda_path:
  config.substitutions.append(("%cuda_flags", "--cuda-path=" + config.cuda_path))
else:
  config.substitutions.append(("%cuda_flags", ""))
config.substitutions.append(("%flags", config.test_flags))

config.substitutions.append(("%run", "%t"))
config.substitutions.append(("%not", config.libomptarget_not))
