CC ?= gcc
CFLAGS ?= -std=c11 -Wall -Wextra -O2 -pthread -D_GNU_SOURCE
CPPFLAGS ?= -Iinclude -Ithird_party/cjson -Ithird_party/kcp
LDFLAGS ?= -pthread

BIN_DIR := bin
SRC_DIR := src
CMD_DIR := cmd

COMMON_SRCS := \
	$(SRC_DIR)/omni_common.c \
	$(SRC_DIR)/protocol.c \
	$(SRC_DIR)/latencylog.c \
	$(SRC_DIR)/tx_timestamp_debug.c \
	$(SRC_DIR)/kcp_packet_debug.c \
	$(SRC_DIR)/kcp_session_stats.c \
	$(SRC_DIR)/linux_timestamping.c \
	$(SRC_DIR)/interactive.c \
	$(SRC_DIR)/transport_udp.c \
	$(SRC_DIR)/transport_kcp.c \
	$(SRC_DIR)/server_udp_relay.c \
	$(SRC_DIR)/server_udp_hub.c \
	$(SRC_DIR)/server_kcp_hub.c \
	$(SRC_DIR)/peer_udp_client.c \
	$(SRC_DIR)/peer_kcp_client.c \
	third_party/cjson/cJSON.c \
	third_party/kcp/ikcp.c

TARGETS := \
	$(BIN_DIR)/udpserver \
	$(BIN_DIR)/udppeer \
	$(BIN_DIR)/udpping \
	$(BIN_DIR)/udprelay \
	$(BIN_DIR)/kcpserver \
	$(BIN_DIR)/kcppeer \
	$(BIN_DIR)/kcpping

all: $(TARGETS)

$(BIN_DIR):
	mkdir -p $(BIN_DIR)

$(BIN_DIR)/udpserver: $(CMD_DIR)/udpserver.c $(COMMON_SRCS) | $(BIN_DIR)
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^ $(LDFLAGS)

$(BIN_DIR)/udppeer: $(CMD_DIR)/udppeer.c $(COMMON_SRCS) | $(BIN_DIR)
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^ $(LDFLAGS)

$(BIN_DIR)/udpping: $(CMD_DIR)/udpping.c $(COMMON_SRCS) | $(BIN_DIR)
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^ $(LDFLAGS)

$(BIN_DIR)/udprelay: $(CMD_DIR)/udprelay.c $(COMMON_SRCS) | $(BIN_DIR)
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^ $(LDFLAGS)

$(BIN_DIR)/kcpserver: $(CMD_DIR)/kcpserver.c $(COMMON_SRCS) | $(BIN_DIR)
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^ $(LDFLAGS)

$(BIN_DIR)/kcppeer: $(CMD_DIR)/kcppeer.c $(COMMON_SRCS) | $(BIN_DIR)
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^ $(LDFLAGS)

$(BIN_DIR)/kcpping: $(CMD_DIR)/kcpping.c $(COMMON_SRCS) | $(BIN_DIR)
	$(CC) $(CFLAGS) $(CPPFLAGS) -o $@ $^ $(LDFLAGS)

clean:
	rm -rf $(BIN_DIR)

.PHONY: all clean
