#!/usr/bin/env bash
set -euo pipefail
usage() {
cat <<EOF
Usage: $0 [OPTIONS]
选项:
-t, --target TARGET 指定要构建和运行的目标 (sample 或 sample_and_run)
-h, --help 显示此帮助信息
默认行为:
当未指定目标时,默认构建并dump图
EOF
exit 0
}
TARGET="sample"
while [[ $# -gt 0 ]]; do
case "$1" in
-t|--target)
TARGET="$2"
shift 2
;;
-h|--help)
usage
;;
*)
echo "未知选项: $1" >&2
usage
exit 1
;;
esac
done
VALID_TARGETS=("sample" "sample_and_run")
if [[ ! " ${VALID_TARGETS[@]} " =~ " ${TARGET} " ]]; then
echo "错误: 无效目标 '${TARGET}'。有效目标: ${VALID_TARGETS[*]}" >&2
exit 1
fi
echo "[Info] 目标设置为: ${TARGET}"
echo "[Info] 运行模式设置为: copy输入输出"
set +u
if [[ -z "${ASCEND_HOME_PATH}" ]]; then
echo -e "ERROR 环境变量ASCEND_HOME_PATH 未配置" >&2
echo -e "ERROR 请先执行: source /usr/local/Ascend/cann/set_env.sh " >&2
exit 1
fi
ARCH=$(uname -m)
case "${ARCH}" in
x86_64|amd64)
ASCEND_ARCH="x86_64-linux"
;;
aarch64|arm64)
ASCEND_ARCH="aarch64-linux"
;;
*)
echo "WARNING: 未识别的架构 ${ARCH},使用默认值 x86_64-linux" >&2
ASCEND_ARCH="x86_64-linux"
;;
esac
echo "[Info] 检测到系统架构: ${ARCH}"
echo "[Info] 使用 ASCEND 架构: ${ASCEND_ARCH}"
ASCEND_LIB_DIR="${ASCEND_HOME_PATH}/lib64"
echo "[Info] ASCEND_LIB_DIR = ${ASCEND_LIB_DIR}"
export LD_LIBRARY_PATH="${ASCEND_LIB_DIR}:${LD_LIBRARY_PATH:-}"
echo "[Info] 预先设置 LD_LIBRARY_PATH=${LD_LIBRARY_PATH} 以支持 gen_esb 运行"
BUILD_DIR="build"
if [[ ! -d "${BUILD_DIR}" ]]; then
echo "[Info] 创建构建目录 ${BUILD_DIR}"
mkdir -p "${BUILD_DIR}"
fi
export LD_LIBRARY_PATH="${ASCEND_LIB_DIR}:${LD_LIBRARY_PATH:-}"
echo "[Info] LD_LIBRARY_PATH 已设置为: ${LD_LIBRARY_PATH}"
case "${TARGET}" in
sample)
echo "[Info] 开始准备并编译目标: sample"
echo "[Info] 清理旧的 ${BUILD_DIR}..."
[ -n "${BUILD_DIR}" ] && rm -rf "${BUILD_DIR}" || true
mkdir -p "${BUILD_DIR}"
cmake -S . -B "${BUILD_DIR}" -DCMAKE_BUILD_TYPE=Release
cmake --build "${BUILD_DIR}" --target sample -j"$(nproc)"
echo "[Info] 运行 ${BUILD_DIR}/sample dump"
if [[ -x "${BUILD_DIR}/sample" ]]; then
"${BUILD_DIR}/sample" dump
echo "[Success] sample 执行成功,pbtxt dump 已生成在当前目录。该文件以 ge_onnx_ 开头,可以在 netron 中打开显示"
else
echo "ERROR: 找不到或不可执行 ${BUILD_DIR}/sample" >&2
exit 1
fi
;;
sample_and_run)
echo "[Info] 开始准备并编译目标: sample_and_run"
bash "$0" -t sample
echo "[Info] 设置NPU设备下的环境变量 ${ASCEND_HOME_PATH}/set_env.sh"
echo "[Info] 检查环境变量和文件"
if [ -z "${ASCEND_HOME_PATH:-}" ]; then
echo "[Error] ASCEND_HOME_PATH 未设置"
exit 1
fi
if [ -z "${ASCEND_ARCH:-}" ]; then
echo "[Error] ASCEND_ARCH 未设置"
exit 1
fi
SETENV_FILE="${ASCEND_HOME_PATH}/set_env.sh"
if [ ! -f "$SETENV_FILE" ]; then
echo "[Error] set_env.sh 不存在: $SETENV_FILE"
exit 1
fi
set +e
source "$SETENV_FILE"
set -e
echo "[Info] 运行 ${BUILD_DIR}/sample run"
"${BUILD_DIR}/sample" run && echo "[Success] sample_and_run 执行成功,pbtxt和data输出dump 已生成在当前目录"
;;
*)
echo "错误: 未知目标 ${TARGET}" >&2
exit 1
;;
esac