
include(${OpenVML_ARCH}/Kernel_${OpenVML_CPU_CORENAME}.txt)

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

#s,d
set(KERNEL_LIST add sub sqr pow powx exp expm1 tanh log10 ln log1p floor
  sin cos sincos tan asin acos atan atan2)

#c,z
set(Z_KERNEL_LIST add sub) 
######## s,d kernels

foreach(KERNEL ${KERNEL_LIST})

  set(OpenVML_LIBSRC_S
    ${OpenVML_LIBSRC_S}
    ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_s_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    )

  set(OpenVML_LIBSRC_D
    ${OpenVML_LIBSRC_D}
    ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_d_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    )


  set(S_KERNEL_SOURCE ${${KERNEL}_S_KERNEL_SOURCE})

  add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_s_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${S_KERNEL_SOURCE}
    COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${S_KERNEL_SOURCE}   ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_s_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_s_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c)

  set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_s_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    APPEND 
    PROPERTY COMPILE_DEFINITIONS ${OpenVML_S_DEFINITIONS} ) 

  set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_s_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    APPEND 
    PROPERTY COMPILE_DEFINITIONS KERNEL_NAME=${OpenVML_FUNC_PREFIX}s${KERNEL}_k${OpenVML_FUNC_SUFFIX} ) 

  set(D_KERNEL_SOURCE ${${KERNEL}_D_KERNEL_SOURCE})
  add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_d_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${D_KERNEL_SOURCE}
    COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${D_KERNEL_SOURCE}   ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_d_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_d_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c)

  set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_d_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    APPEND 
    PROPERTY COMPILE_DEFINITIONS ${OpenVML_D_DEFINITIONS} ) 

  set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_d_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    APPEND 
    PROPERTY COMPILE_DEFINITIONS KERNEL_NAME=${OpenVML_FUNC_PREFIX}d${KERNEL}_k${OpenVML_FUNC_SUFFIX}) 

endforeach(KERNEL)


######## c,z kernels


foreach(KERNEL ${Z_KERNEL_LIST})

  set(OpenVML_LIBSRC_C
    ${OpenVML_LIBSRC_C}
    ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_c_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    )

  set(OpenVML_LIBSRC_Z
    ${OpenVML_LIBSRC_Z}
    ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_z_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    )


  set(C_KERNEL_SOURCE ${${KERNEL}_C_KERNEL_SOURCE})

  add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_c_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${C_KERNEL_SOURCE}
    COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${C_KERNEL_SOURCE}   ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_c_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_c_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c)

  set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_c_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    APPEND 
    PROPERTY COMPILE_DEFINITIONS ${OpenVML_C_DEFINITIONS} ) 

  set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_c_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    APPEND 
    PROPERTY COMPILE_DEFINITIONS KERNEL_NAME=${OpenVML_FUNC_PREFIX}c${KERNEL}_k${OpenVML_FUNC_SUFFIX} ) 

  set(Z_KERNEL_SOURCE ${${KERNEL}_Z_KERNEL_SOURCE})
  add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_z_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${Z_KERNEL_SOURCE}
    COMMAND ${CMAKE_COMMAND} -E copy_if_different ${CMAKE_CURRENT_SOURCE_DIR}/${Z_KERNEL_SOURCE}   ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_z_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_z_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c)

  set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_z_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    APPEND 
    PROPERTY COMPILE_DEFINITIONS ${OpenVML_Z_DEFINITIONS} ) 

  set_property(SOURCE ${CMAKE_CURRENT_BINARY_DIR}/${KERNEL}_kernel_z_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}.c
    APPEND 
    PROPERTY COMPILE_DEFINITIONS KERNEL_NAME=${OpenVML_FUNC_PREFIX}z${KERNEL}_k${OpenVML_FUNC_SUFFIX}) 

endforeach(KERNEL)



add_library(openvml_kernel_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}_core OBJECT ${OpenVML_LIBSRC_S} ${OpenVML_LIBSRC_D} ${OpenVML_LIBSRC_C} ${OpenVML_LIBSRC_Z})

target_compile_options(openvml_kernel_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}_core PRIVATE ${OpenVML_KERNEL_COMPILE_FLAGS})

target_include_directories(openvml_kernel_${OpenVML_ARCH}_${OpenVML_CPU_CORENAME}_core PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/${OpenVML_ARCH})
