# <license>
# 
# Controller v2.1
# 
# This software is provided to enhance knowledge and encourage progress in the scientific
# community. It should be used only for research and educational purposes. Any reproduction
# or use for commercial purpose, public redistribution, in source or binary forms, with or 
# without modifications, is NOT ALLOWED without the previous authorization of the copyright 
# holder. The origin of this software must not be misrepresented; you must not claim that you
# wrote the original software. If you use this software for any purpose (e.g. publication),
# a reference to the software package and the authors must be included.
# 
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS "AS IS" AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
# THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# 
# Copyright (c) 2007-2020, Trasgo Group, Universidad de Valladolid.
# All rights reserved.
# 
# More information on http://trasgo.infor.uva.es/
# 
# </license>
cmake_minimum_required (VERSION 3.17)

# Common files and include dirs
set(CTRL_INCLUDE_DIRS ${CTRL_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/Ctrl/inc)
set(CTRL_SOURCES ${CTRL_SOURCES} src/Core/Ctrl_Core.c)

# Support for Cpu
if (SUPPORT_CPU)
	set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_ARCH_CPU_ ")
	set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_ARCH_CPU_ ")
	set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_ARCH_CPU_ ")

	set(CTRL_SOURCES ${CTRL_SOURCES} src/Architectures/Cpu/Ctrl_Cpu.c)

	# MKL support
	if (MKL)
		set(BLA_VENDOR Intel10_64lp)
		find_package(BLAS REQUIRED)
		set(CTRL_LIBS ${CTRL_LIBS} ${BLAS_LIBRARIES})
		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_MKL_ ")
	endif (MKL)
endif (SUPPORT_CPU)

# Support for OpenCl Gpu
if (SUPPORT_OPENCL_GPU)
	if (OPENCL_GPU_ERROR_CHECK)
		set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_OPENCL_GPU_ERROR_CHECK_ ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_OPENCL_GPU_ERROR_CHECK_ ")
		set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_OPENCL_GPU_ERROR_CHECK_ ")
	endif (OPENCL_GPU_ERROR_CHECK)

	if (OPENCL_GPU_PERFORMANCE)
		set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_OPENCL_GPU_PERFORMANCE_ ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_OPENCL_GPU_PERFORMANCE_ ")
		set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_OPENCL_GPU_PERFORMANCE_ ")
	endif (OPENCL_GPU_PERFORMANCE)

	if (OPENCL_GPU_DEBUG)
		set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_OPENCL_GPU_DEBUG_ ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_OPENCL_GPU_DEBUG_ ")
		set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_OPENCL_GPU_DEBUG_ ")
	endif (OPENCL_GPU_DEBUG)

	if (OPENCL_GPU_TEST_OUTPUT)
		set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_OPENCL_GPU_TEST_OUTPUT_ ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_OPENCL_GPU_TEST_OUTPUT_ ")
		set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_OPENCL_GPU_TEST_OUTPUT_ ")
	endif (OPENCL_GPU_TEST_OUTPUT)

	if (OPENCL_GPU_PROFILING)
		set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_OPENCL_GPU_PROFILING_ ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_OPENCL_GPU_PROFILING_ ")
		set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_OPENCL_GPU_PROFILING_ ")

		set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_OPENCL_GPU_PROFILING_N_READ_TASKS_=${OPENCL_GPU_PROFILING_N_READ_TASKS} ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_OPENCL_GPU_PROFILING_N_READ_TASKS_=${OPENCL_GPU_PROFILING_N_READ_TASKS} ")
		set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_OPENCL_GPU_PROFILING_N_READ_TASKS_=${OPENCL_GPU_PROFILING_N_READ_TASKS} ")

		set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_OPENCL_GPU_PROFILING_N_WRITE_TASKS_=${OPENCL_GPU_PROFILING_N_WRITE_TASKS} ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_OPENCL_GPU_PROFILING_N_WRITE_TASKS_=${OPENCL_GPU_PROFILING_N_WRITE_TASKS} ")
		set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_OPENCL_GPU_PROFILING_N_WRITE_TASKS_=${OPENCL_GPU_PROFILING_N_WRITE_TASKS} ")

		set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_OPENCL_GPU_PROFILING_N_KERNEL_TASKS_=${OPENCL_GPU_PROFILING_N_KERNEL_TASKS} ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_OPENCL_GPU_PROFILING_N_KERNEL_TASKS_=${OPENCL_GPU_PROFILING_N_KERNEL_TASKS} ")
		set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_OPENCL_GPU_PROFILING_N_KERNEL_TASKS_=${OPENCL_GPU_PROFILING_N_KERNEL_TASKS} ")

		if (OPENCL_GPU_PROFILING_VERBOSE)
			set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_OPENCL_GPU_PROFILING_VERBOSE_ ")
			set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_OPENCL_GPU_PROFILING_VERBOSE_ ")
			set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_OPENCL_GPU_PROFILING_VERBOSE_ ")
		endif (OPENCL_GPU_PROFILING_VERBOSE)
	endif (OPENCL_GPU_PROFILING)

	if (SUPPORT_OPENCL_GPU_AMD)
		set(OPENCL_LIB_DIRS ${OPENCL_LIB_DIRS} /opt/rocm/opencl/lib)
		set(CTRL_INCLUDE_DIRS ${CTRL_INCLUDE_DIRS} /opt/rocm/opencl/include)
		set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_OPENCL_BLOCKING_MOVES_ ")
		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_OPENCL_BLOCKING_MOVES_ ")
		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_OPENCL_BLOCKING_MOVES_ ")
		string(ASCII 27 Esc)
	else (SUPPORT_OPENCL_GPU_AMD)
		set(OPENCL_LIB_DIRS ${OPENCL_LIB_DIRS} /usr/local/cuda/lib64)
		set(CTRL_INCLUDE_DIRS ${CTRL_INCLUDE_DIRS} /usr/local/cuda/include/)
	endif (SUPPORT_OPENCL_GPU_AMD)
	
	find_library(OPENCLLIB OpenCL HINTS ${OPENCL_LIB_DIRS})
	
	set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_ARCH_OPENCL_GPU_ ")
	set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_ARCH_OPENCL_GPU_ ")
	set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_ARCH_OPENCL_GPU_ ")

	# set(CTRL_INCLUDE_DIRS ${CTRL_INCLUDE_DIRS} /usr/include/)
	set(CTRL_SOURCES ${CTRL_SOURCES} src/Architectures/OpenCL/Ctrl_OpenCL_Gpu.c)
	set(CTRL_LIBS ${CTRL_LIBS} ${OPENCLLIB})
endif (SUPPORT_OPENCL_GPU)


if (SUPPORT_FPGA)
	if (OPENCL_GPU_ERROR_CHECK)
		set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_OPENCL_GPU_ERROR_CHECK_ ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_OPENCL_GPU_ERROR_CHECK_ ")
		set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_OPENCL_GPU_ERROR_CHECK_ ")
	endif (OPENCL_GPU_ERROR_CHECK)

	if (OPENCL_GPU_PERFORMANCE)
		set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_OPENCL_GPU_PERFORMANCE_ ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_OPENCL_GPU_PERFORMANCE_ ")
		set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_OPENCL_GPU_PERFORMANCE_ ")
	endif (OPENCL_GPU_PERFORMANCE)

	if (OPENCL_GPU_DEBUG)
		set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_OPENCL_GPU_DEBUG_ ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_OPENCL_GPU_DEBUG_ ")
		set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_OPENCL_GPU_DEBUG_ ")
	endif (OPENCL_GPU_DEBUG)

	if (OPENCL_GPU_TEST_OUTPUT)
		set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_OPENCL_GPU_TEST_OUTPUT_ ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_OPENCL_GPU_TEST_OUTPUT_ ")
		set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_OPENCL_GPU_TEST_OUTPUT_ ")
	endif (OPENCL_GPU_TEST_OUTPUT)

	if (OPENCL_GPU_PROFILING)
		set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_OPENCL_GPU_PROFILING_ ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_OPENCL_GPU_PROFILING_ ")
		set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_OPENCL_GPU_PROFILING_ ")

		set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_OPENCL_GPU_PROFILING_N_READ_TASKS_=${OPENCL_GPU_PROFILING_N_READ_TASKS} ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_OPENCL_GPU_PROFILING_N_READ_TASKS_=${OPENCL_GPU_PROFILING_N_READ_TASKS} ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_OPENCL_GPU_PROFILING_N_READ_TASKS_=${OPENCL_GPU_PROFILING_N_READ_TASKS} ")

		set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_OPENCL_GPU_PROFILING_N_WRITE_TASKS_=${OPENCL_GPU_PROFILING_N_WRITE_TASKS} ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_OPENCL_GPU_PROFILING_N_WRITE_TASKS_=${OPENCL_GPU_PROFILING_N_WRITE_TASKS} ")
		set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_OPENCL_GPU_PROFILING_N_WRITE_TASKS_=${OPENCL_GPU_PROFILING_N_WRITE_TASKS} ")

		set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_OPENCL_GPU_PROFILING_N_KERNEL_TASKS_=${OPENCL_GPU_PROFILING_N_KERNEL_TASKS} ")
		set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_OPENCL_GPU_PROFILING_N_KERNEL_TASKS_=${OPENCL_GPU_PROFILING_N_KERNEL_TASKS} ")
		set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_OPENCL_GPU_PROFILING_N_KERNEL_TASKS_=${OPENCL_GPU_PROFILING_N_KERNEL_TASKS} ")

		if (OPENCL_GPU_PROFILING_VERBOSE)
			set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_OPENCL_GPU_PROFILING_VERBOSE_ ")
			set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_OPENCL_GPU_PROFILING_VERBOSE_ ")
			set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_OPENCL_GPU_PROFILING_VERBOSE_ ")
		endif (OPENCL_GPU_PROFILING_VERBOSE)
	endif (OPENCL_GPU_PROFILING)

	set(OPENCL_LIB_DIRS ${OPENCL_LIB_DIRS} /opt/intel/oneapi/compiler/latest/linux/lib)
	set(CTRL_INCLUDE_DIRS ${CTRL_INCLUDE_DIRS} /opt/intel/oneapi/compiler/latest/linux/include/sycl)

	find_library(OPENCLLIB OpenCL HINTS ${OPENCL_LIB_DIRS})
	
	set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_ARCH_FPGA_ ")
	set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_ARCH_FPGA_ ")
	set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_ARCH_FPGA_ ")

	set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -DCTRL_HOST_COMPILE ")
	set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DCTRL_HOST_COMPILE ")
	set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DCTRL_HOST_COMPILE ")

	# set(CTRL_INCLUDE_DIRS ${CTRL_INCLUDE_DIRS} /usr/include/)
	set(CTRL_SOURCES ${CTRL_SOURCES} src/Architectures/FPGA/Ctrl_FPGA.c)
	set(CTRL_LIBS ${CTRL_LIBS} ${OPENCLLIB})
endif (SUPPORT_FPGA)


# Support for CUDA
if (SUPPORT_CUDA)
	if (CUDA_ERROR_CHECK)
		set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_CUDA_ERROR_CHECK_ ")
		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_CUDA_ERROR_CHECK_ ")
		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_CUDA_ERROR_CHECK_ ")
	endif (CUDA_ERROR_CHECK)

	if (CUDA_DEBUG)
		set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_CUDA_DEBUG_ ")
		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_CUDA_DEBUG_ ")
		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_CUDA_DEBUG_ ")
	endif (CUDA_DEBUG)

	if (CUDA_EVENT_DEBUG)
		set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_CUDA_EVENT_DEBUG_ ")
		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_CUDA_EVENT_DEBUG_ ")
		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_CUDA_EVENT_DEBUG_ ")
	endif (CUDA_EVENT_DEBUG)

	set (CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_ARCH_CUDA_")
	set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_ARCH_CUDA_")
	set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_ARCH_CUDA_")
	set (NVCC_FLAGS "-lcuda")

	set(CTRL_INCLUDE_DIRS ${CTRL_INCLUDE_DIRS} /usr/local/cuda/samples/common/inc)
	set(CTRL_INCLUDE_DIRS ${CTRL_INCLUDE_DIRS} ${CUDAToolkit_INCLUDE_DIRS})
	
	set(CTRL_SOURCES ${CTRL_SOURCES} src/Architectures/Cuda/Ctrl_Cuda.c)
	set(CTRL_LIBS ${CTRL_LIBS} CUDA::cudart)

	# CUBLAS support
	if (CUBLAS)
		set(CTRL_LIBS ${CTRL_LIBS} CUDA::cublas)
		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_CUBLAS_ ")
	endif (CUBLAS)

	# Magma support
	if (MAGMA)
		#TODO @sergioalo move magma lib to a common dir
		set(MAGMA_ROOT /frontend/sergioalo/magma-2.6.0-gcc-10.3-mkl-2021.2.0-cuda-11.3)
		set(CTRL_INCLUDE_DIRS ${CTRL_INCLUDE_DIRS} ${MAGMA_ROOT}/include)
		set(CTRL_LIBS ${CTRL_LIBS} ${MAGMA_ROOT}/lib/libmagma.so)
		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_MAGMA_ -DADD_ ")
	endif (MAGMA)
endif (SUPPORT_CUDA)

# Support for HIP
if (SUPPORT_HIP)

	if (HIP_ERROR_CHECK)
		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_HIP_ERROR_CHECK_ ")
		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_HIP_ERROR_CHECK_ ")
		set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_HIP_ERROR_CHECK_ ")
	endif (HIP_ERROR_CHECK)

	if (HIP_DEBUG)
		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_HIP_DEBUG_ ")
		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_HIP_DEBUG_ ")
		set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_HIP_DEBUG_ ")
	endif (HIP_DEBUG)

	if (HIP_EVENT_DEBUG)
		set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_HIP_EVENT_DEBUG_ ")
		set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_HIP_EVENT_DEBUG_ ")
		set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -D_CTRL_HIP_EVENT_DEBUG_ ")
	endif (HIP_EVENT_DEBUG)

	set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_CTRL_ARCH_HIP_")
	set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CTRL_ARCH_HIP_")

	set(HIPCC_FLAGS "-lhip_runtime")

	set(CTRL_INCLUDE_DIRS ${CTRL_INCLUDE_DIRS} /opt/rocm/hip/include)
	
	set(CTRL_SOURCES ${CTRL_SOURCES} src/Architectures/Hip/Ctrl_Hip.c)
	set(CTRL_LIBS ${CTRL_LIBS} hip::host)

endif (SUPPORT_HIP)

if (CTRL_CMAKE_VERBOSE_CTRL)
	message(STATUS "CTRL_CPU = ${SUPPORT_CPU}")
	message(STATUS "CTRL_CUDA = ${SUPPORT_CUDA}")
	message(STATUS "CTRL_HIP = ${SUPPORT_HIP}")
	message(STATUS "CTRL_OPENCL_GPU = ${SUPPORT_OPENCL_GPU}")
	message(STATUS "CTRL_FPGA = ${SUPPORT_FPGA}")
	message(STATUS "CTRL_C vars = ${CMAKE_C_FLAGS}")
	message(STATUS "CTRL_CUDA vars = ${CMAKE_CUDA_FLAGS}")
	message(STATUS "CTRL_HIP vars = ${CMAKE_HIP_FLAGS}")
	message(STATUS "CTRL_HEADERS = ${CTRL_HEADERS}")
	message(STATUS "CTRL_INCLUDE DIRS = ${CTRL_INCLUDE_DIRS}")
	message(STATUS "CTRL_SOURCES = ${CTRL_SOURCES}")
	message(STATUS "CTRL_LIBS = ${CTRL_LIBS}")
endif(CTRL_CMAKE_VERBOSE_CTRL)

# Include all directories
include_directories(${CTRL_INCLUDE_DIRS})

# Build the library
add_library(Ctrl SHARED ${CTRL_SOURCES})
target_link_libraries(Ctrl ${CTRL_LIBS})
set_target_properties(Ctrl PROPERTIES VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_REVISION} SOVERSION ${VERSION_MAJOR})

# Update parent vars
set(CTRL_LIBS ${CTRL_LIBS} PARENT_SCOPE)
set(CTRL_INCLUDE_DIRS ${CTRL_INCLUDE_DIRS} PARENT_SCOPE)
set(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} PARENT_SCOPE)
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} PARENT_SCOPE)
set(CMAKE_CUDA_FLAGS ${CMAKE_CUDA_FLAGS} PARENT_SCOPE)
