cmake_minimum_required(VERSION 3.22.1)

include(FetchContent)

project("MetronomeMixer")

set(CMAKE_EXPORT_COMPILE_COMMANDS ON) 

option(WITH_OBOE "Compile oboe backend" OFF)
option(WITH_JNI "Compile java api" OFF)
option(WITH_TESTS "Compile tests" OFF)

# might help for reproducible builds
add_link_options("LINKER:--build-id=none")
#add_compile_options("-no-canonical-prefixes") # seems to be added anyway
add_compile_options("-Wa,-fdebug-compilation-dir=.")
add_compile_options("-Werror=date-time")
# the following could also be used, but the other options should be enough
#add_compile_options("-ffile-prefix-map=${CMAKE_CURRENT_SOURCE_DIR}=.")

set(CPPFILES
  src/Effects.cpp
  src/MetronomeMixer.cpp
  src/MetronomeCallbackHandler.cpp
  src/MetronomeProperties.cpp
  src/NoteList.cpp
  src/SoundBank.cpp
  )

set(METRONOME_LIBS "")
set(METRONOME_DEFINITIONS "")
 
set(CMAKE_CXX_STANDARD 20)

if (WITH_OBOE)
  # Find the Oboe package
  find_package (oboe REQUIRED CONFIG)

  set(CPPFILES ${CPPFILES}
    src/OboeMetronome.cpp
  )
  set(METRONOME_LIBS ${METRONOME_LIBS}
    oboe::oboe
  )
endif()

if (WITH_JNI)
  set(METRONOME_DEFINITIONS ${METRONOME_DEFINITIONS} -DMETRONOME_HAS_JNI)
  set(CPPFILES ${CPPFILES}
    src/MetronomeCallbackJNI.cpp
  )

  if (WITH_OBOE)
    set(CPPFILES ${CPPFILES}
      src/jnibridge.cpp
      src/OboeStatusChangeCallbackJNI.cpp
    )
  endif()
  
  set(METRONOME_LIBS ${METRONOME_LIBS}
    android
    log
  )
endif()

message("Project name: " ${CMAKE_PROJECT_NAME})

add_library(${CMAKE_PROJECT_NAME} SHARED
  ${CPPFILES}
)

include_directories(include ext/rsmpl/include)
#target_include_directories(${CMAKE_PROJECT_NAME}
#  include
#)

target_compile_features(${CMAKE_PROJECT_NAME} PUBLIC cxx_std_20)

target_compile_definitions(${CMAKE_PROJECT_NAME}
  PUBLIC
  ${METRONOME_DEFINITIONS}
)
target_link_libraries(${CMAKE_PROJECT_NAME}
  ${METRONOME_LIBS}
)

if (WITH_TESTS)
  FetchContent_Declare(
    googletest
    GIT_REPOSITORY https://github.com/google/googletest.git
    GIT_TAG v1.17.0
  )
  set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
  FetchContent_MakeAvailable(googletest)

  enable_testing()

  add_executable(tests
    tests/FifoQueueTest.cpp
    tests/NoteListTest.cpp
    tests/MetronomeMixerTest.cpp
    tests/MetronomeCallbackHandlerTest.cpp
    tests/RingBufferTest.cpp
    tests/RoundEquiSpacedTest.cpp
    tests/SynchronizeBeatsTest.cpp
    tests/UpdatePtrTest.cpp
  )
  
  target_link_libraries(tests
    GTest::gtest_main
    ${CMAKE_PROJECT_NAME}
  )

  include(GoogleTest)
  gtest_discover_tests(tests)

endif()
