74 lines
2.1 KiB
Bash
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 ==='
|