set(DEFAULT_BUILD_TYPE "Release")

if (NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
    set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}" CACHE STRING "Choose the build type: Release/Debug" FORCE)
endif()

function(generate_stub_with_output_name STUB STUB_OUTPUT_NAME) 
    if(EXISTS ${DOWNLOAD_LIB_DIR}/lib${STUB_OUTPUT_NAME}.so) 
        add_library(${STUB} SHARED IMPORTED GLOBAL) 
        set_target_properties(${STUB} PROPERTIES 
            IMPORTED_LOCATION "${DOWNLOAD_LIB_DIR}/lib${STUB_OUTPUT_NAME}.so" 
            INTERFACE_LINK_OPTIONS "-Wl,-rpath-link=${DOWNLOAD_LIB_DIR}" 
        ) 
        message(STATUS "Imported library lib${STUB_OUTPUT_NAME}.so") 
    else() 
        string(FIND ${STUB_OUTPUT_NAME} "::" temp) 
        if (temp EQUAL "-1") 
            set(target_plain_name ${STUB_OUTPUT_NAME}) 
        else() 
            string(REPLACE "::" ";" temp_list ${STUB_OUTPUT_NAME}) 
            list(GET temp_list 1 target_plain_name) 
        endif() 


        if (NOT TARGET ${target_plain_name}_stub_tmp) 
            add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/stub/${target_plain_name}.c 
                COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_CURRENT_BINARY_DIR}/stub 
                COMMAND ${CMAKE_COMMAND} -E touch ${CMAKE_CURRENT_BINARY_DIR}/stub/${target_plain_name}.c) 
            add_library(${target_plain_name}_stub_tmp SHARED ${CMAKE_CURRENT_BINARY_DIR}/stub/${target_plain_name}.c) 
            set_target_properties(${target_plain_name}_stub_tmp PROPERTIES 
                WINDOWS_EXPORT_ALL_SYMBOLS TRUE 
                LIBRARY_OUTPUT_NAME ${target_plain_name} 
                RUNTIME_OUTPUT_NAME ${target_plain_name} 
                LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/stub 
                RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/stub) 
        endif() 


        add_library(${STUB} SHARED IMPORTED GLOBAL) 
        if (UNIX) 
            set_target_properties(${STUB} PROPERTIES 
                IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/stub/lib${target_plain_name}.so") 
        endif() 
        if (WIN32) 
            set_target_properties(${STUB} PROPERTIES 
                IMPORTED_LOCATION "${CMAKE_CURRENT_BINARY_DIR}/stub/${target_plain_name}.dll" 
                IMPORTED_IMPLIB "${CMAKE_CURRENT_BINARY_DIR}/stub/${target_plain_name}.lib") 
        endif() 
        add_dependencies(${STUB} ${target_plain_name}_stub_tmp) 


        message(STATUS "Stub library lib${STUB_OUTPUT_NAME}.so") 
    endif() 
endfunction() 


function(generate_stub STUB) 
    if(DEFINED STUB_OUTPUT_NAME_${STUB}) 
        set(STUB_OUTPUT_NAME ${STUB_OUTPUT_NAME_${STUB}}) 
    else() 
        set(STUB_OUTPUT_NAME ${STUB}) 
    endif() 


    generate_stub_with_output_name(${STUB} ${STUB_OUTPUT_NAME}) 


    if(DEFINED STUB_LINK_LIBRARIES_${STUB}) 
        foreach(LIB ${STUB_LINK_LIBRARIES_${STUB}}) 
            if(TARGET ${LIB}) 
                target_link_libraries(${STUB} INTERFACE ${LIB}) 
            endif() 
        endforeach() 
    endif() 
endfunction(generate_stub) 

if(AARCH_MODE)
    set(STUBS
        hcomm 
        ccl_kernel
        c_sec
        unified_dlog
    ) 
    foreach(STUB ${STUBS}) 
        if(NOT TARGET ${STUB}) 
            generate_stub(${STUB}) 
        endif() 
    endforeach()
elseif(KERNEL_MODE AND BUILD_OPEN_PROJECT)
    # Device aicpu 构建:8.5.0 CANN 下 devlib/device/libccl_kernel.so 不存在,需要生成桩库
    if(CUSTOM_ASCEND_CANN_PACKAGE_PATH)
        set(_hccl_devlib_dir ${CUSTOM_ASCEND_CANN_PACKAGE_PATH}/devlib/device)
    elseif(DEFINED ASCEND_CANN_PACKAGE_PATH)
        set(_hccl_devlib_dir ${ASCEND_CANN_PACKAGE_PATH}/devlib/device)
    endif()
    if(DEFINED _hccl_devlib_dir AND NOT EXISTS ${_hccl_devlib_dir}/libccl_kernel.so)
        if(NOT TARGET ccl_kernel)
            generate_stub(ccl_kernel)
        endif()
    endif()
endif()

if(CUSTOM_ASCEND_CANN_PACKAGE_PATH)
    set(ASCEND_CANN_PACKAGE_PATH  ${CUSTOM_ASCEND_CANN_PACKAGE_PATH})
elseif(DEFINED ENV{ASCEND_HOME_PATH})
    set(ASCEND_CANN_PACKAGE_PATH  $ENV{ASCEND_HOME_PATH})
elseif(DEFINED ENV{ASCEND_OPP_PATH})
    get_filename_component(ASCEND_CANN_PACKAGE_PATH "$ENV{ASCEND_OPP_PATH}/.." ABSOLUTE)
else()
    set(ASCEND_CANN_PACKAGE_PATH  "/usr/local/Ascend/ascend-toolkit/latest")
endif()

set(ASCEND_MOCKCPP_PACKAGE_PATH ${CMAKE_CURRENT_SOURCE_DIR})

# if (NOT EXISTS "${ASCEND_CANN_PACKAGE_PATH}")
#     message(FATAL_ERROR "${ASCEND_CANN_PACKAGE_PATH} does not exist, please install the cann package and set environment variables.")
# endif()

# if (NOT EXISTS "${THIRD_PARTY_NLOHMANN_PATH}")
#     message(FATAL_ERROR "${THIRD_PARTY_NLOHMANN_PATH} does not exist, please check the setting of THIRD_PARTY_NLOHMANN_PATH.")
# endif()

#execute_process(COMMAND bash ${CMAKE_CURRENT_SOURCE_DIR}/cmake/scripts/check_version_compatiable.sh
#                             ${ASCEND_CANN_PACKAGE_PATH}
#                             hccl
#                             ${CMAKE_CURRENT_SOURCE_DIR}/version.info
#    RESULT_VARIABLE result
#    OUTPUT_STRIP_TRAILING_WHITESPACE
#    OUTPUT_VARIABLE CANN_VERSION
#    )

#if (result)
#    message(FATAL_ERROR "${CANN_VERSION}")
#else()
#     string(TOLOWER ${CANN_VERSION} CANN_VERSION)
#endif()

if (CMAKE_INSTALL_PREFIX STREQUAL /usr/local)
    set(CMAKE_INSTALL_PREFIX     "${CMAKE_CURRENT_SOURCE_DIR}/output"  CACHE STRING "path for install()" FORCE)
endif ()

set(HI_PYTHON                     "python3"                       CACHE   STRING   "python executor")

message(STATUS "config.cmake KERNEL_MODE=${KERNEL_MODE} BUILD_OPEN_PROJECT=${BUILD_OPEN_PROJECT}")
if(BUILD_OPEN_PROJECT AND KERNEL_MODE)
    set(PRODUCT_SIDE                  device)
else()
    set(PRODUCT_SIDE                  host)
endif()
set(INSTALL_LIBRARY_DIR ${CMAKE_SYSTEM_PROCESSOR}-linux/lib64)
set(INSTALL_INCLUDE_DIR ${CMAKE_SYSTEM_PROCESSOR}-linux/include)
set(INSTALL_AICPU_KERNEL_JSON_DIR opp/built-in/op_impl/aicpu)
set(INSTALL_DEVICE_TAR_DIR compat)

set(INSTALL_OPGRAPH_LIBRARY_DIR opp/built-in/op_graph/lib/linux/${CMAKE_SYSTEM_PROCESSOR})
set(INSTALL_OPGRAPH_INCLUDE_DIR opp/built-in/op_graph/inc)
set(WHL_INSTALL_DIR ops_hccl)

if (ENABLE_TEST)
    set(CMAKE_SKIP_RPATH FALSE)
else ()
    set(CMAKE_SKIP_RPATH TRUE)
endif ()