# Makefile
ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
INSTALL_DIR ?= /usr/local/share/kbdpdk
OUTPUT = out/
export RTE_SDK=$(ROOT_DIR)/DPDK/dpdk
export RTE_KMOD=$(ROOT_DIR)/DPDK/dpdk-kmods/linux/igb_uio

PKGCONF ?= pkg-config

ifneq ($(shell $(PKGCONF) --exists libdpdk && echo 0),0)
$(error "no installation of DPDK found")
endif

ifeq ($(RTE_SDK),)
	$(error "Please define RTE_SDK environment variable")
endif

CC=g++
CXX-suffix=cpp

# binary name
TARGETNAME := libkbapi.so
VERSION := $(shell cat $(ROOT_DIR)/version)
MAJOR := $(shell cut -d. -f1 $(ROOT_DIR)/version)
MINOR := $(shell cut -d. -f2 $(ROOT_DIR)/version)
LIB := $(TARGETNAME).$(VERSION)
LIBSONAME := $(TARGETNAME).$(MAJOR).$(MINOR)

LDFLAGS_STATIC = $(shell $(PKGCONF) --static --libs libdpdk)

SRCS-y := kbapi.o
PC_FILE := $(shell $(PKGCONF) --path libdpdk 2>/dev/null)
CFLAGS = -O3 -I/usr/local/include -DALLOW_EXPERIMENTAL_API
DYNAMIC_LIBS =-Wl,--no-whole-archive -lnuma -pthread -ldl -lm -lstdc++ 
LDFLAGS = -shared $(LDFLAGS_STATIC) $(DYNAMIC_LIBS)

# we must create the output dir first and recall the same Makefile
# from this directory
ifeq ($(NOT_FIRST_CALL),)

NOT_FIRST_CALL = 1
export NOT_FIRST_CALL

all:
	$(Q)cp $(RTE_SDK)/ABI_VERSION $(ROOT_DIR)
	$(CC) $(CFLAGS) $(LDFLAGS) -o $(LIB) $(SRCS-y)

%::
	$(Q)cp $(RTE_SDK)/ABI_VERSION $(ROOT_DIR)
	$(CC) $(CFLAGS) $(LDFLAGS) -o $(LIB) $(SRCS-y)
else
include $(RTE_SDK)/mk/rte.lib.mk
SONAME := $(LIBSONAME)
endif

install_all:
	$(Q)echo Install KBDPDK in $(INSTALL_DIR)
	$(Q)mkdir -p $(INSTALL_DIR)
	$(Q)mkdir -p $(INSTALL_DIR)/lib
	$(Q)mkdir -p $(INSTALL_DIR)/tools
	$(Q)mkdir -p $(INSTALL_DIR)/kmod
	$(Q)cp $(LIB) $(INSTALL_DIR)/lib
	$(Q)cp $(ROOT_DIR)/../tools/*.py $(INSTALL_DIR)/tools
	$(Q)cp $(RTE_SDK)/usertools/dpdk-devbind.py $(INSTALL_DIR)/tools
	$(Q)ln -nfrs $(INSTALL_DIR)/tools/kbcheck_compat.py /usr/local/sbin/kbcheck_compat.py
	$(Q)ln -nfrs $(INSTALL_DIR)/tools/kbcheck_config.py /usr/local/sbin/kbcheck_config.py
	$(Q)ln -nfrs $(INSTALL_DIR)/tools/kbconfig_setup.py /usr/local/sbin/kbconfig_setup.py
	$(Q)ln -nfrs $(INSTALL_DIR)/tools/kbconfig_apply.py /usr/local/sbin/kbconfig_apply.py
	$(Q)chmod +x /usr/local/sbin/kb*
	$(Q)ln -nfrs $(INSTALL_DIR)/tools/kbconfig_cleanup.py /usr/local/sbin/kbconfig_cleanup.py
	$(Q)ln -nfrs $(INSTALL_DIR)/tools/kbtools_disp_cores.py /usr/local/sbin/kbtools_disp_cores.py
	$(Q)ln -nfrs $(INSTALL_DIR)/tools/kbtools_disp_nics.py /usr/local/sbin/kbtools_disp_nics.py
	$(Q)cp $(RTE_KMOD)/*.ko $(INSTALL_DIR)/kmod
	$(Q)cp $(RTE_SDK)/build/kernel/linux/kni/*.ko $(INSTALL_DIR)/kmod
	$(Q)mkdir -p /etc/kbdpdk
	$(Q)cp -r $(ROOT_DIR)/../etc/* /etc
	$(Q)cp -r $(ROOT_DIR)/../boot/kbdpdk /etc/init.d
	$(Q)chmod +x /etc/init.d/kbdpdk
	$(Q)rm -f /etc/rc*.d/S*kbdpdk
	$(Q)install -m 644 $(ROOT_DIR)/../boot/kbdpdk.service /lib/systemd/system && systemctl enable kbdpdk.service
	$(Q)cp $(LIB) /usr/local/lib
	$(Q)ln -fs /usr/local/lib/$(LIB) /usr/local/lib/$(LIBSONAME)
	$(Q)ln -fs /usr/local/lib/$(LIBSONAME) /usr/local/lib/$(TARGETNAME)
	$(Q)ldconfig -n /usr/local/lib
	$(Q)ldconfig -X
