97 lines
2.1 KiB
Bash
Executable File
97 lines
2.1 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
|
||
set -euo pipefail
|
||
|
||
if [[ $# -lt 1 || $# -gt 3 ]]; then
|
||
echo "用法: $0 <input.sy> [output_dir] [--run]" >&2
|
||
exit 1
|
||
fi
|
||
|
||
input=$1
|
||
out_dir="test/test_result/asm"
|
||
run_exec=false
|
||
input_dir=$(dirname "$input")
|
||
|
||
shift
|
||
while [[ $# -gt 0 ]]; do
|
||
case "$1" in
|
||
--run)
|
||
run_exec=true
|
||
;;
|
||
*)
|
||
out_dir="$1"
|
||
;;
|
||
esac
|
||
shift
|
||
done
|
||
|
||
if [[ ! -f "$input" ]]; then
|
||
echo "输入文件不存在: $input" >&2
|
||
exit 1
|
||
fi
|
||
|
||
compiler="./build/bin/compiler"
|
||
if [[ ! -x "$compiler" ]]; then
|
||
echo "未找到编译器: $compiler ,请先构建。" >&2
|
||
exit 1
|
||
fi
|
||
|
||
if ! command -v aarch64-linux-gnu-gcc >/dev/null 2>&1; then
|
||
echo "未找到 aarch64-linux-gnu-gcc,无法汇编/链接。" >&2
|
||
exit 1
|
||
fi
|
||
|
||
mkdir -p "$out_dir"
|
||
base=$(basename "$input")
|
||
stem=${base%.sy}
|
||
asm_file="$out_dir/$stem.s"
|
||
exe="$out_dir/$stem"
|
||
stdin_file="$input_dir/$stem.in"
|
||
expected_file="$input_dir/$stem.out"
|
||
|
||
"$compiler" --emit-asm "$input" > "$asm_file"
|
||
echo "汇编已生成: $asm_file"
|
||
|
||
aarch64-linux-gnu-gcc "$asm_file" -o "$exe"
|
||
echo "可执行文件已生成: $exe"
|
||
|
||
if [[ "$run_exec" == true ]]; then
|
||
if ! command -v qemu-aarch64 >/dev/null 2>&1; then
|
||
echo "未找到 qemu-aarch64,无法运行生成的可执行文件。" >&2
|
||
exit 1
|
||
fi
|
||
|
||
stdout_file="$out_dir/$stem.stdout"
|
||
actual_file="$out_dir/$stem.actual.out"
|
||
echo "运行 $exe ..."
|
||
set +e
|
||
if [[ -f "$stdin_file" ]]; then
|
||
qemu-aarch64 -L /usr/aarch64-linux-gnu "$exe" < "$stdin_file" > "$stdout_file"
|
||
else
|
||
qemu-aarch64 -L /usr/aarch64-linux-gnu "$exe" > "$stdout_file"
|
||
fi
|
||
status=$?
|
||
set -e
|
||
cat "$stdout_file"
|
||
echo "退出码: $status"
|
||
{
|
||
cat "$stdout_file"
|
||
if [[ -s "$stdout_file" ]] && (( $(tail -c 1 "$stdout_file" | wc -l) == 0 )); then
|
||
printf '\n'
|
||
fi
|
||
printf '%s\n' "$status"
|
||
} > "$actual_file"
|
||
|
||
if [[ -f "$expected_file" ]]; then
|
||
if diff -u "$expected_file" "$actual_file"; then
|
||
echo "输出匹配: $expected_file"
|
||
else
|
||
echo "输出不匹配: $expected_file" >&2
|
||
echo "实际输出已保存: $actual_file" >&2
|
||
exit 1
|
||
fi
|
||
else
|
||
echo "未找到预期输出文件,跳过比对: $expected_file"
|
||
fi
|
||
fi
|