# -*- mode: cmake -*-
################################################################################
# WARNING: This file is automatically generated from templates and should not
# be directly modified. Instead, make changes to
# scripts/generate_harness/CMakeLists.txt_template and run
# scripts/generate_harness/generate_harness.py to regenerate this file.
################################################################################

cmake_minimum_required(VERSION 2.8.12)

# Add path for custom CMake modules.
list(APPEND CMAKE_MODULE_PATH
    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")

include(AddSwiftBenchmarkSuite)

set(SWIFT_BENCH_MODULES
    single-source/Ackermann
    single-source/AngryPhonebook
    single-source/AnyHashableWithAClass
    single-source/Array2D
    single-source/ArrayAppend
    single-source/ArrayInClass
    single-source/ArrayLiteral
    single-source/ArrayOfGenericPOD
    single-source/ArrayOfGenericRef
    single-source/ArrayOfPOD
    single-source/ArrayOfRef
    single-source/ArraySubscript
    single-source/BitCount
    single-source/ByteSwap
    single-source/Calculator
    single-source/CaptureProp
    single-source/CharacterLiteralsLarge
    single-source/CharacterLiteralsSmall
    single-source/Chars
    single-source/ClassArrayGetter
    single-source/DeadArray
    single-source/DictTest
    single-source/DictTest2
    single-source/DictTest3
    single-source/DictionaryBridge
    single-source/DictionaryLiteral
    single-source/DictionaryRemove
    single-source/DictionarySwap
    single-source/ErrorHandling
    single-source/Fibonacci
    single-source/GlobalClass
    single-source/Hanoi
    single-source/Hash
    single-source/Histogram
    single-source/Integrate
    single-source/IterateData
    single-source/Join
    single-source/LinkedList
    single-source/MapReduce
    single-source/Memset
    single-source/MonteCarloE
    single-source/MonteCarloPi
    single-source/NSDictionaryCastToSwift
    single-source/NSError
    single-source/NSStringConversion
    single-source/NopDeinit
    single-source/ObjectAllocation
    single-source/ObjectiveCBridging
    single-source/ObjectiveCBridgingStubs
    single-source/ObjectiveCNoBridgingStubs
    single-source/ObserverClosure
    single-source/ObserverForwarderStruct
    single-source/ObserverPartiallyAppliedMethod
    single-source/ObserverUnappliedMethod
    single-source/OpenClose
    single-source/Phonebook
    single-source/PolymorphicCalls
    single-source/PopFront
    single-source/PopFrontGeneric
    single-source/Prims
    single-source/ProtocolDispatch
    single-source/ProtocolDispatch2
    single-source/RC4
    single-source/RGBHistogram
    single-source/RangeAssignment
    single-source/RecursiveOwnedParameter
    single-source/ReversedCollections
    single-source/SetTests
    single-source/SevenBoom
    single-source/Sim2DArray
    single-source/SortLettersInPlace
    single-source/SortStrings
    single-source/StackPromo
    single-source/StaticArray
    single-source/StrComplexWalk
    single-source/StrToInt
    single-source/StringBuilder
    single-source/StringInterpolation
    single-source/StringTests
    single-source/StringWalk
    single-source/SuperChars
    single-source/TwoSum
    single-source/TypeFlood
    single-source/UTF8Decode
    single-source/Walsh
    single-source/XorLoop
)

set(SWIFT_MULTISOURCE_BENCHES
)


set(BENCH_DRIVER_LIBRARY_MODULES
    utils/DriverUtils
    utils/TestsUtils
)

set(BENCH_DRIVER_LIBRARY_FLAGS)
if (SWIFT_RUNTIME_ENABLE_LEAK_CHECKER)
  set(BENCH_DRIVER_LIBRARY_FLAGS -DSWIFT_RUNTIME_ENABLE_LEAK_CHECKER)
endif()

set(BENCH_LIBRARY_MODULES
)

add_definitions(-DSWIFT_EXEC -DSWIFT_LIBRARY_PATH -DONLY_PLATFORMS
                -DSWIFT_OPTIMIZATION_LEVELS -DSWIFT_BENCHMARK_EMIT_SIB)

if(NOT ONLY_PLATFORMS)
  set(ONLY_PLATFORMS "macosx" "iphoneos" "appletvos" "watchos")
endif()

if(NOT SWIFT_EXEC)
  runcmd(COMMAND "xcrun" "-f" "swiftc"
         VARIABLE SWIFT_EXEC
         ERROR "Unable to find Swift driver")
endif()

if(NOT SWIFT_LIBRARY_PATH)
  get_filename_component(tmp_dir "${SWIFT_EXEC}" DIRECTORY)
  get_filename_component(tmp_dir "${tmp_dir}" DIRECTORY)
  set(SWIFT_LIBRARY_PATH "${tmp_dir}/lib/swift")
endif()

# If the CMAKE_C_COMPILER is already clang, don't find it again,
# thus allowing the --host-cc build-script argument to work here.
get_filename_component(c_compiler ${CMAKE_C_COMPILER} NAME)

if(${c_compiler} STREQUAL "clang")
  set(CLANG_EXEC ${CMAKE_C_COMPILER})
else()
  runcmd(COMMAND "xcrun" "-toolchain" "${SWIFT_DARWIN_XCRUN_TOOLCHAIN}" "-f" "clang"
         VARIABLE CLANG_EXEC
         ERROR "Unable to find Clang driver")
endif()


# You have to delete CMakeCache.txt in the swift build to force a
# reconfiguration.
set(SWIFT_EXTRA_BENCH_CONFIGS CACHE STRING
    "A semicolon separated list of benchmark configurations. \
Available configurations: <Optlevel>_SINGLEFILE, <Optlevel>_MULTITHREADED")

# Syntax for an optset:  <optimization-level>_<configuration>
#    where "_<configuration>" is optional.
if(NOT SWIFT_OPTIMIZATION_LEVELS)
  set(SWIFT_OPTIMIZATION_LEVELS "Onone" "O" "Ounchecked"
                                ${SWIFT_EXTRA_BENCH_CONFIGS})
endif()

set(SWIFT_BENCHMARK_NUM_O_ITERATIONS "" CACHE STRING
    "Number of iterations to perform when running -O benchmarks via cmake")
set(SWIFT_BENCHMARK_NUM_ONONE_ITERATIONS "" CACHE STRING
    "Number of iterations to perform when running -Onone benchmarks via cmake")

# Options for the default (= empty) configuration
set(BENCHOPTS "-whole-module-optimization")

# Options for other configurations
set(BENCHOPTS_MULTITHREADED
    "-whole-module-optimization" "-num-threads" "4")
set(BENCHOPTS_SINGLEFILE "")

set(macosx_arch "x86_64")
set(iphoneos_arch "arm64" "armv7")
set(appletvos_arch "arm64")
set(watchos_arch "armv7k")

set(macosx_ver "10.9")
set(iphoneos_ver "8.0")
set(appletvos_ver "9.1")
set(watchos_ver "2.0")

set(macosx_triple_platform "macosx")
set(iphoneos_triple_platform "ios")
set(appletvos_triple_platform "tvos")
set(watchos_triple_platform "watchos")

set(sdks)
set(platforms)
foreach(platform ${ONLY_PLATFORMS})
  execute_process(
      COMMAND "xcrun" "--sdk" "${platform}" "--show-sdk-path"
      OUTPUT_VARIABLE ${platform}_sdk
      RESULT_VARIABLE result
      ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE)
  if("${result}" MATCHES "0")
    list(APPEND sdks "${${platform}_sdk}")
    list(APPEND platforms ${platform})
  endif()
endforeach()

message("--")
message("-- Swift Benchmark Suite:")
message("--   SWIFT_EXEC = ${SWIFT_EXEC}")
message("--   SWIFT_LIBRARY_PATH = ${SWIFT_LIBRARY_PATH}")
message("--   CLANG_EXEC = ${CLANG_EXEC}")
message("--   SWIFT_OPTIMIZATION_LEVELS = ${SWIFT_OPTIMIZATION_LEVELS}")
message("--   ONLY_PLATFORMS = ${ONLY_PLATFORMS}")

message("--   found platforms: ${platforms}")
message("--   found sdks:")
foreach(sdk ${sdks})
  message("--     ${sdk}")
endforeach()

set(executable_targets)

if(SWIFT_SDKS)
  set(IS_SWIFT_BUILD true)
endif()

set(srcdir "${CMAKE_CURRENT_SOURCE_DIR}")

if(IS_SWIFT_BUILD)
  get_filename_component(swift-bin-dir "${SWIFT_EXEC}" DIRECTORY)
else()
  set(swift-bin-dir "${CMAKE_BINARY_DIR}/bin")
endif()

set(benchmark-bin-dir "${CMAKE_CURRENT_BINARY_DIR}/bin")
set(benchmark-lib-dir "${CMAKE_CURRENT_BINARY_DIR}/lib")
set(benchmark-lib-swift-dir "${CMAKE_CURRENT_BINARY_DIR}/lib/swift")

file(MAKE_DIRECTORY "${swift-bin-dir}")
file(MAKE_DIRECTORY "${benchmark-bin-dir}")
file(MAKE_DIRECTORY "${benchmark-lib-dir}")
file(MAKE_DIRECTORY "${benchmark-lib-swift-dir}")

# Compile the perf test suite for each platform
foreach(platform ${platforms})
  swift_benchmark_compile(PLATFORM ${platform})
endforeach()

add_subdirectory(scripts)
