# ============================================================
# Hikvision ISUP Client - Makefile
# ============================================================

# 项目名称
PROJECT_NAME := hikvision-isup-client
VERSION := 1.1.0

# 编译器设置
CC := gcc
CFLAGS := -Wall -Wextra -std=c11 -g -O2
CFLAGS += -D_GNU_SOURCE
CFLAGS += -I./include

# 构建目录 (必须在 OBJECTS 之前定义, 因为 OBJECTS 用 := 即时展开)
BUILD_DIR := build

# 库路径
LIB_PATH := ./libs
HCNETSDK_PATH ?= $(LIB_PATH)

# 目标文件
TARGET := $(PROJECT_NAME)

# 源文件
SRCDIR := src
INCDIR := include
SOURCES := $(wildcard $(SRCDIR)/*.c)
OBJECTS := $(patsubst $(SRCDIR)/%.c, $(BUILD_DIR)/%.o, $(SOURCES))

# HCNetSDK库文件(真实SDK部署时打开下行)
# HCNETSDK_LIBS := -L$(HCNETSDK_PATH) -lhcnetsdk -lPlayCtrl -lHCCore
HCNETSDK_LIBS ?=

# 其他依赖库
OTHER_LIBS := -lpthread -ldl -lm

# 最终链接库
ALL_LIBS := $(HCNETSDK_LIBS) $(OTHER_LIBS)

# 头文件依赖
HEADERS := $(wildcard $(INCDIR)/*.h)

# ============================================================
# 编译目标
# ============================================================

.PHONY: all clean cleanbuild install test simulate check help deploy deps

all: $(BUILD_DIR) $(TARGET)

# 创建构建目录
$(BUILD_DIR):
	mkdir -p $(BUILD_DIR)

# 链接可执行文件
$(TARGET): $(OBJECTS)
	$(CC) $(CFLAGS) -o $@ $^ $(ALL_LIBS)
	@echo "Build complete: $(TARGET)"
	@echo "Version: $(VERSION)"

# 编译源文件
$(BUILD_DIR)/%.o: $(SRCDIR)/%.c $(HEADERS)
	$(CC) $(CFLAGS) -c $< -o $@

# 清理
clean:
	rm -rf $(BUILD_DIR) $(TARGET)
	@echo "Clean complete"

# 清理并重新编译
cleanbuild: clean all
	@echo "Clean build complete"

# 安装
install: $(TARGET)
	install -d /usr/local/bin
	install -m 755 $(TARGET) /usr/local/bin/$(TARGET)
	@echo "Installed to /usr/local/bin/$(TARGET)"

# 仿真/模拟模式: 定义 HAVE_HCNETSDK=0 走内置Mock实现(无需真实SDK)
# 与源码 #ifndef HAVE_HCNETSDK 的模拟分支一致
simulate: clean
	$(MAKE) CFLAGS="$(CFLAGS) -DHAVE_HIKVISION_SIMULATION" all
	@echo "Simulation build complete (no actual SDK required)"

# 自测: 编译后以 -test 运行(不需要真实设备)
test: $(TARGET)
	./$(TARGET) -test

# 生成依赖文件
deps: $(BUILD_DIR) $(HEADERS)
	$(CC) $(CFLAGS) -MM $(SOURCES) > $(BUILD_DIR)/dependencies.mk

# 帮助
help:
	@echo "Hikvision ISUP Client Build System"
	@echo "=================================="
	@echo ""
	@echo "Targets:"
	@echo "  all         Build the project (default)"
	@echo "  clean       Remove build artifacts"
	@echo "  cleanbuild  Clean and rebuild"
	@echo "  install     Install to /usr/local/bin"
	@echo "  simulate    Build with simulation mode (no SDK needed)"
	@echo "  test        Build then run self-test (-test)"
	@echo "  check       Run cppcheck static analysis"
	@echo "  help        Show this help"
	@echo ""
	@echo "Examples:"
	@echo "  make            # Build"
	@echo "  make simulate   # Build without real SDK (mock)"
	@echo "  make test       # Build + self-test"

# 包含依赖文件
-include $(BUILD_DIR)/dependencies.mk

# ============================================================
# 部署脚本
# ============================================================

deploy: all
	@echo "Deploying $(TARGET)..."
	./scripts/deploy.sh $(TARGET)

# ============================================================
# 代码检查
# ============================================================

check:
	@echo "Running code checks..."
	@cppcheck --enable=all --suppress=missingIncludeSystem $(SRCDIR)/*.c 2>&1 || true
	@echo "Code check complete"
