cmake_minimum_required(VERSION 3.21)
project(searchi_speech_runtime LANGUAGES C CXX)
find_package(Git REQUIRED)
execute_process(COMMAND "${GIT_EXECUTABLE}" -C "${WHISPER_SOURCE}" rev-parse HEAD OUTPUT_VARIABLE revision OUTPUT_STRIP_TRAILING_WHITESPACE RESULT_VARIABLE status)
if(NOT status EQUAL 0 OR NOT revision STREQUAL "d1be6fde11ac6e0407606b4e42fe72d34add8037")
  message(FATAL_ERROR "Provide the pinned whisper.cpp source checkout")
endif()
option(SEARCHI_INTERNAL_CPU "Internal Windows VM CPU tool, not distribution" OFF)
set(GGML_NATIVE OFF CACHE BOOL "" FORCE)
set(GGML_OPENMP OFF CACHE BOOL "" FORCE)
set(WHISPER_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
set(WHISPER_BUILD_TESTS OFF CACHE BOOL "" FORCE)
foreach(provider CUDA SYCL HIP BLAS)
  set(GGML_${provider} OFF CACHE BOOL "" FORCE)
endforeach()
if(SEARCHI_INTERNAL_CPU)
  set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
  set(GGML_BACKEND_DL OFF CACHE BOOL "" FORCE)
  set(GGML_VULKAN OFF CACHE BOOL "" FORCE)
  set(GGML_METAL OFF CACHE BOOL "" FORCE)
else()
  set(BUILD_SHARED_LIBS ON CACHE BOOL "" FORCE)
  set(GGML_BACKEND_DL ON CACHE BOOL "" FORCE)
  if(CMAKE_SYSTEM_PROCESSOR MATCHES "^(AMD64|amd64|x86_64)$")
    set(GGML_CPU_ALL_VARIANTS ON CACHE BOOL "" FORCE)
  endif()
  if(APPLE)
    set(GGML_METAL ON CACHE BOOL "" FORCE)
    set(GGML_VULKAN OFF CACHE BOOL "" FORCE)
  else()
    find_package(Vulkan REQUIRED COMPONENTS glslc)
    set(GGML_VULKAN ON CACHE BOOL "" FORCE)
    set(GGML_METAL OFF CACHE BOOL "" FORCE)
  endif()
endif()
if(UNIX AND NOT APPLE AND NOT SEARCHI_INTERNAL_CPU)
  # The staged worker and every dynamic backend live together. RUNPATH is
  # non-transitive, so each shared target needs its own relocatable lookup.
  set(CMAKE_INSTALL_RPATH "$ORIGIN")
  set(CMAKE_BUILD_WITH_INSTALL_RPATH ON)
endif()
add_subdirectory("${WHISPER_SOURCE}" whisper)
target_compile_features(whisper PRIVATE cxx_std_17)
add_executable(searchi-speech-worker worker.cpp)
target_compile_features(searchi-speech-worker PRIVATE cxx_std_17)
target_link_libraries(searchi-speech-worker PRIVATE whisper)
if(NOT SEARCHI_INTERNAL_CPU)
  target_compile_definitions(searchi-speech-worker PRIVATE SEARCHI_DISTRIBUTION_AUTO=1)
endif()
if(MSVC)
  target_compile_options(searchi-speech-worker PRIVATE /utf-8)
endif()
if(APPLE)
  set_target_properties(searchi-speech-worker PROPERTIES BUILD_RPATH "$ORIGIN;@loader_path" INSTALL_RPATH "$ORIGIN;@loader_path")
elseif(UNIX)
  set_target_properties(searchi-speech-worker PROPERTIES BUILD_RPATH "$ORIGIN" INSTALL_RPATH "$ORIGIN")
endif()
