# -----------------------------------------------------------------------------------------------------------
# Copyright (c) 2025 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.
# -----------------------------------------------------------------------------------------------------------

# 定义 hccl_alg 链接库,在 host 侧使用
add_library(hccl_alg SHARED)

# 宏定义
target_compile_definitions(hccl_alg PRIVATE
    $<$<STREQUAL:${PRODUCT_SIDE},host>:_GLIBCXX_USE_CXX11_ABI=0>
)

# 编译选项
target_compile_options(hccl_alg PRIVATE
    -Werror
    -fno-common
    -fno-strict-aliasing
    -pipe
    -O3
    -std=c++17
    -fstack-protector-all
    $<$<CONFIG:Debug>:-g>
)

# 链接选项
target_link_options(hccl_alg PRIVATE
    -Wl,-z,relro
    -Wl,-z,now
    -Wl,-z,noexecstack
    -s
)

# 头文件搜索路径
target_include_directories(hccl_alg PRIVATE
    ${CMAKE_CURRENT_SOURCE_DIR}/base/inc
    ${CMAKE_CURRENT_SOURCE_DIR}/base/alg_aiv_template
    ${CMAKE_CURRENT_SOURCE_DIR}/base/alg_template
    ${CMAKE_CURRENT_SOURCE_DIR}/base/alg_template/component/
    ${CMAKE_CURRENT_SOURCE_DIR}/base/alg_template/temp_all_gather
    ${CMAKE_CURRENT_SOURCE_DIR}/base/alg_template/temp_all_reduce
    ${CMAKE_CURRENT_SOURCE_DIR}/base/alg_template/temp_alltoall
    ${CMAKE_CURRENT_SOURCE_DIR}/base/alg_template/temp_alltoallv
    ${CMAKE_CURRENT_SOURCE_DIR}/base/alg_template/temp_broadcast
    ${CMAKE_CURRENT_SOURCE_DIR}/base/alg_template/temp_reduce
    ${CMAKE_CURRENT_SOURCE_DIR}/base/alg_template/temp_reduce_scatter
    ${CMAKE_CURRENT_SOURCE_DIR}/base/alg_template/temp_scatter
    ${CMAKE_CURRENT_SOURCE_DIR}/base/mc2_handler
    ${CMAKE_CURRENT_SOURCE_DIR}/base/communicator
    ${CMAKE_CURRENT_SOURCE_DIR}/base/communicator/legacy
    ${CMAKE_CURRENT_SOURCE_DIR}/impl
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/inc
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/legacy
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/legacy/operator
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/resource_manager
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/task
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/operator
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/operator/registry
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor/registry
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor/coll_send_receive
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor/coll_all_reduce
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor/coll_all_reduce/310P
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor/coll_all_to_all
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor/coll_all_gather
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor/coll_all_gather/310P
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor/coll_all_gather_v
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor/coll_all_gather_v/310P
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor/coll_reduce_scatter
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor/coll_reduce_scatter/310P
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor/coll_reduce_scatter_v
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor/coll_reduce_scatter_v/310P
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor/coll_scatter
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor/coll_broadcast
    ${CMAKE_CURRENT_SOURCE_DIR}/impl/coll_executor/coll_broadcast/310P
    ${CMAKE_CURRENT_SOURCE_DIR}/pub_inc
    ${CMAKE_CURRENT_SOURCE_DIR}/../common/health
    ${CMAKE_CURRENT_SOURCE_DIR}/../common/debug/profiling/inc
    ${CMAKE_CURRENT_SOURCE_DIR}/../common/debug/profiling/inc/host
    ${CMAKE_CURRENT_SOURCE_DIR}/../common/debug/config
    ${CMAKE_CURRENT_SOURCE_DIR}/../common/stream/
    ${CMAKE_CURRENT_SOURCE_DIR}/../common/launch_device

    ${HCOMM_DIR}/include
    ${HCOMM_DIR}/include/hccl
    ${HCOMM_DIR}/pkg_inc
    ${HCOMM_DIR}/pkg_inc/hccl

    # pub_inc (legacy/ascend910)
    ${HCOMM_DIR}/src/legacy/ascend910/pub_inc

    # framework (legacy/ascend910)
    ${HCOMM_DIR}/src/legacy/ascend910/pub_inc/new
    ${HCOMM_DIR}/src/legacy/ascend910/common/error_manager
    ${HCOMM_DIR}/src/legacy/ascend910/framework/common/src/config
    ${HCOMM_DIR}/src/legacy/ascend910/framework/inc/
    ${HCOMM_DIR}/src/legacy/ascend910/framework/common/src/config

    # platform (legacy/ascend910)
    ${HCOMM_DIR}/src/legacy/ascend910/platform/task/
    ${HCOMM_DIR}/src/legacy/ascend910/platform/inc/adapter/
    ${HCOMM_DIR}/src/legacy/ascend910/platform/common/

    # hccp (base_comm/resources)
    ${HCOMM_DIR}/src/base_comm/resources/hccp/inc/network/
    ${HCOMM_DIR}/src/base_comm/resources/hccp/inc/

    # common
    ${HCOMM_DIR}/src/legacy/ascend910/common/launch_aicpu
)

if(BUILD_OPEN_PROJECT)
    target_compile_definitions(hccl_alg PRIVATE
        OPEN_BUILD_PROJECT
        LOG_CPP
    )

    target_link_libraries(hccl_alg PRIVATE
        $<BUILD_INTERFACE:acl_rt_headers>
        $<BUILD_INTERFACE:ascend_hal_headers>
        $<BUILD_INTERFACE:atrace_headers>
        $<BUILD_INTERFACE:mmpa_headers>
        $<BUILD_INTERFACE:runtime_headers>
        $<BUILD_INTERFACE:rdma_core_headers>
        -Wl,--no-as-needed
        c_sec
        unified_dlog
        mmpa
        -Wl,--no-as-needed
        hccl_plf
    )
else()
    target_include_directories(hccl_alg PRIVATE
        ${TOP_DIR}/abl/msprof/inc
        ${TOP_DIR}/ace/npuruntime/inc
        ${TOP_DIR}/metadef/pkg_inc
        ${TOP_DIR}/metadef/inc/external/
	    ${TOP_DIR}/metadef/pkg_inc
        ${TOP_DIR}/ace/npuruntime/inc/runtime
        ${TOP_DIR}/open_source/json/include
        ${TOP_DIR}/runtime/include/external
    )

    target_link_libraries(hccl_alg PRIVATE
        -Wl,--no-as-needed
        c_sec
        unified_dlog
        mmpa
        -Wl,--no-as-needed
        hccl_plf
        ofed_headers
    )

    install_package(
        PACKAGE hccl
        TARGETS hccl_alg
    )
endif()

install(TARGETS hccl_alg
    LIBRARY DESTINATION ${INSTALL_LIBRARY_DIR} ${INSTALL_OPTIONAL}
    COMPONENT hcomm
)