# CAN 协议栈 — 顶层 Makefile
# 构建协议栈库和测试程序
#
# 交叉编译：
#   export CC=aarch64-buildroot-linux-gnu-gcc
#   make
#
# 本地测试（PC + vcan）：
#   make HOST=1

# ---- 交叉编译器设置 ----
# 参考创龙 RK3568 SDK 的工具链路径
CROSS_COMPILE ?= aarch64-buildroot-linux-gnu-
CC            ?= $(CROSS_COMPILE)gcc

# ---- 构建选项 ----
CFLAGS   = -Wall -g -O2 -std=gnu99
INCLUDES = -Iinclude
LDFLAGS  =
LIBS     = -lpthread -lrt

# 如果是本地编译（不用交叉工具链）
ifdef HOST
    CC      = gcc
    CFLAGS += -DHOST_BUILD
endif

# ---- 目录 ----
SRC_DIR  = src
INC_DIR  = include
APP_DIR  = app
BUILD_DIR = build

# ---- 源文件 ----
SRC      = $(wildcard $(SRC_DIR)/*.c)
OBJS     = $(SRC:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.o)

APP_SRC  = $(APP_DIR)/test_protocol.c
APP_OBJ  = $(BUILD_DIR)/test_protocol.o

# ---- 目标 ----
LIB_TARGET  = $(BUILD_DIR)/libcanprot.a
APP_TARGET  = $(BUILD_DIR)/can_test

.PHONY: all lib app clean install

all: lib app

lib: $(LIB_TARGET)

app: $(APP_TARGET)

# 确保 build 目录存在
$(BUILD_DIR):
	mkdir -p $(BUILD_DIR)

# 编译协议栈库
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c | $(BUILD_DIR)
	$(CC) -c $< -o $@ $(INCLUDES) $(CFLAGS)

$(LIB_TARGET): $(OBJS)
	$(AR) rcs $@ $^

# 编译测试程序
$(BUILD_DIR)/test_protocol.o: $(APP_DIR)/test_protocol.c | $(BUILD_DIR)
	$(CC) -c $< -o $@ $(INCLUDES) $(CFLAGS)

$(APP_TARGET): $(APP_OBJ) $(LIB_TARGET)
	$(CC) $(CFLAGS) -o $@ $(APP_OBJ) -L$(BUILD_DIR) -lcanprot $(LDFLAGS) $(LIBS)

# 清理
clean:
	rm -rf $(BUILD_DIR)

# 安装到目标板
install:
	cp $(APP_TARGET) $(PREFIX)/can_test

# 显示构建信息
info:
	@echo "编译器:    $(CC)"
	@echo "CFLAGS:    $(CFLAGS)"
	@echo "源文件:    $(SRC)"
	@echo "目标文件:  $(OBJS)"
	@echo "库:        $(LIB_TARGET)"
	@echo "测试程序:  $(APP_TARGET)"
