# ========== 编译器和标志 ==========
CC = gcc
# 定义 _DEFAULT_SOURCE 以启用 usleep 等 POSIX 函数的声明
CFLAGS = -Wall -Wextra -std=c99 -D_DEFAULT_SOURCE
LDFLAGS = -lpn -lpthread -lrt

# ========== 目录配置 ==========
SRC_DIR = .
INC_DIR = ../include
LIB_DIR = ../lib
BUILD_DIR = build

# ========== 查找源文件和目标文件 ==========
SRCS = $(wildcard $(SRC_DIR)/*.c)
OBJS = $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%.o,$(SRCS))
BINS = $(patsubst $(SRC_DIR)/%.c,$(BUILD_DIR)/%,$(SRCS))

# ========== 包含目录和库目录 ==========
INCLUDES = -I$(INC_DIR)
LIBPATHS = -L$(LIB_DIR)

# ========== 默认目标 ==========
.PHONY: all
all: $(BINS)

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

# ========== 编译规则：.c -> .o ==========
$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c | $(BUILD_DIR)
	@echo "CC $<"
	$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@

# ========== 链接规则：.o -> 可执行文件 ==========
$(BUILD_DIR)/%: $(BUILD_DIR)/%.o
	@echo "LD $@"
	$(CC) $< $(LIBPATHS) $(LDFLAGS) -o $@

# ========== 清理目标 ==========
.PHONY: clean
clean:
	@echo "Cleaning..."
	rm -rf $(BUILD_DIR)
	@echo "Clean done"

# ========== 运行目标（可选） ==========
# 获取第一个参数作为目标程序
TARGET := $(filter-out run,$(MAKECMDGOALS))

.PHONY: run
run: all
	@echo "Running executables..."
ifeq ($(TARGET),)
	@for bin in $(BINS); do \
		echo "========================================"; \
		echo "Running: $$bin"; \
		echo "========================================"; \
		sudo $$bin || true; \
	done
else
	@echo "========================================"; \
	echo "Running: build/$(TARGET)"; \
	echo "========================================"; \
	sudo build/$(TARGET) || true;
endif

# 防止 make 将参数当作目标去构建
%:
	@:

# ========== 帮助信息 ==========
.PHONY: help
help:
	@echo "PCIE_PN Example Makefile"
	@echo ""
	@echo "Targets:"
	@echo "  all     - 编译所有示例程序 (默认)"
	@echo "  clean   - 清理编译产物"
	@echo "  run     - 编译并运行所有示例（需要 sudo 权限）"
	@echo "  help    - 显示此帮助信息"
	@echo ""
	@echo "Directories:"
	@echo "  Source:      $(SRC_DIR)"
	@echo "  Include:     $(INC_DIR)"
	@echo "  Library:     $(LIB_DIR)"
	@echo "  Build:       $(BUILD_DIR)"
	@echo ""
	@echo "Source files:"
	@echo "  $(SRCS)"
	@echo ""
	@echo "Output binaries:"
	@echo "  $(BINS)"

# ========== 调试信息（可选） ==========
.PHONY: info
info:
	@echo "Compiler:    $(CC)"
	@echo "CFLAGS:      $(CFLAGS)"
	@echo "LDFLAGS:     $(LDFLAGS)"
	@echo "INCLUDES:    $(INCLUDES)"
	@echo "LIBPATHS:    $(LIBPATHS)"
	@echo "Sources:     $(SRCS)"
	@echo "Objects:     $(OBJS)"
	@echo "Binaries:    $(BINS)"
