if ("${BUILD_TEST}" STREQUAL "ON")
    set(ASCEND_CANN_PACKAGE_PATH $ENV{ASCEND_HOME_PATH})
    message(STATUS "ASCEND_CANN_PACKAGE_PATH = ${ASCEND_CANN_PACKAGE_PATH}")
    if ("${ASCEND_CANN_PACKAGE_PATH}" STREQUAL "")
        message(WARNING "ascend cann path not found!Please set the environment variable: ASCEND_HOME_PATH")
        return()
    endif ()
    file(GLOB BM_BENCHMARK_FILES *.cpp
            ${CMAKE_CURRENT_SOURCE_DIR}/*
    )
    add_executable(bm_perf_benchmark ${BM_BENCHMARK_FILES})

    if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64")
        set(TARGET_ARCH "x86_64")
    elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "arm64|aarch64")
        set(TARGET_ARCH "aarch64")
    else ()
        message(FATAL_ERROR "arch is not support!")
    endif ()

    target_compile_options(bm_perf_benchmark PRIVATE -D_GLIBCXX_USE_CXX11_ABI=0)

    include_directories(
            ${PROJECT_SOURCE_DIR}/src/smem/include/host
            ${ASCEND_CANN_PACKAGE_PATH}/${TARGET_ARCH}-linux/include/
    )
    target_link_directories(bm_perf_benchmark PUBLIC
            ${ASCEND_CANN_PACKAGE_PATH}/${TARGET_ARCH}-linux/lib64
            ${ASCEND_CANN_PACKAGE_PATH}/${TARGET_ARCH}-linux/lib64/plugin/opskernel
            ${ASCEND_CANN_PACKAGE_PATH}/${TARGET_ARCH}-linux/lib64/lib64/plugin/nnengine
            ${ASCEND_CANN_PACKAGE_PATH}/${TARGET_ARCH}-linux/devlib
    )

    target_link_libraries(bm_perf_benchmark PRIVATE
            stdc++
            hybmm_shared
            smem_shared
            ascendcl
    )
    target_compile_options(bm_perf_benchmark PRIVATE -w)
    target_compile_options(bm_perf_benchmark PRIVATE -Wno-sign-compare)
    target_compile_options(bm_perf_benchmark PRIVATE -Wno-stack-usage)
    set_target_properties(bm_perf_benchmark PROPERTIES OUTPUT_NAME "bm_perf_benchmark")

    install(TARGETS bm_perf_benchmark
            RUNTIME DESTINATION ${TARGET_INSTALL_DIR}/smem/bin
            PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE)
else ()
    cmake_minimum_required(VERSION 3.12)
    project(BM_EXAMPLE)

    set(MF_PATH $ENV{MEMFABRIC_HYBRID_HOME_PATH})
    if ("${MF_PATH}" STREQUAL "")
        message(FATAL_ERROR "memfabric_hybrid path not found!")
    endif ()
    set(ASCEND_CANN_PACKAGE_PATH $ENV{ASCEND_HOME_PATH})
    if ("${ASCEND_CANN_PACKAGE_PATH}" STREQUAL "")
        message(FATAL_ERROR "ascend cann path not found!")
    endif ()
    file(GLOB BM_BENCHMARK_FILES *.cpp
            ${CMAKE_CURRENT_SOURCE_DIR}/*
    )
    add_executable(bm_perf_benchmark ${BM_BENCHMARK_FILES})

    if (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64|amd64")
        set(TARGET_ARCH "x86_64")
    elseif (CMAKE_SYSTEM_PROCESSOR MATCHES "arm64|aarch64")
        set(TARGET_ARCH "aarch64")
    else ()
        message(FATAL_ERROR "arch is not support!")
    endif ()

    target_compile_options(bm_perf_benchmark PRIVATE
            -O2 -D_GLIBCXX_USE_CXX11_ABI=0 -Wall -g
    )

    include_directories(
            ${CMAKE_CURRENT_SOURCE_DIR}/
            ${MF_PATH}/include/smem/host
            ${MF_PATH}/include/hybm
            ${ASCEND_CANN_PACKAGE_PATH}/${TARGET_ARCH}-linux/include/
    )

    target_link_directories(bm_perf_benchmark PUBLIC
            ${MF_PATH}/${TARGET_ARCH}-linux/lib64
            ${ASCEND_CANN_PACKAGE_PATH}/${TARGET_ARCH}-linux/lib64
    )

    target_link_libraries(bm_perf_benchmark PRIVATE
            mf_smem
            mf_hybm_core
            ascendcl
    )

    set_target_properties(bm_perf_benchmark PROPERTIES OUTPUT_NAME "bm_perf_benchmark")
    set_target_properties(bm_perf_benchmark PROPERTIES CLEAN_DIRECT_OUTPUT 1)
    set_target_properties(bm_perf_benchmark PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/)
endif ()