Files
agila_open_tool/tools/v/cmd/v2/test_v2_self.sh
T

74 lines
2.1 KiB
Bash

#!/usr/bin/env bash
set -euo pipefail
script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
repo_root="$(cd -- "${script_dir}/../.." && pwd)"
v2_source="${script_dir}/v2.v"
v2_bin="${script_dir}/v2"
v3_bin="${script_dir}/v3"
v4_bin="${script_dir}/v4"
v5_bin="${script_dir}/v5"
# Variable for the backend (originally cleanc)
backend="cleanc"
v1_compiler="${V:-${repo_root}/v}"
if [[ ! -x "${v1_compiler}" ]]; then
fallback_v1_compiler="${HOME}/code/v/v"
if [[ -x "${fallback_v1_compiler}" ]]; then
v1_compiler="${fallback_v1_compiler}"
else
echo "FAILURE: v1 compiler not found or not executable: ${v1_compiler}"
exit 1
fi
fi
# V1's formatter may clobber v2 source files — backup and restore.
v2_src="${repo_root}/vlib/v2_toberemoved"
v2_bak="/tmp/v2_src_bak_self_test"
rm -rf "${v2_bak}"
cp -R "${v2_src}" "${v2_bak}"
# Build v2 with v1.
rm -f "${v2_bin}" "${v3_bin}" "${v3_bin}.c" "${v4_bin}" "${v4_bin}.c" "${v5_bin}" "${v5_bin}.c"
"${v1_compiler}" -gc none -cc cc -o "${v2_bin}" "${v2_source}"
# Restore v2 sources after V1 build.
rsync -a --delete "${v2_bak}/" "${v2_src}/"
# Use clang instead of TCC for v2-compiled C code.
export V2CC="${V2CC:-cc}"
# Clear stale caches to avoid reusing incompatible generated C across runs.
rm -rf /tmp/v2_cleanc_obj_cache
# Use v2 to compile itself to v3 (using defined backend).
"${v2_bin}" -gc none -o "${v3_bin}" -backend "${backend}" "${v2_source}"
echo "SUCCESS: v2 successfully compiled itself to v3"
echo "v3 binary size: $(ls -lh "${v3_bin}" | awk '{print $5}')"
if [[ "${backend}" != "cleanc" ]]; then
"${v3_bin}" -gc none -o "${v4_bin}" -backend "${backend}" "${v2_source}"
printf '\nV4 compiled\n\n'
"${v4_bin}" -gc none -o "${v5_bin}" -backend "${backend}" "${v2_source}"
printf '\nV5 compiled\n\n'
fi
# Test that v3 runs and produces expected output.
output="$("${v3_bin}" 2>&1 || true)"
expected='At least 1 .v file expected'
if echo "${output}" | grep -q "${expected}"; then
echo "SUCCESS"
else
echo "FAILURE: Expected '${expected}' but got:"
echo "${output}"
exit 1
fi
echo ''
echo '=== SELF-COMPILATION TEST PASSED ==='