#!/bin/bash
# =============================================================================
# set_kernel_obj_env.sh - 算子调试内核目标文件环境变量配置脚本
#
# 功能描述:
#   本脚本用于自动查找算子编译生成的内核目标文件 (.o),并设置 LAUNCH_KERNEL_PATH
#   环境变量,供 msdebug 算子调试工具使用。
#
# 主要功能:
#   1. 在指定路径下递归搜索匹配前缀的 .o 目标文件
#   2. 自动选择最新修改的目标文件
#   3. 设置 LAUNCH_KERNEL_PATH 环境变量指向该文件
#
# 使用方法:
#   source set_kernel_obj_env.sh [search_path] [prefix]
#
# 参数说明:
#   search_path - 搜索路径 (可选)
#                 默认: $ASCEND_OPP_PATH (若已设置),否则为 /usr/local/Ascend
#   prefix      - 目标文件前缀 (可选)
#                 默认: AddCustom (将匹配 AddCustom_*.o)
#
# 注意事项:
#   - 必须使用 source 命令调用,不能直接执行
#   - 需要确保搜索路径下存在对应的 .o 文件
#
# 示例:
#   source set_kernel_obj_env.sh                          # 使用默认路径和前缀
#   source set_kernel_obj_env.sh /path/to/opp             # 指定搜索路径
#   source set_kernel_obj_env.sh /path/to/opp MyOperator  # 指定路径和前缀
# =============================================================================

# 检查是否被 source 调用
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
    echo "Error: This script must be sourced, not executed directly." >&2
    echo "Usage: source $0 [search_path] [prefix]" >&2
    echo "  - search_path: directory to search" >&2
    echo "                 (default: \$ASCEND_OPP_PATH if set, else /usr/local/Ascend)" >&2
    echo "  - prefix:     object file prefix (default: AddCustom)" >&2
    exit 1
fi

# 参数处理:
# - $1: 搜索路径(若提供且非空,则使用)
# - 否则:使用 ASCEND_OPP_PATH 环境变量(若已设置)
# - 否则:默认为 /usr/local/Ascend
if [ -n "$1" ]; then
    SEARCH_PATH="$1"
elif [ -n "$ASCEND_OPP_PATH" ]; then
    SEARCH_PATH="$ASCEND_OPP_PATH"
else
    SEARCH_PATH="/usr/local/Ascend"
fi

SEARCH_PATH="${SEARCH_PATH%/ascend-toolkit*}"

# 第二个参数:文件前缀,默认 AddCustom
PREFIX="${2:-AddCustom}"

# 构造匹配模式
PATTERN="${PREFIX}_*.o"

# 查找最新 .o 文件
FILES=$(find "$SEARCH_PATH" -type f -name "$PATTERN" 2>/dev/null)
if [ -n "$FILES" ]; then
    O_FILE=$(printf '%s\n' "$FILES" | xargs ls -t 2>/dev/null | head -n 1)
else
    O_FILE=""
fi

if [ -n "$O_FILE" ]; then
    export LAUNCH_KERNEL_PATH="$O_FILE"
    echo "Find obj file, exec cmd:export LAUNCH_KERNEL_PATH=$LAUNCH_KERNEL_PATH"
else
    echo "Error: No ${PATTERN} file found under '${SEARCH_PATH}'" >&2
    return 1
fi