# cellar-cli-c — reimplementazione C del client CLI di Cellar
#
# Target principali:
#   make            -> dist/cellar-cli          (x86-64 statico, glibc)
#   make 32         -> dist/cellar-cli-i686     (i686 statico, per sistemi 32 bit)
#   make arm64      -> dist/cellar-cli-aarch64  (aarch64 statico via cross toolchain)
#   make dist       -> tutti e tre
#   make verify     -> controlla dipendenze, simboli GLIBC richiesti, ldd, size
#   make test       -> parity test contro il client Python (server mock incluso)
#   make asan       -> build dinamica con AddressSanitizer/UBSan per i test

CC          ?= gcc
AARCH64_CC  ?= $(HOME)/toolchains/arm-gnu-toolchain-13.2.Rel1-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc

CFLAGS      ?= -std=c99 -O2 -Wall -Wextra -Wno-unused-parameter
CPPFLAGS    += -D_POSIX_C_SOURCE=200809L -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Isrc -Ithird_party

SRCS  := $(wildcard src/*.c) third_party/miniz.c
DIST  := dist
NAME  := cellar-cli

.PHONY: all 32 arm64 dist verify test asan clean

all: $(DIST)/$(NAME)

$(DIST)/$(NAME): $(SRCS)
	@mkdir -p $(DIST)
	$(CC) $(CFLAGS) $(CPPFLAGS) -static -static-libgcc -s -o $@ $(SRCS)

$(DIST)/$(NAME)-i686: $(SRCS)
	@mkdir -p $(DIST)
	$(CC) -m32 $(CFLAGS) $(CPPFLAGS) -static -static-libgcc -s -o $@ $(SRCS)

$(DIST)/$(NAME)-aarch64: $(SRCS)
	@mkdir -p $(DIST)
	$(AARCH64_CC) $(CFLAGS) $(CPPFLAGS) -static -s -o $@ $(SRCS)

32: $(DIST)/$(NAME)-i686
arm64: $(DIST)/$(NAME)-aarch64
dist: all 32 arm64

# Build dinamica con sanitizzatori: usata dai test di parità.
$(DIST)/$(NAME)-asan: $(SRCS)
	@mkdir -p $(DIST)
	$(CC) -g -O1 -fsanitize=address,undefined -fno-omit-frame-pointer $(CFLAGS) $(CPPFLAGS) -o $@ $(SRCS)

asan: $(DIST)/$(NAME)-asan

verify: all
	tests/verify_binary.sh $(DIST)/$(NAME)

test: asan
	tests/parity_test.sh      # parita' col client Python (30 casi + artefatti)
	tests/progress_test.sh    # barra di avanzamento (pipe/PTY/plain/off)

clean:
	rm -rf $(DIST) build tests/tmp
