Revision control
Copy as Markdown
#!/bin/sh
# Copyright (C) 2026 The Qt Company Ltd.
# SPDX-License-Identifier: BSD-3-Clause
# Drop-in xcodebuild replacement with retry logic for QTBUG-138855.
#
# The test_i18n_subdir*_xcode tests occasionally fail due to a spurious
# xcodebuild crash during CMake's compiler detection phase. This appears
# to be an issue with the Xcode/Parallels VM combination on CI machines,
# manifesting as "thread is already initializing this class!" errors.
#
# This script is used as the MAKE_PROGRAM for Xcode generator tests.
# It runs xcodebuild with retry logic, detecting the spurious failure
# pattern and retrying up to 3 times if detected.
#
# POSIX-compliant shell script for compatibility with macOS /bin/sh.
MAX_ATTEMPTS=3
ATTEMPT=1
OUTPUT_FILE=$(mktemp)
trap 'rm -f "$OUTPUT_FILE"' EXIT
while [ "$ATTEMPT" -le "$MAX_ATTEMPTS" ]; do
xcodebuild "$@" > "$OUTPUT_FILE" 2>&1
EXIT_CODE=$?
cat "$OUTPUT_FILE"
if [ "$EXIT_CODE" -eq 0 ]; then
exit 0
fi
if grep -q "thread is already initializing this class!" "$OUTPUT_FILE"; then
if [ "$ATTEMPT" -eq "$MAX_ATTEMPTS" ]; then
echo "" >&2
echo "==========================================================================" >&2
echo "QTBUG-138855: Spurious xcodebuild failure detected on all $MAX_ATTEMPTS attempts." >&2
echo "The 'thread is already initializing this class!' error persists." >&2
echo "Treating as PASS to avoid blocking CI on a known VM/Xcode issue." >&2
echo "==========================================================================" >&2
echo "" >&2
exit 0
fi
echo "" >&2
echo "QTBUG-138855: Spurious xcodebuild failure detected. Retrying (attempt $((ATTEMPT + 1))/$MAX_ATTEMPTS)..." >&2
echo "" >&2
ATTEMPT=$((ATTEMPT + 1))
else
exit "$EXIT_CODE"
fi
done
exit 1