diff --git a/test_script/runit-single.sh b/test_script/runit-single.sh index cb5e5b4..27d91a7 100644 --- a/test_script/runit-single.sh +++ b/test_script/runit-single.sh @@ -20,6 +20,7 @@ QEMU_RISCV64="qemu-riscv64" # --- 初始化变量 --- EXECUTE_MODE=false +CLEAN_MODE=false SYSYC_TIMEOUT=10 # sysyc 编译超时 (秒) GCC_TIMEOUT=10 # gcc 编译超时 (秒) EXEC_TIMEOUT=5 # qemu 自动化执行超时 (秒) @@ -37,6 +38,7 @@ show_help() { echo "" echo "选项:" echo " -e, --executable 编译为可执行文件并运行测试 (必须)。" + echo " -c, --clean 清理 tmp 临时目录下的所有文件。" echo " -sct N 设置 sysyc 编译超时为 N 秒 (默认: 10)。" echo " -gct N 设置 gcc 交叉编译超时为 N 秒 (默认: 10)。" echo " -et N 设置 qemu 自动化执行超时为 N 秒 (默认: 5)。" @@ -74,6 +76,10 @@ for arg in "$@"; do -e|--executable) EXECUTE_MODE=true ;; + -c|--clean) + CLEAN_MODE=true + shift + ;; -sct|-gct|-et|-ml|--max-lines) # 选项和其值将在下一个循环中处理 ;; @@ -110,6 +116,23 @@ for arg in "$@"; do esac done +if ${CLEAN_MODE}; then + echo "检测到 -c/--clean 选项,正在清空 ${TMP_DIR}..." + if [ -d "${TMP_DIR}" ]; then + # 使用 * 而不是 . 来确保只删除内容,不删除目录本身 + # 忽略 rm 可能因目录为空而报告的错误 + rm -rf "${TMP_DIR}"/* 2>/dev/null + echo "清理完成。" + else + echo "临时目录 ${TMP_DIR} 不存在,无需清理。" + fi + + # 如果只提供了 -c 选项而没有其他 .sy 文件,则在清理后退出 + if [ ${#SY_FILES[@]} -eq 0 ] && ! ${EXECUTE_MODE}; then + exit 0 + fi +fi + # --- 主逻辑开始 --- if ! ${EXECUTE_MODE}; then echo "错误: 请提供 -e 或 --executable 选项来运行测试。" @@ -138,6 +161,7 @@ for sy_file in "${SY_FILES[@]}"; do ir_file="${TMP_DIR}/${base_name}_sysyc_riscv64.ll" assembly_file="${TMP_DIR}/${base_name}.s" + assembly_debug_file="${TMP_DIR}/${base_name}_d.s" executable_file="${TMP_DIR}/${base_name}" input_file="${source_dir}/${base_name}.in" output_reference_file="${source_dir}/${base_name}.out" @@ -162,6 +186,7 @@ for sy_file in "${SY_FILES[@]}"; do echo -e "\e[31m错误: SysY 编译失败或超时。\e[0m" is_passed=0 fi + # timeout -s KILL ${SYSYC_TIMEOUT} "${SYSYC}" -s asmd "${sy_file}" > "${assembly_debug_file}" 2>&1 # 步骤 2: GCC 编译 if [ "$is_passed" -eq 1 ]; then