# Build lib/bgi256.lib + lib/bgi256_safe.lib — Sprinter BGI graphics driver (320×256×256).
#
# libbgi/ — самостоятельная графическая библиотека, отделённая от libc.
# Две driver-библиотеки собираются из одной исходной базы:
#   bgi256.lib       = common/*.rel + bgi256/*.rel  (fast, без bounds-check)
#   bgi256_safe.lib  = common/*.rel + bgi256/*.rel  (safe, с bounds-check)
# common/ — mode-agnostic: .rel компилируется в ОБЕ версии параллельно.
# bgi256/ — mode-specific leaf'ы.
#
# Каждый .c — отдельный .rel в архиве (1 публичная функция = 1 модуль);
# линкер тянет только нужные .rel → DCE на уровне файлов.
#
#   make               build lib/bgi256.lib + lib/bgi256_safe.lib (обе)
#   make fast          build только lib/bgi256.lib
#   make safe          build только lib/bgi256_safe.lib
#   make BUILD_SAFE=1  build только lib/bgi256_safe.lib (legacy)
#   make clean         remove build/ + обе библиотеки
#

PROJ_ROOT := $(abspath $(CURDIR)/..)
SDCC_BIN  := $(PROJ_ROOT)/third_party/sdcc/bin
SDCC      := $(SDCC_BIN)/sdcc
SDAR      := $(SDCC_BIN)/sdar

INC       := -I$(CURDIR)/include -I$(PROJ_ROOT)/libc/include

BUILD     := $(CURDIR)/build
COMMON_C  := $(wildcard $(CURDIR)/common/*.c)
BGI256_C  := $(wildcard $(CURDIR)/bgi256/*.c)

# Заголовки либы: любой .rel зависит от всех — правка _bgi.h/sprite.h/…
# пересобирает модули (иначе stale .rel со СТАРОЙ раскладкой sprite_t
# молча ломает рантайм — кусало 2026-07-14: sprite_moveto писал флаги
# по старому офсету, T4/T5 spranim FAIL).
HDRS      := $(wildcard $(CURDIR)/*.h $(CURDIR)/include/*.h)

COMMON_FAST_RELS  := $(patsubst $(CURDIR)/common/%.c,$(BUILD)/fast/common/%.rel,$(COMMON_C))
BGI256_FAST_RELS  := $(patsubst $(CURDIR)/bgi256/%.c,$(BUILD)/fast/bgi256/%.rel,$(BGI256_C))
COMMON_SAFE_RELS  := $(patsubst $(CURDIR)/common/%.c,$(BUILD)/safe/common/%.rel,$(COMMON_C))
BGI256_SAFE_RELS  := $(patsubst $(CURDIR)/bgi256/%.c,$(BUILD)/safe/bgi256/%.rel,$(BGI256_C))

LIB_DIR  := $(PROJ_ROOT)/lib
LIB_FAST   := $(LIB_DIR)/bgi256.lib
LIB_SAFE   := $(LIB_DIR)/bgi256_safe.lib

all: fast safe

fast: $(LIB_FAST)

safe: $(LIB_SAFE)

# --- Fast version: -DGFX_NOCHECK (guard'и выключены) ---

$(BUILD)/fast/common/%.rel: $(CURDIR)/common/%.c $(HDRS)
	@mkdir -p $(dir $@)
	$(SDCC) -mz80 --no-std-crt0 --std-c99 --opt-code-size -DGFX_NOCHECK --max-allocs-per-node 100000 $(INC) -c -o $@ $<

$(BUILD)/fast/bgi256/%.rel: $(CURDIR)/bgi256/%.c $(HDRS)
	@mkdir -p $(dir $@)
	$(SDCC) -mz80 --no-std-crt0 --std-c99 --opt-code-size -DGFX_NOCHECK --max-allocs-per-node 100000 $(INC) -c -o $@ $<

# --- Safe version: guard'и включены (по умолчанию) ---

$(BUILD)/safe/common/%.rel: $(CURDIR)/common/%.c $(HDRS)
	@mkdir -p $(dir $@)
	$(SDCC) -mz80 --no-std-crt0 --std-c99 --opt-code-size $(INC) -c -o $@ $<

$(BUILD)/safe/bgi256/%.rel: $(CURDIR)/bgi256/%.c $(HDRS)
	@mkdir -p $(dir $@)
	$(SDCC) -mz80 --no-std-crt0 --std-c99 --opt-code-size $(INC) -c -o $@ $<

# --- Archive: fast ---

$(BUILD)/fast/.have: $(COMMON_FAST_RELS) $(BGI256_FAST_RELS)
	@find $(BUILD)/fast -name '*.rel' -print | sort > $@ 2>/dev/null || true
	@printf '%s\n' $(COMMON_FAST_RELS) $(BGI256_FAST_RELS) | sort > $(BUILD)/fast/.want
	@comm -23 $(BUILD)/fast/.have $(BUILD)/fast/.want | while read f; do \
	    echo "  stale: $$f — rm"; \
	    rm -f "$$f" "$${f%.rel}.asm" "$${f%.rel}.lst" "$${f%.rel}.sym"; \
	done

$(LIB_FAST): $(COMMON_FAST_RELS) $(BGI256_FAST_RELS) $(BUILD)/fast/.have
	rm -f $@
	$(SDAR) -rcs $@ $(COMMON_FAST_RELS) $(BGI256_FAST_RELS)
	@echo "  Built $@ with $$(( $$(echo "$(words $(COMMON_FAST_RELS))") + $$(echo "$(words $(BGI256_FAST_RELS))") )) modules."

# --- Archive: safe ---

$(BUILD)/safe/.have: $(COMMON_SAFE_RELS) $(BGI256_SAFE_RELS)
	@find $(BUILD)/safe -name '*.rel' -print | sort > $@ 2>/dev/null || true
	@printf '%s\n' $(COMMON_SAFE_RELS) $(BGI256_SAFE_RELS) | sort > $(BUILD)/safe/.want
	@comm -23 $(BUILD)/safe/.have $(BUILD)/safe/.want | while read f; do \
	    echo "  stale: $$f — rm"; \
	    rm -f "$$f" "$${f%.rel}.asm" "$${f%.rel}.lst" "$${f%.rel}.sym"; \
	done

$(LIB_SAFE): $(COMMON_SAFE_RELS) $(BGI256_SAFE_RELS) $(BUILD)/safe/.have
	rm -f $@
	$(SDAR) -rcs $@ $(COMMON_SAFE_RELS) $(BGI256_SAFE_RELS)
	@echo "  Built $@ with $$(( $$(echo "$(words $(COMMON_SAFE_RELS))") + $$(echo "$(words $(BGI256_SAFE_RELS))") )) modules."

clean:
	rm -rf $(BUILD) $(LIB_FAST) $(LIB_SAFE)

.PHONY: all fast safe clean
