cmake_minimum_required(VERSION 3.10)

project(generate_crend_ivas_tables)

# set(CMAKE_OSX_ARCHITECTURES "x86_64")
set(CMAKE_BUILD_TYPE "Debug")
set(IVAS_TRUNK_PATH "${PROJECT_SOURCE_DIR}/../..")
set(IVAS_TRUNK_UTIL_PATH ${IVAS_TRUNK_PATH}/lib_util)
string(REPLACE "/binauralRenderer_interface" "" IVAS_TRUNK_SCRIPTS_PATH ${PROJECT_SOURCE_DIR})
set(IVAS_TRUNK_DEC_PATH ${IVAS_TRUNK_PATH}/lib_dec)
set(IVAS_TRUNK_REND_PATH ${IVAS_TRUNK_PATH}/lib_rend)
set(IVAS_TRUNK_ENC_PATH ${IVAS_TRUNK_PATH}/lib_enc)
set(IVAS_TRUNK_COM_PATH ${IVAS_TRUNK_PATH}/lib_com)
set(IVAS_TRUNK_ISAR_PATH ${IVAS_TRUNK_PATH}/lib_isar)
set(IVAS_TRUNK_LC3_PATH ${IVAS_TRUNK_PATH}/lib_lc3plus)
set(IVAS_TRUNK_DEBUG_PATH ${IVAS_TRUNK_PATH}/lib_debug)

option(USE_MATLAB_ENG "Use matlab engine" OFF) # allows to use sofa file as input to the exe, but on windows requires to register matlab as a com server type in matlab "comserver('register')""
find_package(Matlab REQUIRED)
message("Matlab_VERSION = ${Matlab_VERSION}")
message("Matlab_ROOT_DIR = ${Matlab_ROOT_DIR}")
message("Matlab_INCLUDE_DIRS = ${Matlab_INCLUDE_DIRS}")

if(NOT Matlab_MAT_LIBRARY)
    string(REPLACE "mex" "mat" Matlab_MAT_LIBRARY ${Matlab_MEX_LIBRARY})
endif()

message("Matlab_MAT_LIBRARY = ${Matlab_MAT_LIBRARY}")
message("Matlab_LIBRARIES = ${Matlab_LIBRARIES}")
message("Matlab_MX_LIBRARY = ${Matlab_MX_LIBRARY}")
message("Matlab_MEX_LIBRARY = ${Matlab_MEX_LIBRARY}")
message("Matlab_ENGINE_LIBRARY = ${Matlab_ENGINE_LIBRARY}")
message("Matlab_DATAARRAY_LIBRARY = ${Matlab_DATAARRAY_LIBRARY}")
include_directories(${Matlab_INCLUDE_DIRS} ${IVAS_TRUNK_UTIL_PATH} ${IVAS_TRUNK_ENC_PATH} ${IVAS_TRUNK_DEC_PATH} ${IVAS_TRUNK_REND_PATH} ${IVAS_TRUNK_COM_PATH} ${IVAS_TRUNK_ISAR_PATH} ${IVAS_TRUNK_LC3_PATH} ${IVAS_TRUNK_DEBUG_PATH})

if(USE_MATLAB_ENG)
    string(REPLACE "mex" "eng" Matlab_ENG_LIBRARY ${Matlab_MEX_LIBRARY})
    add_definitions(-DUSE_MATLAB_ENG)
endif()

set(SOURCE_FILES_C
    ${PROJECT_SOURCE_DIR}/ivas_crend_binaural_filter_design.c
    ${PROJECT_SOURCE_DIR}/config_reader.c
    ${IVAS_TRUNK_COM_PATH}/basop32.c
    ${IVAS_TRUNK_COM_PATH}/basop_mpy.c
    ${IVAS_TRUNK_COM_PATH}/enh40.c
    ${IVAS_TRUNK_COM_PATH}/fft.c
    ${IVAS_TRUNK_COM_PATH}/fft_rel.c
    ${IVAS_TRUNK_COM_PATH}/ifft_rel.c
    ${IVAS_TRUNK_COM_PATH}/ivas_mdft_imdft.c
    ${IVAS_TRUNK_COM_PATH}/rom_com.c
    ${IVAS_TRUNK_COM_PATH}/ivas_rom_com.c
    ${IVAS_TRUNK_COM_PATH}/tools.c
    ${IVAS_TRUNK_COM_PATH}/tns_base.c
    ${IVAS_TRUNK_UTIL_PATH}/cmdl_tools.c
    ${IVAS_TRUNK_REND_PATH}/ivas_rom_rend.c
)

set(SOURCE_FILES_H
    ${PROJECT_SOURCE_DIR}/ivas_crend_binaural_filter_design.h
    ${PROJECT_SOURCE_DIR}/config_reader.h
    ${IVAS_TRUNK_REND_PATH}/ivas_stat_rend.h
    ${IVAS_TRUNK_DEC_PATH}/ivas_stat_dec.h
    ${IVAS_TRUNK_DEC_PATH}/stat_dec.h
    ${IVAS_TRUNK_COM_PATH}/options.h
    ${IVAS_TRUNK_COM_PATH}/ivas_cnst.h
    ${IVAS_TRUNK_COM_PATH}/cnst.h
    ${IVAS_TRUNK_COM_PATH}/prot.h
    ${IVAS_TRUNK_COM_PATH}/ivas_prot.h
    ${IVAS_TRUNK_COM_PATH}/common_api_types.h
    ${IVAS_TRUNK_REND_PATH}/ivas_rom_rend.h
)

# require to be bit exact with main branch
if(MSVC)
    add_compile_options("/fp:precise")
else()
    add_compile_options("-ffp-contract=off")
endif()

add_library(${PROJECT_NAME}_lib STATIC ${SOURCE_FILES_C} ${SOURCE_FILES_H})

add_executable(${PROJECT_NAME} generate_crend_ivas_tables_from_sofa.c)

target_link_libraries(${PROJECT_NAME} ${PROJECT_NAME}_lib ${Matlab_MAT_LIBRARY} ${Matlab_MX_LIBRARY})

if(UNIX AND NOT APPLE)
    target_link_libraries(${PROJECT_NAME} libstdc++.so.6 -lm -ldl)
endif()

if(USE_MATLAB_ENG)
    target_link_libraries(${PROJECT_NAME} ${Matlab_ENG_LIBRARY})
endif()

if(WIN32)
    add_compile_definitions(_CRT_SECURE_NO_WARNINGS)
endif()

add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD VERBATIM COMMAND "${CMAKE_COMMAND}" -E copy "$<TARGET_FILE:${PROJECT_NAME}>" "${CMAKE_CURRENT_SOURCE_DIR}/")
