
include(CMakeParseArguments)
include(LLVMExternalProjectUtils)
include(SwiftUtils)

# This is the name of the target on the parent cmake side that is associated
# with an external project target.
#
# If LLVMExternalProjectUtils refactors its external target code, so we can
# easily add individual forwarded targets with different dependencies, this can
# be removed.
function(compute_external_target_name target_name_out target)
  string(REPLACE ":" ";" target_list ${target})
  list(GET target_list 0 target)
  list(LENGTH target_list target_list_len)
  if(${target_list_len} GREATER 1)
    list(GET target_list 1 target_name)
  else()
    set(target_name "${target}")
  endif()

  set(${target_name_out} "${target_name}" PARENT_SCOPE)
endfunction()

function(compute_stdlib_dependencies stdlib_dependencies_out platform)
  foreach(stdlib_dependency ${UNIVERSAL_LIBRARY_NAMES_${platform}})
    string(FIND "${stdlib_dependency}" "Unittest" find_output)
    if("${find_output}" STREQUAL "-1")
      list(APPEND stdlib_dependencies "${stdlib_dependency}")
    endif()
  endforeach()
  set(${stdlib_dependencies_out} "${stdlib_dependencies}" PARENT_SCOPE)
endfunction()

set(ONLY_PLATFORMS "macosx" "iphoneos" "appletvos" "watchos")

function (get_platform_from_target target_platform_out target)
  foreach (platform ${ONLY_PLATFORMS})
    string(FIND "${target}" "${platform}" FOUND_TARGET_PLATFORM)
    if (NOT FOUND_TARGET_PLATFORM)
      continue()
    endif()

    set(${target_platform_out} "${platform}" PARENT_SCOPE)
    break()
  endforeach()
endfunction()

function (compute_target_stdlib_dependencies dependencies_out target)
  get_platform_from_target(target_platform ${target})
  precondition(target_platform
    MESSAGE "Failed to find a platform for ${target_platform}")
  compute_stdlib_dependencies(stdlib_dependencies ${target_platform})
  set(${dependencies_out} ${stdlib_dependencies} PARENT_SCOPE)
endfunction()

function (add_external_benchmark_suite)
  set(name swift-benchmark)
  set(src_dir ${SWIFT_SOURCE_DIR}/benchmark)
  set(bin_dir ${SWIFT_BINARY_DIR}/external-benchmark/binary)
  set(stamp_dir ${SWIFT_BINARY_DIR}/external-benchmark/stamps)
  set(prefix_dir ${SWIFT_BINARY_DIR}/external-benchmark/prefix)

  set(bench_targets Benchmark_O Benchmark_Onone Benchmark_Osize)
  set(library_targets swift-benchmark-macosx-x86_64-external)

  set(all_stdlib_dependencies)
  foreach (target ${library_targets})
    compute_target_stdlib_dependencies(stdlib_dependencies ${target})
    precondition(stdlib_dependencies)
    # Add dependencies from all of our stdlib dependencies to
    # swift-bench-configure. This will ensure the stdlib is ready to be poked at
    # in the configure script if we ever want to do so.
    list(APPEND all_stdlib_dependencies ${stdlib_dependencies})
  endforeach()

  llvm_ExternalProject_add(swift-bench ${src_dir}
    SOURCE_DIR ${src_dir}
    EXCLUDE_FROM_ALL
    DEPENDS swift ${all_stdlib_dependencies}
    EXTRA_TARGETS ${bench_targets} ${library_targets}
    CMAKE_ARGS
      -DSWIFT_EXEC=${SWIFT_BINARY_DIR}/bin/swiftc
      -DSWIFT_LIBRARY_PATH=${SWIFT_BINARY_DIR}/lib/swift
      -DCMAKE_C_COMPILER=${PATH_TO_CLANG_BUILD}/bin/clang
      -DCMAKE_CXX_COMPILER=${PATH_TO_CLANG_BUILD}/bin/clang++
      -DSWIFT_BENCHMARK_SUBCMAKE_BUILD=TRUE
    PASSTHROUGH_PREFIXES SWIFT_BENCHMARK
    )
endfunction()
