##===----------------------------------------------------------------------===##
# 
#                     The LLVM Compiler Infrastructure
#
# This file is dual licensed under the MIT and the University of Illinois Open
# Source Licenses. See LICENSE.txt for details.
# 
##===----------------------------------------------------------------------===##
#
# Build plugins for the user system if available.
#
##===----------------------------------------------------------------------===##

# void build_generic_elf64(string tmachine, string tmachine_name, string tmachine_libname, string elf_machine_id);
# - build a plugin for an ELF based generic 64-bit target based on libffi.
# - tmachine: name of the machine processor as used in the cmake build system.
# - tmachine_name: name of the machine to be printed with the debug messages.
# - tmachine_libname: machine name to be appended to the plugin library name.
macro(build_generic_elf64 tmachine tmachine_name tmachine_libname tmachine_triple elf_machine_id)
if(CMAKE_SYSTEM_PROCESSOR MATCHES "${tmachine}$")
  if(LIBOMPTARGET_DEP_LIBELF_FOUND)
    if(LIBOMPTARGET_DEP_LIBFFI_FOUND)
    
      libomptarget_say("Building ${tmachine_name} offloading plugin.")
    
      include_directories(${LIBOMPTARGET_DEP_LIBFFI_INCLUDE_DIR})
      include_directories(${LIBOMPTARGET_DEP_LIBELF_INCLUDE_DIR})
      
      # Define macro to be used as prefix of the runtime messages for this target.
      add_definitions("-DTARGET_NAME=${tmachine_name}")
      
      # Define macro with the ELF ID for this target.
      add_definitions("-DTARGET_ELF_ID=${elf_machine_id}")
    
      add_library("omptarget.rtl.${tmachine_libname}" SHARED 
        ${CMAKE_CURRENT_SOURCE_DIR}/../generic-elf-64bit/src/rtl.cpp)
        
      # Install plugin under the lib destination folder.
      install(TARGETS "omptarget.rtl.${tmachine_libname}" 
        LIBRARY DESTINATION "${OPENMP_INSTALL_LIBDIR}")
        
      target_link_libraries(
        "omptarget.rtl.${tmachine_libname}"
        ${LIBOMPTARGET_DEP_LIBFFI_LIBRARIES} 
        ${LIBOMPTARGET_DEP_LIBELF_LIBRARIES}
        dl
        "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/../exports")
    
      # Report to the parent scope that we are building a plugin.
      set(LIBOMPTARGET_SYSTEM_TARGETS 
        "${LIBOMPTARGET_SYSTEM_TARGETS} ${tmachine_triple}" PARENT_SCOPE)
      
    else(LIBOMPTARGET_DEP_LIBFFI_FOUND)
      libomptarget_say("Not building ${tmachine_name} offloading plugin: libffi dependency not found.")
    endif(LIBOMPTARGET_DEP_LIBFFI_FOUND)
  else(LIBOMPTARGET_DEP_LIBELF_FOUND)
    libomptarget_say("Not building ${tmachine_name} offloading plugin: libelf dependency not found.")
  endif(LIBOMPTARGET_DEP_LIBELF_FOUND)
else()
  libomptarget_say("Not building ${tmachine_name} offloading plugin: machine not found in the system.")
endif()
endmacro()

add_subdirectory(aarch64)
add_subdirectory(cuda)
add_subdirectory(ppc64)
add_subdirectory(ppc64le)
add_subdirectory(x86_64)

# Make sure the parent scope can see the plugins that will be created.
set(LIBOMPTARGET_SYSTEM_TARGETS "${LIBOMPTARGET_SYSTEM_TARGETS}" PARENT_SCOPE)

