# Makefile

ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
INSTALL_DIR ?= /usr/local/share/kbdpdk
export RTE_SDK=$(ROOT_DIR)/DPDK/dpdk-stable-19.11.1

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

CC=g++
CXX-suffix=cpp
# Default target, can be overriden by command line or environment
RTE_TARGET ?= x86_64-native-linux-gcc
# Ignore the value, calling for side effects
IGNORE := $(shell ln -nsf $(ROOT_DIR)/DPDK/dpdk-stable-19.11.1/build $(ROOT_DIR)/DPDK/dpdk-stable-19.11.1/$(RTE_TARGET)))

include $(RTE_SDK)/mk/rte.vars.mk
# 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)

SRCS-y := kbapi.o
CONFIG_RTE_BUILD_SHARED_LIB = y
LDLIBS += -L$(RTE_SDK)/$(RTE_TARGET)/lib -Wl,--whole-archive -ldpdk -Wl,--no-whole-archive -lstdc++ -lnuma -pthread -ldl -lm

MAKEFLAGS += --no-print-directory
EXTLIB_BUILD := y

# 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)mkdir -p $(RTE_OUTPUT)
	$(Q)cp $(SRCS-y) $(RTE_OUTPUT)
	$(Q)cp $(RTE_SDK)/ABI_VERSION $(ROOT_DIR)
	$(Q)$(MAKE) -C $(RTE_OUTPUT) -f $(RTE_EXTMK) \
		S=$(RTE_SRCDIR) O=$(RTE_OUTPUT) SRCDIR=$(RTE_SRCDIR)

%::
	$(Q)mkdir -p $(RTE_OUTPUT)
	$(Q)rm -f $(RTE_OUTPUT)/*.o
	$(Q)cp $(SRCS-y) $(RTE_OUTPUT)
	$(Q)cp $(RTE_SDK)/ABI_VERSION $(ROOT_DIR)
	$(Q)$(MAKE) -C $(RTE_OUTPUT) -f $(RTE_EXTMK) $@ \
		S=$(RTE_SRCDIR) O=$(RTE_OUTPUT) SRCDIR=$(RTE_SRCDIR)
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 $(RTE_OUTPUT)/$(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)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_SDK)/build/kmod/*.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)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 $(RTE_OUTPUT)/$(LIB) /usr/local/lib
	$(Q)ln -fs /usr/local/lib/$(LIBSONAME) /usr/local/lib/$(TARGETNAME)
	$(Q)ldconfig -n /usr/local/lib
	$(Q)ldconfig -X
