# checkout the thirdparty/kaldi/base/kaldi-types.h
# compile kaldi without openfst
add_definitions("-DCOMPILE_WITHOUT_OPENFST")

if ((NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/base))
    file(COPY ../../../../speechx/speechx/kaldi/base DESTINATION ${CMAKE_CURRENT_LIST_DIR})
    file(COPY ../../../../speechx/speechx/kaldi/feat DESTINATION ${CMAKE_CURRENT_LIST_DIR})
    file(COPY ../../../../speechx/speechx/kaldi/matrix DESTINATION ${CMAKE_CURRENT_LIST_DIR})
    file(COPY ../../../../speechx/speechx/kaldi/util DESTINATION ${CMAKE_CURRENT_LIST_DIR})
endif()

# kaldi-base
add_library(kaldi-base STATIC
  base/io-funcs.cc
  base/kaldi-error.cc
  base/kaldi-math.cc
  base/kaldi-utils.cc
  base/timer.cc
)
target_include_directories(kaldi-base PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

# kaldi-matrix
if (APPLE)
    find_package(GFortranLibs REQUIRED)
    include(FortranCInterface)
    include(FindGFortranLibs REQUIRED)
endif()


add_library(kaldi-matrix STATIC
  matrix/compressed-matrix.cc
  matrix/matrix-functions.cc
  matrix/kaldi-matrix.cc
  matrix/kaldi-vector.cc
  matrix/optimization.cc
  matrix/packed-matrix.cc
  matrix/qr.cc
  matrix/sparse-matrix.cc
  matrix/sp-matrix.cc
  matrix/srfft.cc
  matrix/tp-matrix.cc
)
target_include_directories(kaldi-matrix PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

if (NOT MSVC)
    target_link_libraries(kaldi-matrix PUBLIC kaldi-base libopenblas ${LIBGFORTRAN_LIBRARIES})
else()
    target_link_libraries(kaldi-matrix PUBLIC kaldi-base openblas)
endif()

# kaldi-util
add_library(kaldi-util STATIC
  util/kaldi-holder.cc
  util/kaldi-io.cc
  util/kaldi-semaphore.cc
  util/kaldi-table.cc
  util/kaldi-thread.cc
  util/parse-options.cc
  util/simple-io-funcs.cc
  util/simple-options.cc
  util/text-utils.cc
)
target_include_directories(kaldi-util PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(kaldi-util PUBLIC kaldi-base kaldi-matrix)

# kaldi-feat-common
add_library(kaldi-feat-common STATIC
  feat/cmvn.cc
  feat/feature-functions.cc
  feat/feature-window.cc
  feat/mel-computations.cc
  feat/pitch-functions.cc
  feat/resample.cc
  feat/signal.cc
  feat/wave-reader.cc
)
target_include_directories(kaldi-feat-common PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(kaldi-feat-common PUBLIC kaldi-base kaldi-matrix kaldi-util)


# kaldi-mfcc
add_library(kaldi-mfcc STATIC
  feat/feature-mfcc.cc
)
target_include_directories(kaldi-mfcc PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(kaldi-mfcc PUBLIC kaldi-feat-common)


# kaldi-fbank
add_library(kaldi-fbank STATIC
  feat/feature-fbank.cc
)
target_include_directories(kaldi-fbank PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(kaldi-fbank PUBLIC kaldi-feat-common)


set(KALDI_LIBRARIES
  ${CMAKE_CURRENT_BINARY_DIR}/libkaldi-base.a
  ${CMAKE_CURRENT_BINARY_DIR}/libkaldi-matrix.a
  ${CMAKE_CURRENT_BINARY_DIR}/libkaldi-util.a
  ${CMAKE_CURRENT_BINARY_DIR}/libkaldi-feat-common.a
  ${CMAKE_CURRENT_BINARY_DIR}/libkaldi-mfcc.a
  ${CMAKE_CURRENT_BINARY_DIR}/libkaldi-fbank.a
)

add_library(libkaldi INTERFACE)
add_dependencies(libkaldi kaldi-base kaldi-matrix kaldi-util kaldi-feat-common kaldi-mfcc kaldi-fbank)
target_include_directories(libkaldi INTERFACE ${CMAKE_CURRENT_SOURCE_DIR})

if (APPLE)
    target_link_libraries(libkaldi INTERFACE ${KALDI_LIBRARIES} libopenblas ${LIBGFORTRAN_LIBRARIES})
elseif (MSVC)
    target_link_libraries(libkaldi INTERFACE kaldi-base kaldi-matrix kaldi-util kaldi-feat-common kaldi-mfcc kaldi-fbank openblas)
else()
    target_link_libraries(libkaldi INTERFACE -Wl,--start-group -Wl,--whole-archive ${KALDI_LIBRARIES} libopenblas.a gfortran -Wl,--no-whole-archive -Wl,--end-group)
endif()

target_compile_definitions(libkaldi INTERFACE "-DCOMPILE_WITHOUT_OPENFST")
