# Copyright © 2023 ESWIN. All rights reserved.
#
# Beijing ESWIN Computing Technology Co., Ltd and its affiliated companies
# ("ESWIN") retain all intellectual property and proprietary rights in and to
# this software. Except as expressly authorized by ESWIN, no part of the
# software may be released, copied, distributed, reproduced, modified, adapted,
# translated, or created derivative work of, in whole or in part.
cmake_minimum_required(VERSION 3.16.1)
set(PROJECTNAME dsp_kernel_sample)
project(${PROJECTNAME})

# check cadence environment variables
if(NOT DEFINED ENV{XTENSA_TOOLS_BIN})
    message(FATAL_ERROR "XTENSA_TOOLS_BIN environment variable not defined")
endif()

if(NOT DEFINED ENV{XTENSA_ELF_INCLUDE})
    message(FATAL_ERROR "XTENSA_ELF_INCLUDE environment variable not defined")
endif()

if(NOT DEFINED ENV{XTENSA_TIE_INCLUDE})
    message(FATAL_ERROR "XTENSA_TIE_INCLUDE environment variable not defined")
endif()

if(NOT DEFINED ENV{XTENSA_CONFIG_INCLUDE})
    message(
        FATAL_ERROR "XTENSA_CONFIG_INCLUDE environment variable not defined")
endif()

if(NOT DEFINED ENV{XTENSA_LIBXI_INSTALL})
    message(WARNING "XTENSA_LIBXI_INSTALL environment variable not defined")
endif()

if(NOT DEFINED ENV{XTENSA_COMPLIER})
    message(WARNING "XTENSA_COMPLIER environment variable not defined")
endif()

if(NOT DEFINED ENV{XTENSA_COMPLIER_FLAGS})
    message(WARNING "XTENSA_COMPLIER_FLAGS environment variable not defined")
endif()

set(XTENSA_TOOLS_BIN $ENV{XTENSA_TOOLS_BIN})
set(XTENSA_ELF_INCLUDE $ENV{XTENSA_ELF_INCLUDE})
set(XTENSA_ARC_INCLUDE $ENV{XTENSA_ARC_INCLUDE})
set(XTENSA_TIE_INCLUDE $ENV{XTENSA_TIE_INCLUDE})
set(XTENSA_CONFIG_INCLUDE $ENV{XTENSA_CONFIG_INCLUDE})
set(XTENSA_LIBXI_INSTALL $ENV{XTENSA_LIBXI_INSTALL})
set(XTENSA_COMPLIER $ENV{XTENSA_COMPLIER})
set(XTENSA_COMPLIER_FLAGS $ENV{XTENSA_COMPLIER_FLAGS})
set(XTENSA_KERNEL_LSP $ENV{XTENSA_KERNEL_LSP})

message(STATUS "Using XTENSA_TOOLS_BIN      ${XTENSA_TOOLS_BIN}")
message(STATUS "Using XTENSA_ELF_INCLUDE    ${XTENSA_ELF_INCLUDE}")
message(STATUS "Using XTENSA_TIE_INCLUDE    ${XTENSA_TIE_INCLUDE}")
message(STATUS "Using XTENSA_CONFIG_INCLUDE ${XTENSA_CONFIG_INCLUDE}")
message(STATUS "Using XTENSA_KERNEL_LSP     ${XTENSA_KERNEL_LSP}")

if(NOT DEFINED ENV{ESWIN_SDK_INCLUDE})
    message(FATAL_ERROR "ESWIN_SDK_INCLUDE environment variable not defined")
endif()

set(ESWIN_SDK_INCLUDE $ENV{ESWIN_SDK_INCLUDE})

message(STATUS "Using ESWIN_SDK_INCLUDE    ${ESWIN_SDK_INCLUDE}")

set(KERNEL_SRC ${CMAKE_CURRENT_SOURCE_DIR})
set(KERNEL_COMMON ${KERNEL_SRC}/include/common)

add_definitions(-DCONFIG_CORE_COUNT=1 -DCONFIG_XT_INTERRUPT_LEVEL_1=1)

set(KERNEL_ENTRY "eval")
set(XTENSA_KERNEL_FLAGS "-Wl,--shared-pagesize=128 -Wl,-pie -Wl,--no-relax -Wl,--multi-section-pil -e${KERNEL_ENTRY}")

macro(generate_pkg_lib kernel_lib)
    set(PKG_LIB_NAME ${kernel_lib}.pkg.lib)
    set(STRIP_TOOL ${XTENSA_TOOLS_BIN}/xt-strip)

    add_custom_command(
        OUTPUT ${PKG_LIB_NAME}
        COMMAND ${STRIP_TOOL} -K eval -K prepare ${kernel_lib} -o
                ${PKG_LIB_NAME}
        DEPENDS ${kernel_lib}
        WORKING_DIRECTORY .
        COMMENT "start xt-strip ${kernel_lib} to ${PKG_LIB_NAME}"
        VERBATIM)

    add_custom_target(strip_${kernel_lib} ALL DEPENDS ${PKG_LIB_NAME})

    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${PKG_LIB_NAME} DESTINATION .)
endmacro()

add_subdirectory(user_add)
add_subdirectory(bev_pool)
