# ----------------------------------------------------------------------------
# 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.
# ----------------------------------------------------------------------------

##############################################################################
# ops-tensor CMake 配置
##############################################################################

cmake_minimum_required(VERSION 3.16)

##############################################################################
# 一、基础配置
##############################################################################

# 项目声明
project(ops_tensor)

# 包含变量和版本配置
include(cmake/func.cmake)
include(cmake/variables.cmake)
include(${CMAKE_CURRENT_SOURCE_DIR}/version.cmake)

# 设置项目变量
set(OPS_TENSOR ops_tensor)
set(PROJECT_VERSION "1.0.0")

# 查找 ASC 编译器
find_package(ASC REQUIRED)
project(${OPS_TENSOR} VERSION ${PROJECT_VERSION} LANGUAGES ASC CXX)

##############################################################################
# 二、环境初始化(封装)
##############################################################################

include(cmake/init_env.cmake)
init_env()  # 发现算子

##############################################################################
# 三、核心构建流程
##############################################################################

# 3.1 编译测试(可选)
option(BUILD_TESTING "Build tests" OFF)

# 3.2 编译框架层(lib/ 目录)
add_subdirectory(lib)

# 3.3 创建 ops_tensor 动态库
add_library(${OPS_TENSOR} SHARED)

# 链接框架层 OBJECT 库和 CANN 依赖库
target_link_libraries(${OPS_TENSOR} PRIVATE ${OPS_TENSOR}_framework tiling_api ascendcl)

# 添加 CANN 库搜索路径(C++ 链接器需要显式指定)
target_link_directories(${OPS_TENSOR} PRIVATE ${ASCEND_HOME_PATH}/lib64)

# 设置库的版本属性
set_target_properties(${OPS_TENSOR} PROPERTIES
    VERSION ${PROJECT_VERSION}
    SOVERSION 1
    OUTPUT_NAME "cann_ops_tensor"  # 生成文件名:libcann_ops_tensor.so
)

# 设置公共包含目录
target_include_directories(${OPS_TENSOR} PUBLIC
    ${CMAKE_SOURCE_DIR}/include
    ${CMAKE_SOURCE_DIR}/src
    ${CMAKE_SOURCE_DIR}/lib
    ${ASCEND_HOME_PATH}/include               # acl.h 等核心头文件
    ${ASCEND_HOME_PATH}/include/op_common/
    ${ASCEND_HOME_PATH}/pkg_inc/op_common/    # ASCEND 公共操作
    ${ASCEND_HOME_PATH}/pkg_inc/base/         # ASCEND 基础类型
    ${ASCEND_HOME_PATH}/pkg_inc/              # ASCEND 头文件
)

target_compile_options(${OPS_TENSOR} PRIVATE
    $<$<COMPILE_LANGUAGE:ASC>:--npu-arch=${ASCEND_NPU_ARCH}>
)

# 3.4 编译算子层(src/ 目录)
# 注意:必须在创建 ${OPS_TENSOR} 之后,否则 register_operator() 无法添加源文件
add_subdirectory(src)

# 3.5 设置源文件语言属性
get_target_property(LIB_TARGET_SOURCE ${OPS_TENSOR} SOURCES)
set_source_files_properties(${LIB_TARGET_SOURCE} PROPERTIES LANGUAGE ASC)

# 3.6 编译测试
if(BUILD_TESTING)
    add_subdirectory(tests)
endif()

# 3.7 打包配置
option(ENABLE_PACKAGE "Enable package generation" OFF)
if(ENABLE_PACKAGE)
    # 设置第三方库路径
    if(NOT CANN_3RD_LIB_PATH)
        set(CANN_3RD_LIB_PATH ${PROJECT_SOURCE_DIR}/third_party CACHE STRING "CANN third party lib path")
    endif()
    # 检查构建依赖
    check_pkg_build_deps(ops_tensor)
    # 生成版本信息目标
    add_version_info_targets()
    # 打包
    include(cmake/package.cmake)
    pack_built_in()
endif()

##############################################################################
# 四、安装规则
##############################################################################

# 安装库文件到 ops_tensor/lib64/
install(TARGETS ${OPS_TENSOR}
    LIBRARY DESTINATION ${OPS_TENSOR_LIB_INSTALL_DIR}
    RUNTIME DESTINATION bin
)

# 安装公共头文件到 ops_tensor/include/
install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/
    DESTINATION ${OPS_TENSOR_INC_INSTALL_DIR}
    FILES_MATCHING PATTERN "*.h" PATTERN "*.hpp"
)

##############################################################################
# 五、构建摘要
##############################################################################

message(STATUS "")
message(STATUS "==========================================")
message(STATUS "  Build Summary")
message(STATUS "==========================================")
message(STATUS "  Version   : ${PROJECT_VERSION}")
message(STATUS "  NPU       : ${ASCEND_NPU_ARCH}")
message(STATUS "  Operators : ${BUILD_OPERATORS}")
message(STATUS "  Tests     : ${BUILD_TESTING}")
message(STATUS "==========================================")