# SPDX-License-Identifier: BSD-3-Clause
# DPDK WebSocket Client - Makefile (DPDK 24.11)

APP = dpdk_ws_client
BUILD_DIR = build

# DPDK 24.11 pkg-config (meson build)
DPDK_BUILD = /home/wxj/share/dpdk-study/sources/dpdk-24.11/build
PKG_CONFIG_PATH := $(DPDK_BUILD)/meson-uninstalled

PKGCONF = PKG_CONFIG_PATH="$(PKG_CONFIG_PATH)" pkg-config

# Library: use libdpdk-libs for shared linking (PMDs loaded as plugins)
DPDK_CFLAGS := $(shell $(PKGCONF) --cflags libdpdk-libs 2>/dev/null || echo "ERROR: DPDK pkg-config not found")
DPDK_LIBS   := $(shell $(PKGCONF) --libs libdpdk-libs 2>/dev/null)

# Source files
SRCS := src/main.c
SRCS += src/tcp_core.c
SRCS += src/tcp_input.c
SRCS += src/tcp_output.c
SRCS += src/tcp_timer.c
SRCS += src/tcp_socket.c
SRCS += src/ws_client.c

OBJS := $(SRCS:%.c=$(BUILD_DIR)/%.o)
DEPS := $(OBJS:.o=.d)

CFLAGS  = -O2 -g -Wall -Wno-unused-parameter -Wno-unused-function
CFLAGS += -DALLOW_EXPERIMENTAL_API
CFLAGS += -Isrc/
CFLAGS += $(DPDK_CFLAGS)
LDFLAGS  = $(DPDK_LIBS) -lpthread -ldl -lnuma
LDFLAGS += -Wl,--allow-multiple-definition
LDFLAGS += -Wl,-rpath,$(DPDK_BUILD)/lib

.PHONY: all clean clean-all perf

all: $(BUILD_DIR)/$(APP)

# Performance test binary
PERF_SRCS := src/perf_test.c
PERF_SRCS += src/tcp_core.c
PERF_SRCS += src/tcp_input.c
PERF_SRCS += src/tcp_output.c
PERF_SRCS += src/tcp_timer.c
PERF_SRCS += src/tcp_socket.c
PERF_SRCS += src/ws_client.c
PERF_OBJS := $(PERF_SRCS:%.c=$(BUILD_DIR)/%.o)

perf: $(BUILD_DIR)/dpdk_perf
$(BUILD_DIR)/dpdk_perf: $(PERF_OBJS)
	@mkdir -p $(@D)
	PKG_CONFIG_PATH="$(PKG_CONFIG_PATH)" gcc $(PERF_OBJS) $(LDFLAGS) -o $@
	@echo "  LINK  $@"

-include $(DEPS)

$(BUILD_DIR)/$(APP): $(OBJS)
	@mkdir -p $(@D)
	PKG_CONFIG_PATH="$(PKG_CONFIG_PATH)" gcc $(OBJS) $(LDFLAGS) -o $@
	@echo "  LINK  $@"

$(BUILD_DIR)/%.o: %.c
	@mkdir -p $(@D)
	PKG_CONFIG_PATH="$(PKG_CONFIG_PATH)" gcc $(CFLAGS) -MMD -c $< -o $@
	@echo "  CC    $<"

clean:
	rm -rf $(BUILD_DIR)

clean-all: clean
	rm -f $(APP)
