cmake_minimum_required(VERSION 3.10)
project(StackDetectorPlugin)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# Пути к x64dbg и его SDK (относительные пути к локальной копии)
set(X64DBG_SDK "${CMAKE_CURRENT_SOURCE_DIR}/../pluginsdk")
set(X64DBG_ROOT "C:/Users/user/Downloads/snapshot_2024-07-28_17-00")

# Настройка выходных путей для плагина
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
    set(PLUGIN_ARCH "x64")
    set(PLUGIN_NAME "StackDetector_x64.dp64")
    set(BRIDGE_LIB "${X64DBG_SDK}/x64bridge.lib")
    set(DBG_LIB "${X64DBG_SDK}/x64dbg.lib")
    set(PLUGIN_INSTALL_DIR "${X64DBG_ROOT}/release/x64/plugins")
else()
    set(PLUGIN_ARCH "x32")
    set(PLUGIN_NAME "StackDetector_x32.dp32")
    set(BRIDGE_LIB "${X64DBG_SDK}/x32bridge.lib")
    set(DBG_LIB "${X64DBG_SDK}/x32dbg.lib")
    set(PLUGIN_INSTALL_DIR "${X64DBG_ROOT}/release/x32/plugins")
endif()

# Добавляем исходные файлы плагина
add_library(${PROJECT_NAME} SHARED
    plugin.cpp
    plugin.h
    stack_detector.cpp
    stack_detector.h
)

# Включаем директории SDK (используем SYSTEM для системных заголовков)
target_include_directories(${PROJECT_NAME} SYSTEM PRIVATE
    "${X64DBG_SDK}"
)

# Определения для компиляции
target_compile_definitions(${PROJECT_NAME} PRIVATE
    _WINDOWS
    _USRDLL
    _CRT_SECURE_NO_WARNINGS
    NOMINMAX
    WIN32_LEAN_AND_MEAN
)

# Линкуем необходимые библиотеки
target_link_libraries(${PROJECT_NAME} PRIVATE
    ${BRIDGE_LIB}
    ${DBG_LIB}
)

# Устанавливаем имя выходного файла
set_target_properties(${PROJECT_NAME} PROPERTIES
    OUTPUT_NAME "StackDetector"
    PREFIX ""
    SUFFIX ${CMAKE_SHARED_LIBRARY_SUFFIX}
)

# Копируем плагин в папку x64dbg после сборки
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E make_directory "${PLUGIN_INSTALL_DIR}"
    COMMAND ${CMAKE_COMMAND} -E copy $<TARGET_FILE:${PROJECT_NAME}> "${PLUGIN_INSTALL_DIR}/${PLUGIN_NAME}"
    COMMAND ${CMAKE_COMMAND} -E echo "Plugin copied to: ${PLUGIN_INSTALL_DIR}/${PLUGIN_NAME}"
    COMMENT "Installing plugin..."
)

# Копируем необходимые DLL из SDK (если они есть)
if(EXISTS "${X64DBG_SDK}/TitanEngine/${PLUGIN_ARCH}/TitanEngine.dll")
    add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
        COMMAND ${CMAKE_COMMAND} -E copy
            "${X64DBG_SDK}/TitanEngine/${PLUGIN_ARCH}/TitanEngine.dll"
            "${PLUGIN_INSTALL_DIR}"
        COMMAND ${CMAKE_COMMAND} -E echo "TitanEngine.dll copied to: ${PLUGIN_INSTALL_DIR}/TitanEngine.dll"
        COMMENT "Copying TitanEngine.dll..."
    )
endif()

# Проверяем и копируем другие зависимости
foreach(DEP_DLL
    "dbghelp.dll"
    "DeviceNameResolver.dll"
    "lz4.dll"
    "XEDParse.dll"
)
    if(EXISTS "${X64DBG_SDK}/${PLUGIN_ARCH}/${DEP_DLL}")
        add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
            COMMAND ${CMAKE_COMMAND} -E copy
                "${X64DBG_SDK}/${PLUGIN_ARCH}/${DEP_DLL}"
                "${PLUGIN_INSTALL_DIR}"
            COMMAND ${CMAKE_COMMAND} -E echo "${DEP_DLL} copied to: ${PLUGIN_INSTALL_DIR}/${DEP_DLL}"
            COMMENT "Copying ${DEP_DLL}..."
        )
    endif()
endforeach()

# Добавляем сообщение о завершении установки
add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD
    COMMAND ${CMAKE_COMMAND} -E echo "----------------------------------------"
    COMMAND ${CMAKE_COMMAND} -E echo "Plugin installation completed!"
    COMMAND ${CMAKE_COMMAND} -E echo "Plugin directory: ${PLUGIN_INSTALL_DIR}"
    COMMAND ${CMAKE_COMMAND} -E echo "Plugin name: ${PLUGIN_NAME}"
    COMMAND ${CMAKE_COMMAND} -E echo "Architecture: ${PLUGIN_ARCH}"
    COMMAND ${CMAKE_COMMAND} -E echo "----------------------------------------"
)
