ci/build_vprod_test.sh
Rama master · réplica de lectura del repositorio original.
#!/bin/sh
# The C compiler must start after V exits; failed builds must preserve the old binary.
set -eu
repo=$(CDPATH= cd "$(dirname "$0")/.." && pwd -P)
work=$(mktemp -d "${TMPDIR:-/tmp}/v-prod-build.XXXXXX")
trap 'rm -rf "$work"' EXIT
cat > "$work/compiler" <<'MOCK'
#!/bin/sh
set -eu
[ "$1" = self ] && [ "$2" = -prod ] && [ "$3" = -cc ] && [ "$4" = 'compiler with spaces' ]
[ "$5" = -parallel-cc ] && [ "$6" = -generate-c-project ]
project=$7
[ "$8" = -o ] && [ "$9" = "$WORK/vprod" ]
echo "$project" > "$WORK/project"
echo $$ > "$WORK/generator.pid"
[ "${FAIL_STAGE:-}" != generate ] || exit 7
cat > "$project/Makefile" <<'MAKE'
all:
@if kill -0 "$$(cat "$$WORK/generator.pid")" 2>/dev/null; then echo 'V is still running'; exit 90; fi
@test "$${FAIL_STAGE:-}" != compile || exit 8
@printf '#!/bin/sh\necho optimized\n' > v
MAKE
sleep 0.2
MOCK
chmod +x "$work/compiler"
for stage in success generate compile; do
printf original > "$work/vprod"
status=0
WORK="$work" FAIL_STAGE="$stage" sh "$repo/cmd/tools/build_vprod.sh" \
"$work/compiler" "$work/vprod" 'compiler with spaces' > "$work/log" 2>&1 || status=$?
case "$stage" in
success) [ "$status" -eq 0 ] && [ "$("$work/vprod")" = optimized ] ;;
*) [ "$status" -ne 0 ] && [ "$(cat "$work/vprod")" = original ] ;;
esac
[ ! -e "$(cat "$work/project")" ]
done
echo 'sequential production build, cleanup, and failure propagation passed'