# Sprinter C Compiler — top-level Makefile
#
#   make             build host tools, libc archive, all tests
#   make tools       build only host tools (mkexe)
#   make lib         build lib/sprinter.lib (libc) + lib/bgi256.lib (libbgi)
#   make tests       build all libc feature tests under tests/
#   make floppy      пакет всех SDK-тестов в build/media/toolkit-tests.img
#   make check       run mkexe unit tests
#   make clean       remove all build artefacts
#   make sdcc        download/extract vendored SDCC
#
# Most heavy lifting is delegated to sub-Makefiles.

# Small libc-feature tests (one program per .c-language feature or libc API).
TESTS := hello hello2 simple banked bankedbg banktest strtest cat seek \
         malloc mem_test argv errno rt_test openenv ls conio conio2 \
         attrprob timedir mouse banklocl stdlib assrtest ptime stattest \
         filetest fdmax fbench solidt irqtest cbltest cblwav cblstream dec_test gets stest2 winrest \
         bios_text text_palette \
         gfx_demo gfx_dbuf bgitest bgi_img accfill
# gfx_d16 / gfx_text / gfx_mous — 16-цветные; убраны до Фазы 2 (bgi16.lib
# ещё не собирается).  Вернуть мигрированными на BGI --gfx 16.
FLOPPY_IMG  := build/media/toolkit-tests.img
MAKE_DISK   := toolchain/make_disk.py
MAME_HOME   ?= $(if $(wildcard mame/v306/mame.arm),$(CURDIR)/mame/v306,)

TEST_EXES := $(foreach t,$(TESTS),tests/$(t)/$(t).exe)
ALL_EXES  := $(TEST_EXES)

DATA_FILES := \
    tests/cat/test.txt          \
    tests/seek/big.txt          \
    tests/cblwav/speech.pcm

.PHONY: all tools lib tests check clean sdcc floppy run \
        size-check size-baseline host-tests sdbg-tests $(TESTS)

all: tools lib tests

tools:
	$(MAKE) -C toolchain/mkexe

lib:
	$(MAKE) -C libc
	$(MAKE) -C libbgi

check: tools
	$(MAKE) -C toolchain/mkexe check

tests:    $(TESTS)

$(TESTS): tools lib
	$(MAKE) -C tests/$@


# Generate big.txt if missing (gen_bigfile.py creates 100 KB marker file).
tests/seek/big.txt:
	cd tests/seek && python3 gen_bigfile.py big.txt 102400

# Собственный SDK-носитель: не изменяет диск MAME или приложения.
floppy: tests tests/seek/big.txt
	python3 $(MAKE_DISK) $(FLOPPY_IMG) $(ALL_EXES) $(DATA_FILES)
	@echo
	@echo "Floppy ready: $(FLOPPY_IMG)"
	@echo "Run:  make run MAME_HOME=/путь/к/MAME/runtime"

run: floppy
	python3 toolchain/run_sprinter_mame.py --mame-home "$(MAME_HOME)" --floppy "$(FLOPPY_IMG)"

# Модульные тесты под ucsim_z80.  Обвязка — testkit/, сами наборы лежат
# рядом с кодом, который проверяют.  MAME не нужна, идут за секунды;
# ucsim идёт в комплекте нашего SDCC.
# Тесты продуктов запускаются в собственных репозиториях.
HOST_TEST_DIRS := testkit

host-tests:
	@for d in $(HOST_TEST_DIRS); do $(MAKE) -C $$d || exit 1; done

# Отладочная карта: реальные SDCC/linker и протокол транспорта без MAME.
# Для local pyenv: pyenv exec make sdbg-tests.
sdbg-tests: tools lib
	python3 -m unittest discover -s tests/sdbg -v

# Размерный регресс: сверить _CODE всех программ с docs/size_baseline.tsv.
size-check:
	python3 toolchain/size_check.py

# Принять текущие размеры как эталон (после осознанных изменений).
size-baseline:
	python3 toolchain/size_check.py --update

clean:
	$(MAKE) -C toolchain/mkexe clean
	$(MAKE) -C libc clean
	$(MAKE) -C libbgi clean
	@for t in $(TESTS); do $(MAKE) -C tests/$$t clean; done

sdcc:
	bash third_party/setup-sdcc.sh
