# *******************************************************************************
#
# Copyright (C) 2026 NETINT Technologies
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
#
# ******************************************************************************/

# ============================
#   Project configuration
# ============================
TARGET      := xcoder_p2p_cuda
COMMON_DIR  := ../../../libxcoder/source/examples/common
SRC_C       := ni_p2p_cuda.c $(COMMON_DIR)/ni_decode_utils.c $(COMMON_DIR)/ni_generic_utils.c $(COMMON_DIR)/ni_filter_utils.c $(COMMON_DIR)/ni_encode_utils.c
SRC_CU      := ni_draw_box_cuda.cu

OBJ_C       := $(SRC_C:.c=.o)
OBJ_CU      := $(SRC_CU:.cu=.o)
OBJ         := $(OBJ_C) $(OBJ_CU)

# ============================
#   Build type (Debug/Release)
# ============================
BUILD ?= Release

ifeq ($(BUILD),Debug)
    CFLAGS_COMMON    := -g -O0 -fno-omit-frame-pointer -rdynamic
    NVCCFLAGS_COMMON := -G -O0
else ifeq ($(BUILD),Release)
    CFLAGS_COMMON    := -O3 -DNDEBUG
    NVCCFLAGS_COMMON := -O3 -DNDEBUG
else
    $(error Unknown BUILD type '$(BUILD)'. Use Debug or Release)
endif

# ============================
#   Compiler settings
# ============================
CC      := gcc
NVCC    := nvcc

CFLAGS      := -std=c11 -Wall -Wextra -Wpedantic -Wno-unused-result $(CFLAGS_COMMON)
NVCCFLAGS   := -std=c++11 -Xcompiler "-Wall -Wextra -Wno-unused-result" $(NVCCFLAGS_COMMON)

# ============================
#   CUDA Toolkit
# ============================
CUDA_HOME ?= /usr/local/cuda
CUDA_INC  := $(CUDA_HOME)/include
CUDA_LIB  := $(CUDA_HOME)/lib64

INCLUDES  := -I$(CUDA_INC) -I$(COMMON_DIR)

LDFLAGS   := -L$(CUDA_LIB)
LDLIBS    := -lcuda -lcudart -lxcoder -lm

# ============================
#   Build rules
# ============================
all: $(TARGET)

%.o: %.c
	$(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@

%.o: %.cu
	$(NVCC) $(NVCCFLAGS) $(INCLUDES) -c $< -o $@

$(TARGET): $(OBJ)
	$(NVCC) $(NVCCFLAGS) $(LDFLAGS) $^ -o $@ $(LDLIBS)

# ============================
#   Shortcuts
# ============================
d:
	$(MAKE) BUILD=Debug

r:
	$(MAKE) BUILD=Release

# ============================
#   Cleaning
# ============================
clean:
	rm -f $(TARGET) $(OBJ)

.PHONY: all clean d r
