# -*- 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', '.s']

# 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, 'utils')
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')

cfg_variant = getattr(config, 'configuration_variant', 'libcxxabi')
if cfg_variant:
    lit_config.note('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()
