# ------------------------------------------------------------------------------------------------------------
# Copyright (c) 2026 Huawei Technologies Co., Ltd.
# This program is free software, you can redistribute it and/or modify it under the terms and conditions of
# CANN Open Software License Agreement Version 2.0 (the "License").
# Please refer to the License for details. You may not use this file except in compliance with the License.
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
# INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
# See LICENSE in the root of the software repository for the full text of the License.
# ------------------------------------------------------------------------------------------------------------
include_guard(GLOBAL)
include(ExternalProject)
unset(rdma_core_FOUND CACHE)
unset(RDMA_CORE_INCLUDE CACHE)

if(POLICY CMP0135)
    cmake_policy(SET CMP0135 NEW)
endif()

if(PRODUCT_SIDE STREQUAL "device")
    set(RDMA_CORE_SRC_DIR ${CANN_3RD_LIB_PATH}/lib_cache/device/rdma_core_src)
    set(RDMA_CORE_BUILD_DIR ${CANN_3RD_LIB_PATH}/lib_cache/device/rdma_core_build)
    set(RDMA_CORE_PKG_DIR ${CANN_3RD_LIB_PATH}/pkg/device)
else()
    set(RDMA_CORE_SRC_DIR ${CANN_3RD_LIB_PATH}/lib_cache/rdma_core_src)
    set(RDMA_CORE_BUILD_DIR ${CANN_3RD_LIB_PATH}/lib_cache/rdma_core_build)
    set(RDMA_CORE_PKG_DIR ${CANN_3RD_LIB_PATH}/pkg)
endif()


# 查找目录下是否已经安装,避免重复编译安装
find_path(RDMA_CORE_INCLUDE
    NAMES rdma/rdma_user_cm.h
    PATH_SUFFIXES include
    PATHS ${RDMA_CORE_BUILD_DIR}
    NO_DEFAULT_PATH
)

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(rdma_core
    FOUND_VAR
        rdma_core_FOUND
    REQUIRED_VARS
        RDMA_CORE_INCLUDE
)

set(RDMA_CORE_FILE "rdma-core-42.7.tar.gz")
set(RDMA_CORE_PATCH_FILE "rdma-core-42.7.patch")
set(RDMA_CORE_URL "https://cann-3rd.obs.cn-north-4.myhuaweicloud.com/rdma-core/${RDMA_CORE_FILE}")
set(RDMA_CORE_PATCH_URL "https://cann-3rd.obs.cn-north-4.myhuaweicloud.com/rdma-core/${RDMA_CORE_PATCH_FILE}")

add_library(rdma_core_headers INTERFACE)

if(rdma_core_FOUND AND NOT FORCE_REBUILD_CANN_3RD)
    set(RDMA_CORE_INCLUDE_DIR "${RDMA_CORE_INCLUDE}")
    message(STATUS "[ThirdPartyLib][rdma-core] rdma-core found in ${RDMA_CORE_BUILD_PATH}, and not force rebuild cann third_party")
