# -*clang- Python -*-

import os
import platform
import re
import subprocess

import lit.formats
import lit.util

from lit.llvm import llvm_config

# Configuration file for the 'lit' test runner.

# name: The name of this test suite.
config.name = 'Polly'

# 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.
#
# 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)

config.test_format = lit.formats.ShTest(execute_external=not use_lit_shell)

# suffixes: A list of file extensions to treat as test files.
config.suffixes = ['.ll']

# 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.
config.test_exec_root = os.path.join(config.polly_obj_root, 'test')

# Tweak the PATH to include the tools dir and the scripts dir.
base_paths = [config.llvm_tools_dir, config.environment['PATH']]
path = os.path.pathsep.join(base_paths + config.extra_paths)
config.environment['PATH'] = path

path = os.path.pathsep.join((config.llvm_libs_dir,
                              config.environment.get('LD_LIBRARY_PATH','')))
config.environment['LD_LIBRARY_PATH'] = path

llvm_config.use_default_substitutions()

tool_patterns = ['opt', 'polly-isl-test']
llvm_config.add_tool_substitutions(tool_patterns)

# opt knows whether it is compiled with -DNDEBUG.
import subprocess
try:
    opt_cmd = subprocess.Popen([os.path.join(config.llvm_tools_dir, 'opt'), '-version'],
                           stdout = subprocess.PIPE,
                           env=config.environment)
except OSError:
    print("Could not find opt in " + config.llvm_tools_dir)
    exit(42)

if re.search(r'with assertions', opt_cmd.stdout.read().decode('ascii')):
    config.available_features.add('asserts')
opt_cmd.wait()

try:
    llvm_config_cmd = subprocess.Popen([os.path.join(
                                        config.llvm_tools_dir,
                                        'llvm-config'),
                                        '--targets-built'],
                                       stdout = subprocess.PIPE,
                                       env=config.environment)
except OSError:
    print("Could not find llvm-config in " + config.llvm_tools_dir)
    exit(42)

llvm_config_cmd.wait()
