cmake_minimum_required(VERSION 3.10)
project(chromaprint_nif LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

if(NOT ERTS_INCLUDE_DIR)
  message(FATAL_ERROR "ERTS_INCLUDE_DIR is required (path to erts-x.y.z/include)")
endif()
if(NOT PRIV_DIR)
  message(FATAL_ERROR "PRIV_DIR is required (mix app priv/ directory)")
endif()

option(CHROMAPRINT_USE_SYSTEM "Link against a system-provided libchromaprint" OFF)

if(CHROMAPRINT_USE_SYSTEM)
  find_path(CHROMAPRINT_INCLUDE_DIR chromaprint.h)
  find_library(CHROMAPRINT_LIBRARY NAMES chromaprint)
  if(NOT CHROMAPRINT_INCLUDE_DIR OR NOT CHROMAPRINT_LIBRARY)
    message(FATAL_ERROR
      "CHROMAPRINT_USE_SYSTEM=ON but chromaprint.h or libchromaprint not found. "
      "Set CHROMAPRINT_INCLUDE_DIR and CMAKE_LIBRARY_PATH (or CMAKE_PREFIX_PATH).")
  endif()
  message(STATUS "Using system chromaprint: ${CHROMAPRINT_LIBRARY}")
  add_library(chromaprint_dep INTERFACE)
  target_include_directories(chromaprint_dep INTERFACE "${CHROMAPRINT_INCLUDE_DIR}")
  target_link_libraries(chromaprint_dep INTERFACE "${CHROMAPRINT_LIBRARY}")
else()
  message(STATUS "Building vendored chromaprint (c_src/chromaprint)")
  set(BUILD_TOOLS OFF CACHE BOOL "" FORCE)
  set(BUILD_TESTS OFF CACHE BOOL "" FORCE)
  set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE)
  set(BUILD_FRAMEWORK OFF CACHE BOOL "" FORCE)
  set(FFT_LIB "kissfft" CACHE STRING "" FORCE)
  # FindKissFFT.cmake searches CMAKE_SOURCE_DIR/src/3rdparty/kissfft, which would
  # resolve to c_src/src/... when chromaprint is added as a subdirectory. Point
  # it at the vendored copy inside the submodule.
  set(KISSFFT_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/chromaprint/src/3rdparty/kissfft"
      CACHE PATH "" FORCE)
  add_subdirectory(chromaprint EXCLUDE_FROM_ALL)
  add_library(chromaprint_dep INTERFACE)
  target_link_libraries(chromaprint_dep INTERFACE chromaprint)
  target_include_directories(chromaprint_dep INTERFACE
    "${CMAKE_CURRENT_SOURCE_DIR}/chromaprint/src")
endif()

add_library(chromaprint_nif SHARED chromaprint_nif.cpp)

set_target_properties(chromaprint_nif PROPERTIES
  PREFIX ""
  SUFFIX ".so"
)

target_include_directories(chromaprint_nif PRIVATE "${ERTS_INCLUDE_DIR}")
target_link_libraries(chromaprint_nif PRIVATE chromaprint_dep)

if(APPLE)
  set_target_properties(chromaprint_nif PROPERTIES
    LINK_FLAGS "-flat_namespace -undefined suppress")
endif()

install(TARGETS chromaprint_nif
  LIBRARY DESTINATION "${PRIV_DIR}"
  RUNTIME DESTINATION "${PRIV_DIR}")