else()
    if(EXISTS "${RDMA_CORE_PKG_DIR}/${RDMA_CORE_PATCH_FILE}")
        set(RDMA_CORE_PATCH "${RDMA_CORE_PKG_DIR}/${RDMA_CORE_PATCH_FILE}")
    elseif(EXISTS "${CANN_3RD_LIB_PATH}/${RDMA_CORE_PATCH_FILE}")
        set(RDMA_CORE_PATCH "${CANN_3RD_LIB_PATH}/${RDMA_CORE_PATCH_FILE}")
    elseif(EXISTS "${CANN_3RD_LIB_PATH}/rdma-core/${RDMA_CORE_PATCH_FILE}")
        set(RDMA_CORE_PATCH "${CANN_3RD_LIB_PATH}/rdma-core/${RDMA_CORE_PATCH_FILE}")
    else()
        set(RDMA_CORE_PATCH_PROJECT_URL "${RDMA_CORE_PATCH_URL}")
    endif()

    if(RDMA_CORE_PATCH_PROJECT_URL)
 	    ExternalProject_Add(rdma_core_patch
            URL ${RDMA_CORE_PATCH_PROJECT_URL}
 	        URL_HASH SHA256=54ca56b3b68bc465a78dd5839cd7110610745c7152a1dc3a72b265deeebb905f
 	        DOWNLOAD_DIR ${RDMA_CORE_PKG_DIR}
 	        UPDATE_COMMAND ""
 	        CONFIGURE_COMMAND ""
 	        BUILD_COMMAND ""
 	        INSTALL_COMMAND ""
 	        DOWNLOAD_NO_EXTRACT TRUE
 	        DOWNLOAD_NO_PROGRESS TRUE
 	        EXCLUDE_FROM_ALL TRUE
 	    )
        set(RDMA_CORE_PATCH "${RDMA_CORE_PKG_DIR}/${RDMA_CORE_PATCH_FILE}")
    else()
        add_custom_target(rdma_core_patch)
    endif()

    if(EXISTS "${CANN_3RD_LIB_PATH}/rdma-core/CMakeLists.txt")
        set(RDMA_CORE_SRC_DIR ${CANN_3RD_LIB_PATH}/rdma-core)
        message(STATUS "[ThirdPartyLib][rdma-core] use local rdma-core cache ${RDMA_CORE_SRC_DIR}.")
    elseif(EXISTS "${CANN_3RD_LIB_PATH}/${RDMA_CORE_FILE}")
        set(RDMA_CORE_PROJECT_URL "${CANN_3RD_LIB_PATH}/${RDMA_CORE_FILE}")
        message(STATUS "[ThirdPartyLib][rdma-core] use local rdma-core cache ${RDMA_CORE_PROJECT_URL}.")
    elseif(EXISTS "${CANN_3RD_LIB_PATH}/rdma-core/${RDMA_CORE_FILE}")
        set(RDMA_CORE_PROJECT_URL "${CANN_3RD_LIB_PATH}/rdma-core/${RDMA_CORE_FILE}")
        message(STATUS "[ThirdPartyLib][rdma-core] pipeline use rdma-core cache ${RDMA_CORE_PROJECT_URL}.")
    else()
        set(RDMA_CORE_PROJECT_URL "${RDMA_CORE_URL}")
        message(STATUS "[ThirdPartyLib][rdma-core] not use cache, download rdma-core ${RDMA_CORE_URL}.")
    endif()

    if(RDMA_CORE_PROJECT_URL)
        ExternalProject_Add(rdma_core_src
            URL ${RDMA_CORE_PROJECT_URL}
            URL_HASH SHA256=aa935de1fcd07c42f7237b0284b5697b1ace2a64f2bcfca3893185bc91b8c74d
            SOURCE_DIR ${RDMA_CORE_SRC_DIR}
            DOWNLOAD_DIR ${RDMA_CORE_PKG_DIR}
            PATCH_COMMAND patch -p1 -i "${RDMA_CORE_PATCH}"
            CONFIGURE_COMMAND ""
            BUILD_COMMAND ""
            INSTALL_COMMAND ""
            DOWNLOAD_NO_PROGRESS TRUE
            EXCLUDE_FROM_ALL TRUE
            DEPENDS rdma_core_patch
        )
    else()
        add_custom_target(rdma_core_src)
    endif()

    ExternalProject_Add(rdma_core_build
        SOURCE_DIR ${RDMA_CORE_SRC_DIR}
        BINARY_DIR ${RDMA_CORE_BUILD_DIR}
        DOWNLOAD_COMMAND ""
        CONFIGURE_COMMAND ${CMAKE_COMMAND}
            -DNO_MAN_PAGES=1
            -DENABLE_RESOLVE_NEIGH=0
            -DCMAKE_SKIP_RPATH=True
            -DNO_PYVERBS=1
            <SOURCE_DIR>
        BUILD_COMMAND $(MAKE) kern-abi
        INSTALL_COMMAND ""
        EXCLUDE_FROM_ALL TRUE
        DEPENDS rdma_core_src
    )

    set(RDMA_CORE_INCLUDE_DIR "${RDMA_CORE_BUILD_DIR}/include")
    add_dependencies(rdma_core_headers rdma_core_build)
endif()

target_include_directories(rdma_core_headers INTERFACE
    ${RDMA_CORE_INCLUDE_DIR}
)