cmake_minimum_required(VERSION 3.19.3)
project(msprobe VERSION 1.0.0 LANGUAGES CXX C)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(ASCEND_TOOLKIT_PATH $ENV{ASCEND_TOOLKIT_HOME})

find_package(cpython MODULE REQUIRED)
find_package(openssl MODULE REQUIRED)
find_package(nlohmannjson MODULE REQUIRED)
find_package(protobuf MODULE REQUIRED)
find_package(re2 MODULE REQUIRED)

find_library(adump_server NAMES adump_server PATHS ${ASCEND_TOOLKIT_PATH}/lib64 REQUIRED)

if (DEFINED CANN_PATH AND NOT "${CANN_PATH}" STREQUAL "")
    file(GLOB_RECURSE DUMP_DATA_PROTOS "${CANN_PATH}/**/dump_data.proto")
    if (DUMP_DATA_PROTOS)
        list(GET DUMP_DATA_PROTOS 0 DUMP_DATA_PROTO)
        file(COPY "${DUMP_DATA_PROTO}" DESTINATION "${CMAKE_CURRENT_SOURCE_DIR}/third_party/ACL/AclDumpMsg.proto")
    else()
        message("Warning: File dump_data.proto not found.")
    endif()
endif()

set(PROTO_PATH ${CMAKE_CURRENT_SOURCE_DIR}/third_party/proto)
file(GLOB_RECURSE PROTO_SRC "*.proto")
compile_protobuf_file(
    ${PROTO_PATH}
    ${PROTO_SRC}
)

set(CMAKE_SKIP_RPATH TRUE)

add_library(_msprobe_c SHARED)

target_compile_options(_msprobe_c PRIVATE "-Wall")
target_compile_options(_msprobe_c PRIVATE "-fPIC")
target_compile_options(_msprobe_c PRIVATE "-fstack-protector-all")
target_compile_options(_msprobe_c PRIVATE "-ftrapv")
target_compile_options(_msprobe_c PRIVATE "-fstack-check")
target_compile_options(_msprobe_c PRIVATE "-D_FORTIFY_SOURCE=2")

target_link_options(_msprobe_c PRIVATE "-Wl,-z,relro")
target_link_options(_msprobe_c PRIVATE "-Wl,-z,now")
target_link_options(_msprobe_c PRIVATE "-Wl,-z,noexecstack")

target_link_libraries(_msprobe_c PRIVATE ${adump_server})
target_link_libraries(_msprobe_c PUBLIC dl)
target_link_libraries(_msprobe_c PUBLIC pthread)
target_link_libraries(_msprobe_c PUBLIC ${cpython_LIBRARIES})
target_link_libraries(_msprobe_c PUBLIC ${openssl_LIBRARIES})
target_link_libraries(_msprobe_c PUBLIC ${protobuf_LIBRARIES})
target_link_libraries(_msprobe_c PUBLIC ${re2_LIBRARIES})

if(DEFINED BUILD_TYPE AND "${BUILD_TYPE}" STREQUAL "debug")
    target_compile_options(_msprobe_c PRIVATE "-O0")
    target_compile_options(_msprobe_c PRIVATE "-g")
    target_compile_definitions(_msprobe_c PRIVATE __DEBUG__)
else()
    target_compile_options(_msprobe_c PRIVATE "-O2")
    target_link_options(_msprobe_c PRIVATE "-s")
endif()

target_include_directories(_msprobe_c PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})

file(GLOB_RECURSE SOURCES "*.cpp" "*.cc")
target_sources(_msprobe_c PRIVATE ${SOURCES})

set(MSPROBE_C_LIB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../python/msprobe/lib/)
install(TARGETS _msprobe_c LIBRARY DESTINATION ${MSPROBE_C_LIB_DIR})