@AUTO_GEN_COMMENT@

import os
import site

config.cxx_under_test           = "@CMAKE_CXX_COMPILER@"
config.project_obj_root         = "@CMAKE_BINARY_DIR@"
config.libcxx_src_root          = "@LIBCXX_SOURCE_DIR@"
config.libcxx_obj_root          = "@LIBCXX_BINARY_DIR@"
config.cxx_library_root         = "@LIBCXX_LIBRARY_DIR@"
config.enable_exceptions        = @LIBCXX_ENABLE_EXCEPTIONS@
config.enable_debug_tests       = @LIBCXX_ENABLE_DEBUG_MODE_SUPPORT@
config.enable_experimental      = @LIBCXX_ENABLE_EXPERIMENTAL_LIBRARY@
config.enable_rtti              = @LIBCXX_ENABLE_RTTI@
config.enable_shared            = @LIBCXX_LINK_TESTS_WITH_SHARED_LIBCXX@
config.enable_32bit             = @LIBCXX_BUILD_32_BITS@
config.cxx_abi                  = "@LIBCXX_CXX_ABI_LIBNAME@"
config.use_sanitizer            = "@LLVM_USE_SANITIZER@"
config.sanitizer_library        = "@LIBCXX_SANITIZER_LIBRARY@"
config.abi_library_path         = "@LIBCXX_CXX_ABI_LIBRARY_PATH@"
config.configuration_variant    = "@LIBCXX_LIT_VARIANT@"
config.host_triple              = "@LLVM_HOST_TRIPLE@"
config.target_triple            = "@TARGET_TRIPLE@"
config.sysroot                  = "@LIBCXX_SYSROOT@"
config.gcc_toolchain            = "@LIBCXX_GCC_TOOLCHAIN@"
config.generate_coverage        = @LIBCXX_GENERATE_COVERAGE@
config.target_info              = "@LIBCXX_TARGET_INFO@"
config.test_linker_flags        = "@LIBCXX_TEST_LINKER_FLAGS@"
config.test_compiler_flags      = "@LIBCXX_TEST_COMPILER_FLAGS@"

config.executor                 = "@LIBCXX_EXECUTOR@"
config.llvm_unwinder            = @LIBCXXABI_USE_LLVM_UNWINDER@
config.builtins_library         = "@LIBCXX_BUILTINS_LIBRARY@"
config.has_libatomic            = @LIBCXX_HAS_ATOMIC_LIB@
config.debug_build              = @LIBCXX_DEBUG_BUILD@
config.libcxxabi_shared         = @LIBCXX_LINK_TESTS_WITH_SHARED_LIBCXXABI@
config.cxx_ext_threads          = @LIBCXX_BUILD_EXTERNAL_THREAD_LIBRARY@
config.pstl_src_root            = "@ParallelSTL_SOURCE_DIR@" if @LIBCXX_ENABLE_PARALLEL_ALGORITHMS@ else None
config.pstl_obj_root            = "@ParallelSTL_BINARY_DIR@" if @LIBCXX_ENABLE_PARALLEL_ALGORITHMS@ else None

# Code signing
config.llvm_codesign_identity   = "@LLVM_CODESIGNING_IDENTITY@"

site.addsitedir(os.path.join(config.libcxx_src_root, 'utils'))

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

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

# test_source_root: The root path where tests are located.
config.test_source_root = os.path.join(config.libcxx_src_root, 'test')

# Allow expanding substitutions that are based on other substitutions
config.recursiveExpansionLimit = 10

# Infer the test_exec_root from the libcxx_object root.
config.test_exec_root = os.path.join(config.libcxx_obj_root, 'test')

import libcxx.test.format
config.test_format = libcxx.test.format.CxxStandardLibraryTest()

lit_config.note('Using configuration variant: {}'.format(config.configuration_variant))
import libcxx.test.config
configuration = libcxx.test.config.Configuration(lit_config, config)
configuration.configure()
configuration.print_config_info()
