# Taken from utils/lit/tests in the LLVM tree and hacked together to support
# our tests.

# -*- Python -*-

import os
import sys

import lit.formats

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

# testFormat: The test format to use to interpret tests.
config.test_format = lit.formats.ShTest()

# 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__)
config.test_exec_root = config.test_source_root
config.target_triple = '(unused)'

src_root = os.path.abspath(os.path.join(config.test_source_root, '..'))
bin_root = src_root
config.substitutions.append(('%{src_root}', src_root))
config.substitutions.append(('%{python}', sys.executable))

# Finding LLVM binary tools. All tools used in the tests must be listed in
# the llvmbintools list.
llvmbinpath = os.path.abspath(os.environ.get('LLVM_BIN_PATH'))

# Finding Subzero tools
llvm2icetool = os.path.join(bin_root, 'llvm2ice')
config.substitutions.append(
  ('%llvm2iceinsts', ' '.join([os.path.join(bin_root, 'llvm2iceinsts.py'),
                               '--llvm2ice', llvm2icetool,
                               '--llvm-bin-path', llvmbinpath
                             ])))
config.substitutions.append(('%llvm2ice', llvm2icetool))
config.substitutions.append(('%szdiff', os.path.join(bin_root, 'szdiff.py')))

llvmbintools = ['FileCheck']

for tool in llvmbintools:
  config.substitutions.append((tool, os.path.join(llvmbinpath, tool)))

# Add a feature to detect the Python version.
config.available_features.add("python%d.%d" % (sys.version_info[0],
                                               sys.version_info[1]))

# Debugging output
def dbg(s):
  print '[DBG] %s' % s

dbg('bin_root = %s' % bin_root)
dbg('llvmbinpath = %s' % llvmbinpath)


