# Makefile
ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
INSTALL_DIR ?= /usr/local/share/kbdpdk
MODULE_DIR ?= /lib/modules/`uname -r`/extra/dpdk
OUTPUT = out/
export RTE_SDK=$(ROOT_DIR)/DPDK/dpdk-stable
export RTE_KMOD=$(ROOT_DIR)/DPDK/dpdk-kmods/linux/igb_uio

PKGCONF ?= pkg-config

ifeq ($(shell grep -q rhel /etc/os-release && echo 0),0)
export PKG_CONFIG_PATH=--with-path /usr/local/lib64/pkgconfig/
endif

ifneq ($(shell $(PKGCONF) --exists libdpdk $(PKG_CONFIG_PATH) && 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) $(PKG_CONFIG_PATH) --static --libs libdpdk)

SRCS-y := kbapi.o
PC_FILE := $(shell $(PKGCONF) $(PKG_CONFIG_PATH) --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)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)[ -f "../include/kbapi.h" ] && cp ../include/kbapi.h /usr/local/include/kbapi.h || return 0
	$(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)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)chmod +x /usr/local/sbin/kb*
	$(Q)cp $(RTE_KMOD)/*.ko $(MODULE_DIR)
	$(Q)depmod -a
	$(Q)mkdir -p /etc/kbdpdk
	$(Q)cp -r $(ROOT_DIR)/../etc/* /etc
	$(Q)mkdir -p /etc/init.d
	$(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 /usr/local/lib
	$(Q)ldconfig -X
