cmake_minimum_required(VERSION 3.21)

project(
    radhook
    VERSION 1.1.0
    DESCRIPTION "cross-platform function hooking library"
    LANGUAGES CXX
)

option(BUILD_SHARED_LIBS "Build shared library" ON)
option(RADHOOK_BUILD_TESTS "Build radhook tests" ${PROJECT_IS_TOP_LEVEL})

if(RADHOOK_BUILD_TESTS)
    include(CTest)
    enable_testing()
    add_subdirectory(tests)
endif()

add_library(radhook
    src/radhook.cpp
)

target_include_directories(radhook
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
        $<INSTALL_INTERFACE:include>
)

target_compile_features(radhook PUBLIC cxx_std_20)

if(BUILD_SHARED_LIBS)
    target_compile_definitions(radhook PRIVATE RADHOOK_BUILD)
    target_compile_definitions(radhook INTERFACE RADHOOK_SHARED)
endif()

if(WIN32)
    target_compile_definitions(radhook PUBLIC RADIUM_PLATFORM_WINDOWS=1)
elseif(ANDROID)
    target_compile_definitions(radhook PUBLIC RADIUM_PLATFORM_ANDROID=1)
endif()

if(MSVC)
    target_compile_options(radhook PRIVATE
        /W4
        /permissive-
    )
else()
    target_compile_options(radhook PRIVATE
        -Wall
        -Wextra
        -Wpedantic
    )
endif()

target_compile_options(radhook PRIVATE
    $<$<CONFIG:Release>:
        $<$<CXX_COMPILER_ID:MSVC>:/O2 /GL>
        $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-O3 -fvisibility=hidden>
    >
)

target_link_options(radhook PRIVATE
    $<$<CONFIG:Release>:
        $<$<CXX_COMPILER_ID:MSVC>:/OPT:REF /OPT:ICF>
        $<$<NOT:$<CXX_COMPILER_ID:MSVC>>:-s>
    >
)

if(MSVC)
    target_sources(radhook PRIVATE resources/version.rc)
else()
    configure_file(cmake/watermark.cpp.i ${CMAKE_BINARY_DIR}/generated/watermark.cpp @ONLY)
    target_sources(radhook PRIVATE ${CMAKE_BINARY_DIR}/generated/watermark.cpp)
endif()

set_target_properties(radhook PROPERTIES
    CXX_VISIBILITY_PRESET hidden
    VISIBILITY_INLINES_HIDDEN YES
)

include(GNUInstallDirs)

install(TARGETS radhook
    EXPORT radhookTargets
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
)

install(
    DIRECTORY include/radhook
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
)

install(
    EXPORT radhookTargets
    FILE radhookTargets.cmake
    NAMESPACE Radium::
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/radhook
)

include(CMakePackageConfigHelpers)

configure_package_config_file(
    ${CMAKE_CURRENT_SOURCE_DIR}/cmake/radhookConfig.cmake.in
    ${CMAKE_CURRENT_BINARY_DIR}/radhookConfig.cmake
    INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/radhook
)

write_basic_package_version_file(
    ${CMAKE_CURRENT_BINARY_DIR}/radhookConfigVersion.cmake
    VERSION ${PROJECT_VERSION}
    COMPATIBILITY SameMajorVersion
)

install(
    FILES
        ${CMAKE_CURRENT_BINARY_DIR}/radhookConfig.cmake
        ${CMAKE_CURRENT_BINARY_DIR}/radhookConfigVersion.cmake
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/radhook
)