# Hikvision ISUP client - Raspberry Pi 5 (aarch64) + x86_64 compatible build
UNAME_M := $(shell uname -m)
ARCH    ?= $(UNAME_M)
CC      ?= gcc

SRCDIR  := src
INCDIR  := include
BUILD   := build
OBJDIR  := $(BUILD)/obj-$(ARCH)
TARGET  := $(BUILD)/hikvision-isup-client-$(ARCH)

CFLAGS  := -std=gnu11 -O2 -Wall -Wextra -Wno-unused-parameter -pthread \
           -I$(INCDIR) -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE
LDFLAGS := -pthread -ldl -lrt -lm

CORE_SRCS := $(SRCDIR)/portable.c $(SRCDIR)/config.c $(SRCDIR)/platform.c \
             $(SRCDIR)/stream.c $(SRCDIR)/playback.c $(SRCDIR)/alarm.c $(SRCDIR)/main.c
STUB      := $(SRCDIR)/isup_stub.c
CORE_OBJS := $(patsubst $(SRCDIR)/%.c,$(OBJDIR)/%.o,$(CORE_SRCS))

.PHONY: all simulate test run clean dirs
all: dirs $(TARGET)-real
simulate: dirs $(TARGET)-sim

# core objects (shared). -DISUP_SIM only affects the stub via #ifdef, so one
# set of object files works for both builds because non-stub files never
# reference stub-only internals; but to be strict we build sim into separate objs.
$(OBJDIR)/%.o: $(SRCDIR)/%.c
	$(CC) $(CFLAGS) -c $< -o $@

$(TARGET)-real: $(CORE_OBJS)
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) -L./libs -lHCNetSDK || \
	 (echo "real build needs vendor libHCNetSDK in ./libs (Pi5 aarch64)."; echo "use: make simulate"; exit 2)
	@echo "REAL build: $@"

$(TARGET)-sim: $(CORE_OBJS) $(OBJDIR)/isup_stub.o
	$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)
	@echo "SIM build: $@"

$(OBJDIR)/isup_stub.o: $(STUB)
	$(CC) $(CFLAGS) -DISUP_SIM -c $< -o $@

dirs:
	@mkdir -p $(OBJDIR) $(BUILD)

test: simulate
	@$(TARGET)-sim -t

run: simulate
	@$(TARGET)-sim -c config.ini -s

clean:
	@rm -rf build; echo cleaned
