cmake_minimum_required(VERSION 3.14)
project(CycleszEngine VERSION 3.0.0 LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include_directories(include)

# Find Capstone Library
find_library(CAPSTONE_LIB capstone HINTS /opt/homebrew/lib /usr/local/lib)
find_path(CAPSTONE_INCLUDE capstone/capstone.h HINTS /opt/homebrew/include /usr/local/include)

if(CAPSTONE_LIB AND CAPSTONE_INCLUDE)
    message(STATUS "[+] Capstone Library Found: ${CAPSTONE_LIB}")
    include_directories(${CAPSTONE_INCLUDE})
    add_compile_definitions(CYCLESZ_USE_CAPSTONE)
else()
    message(WARNING "[-] Capstone Library not found. DiDecode fallback active.")
endif()

# Build Executables, Demos & Tests
add_executable(real_world_demo examples/real_world_demo.cpp)
add_executable(dbi_tracer_injector examples/dbi_tracer_injector.cpp)
add_executable(test_cyclesz tests/test_cyclesz.cpp)
add_executable(test_tcm_dye tests/test_tcm_dye.cpp)
add_executable(test_production_stack tests/test_production_stack.cpp)
add_executable(test_cyclesz_all tests/test_cyclesz_all.cpp)

enable_testing()
add_test(NAME test_cyclesz COMMAND test_cyclesz)
add_test(NAME test_tcm_dye COMMAND test_tcm_dye)
add_test(NAME test_production_stack COMMAND test_production_stack)
add_test(NAME test_cyclesz_all COMMAND test_cyclesz_all)

if(CAPSTONE_LIB)
    target_link_libraries(real_world_demo PRIVATE ${CAPSTONE_LIB})
    target_link_libraries(dbi_tracer_injector PRIVATE ${CAPSTONE_LIB})
    target_link_libraries(test_cyclesz_all PRIVATE ${CAPSTONE_LIB})
    add_executable(test_didecode tests/test_didecode.cpp)
    target_link_libraries(test_didecode PRIVATE ${CAPSTONE_LIB})
    add_test(NAME test_didecode COMMAND test_didecode)
endif()
