# Copyright 2023-2025 Alişah Özcan
# Licensed under the Apache License, Version 2.0, see LICENSE for details.
# SPDX-License-Identifier: Apache-2.0
# Developer: Alişah Özcan

cmake_minimum_required(VERSION 3.26)

if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES OR CMAKE_CUDA_ARCHITECTURES STREQUAL "")
    set(CMAKE_CUDA_ARCHITECTURES 80;86;89;90 CACHE STRING "CUDA GPU architectures" FORCE)
endif()

project(GPUFFT VERSION 1.0 LANGUAGES C CXX CUDA ASM)

if(NOT CMAKE_BUILD_TYPE OR CMAKE_BUILD_TYPE STREQUAL "")
  set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type (Debug or Release)" )
endif()
set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS Release Debug)
message(STATUS "Build GPUFFT version: ${PROJECT_VERSION}")
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")

set(BINARY_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/bin)

include(GNUInstallDirs)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CUDA_STANDARD 17)
set(CMAKE_CUDA_STANDARD_REQUIRED ON)

set(CMAKE_CXX_FLAGS_DEBUG   "${CMAKE_CXX_FLAGS_DEBUG} -g")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
set(CMAKE_CUDA_FLAGS_DEBUG   "${CMAKE_CUDA_FLAGS_DEBUG} -g")
set(CMAKE_CUDA_FLAGS_RELEASE "${CMAKE_CUDA_FLAGS_RELEASE} -O3")

find_package(CUDAToolkit REQUIRED)
message(STATUS "Setting CMAKE_CUDA_ARCHITECTURES to ${CMAKE_CUDA_ARCHITECTURES} for GPUFFT")

##################
# Export Library #
##################

set(RUNTIME_DESTINATION ${CMAKE_INSTALL_BINDIR})
set(LIBRARY_DESTINATION ${CMAKE_INSTALL_LIBDIR})
set(ARCHIVE_DESTINATION ${CMAKE_INSTALL_LIBDIR})
set(INCLUDES_DESTINATION ${CMAKE_INSTALL_INCLUDEDIR})
set(INCLUDES_INSTALL_DIR ${INCLUDES_DESTINATION}/GPUFFT-${PROJECT_VERSION})

set(GPUFFT_GENERATED_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated")
set(GPUFFT_VERSION_CONFIG "${GPUFFT_GENERATED_DIR}/${PROJECT_NAME}ConfigVersion.cmake")
set(GPUFFT_PROJECT_CONFIG "${GPUFFT_GENERATED_DIR}/${PROJECT_NAME}Config.cmake")
set(GPUFFT_TARGETS_EXPORT_NAME "${PROJECT_NAME}Targets")
set(GPUFFT_CONFIG_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}-${PROJECT_VERSION}")
set(GPUFFT_NAMESPACE "${PROJECT_NAME}::")

include(CMakePackageConfigHelpers)
write_basic_package_version_file(
    "${GPUFFT_VERSION_CONFIG}" VERSION ${PROJECT_VERSION} COMPATIBILITY SameMajorVersion
)
configure_file("${GPUFFT_SOURCE_DIR}/cmake/Config.cmake.in" "${GPUFFT_PROJECT_CONFIG}" @ONLY)

install(
    FILES "${GPUFFT_PROJECT_CONFIG}" "${GPUFFT_VERSION_CONFIG}"
    DESTINATION "${GPUFFT_CONFIG_INSTALL_DIR}")

install(
    EXPORT "${GPUFFT_TARGETS_EXPORT_NAME}"
    NAMESPACE "${GPUFFT_NAMESPACE}"
    DESTINATION "${GPUFFT_CONFIG_INSTALL_DIR}")

add_subdirectory(src)

############
# Examples #
############

option(GPUFFT_BUILD_EXAMPLES "Build GPU-FFT Examples" OFF)
message(STATUS "GPUFFT_BUILD_EXAMPLES: ${GPUFFT_BUILD_EXAMPLES}")
if(GPUFFT_BUILD_EXAMPLES)
    add_subdirectory(example)
endif()

##############
# BENCHMARKS #
##############

option(GPUFFT_BUILD_BENCHMARKS "Build GPU-FFT Benchmarks" OFF)
message(STATUS "GPUFFT_BUILD_BENCHMARKS: ${GPUFFT_BUILD_BENCHMARKS}")
if(GPUFFT_BUILD_BENCHMARKS)
    add_subdirectory(benchmark)
endif()
