cmake_minimum_required(VERSION 3.21)

set(VERSION_STRING "0.1.1")

project(hipthreads VERSION ${VERSION_STRING} LANGUAGES CXX HIP)

if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Release)
endif()

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED True)

if(NOT WIN32)
  add_compile_options("-Wno-error=#warnings")
  set(CMAKE_EXE_LINKER_FLAGS_INIT "-fuse-ld=lld")
  set(CMAKE_MODULE_LINKER_FLAGS_INIT "-fuse-ld=lld")
  set(CMAKE_SHARED_LINKER_FLAGS_INIT "-fuse-ld=lld")
else()
  set(CMAKE_CXX_USING_LINKER_DEFAULT "-fuse-ld=lld")
  set(CMAKE_CXX_USING_LINKER_LLD "-fuse-ld=lld")
  set(CMAKE_HIP_USING_LINKER_DEFAULT "-fuse-ld=lld")
  set(CMAKE_HIP_USING_LINKER_LLD "-fuse-ld=lld")
endif()

list(APPEND CMAKE_PREFIX_PATH $ENV{ROCM_PATH} /opt/rocm)

find_package(hip REQUIRED)
find_package(libhipcxx REQUIRED)

# # Used for automatic generation of LLVM IR (by dissasembling bitcode generated during compilation from the "-save-temps" option)
# find_program(LLVM_DIS llvm-dis REQUIRED HINTS /opt/rocm/llvm/bin)

include(GNUInstallDirs)

# ON: copy the source tree into the build folder. The TheRock tester needs this
# so it can run the lit suite against the packaged build artifact (lit compiles
# the test sources on the tester, so they must be present in the artifact). Set
# by TheRock's build recipe; OFF for normal local/CI builds.
option(HIPTHREADS_COPY_TO_BUILD
  "Copy source tree into build folder (set by TheRock; required for the tester pipeline)." OFF)

if(HIPTHREADS_COPY_TO_BUILD)
  file(COPY "${CMAKE_CURRENT_SOURCE_DIR}" DESTINATION "${CMAKE_CURRENT_BINARY_DIR}")
endif()

add_subdirectory(src)
if (CMAKE_BUILD_TYPE MATCHES Debug)
  add_subdirectory(test)
endif()
 
#-----------------------------------------------------------------------------
# Installation and Packaging Rules
#-----------------------------------------------------------------------------
include(CMakePackageConfigHelpers)

if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
  if(DEFINED ENV{ROCM_PATH})
    set(CMAKE_INSTALL_PREFIX "$ENV{ROCM_PATH}" CACHE PATH "Install path prefix" FORCE)
  else()
    set(CMAKE_INSTALL_PREFIX "/opt/rocm" CACHE PATH "Install path prefix" FORCE)
  endif()
endif()

install(DIRECTORY ${CMAKE_SOURCE_DIR}/inc/hip/
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/hipthreads/hip
)

install(TARGETS hipthreads
    EXPORT hipthreadsTargets
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/hipthreads
)

set(CMAKECONFIG_INSTALL_DIR ${CMAKE_INSTALL_LIBDIR}/cmake/hipthreads)

install(EXPORT hipthreadsTargets
    FILE hipthreadsTargets.cmake
    NAMESPACE hipthreads::
    DESTINATION ${CMAKECONFIG_INSTALL_DIR}
)

configure_package_config_file(
    "cmake/hipthreadsConfig.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/hipthreadsConfig.cmake"
    INSTALL_DESTINATION ${CMAKECONFIG_INSTALL_DIR}
)

install(FILES
    "${CMAKE_CURRENT_BINARY_DIR}/hipthreadsConfig.cmake"
    DESTINATION ${CMAKECONFIG_INSTALL_DIR}
)

# TEMP: until libhipcxx resolves this
target_compile_definitions(hipthreads PUBLIC _LIBCUDACXX_ALLOW_UNSUPPORTED_ARCHITECTURE)
