@@ -161,17 +161,47 @@ check_environment() {
161161# P1: Build
162162# ---------------------------------------------------------------------------
163163check_build () {
164- rm -rf " ${BUILD_DIR} "
165- if ! emcmake cmake -S " ${PROJECT_DIR} /cpp" -B " ${BUILD_DIR} " \
166- -DCMAKE_BUILD_TYPE=Release \
167- -DBUILD_TESTING=OFF \
168- -DSPZ_GATEKEEPER_BUILD_BENCHMARK_TESTS=OFF \
169- -DSPZ_GATEKEEPER_BUILD_WASM=ON > /dev/null 2>&1 ; then
170- fail " P1_BUILD" 3 " emcmake configuration failed" " Check CMake output: emcmake cmake -S cpp -B ${BUILD_DIR} -DCMAKE_BUILD_TYPE=Release"
171- fi
164+ local build_ok=false
165+ local max_attempts=1
166+ [ " ${AUTO_FIX} " = " true" ] && max_attempts=2
167+
168+ for attempt in $( seq 1 ${max_attempts} ) ; do
169+ if [ " ${attempt} " -gt 1 ]; then
170+ echo " Auto-fix: retrying build (attempt ${attempt} /${max_attempts} )..." >&2
171+ rm -rf " ${BUILD_DIR} "
172+ fi
173+
174+ if ! emcmake cmake -S " ${PROJECT_DIR} /cpp" -B " ${BUILD_DIR} " \
175+ -DCMAKE_BUILD_TYPE=Release \
176+ -DBUILD_TESTING=OFF \
177+ -DSPZ_GATEKEEPER_BUILD_BENCHMARK_TESTS=OFF \
178+ -DSPZ_GATEKEEPER_BUILD_WASM=ON > /dev/null 2>&1 ; then
179+ if [ " ${attempt} " -lt " ${max_attempts} " ]; then
180+ echo " Auto-fix: cmake configure failed, retrying after cleanup..." >&2
181+ continue
182+ fi
183+ fail " P1_BUILD" 3 " emcmake configuration failed" " Check CMake output: emcmake cmake -S cpp -B ${BUILD_DIR} -DCMAKE_BUILD_TYPE=Release"
184+ fi
172185
173- if ! emmake cmake --build " ${BUILD_DIR} " --parallel > /dev/null 2>&1 ; then
174- fail " P1_BUILD" 3 " emmake build failed" " Check compiler errors in C++ source files"
186+ if ! emmake cmake --build " ${BUILD_DIR} " --parallel > /dev/null 2>&1 ; then
187+ # Auto-fix: retry with --parallel 1 if OOM suspected
188+ if [ " ${AUTO_FIX} " = " true" ] && [ " ${attempt} " -lt " ${max_attempts} " ]; then
189+ echo " Auto-fix: build failed (possible OOM), retrying with --parallel 1..." >&2
190+ if emmake cmake --build " ${BUILD_DIR} " --parallel 1 > /dev/null 2>&1 ; then
191+ build_ok=true
192+ break
193+ fi
194+ echo " Auto-fix: single-thread build also failed, retrying from clean build..." >&2
195+ continue
196+ fi
197+ fail " P1_BUILD" 3 " emmake build failed" " Check compiler errors in C++ source files"
198+ fi
199+ build_ok=true
200+ break
201+ done
202+
203+ if [ " ${build_ok} " != " true" ]; then
204+ fail " P1_BUILD" 3 " emmake build failed after ${max_attempts} attempts" " Check compiler errors, disk space, and memory"
175205 fi
176206}
177207
@@ -298,22 +328,37 @@ check_frontend() {
298328# ---------------------------------------------------------------------------
299329check_smoke () {
300330 local port=4173
331+ local max_port=4175
332+ [ " ${AUTO_FIX} " = " true" ] && max_port=4175 || max_port=4173
301333 local server_pid
302- python3 -m http.server " ${port} " --directory " ${SITE_DIR} " > /dev/null 2>&1 &
303- server_pid=$!
304- trap ' kill "${server_pid}" 2>/dev/null || true' EXIT
305-
306- local ready=false
307- for _ in $( seq 1 20) ; do
308- if curl -fsS " http://127.0.0.1:${port} /index.html" > /dev/null 2>&1 ; then
309- ready=true
334+
335+ for port in $( seq 4173 ${max_port} ) ; do
336+ python3 -m http.server " ${port} " --directory " ${SITE_DIR} " > /dev/null 2>&1 &
337+ server_pid=$!
338+ trap ' kill "${server_pid}" 2>/dev/null || true' EXIT
339+
340+ local ready=false
341+ for _ in $( seq 1 20) ; do
342+ if curl -fsS " http://127.0.0.1:${port} /index.html" > /dev/null 2>&1 ; then
343+ ready=true
344+ break
345+ fi
346+ sleep 1
347+ done
348+
349+ if [ " ${ready} " = " true" ]; then
310350 break
311351 fi
312- sleep 1
352+
353+ # Port in use or server failed - kill and try next
354+ kill " ${server_pid} " 2> /dev/null || true
355+ if [ " ${port} " -lt " ${max_port} " ]; then
356+ echo " Auto-fix: port ${port} unavailable, trying ${port} ..." >&2
357+ fi
313358 done
314359
315360 if [ " ${ready} " != " true" ]; then
316- fail " P5_SMOKE" 7 " Local HTTP server did not become ready"
361+ fail " P5_SMOKE" 7 " Local HTTP server did not become ready (tried ports 4173- ${max_port} ) "
317362 fi
318363
319364 # Minimal runtime sanity: instantiate module via ES module dynamic import
0 commit comments