# 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@"

# Please remember to handle empty strings and/or unset variables correctly.

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_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 "@SWIFT_ENABLE_RUNTIME_FUNCTION_COUNTERS@" == "TRUE":
    config.available_features.add('runtime_function_counters')

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_BUILD_SYNTAXPARSERLIB@" == "TRUE":
    config.available_features.add('syntax_parser_lib')

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

if "@SWIFT_HAVE_LIBXML2@" == "TRUE":
    config.available_features.add('libxml2')

if "@SWIFT_ENABLE_LLD_LINKER@" == "TRUE":
    config.android_linker_name = "lld"
else:
    # even if SWIFT_ENABLE_GOLD_LINKER isn't set, we cannot use BFD for Android
    config.android_linker_name = "gold"

# 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"))
