# lit.site.cfg.in - Local configuration for the 'lit' test runner -*- python -*-
#
# This source file is part of the Swift.org open source project
#
# Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
# Licensed under Apache License v2.0 with Runtime Library Exception
#
# See https://swift.org/LICENSE.txt for license information
# See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
#
# -----------------------------------------------------------------------------

import os
import platform
import sys

config.llvm_src_root = "@LLVM_MAIN_SRC_DIR@"
config.llvm_obj_root = "@LLVM_BINARY_DIR@"
config.llvm_tools_dir = "@LLVM_TOOLS_DIR@"
config.llvm_libs_dir = "@LLVM_LIBS_DIR@"
config.llvm_code_generators = "@LLVM_TARGETS_TO_BUILD@".split(";")
config.lit_tools_dir = "@LLVM_LIT_TOOLS_DIR@"
config.swift_src_root = lit_config.params.get("swift_src_root", "@SWIFT_SOURCE_DIR@")
config.swift_obj_root = "@SWIFT_BINARY_DIR@"
config.target_triple = "@TARGET_TRIPLE@"
config.variant_triple = "@VARIANT_TRIPLE@"
config.variant_sdk = "@VARIANT_SDK@"
config.variant_suffix = "@VARIANT_SUFFIX@"
config.swiftlib_dir = "@LIT_SWIFTLIB_DIR@"
config.swift_test_results_dir = \
    lit_config.params.get("swift_test_results_dir", "@SWIFT_TEST_RESULTS_DIR@")
config.darwin_xcrun_toolchain = "@SWIFT_DARWIN_XCRUN_TOOLCHAIN@"
config.android_ndk_path = "@SWIFT_ANDROID_NDK_PATH@"
config.android_ndk_gcc_version = "@SWIFT_ANDROID_NDK_GCC_VERSION@"

config.coverage_mode = "@SWIFT_ANALYZE_CODE_COVERAGE@"
config.lldb_build_root = "@LLDB_BUILD_DIR@"

if "@SWIFT_ASAN_BUILD@" == "TRUE":
    config.available_features.add("asan")
else:
    config.available_features.add('no_asan')

if "@SWIFT_RUNTIME_ENABLE_LEAK_CHECKER@" == "TRUE":
    config.available_features.add('leak-checker')

if '@SWIFT_TOOLS_ENABLE_LTO@'.lower() in ['full', 'thin']:
    config.available_features.add('lto')
else:
    config.available_features.add('no_lto')

if "@LLVM_ENABLE_ASSERTIONS@" == "TRUE":
    config.available_features.add('asserts')
else:
    config.available_features.add('no_asserts')

if "@SWIFT_STDLIB_ASSERTIONS@" == "TRUE":
    config.available_features.add('swift_stdlib_asserts')
else:
    config.available_features.add('swift_stdlib_no_asserts')

if "@SWIFT_AST_VERIFIER@" == "TRUE":
    config.available_features.add('swift_ast_verifier')

if "@SWIFT_OPTIMIZED@" == "TRUE":
    config.available_features.add("optimized_stdlib")

if "@SWIFT_STDLIB_ENABLE_RESILIENCE@" == "TRUE":
    config.available_features.add("resilient_stdlib")

if "@SWIFT_STDLIB_USE_NONATOMIC_RC@" == "TRUE":
    config.available_features.add("nonatomic_rc")

if "@SWIFT_HAVE_WORKING_STD_REGEX@" == "FALSE":
    config.available_features.add('broken_std_regex')

if "@CMAKE_GENERATOR@" == "Xcode":
    xcode_bin_dir = os.path.join(config.llvm_obj_root, "@LLVM_BUILD_TYPE@",
                                 'bin')
    lit_config.note('Adding to path: ' + xcode_bin_dir)
    config.environment['PATH'] = \
      os.path.pathsep.join((xcode_bin_dir, config.environment['PATH']))

config.available_features.add("CMAKE_GENERATOR=@CMAKE_GENERATOR@")

if "@SWIFT_ENABLE_SOURCEKIT_TESTS@" == "TRUE":
    config.available_features.add('sourcekit')

# Let the main config do the real work.
if config.test_exec_root is None:
    config.test_exec_root = os.path.dirname(os.path.realpath(__file__))
lit_config.load_config(
    config, os.path.join(config.swift_src_root, "test", "lit.cfg"))
