############ Set LIBSRC #################

set(OpenVML_LIBSRC_S "")
set(OpenVML_LIBSRC_D "")
set(OpenVML_LIBSRC_C "")
set(OpenVML_LIBSRC_Z "")

set(REAL_INTERFACE_LIST 
  add sub sqr
  pow powx pow2o3 pow3o2 exp expm1 
  tanh 
  log10 ln log1p 
  floor
  sin cos sinCos tan asin acos atan atan2)
set(COMPLEX_INTERFACE_LIST add sub)

function(cap_string var_name var_name_cap)
  string(SUBSTRING ${var_name} 0 1 FIRST_LETTER)
  string(TOUPPER ${FIRST_LETTER} FIRST_LETTER)
  string(REGEX REPLACE "^.(.*)" "${FIRST_LETTER}\\1" PROTO_NAME_CAP "${var_name}")
  set(${var_name_cap} ${PROTO_NAME_CAP} PARENT_SCOPE)
endfunction()

foreach(INTERFACE ${REAL_INTERFACE_LIST})

  set(OpenVML_LIBSRC_S
    ${OpenVML_LIBSRC_S}
    ${CMAKE_CURRENT_SOURCE_DIR}/${INTERFACE}.c
    )

  set(OpenVML_LIBSRC_D
    ${OpenVML_LIBSRC_D}
    ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_d.c
    )

  set(OpenVML_INTERFACE_NAME "")

  cap_string(${INTERFACE} OpenVML_INTERFACE_NAME)

  set_property(SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/${INTERFACE}.c
    APPEND 
    PROPERTY COMPILE_DEFINITIONS ${OpenVML_S_DEFINITIONS} ) 

  set_property(SOURCE ${CMAKE_CURRENT_SOURCE_DIR}/${INTERFACE}.c
    APPEND 
    PROPERTY COMPILE_DEFINITIONS CNAME=${OpenVML_FUNC_PREFIX}vs${OpenVML_INTERFACE_NAME}${OpenVML_FUNC_SUFFIX} ) 

  add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_d.c
    DEPENDS ${INTERFACE}.c
    COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${INTERFACE}.c   ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_d.c
    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_d.c)

  set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_d.c
    APPEND 
    PROPERTY COMPILE_DEFINITIONS ${OpenVML_D_DEFINITIONS} ) 

  set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_d.c
    APPEND 
    PROPERTY COMPILE_DEFINITIONS CNAME=${OpenVML_FUNC_PREFIX}vd${OpenVML_INTERFACE_NAME}${OpenVML_FUNC_SUFFIX} ) 

endforeach(INTERFACE)



foreach(INTERFACE ${COMPLEX_INTERFACE_LIST})

  set(OpenVML_LIBSRC_C
    ${OpenVML_LIBSRC_C}
    ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_c.c
    )

  set(OpenVML_LIBSRC_Z
    ${OpenVML_LIBSRC_Z}
    ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_z.c
    )

  set(OpenVML_INTERFACE_NAME "")

  cap_string(${INTERFACE} OpenVML_INTERFACE_NAME)

  add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_c.c
    DEPENDS ${INTERFACE}.c
    COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${INTERFACE}.c   ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_c.c
    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_c.c)

  set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_c.c
    APPEND 
    PROPERTY COMPILE_DEFINITIONS ${OpenVML_C_DEFINITIONS} ) 

  set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_c.c
    APPEND 
    PROPERTY COMPILE_DEFINITIONS CNAME=${OpenVML_FUNC_PREFIX}vc${OpenVML_INTERFACE_NAME}${OpenVML_FUNC_SUFFIX} ) 

  add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_z.c
    DEPENDS ${INTERFACE}.c
    COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${INTERFACE}.c   ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_z.c
    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_z.c)

  set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_z.c
    APPEND 
    PROPERTY COMPILE_DEFINITIONS ${OpenVML_Z_DEFINITIONS} ) 

  set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${INTERFACE}_z.c
    APPEND 
    PROPERTY COMPILE_DEFINITIONS CNAME=${OpenVML_FUNC_PREFIX}vz${OpenVML_INTERFACE_NAME}${OpenVML_FUNC_SUFFIX} ) 

Endforeach(INTERFACE)

add_library(openvml_interface_core OBJECT ${OpenVML_LIBSRC_S} ${OpenVML_LIBSRC_D} ${OpenVML_LIBSRC_C} ${OpenVML_LIBSRC_Z} ${OpenVML_LIBSRC_OTHER})

target_compile_definitions(openvml_interface_core PUBLIC openvml_EXPORTS)
