# -*- Python -*- vim: set ft=python ts=4 sw=4 expandtab tw=79:

# Configuration file for the 'lit' test runner.


import os
import site

site.addsitedir(os.path.dirname(__file__))


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

# name: The name of this test suite.
config.name = 'libc++abi'

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

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

# Infer the libcxx_test_source_root for configuration import.
# If libcxx_source_root isn't specified in the config, assume that the libcxx
# and libcxxabi source directories are sibling directories.
libcxx_src_root = getattr(config, 'libcxx_src_root', None)
if not libcxx_src_root:
    libcxx_src_root = os.path.join(config.test_source_root, '../../libcxx')
libcxx_test_src_root = os.path.join(libcxx_src_root, 'test')
if os.path.isfile(os.path.join(libcxx_test_src_root, 'libcxx', '__init__.py')):
    site.addsitedir(libcxx_test_src_root)
else:
    lit_config.fatal('Could not find libcxx test directory for test imports'
                     ' in: %s' % libcxx_test_src_root)

# Infer the test_exec_root from the libcxx_object root.
obj_root = getattr(config, 'libcxxabi_obj_root', None)

# Check that the test exec root is known.
if obj_root is None:
    import libcxx.test.config
    libcxx.test.config.loadSiteConfig(
        lit_config, config, 'libcxxabi_site_config', 'LIBCXXABI_SITE_CONFIG')
    obj_root = getattr(config, 'libcxxabi_obj_root', None)
    if obj_root is None:
        import tempfile
        obj_root = tempfile.mkdtemp(prefix='libcxxabi-testsuite-')
        lit_config.warning('Creating temporary directory for object root: %s' %
                           obj_root)

config.test_exec_root = os.path.join(obj_root, 'test')

# Check if we have produced a Clang with this build (in-tree)
this_clang = os.path.join(obj_root, '../../bin/clang++')
if os.path.exists(this_clang):
    config.cxx_under_test = this_clang

cfg_variant = getattr(config, 'configuration_variant', 'libcxxabi')
if cfg_variant:
    print 'Using configuration variant: %s' % cfg_variant

# Load the Configuration class from the module name <cfg_variant>.test.config.
config_module_name = '.'.join([cfg_variant, 'test', 'config'])
config_module = __import__(config_module_name, fromlist=['Configuration'])

configuration = config_module.Configuration(lit_config, config)
configuration.configure()
configuration.print_config_info()
config.test_format = configuration.get_test_format()
