# jolt — Clojure on Chez Scheme. Single substrate, no Janet.
#
# bin/joltc runs jolt directly off the checked-in seed (host/chez/seed/); there is no
# build step. `make test` is the full gate. `make remint` rebuilds the seed after a
# source change.

.PHONY: test ci values corpus unit smoke selfhost sci certify ffi transient remint

# Full gate (dev machine). Includes the self-host byte-fixpoint, which only holds
# on the same Chez that minted the seed.
test: selfhost ci
	@echo "OK: all gates passed"

# CI gate: behavior only. The checked-in seed is a minted artifact (like a
# lockfile) — it RUNS correctly on any Chez, but `selfhost` rebuilds it and a
# different Chez version may emit byte-different (gensym/order) output, so the
# byte-fixpoint is a dev-machine check, not a CI one (jolt-8479).
ci: values corpus unit smoke sci ffi transient certify
	@echo "OK: CI gates passed"

# Self-host fixpoint: bootstrap.ss rebuild == checked-in seed.
selfhost:
	@sh host/chez/selfcheck.sh

# Value-model unit tests (nil/truthiness/collections on Chez).
values:
	@chez --script test/chez/values-test.ss

# Corpus conformance vs JVM-sourced expecteds (allowlist + floor).
corpus:
	@chez --script host/chez/run-corpus.ss

# Host-specific unit cases.
unit:
	@chez --script host/chez/run-unit.ss

# Real-CLI smoke over bin/joltc.
smoke:
	@sh host/chez/smoke.sh

# SCI conformance: load borkdude/sci's source through joltc (floor-gated).
sci:
	@chez --script host/chez/run-sci.ss

# FFI + threading: HTTP server GC-safety (blocking calls deactivate the thread)
# and http-client temp-file uniqueness, plus a live request.
ffi:
	@chez --script test/chez/ffi-binding-test.ss
	@chez --script test/chez/ffi-server-test.ss

# Transients: mutable backing, snapshot on persistent!, and linear-time builds.
transient:
	@chez --script test/chez/transient-test.ss

# JVM oracle: certify the corpus against reference Clojure. Skips if clojure absent.
certify:
	@if command -v clojure >/dev/null 2>&1; then \
		clojure -M test/conformance/certify.clj; \
	else \
		echo "certify: clojure not on PATH — skipped"; \
	fi

# Re-mint the seed after changing a seed source (reader/analyzer/backend/core).
remint:
	@sh host/chez/remint.sh
