#!/usr/bin/make -f
# See debhelper(7) (uncomment to enable)
# output every command that modifies files on the build system.
export DH_VERBOSE=1
export DH_OPTIONS=-v

export PREFIX := /opt/mellanox/dpdk

DPDK_ABI := $(shell echo $(DEB_VERSION_UPSTREAM) | cut -d '-' -f1 | cut -d '.'  -f1-2 | cut -d '~' -f1)
DPDK_DRIVER_DIR ?= dpdk-$(DPDK_ABI)-drivers

export RTE_DEVEL_BUILD=n
export EXTRA_CFLAGS+=-g

export DH_VERBOSE=1
export DH_OPTIONS=-v

ifneq (,$(filter $(DEB_HOST_ARCH), arm64))
DPDK_CONFIG ?= "arm64-armv8a-linux-gcc"
RTE_MACHINE ?= "armv8a"
RTE_TARGET ?= "arm64-armv8a-linux-gcc"
INCLUDE_ARCH := arm
else
ifneq (,$(filter $(DEB_HOST_ARCH), ppc64el))
DPDK_CONFIG ?= "ppc_64-power8-linux-gcc"
RTE_MACHINE ?= "power8"
RTE_TARGET ?= "ppc_64-power8-linux-gcc"
INCLUDE_ARCH := ppc_64
else
DPDK_CONFIG ?= "$(DEB_HOST_GNU_CPU)-native-linux-gcc"
RTE_MACHINE ?= "default"
RTE_TARGET ?= "$(DEB_HOST_GNU_CPU)-native-linux-gcc"
INCLUDE_ARCH := x86
endif
endif
DPDK_STATIC_DIR = "debian/build/static-root"
DPDK_SHARED_DIR = "debian/build/shared-root"

# now stable with parallel comilation, so support -j
ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
    PAR := $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
    MAKEFLAGS += -j$(PAR)
endif

BUILD_DOCS=n
export DEB_BUILD_PROFILES += nodoc

ifneq (,$(findstring static,$(DEB_BUILD_OPTIONS)))
CONFIG_RTE_BUILD_SHARED_LIB=n
TARGET := $(DPDK_STATIC_DIR)
EXCLUDE := --exclude .so.* --exclude .so
SHARED := n
else
CONFIG_RTE_BUILD_SHARED_LIB=y
TARGET := $(DPDK_SHARED_DIR)
EXCLUDE := --exclude .a
SHARED := y
endif
CONFIG_RTE_MAX_ETHPORTS=256
DPDK_TARGET := $(RTE_TARGET)

%:
	dh $@ --with python3,systemd

override_dh_auto_clean:
	rm -rf debian/build debian/tmp debian/dpdk-modules-* \
		debian/control.modules debian/VERSION

override_dh_auto_configure:
	# Add support for a custom defconfig file in the debian directory.
ifneq (,$(filter dpdk_config=%,$(DEB_BUILD_OPTIONS)))
	test -e config/defconfig_$(DPDK_CONFIG) || ln -fs ../debian/defconfig_$(DPDK_CONFIG) config/defconfig_$(DPDK_CONFIG)
endif
	# report dpkg-buildflags status to build log
	dpkg-buildflags --status
	echo EXTRA_CFLAGS $$EXTRA_CFLAGS
	echo EXTRA_LDFLAGS: $$EXTRA_LDFLAGS
	$(MAKE) V=$(DH_VERBOSE) O=$(TARGET) RTE_TARGET=$(RTE_TARGET) T=$(DPDK_CONFIG) config
ifeq (,$(filter dpdk_config=%,$(DEB_BUILD_OPTIONS)))
	sed -ri -e 's,(RTE_MACHINE=).*,\1$(RTE_MACHINE),' \
		-e 's,(CONFIG_RTE_LIBRTE_MLX5_PMD=).*,\1y,' \
		-e 's,(CONFIG_RTE_LIBRTE_MLX5_VDPA_PMD=).*,\1y,' \
		-e 's,(CONFIG_RTE_LIBRTE_MLX4_PMD=).*,\1n,' \
		-e 's,(CONFIG_RTE_IBVERBS_LINK_DLOPEN=).*,\1n,' \
		-e 's,(CONFIG_RTE_IBVERBS_LINK_STATIC=).*,\1n,' \
		-e 's,(RTE_NEXT_ABI=).*,\1n,' \
		-e 's,(CONFIG_RTE_EAL_IGB_UIO=).*,\1n,' \
		-e 's,(CONFIG_RTE_LIBRTE_KNI=).*,\1n,' \
		-e 's,(CONFIG_RTE_KNI_KMOD=).*,\1n,' \
		-e 's,(LIBRTE_PMD_PCAP=).*,\1y,' \
		-e 's,(CONFIG_RTE_EAL_PMD_PATH=).*,\1"$(PREFIX)/lib/",' \
		-e 's,(CONFIG_RTE_BUILD_SHARED_LIB=).*,\1$(CONFIG_RTE_BUILD_SHARED_LIB),' \
		-e 's,(CONFIG_RTE_MAX_ETHPORTS=).*,\1$(CONFIG_RTE_MAX_ETHPORTS),' \
		-e 's,(.*_FLOW_CLASSIFY=).*,\1n,' \
		-e 's,(.*IFPGA.*=).*,\1n,' \
		-e 's,(.*ARK_PMD=).*,\1n,' \
		-e 's,(.*ATLANTIC_PMD=).*,\1n,' \
		-e 's,(.*AVP_PMD=).*,\1n,' \
		-e 's,(.*AXGBE_PMD=).*,\1n,' \
		-e 's,(.*BNXT_PMD=).*,\1n,' \
		-e 's,(.*CXGBE_PMD=).*,\1n,' \
		-e 's,(.*FSLMC.*=).*,\1n,' \
		-e 's,(.*DPAA.*=).*,\1n,' \
		-e 's,(.*DPAAX=).*,\1y,' \
		-e 's,(.*PFE_PMD=).*,\1n,' \
		-e 's,(.*ENA_PMD=).*,\1n,' \
		-e 's,(.*ENETC_PMD=).*,\1n,' \
		-e 's,(.*ENIC_PMD=).*,\1n,' \
		-e 's,(.*EM_PMD=).*,\1n,' \
		-e 's,(.*IGB_PMD=).*,\1n,' \
		-e 's,(.*IFC_PMD=).*,\1n,' \
		-e 's,(.*IXGBE_PMD=).*,\1n,' \
		-e 's,(.*I40E_PMD=).*,\1n,' \
		-e 's,(.*FM10K_PMD=).*,\1n,' \
		-e 's,(.*HINIC_PMD=).*,\1n,' \
		-e 's,(.*HNS3_PMD=).*,\1n,' \
		-e 's,(.*ICE_PMD=).*,\1n,' \
		-e 's,(.*IAVF_PMD=).*,\1n,' \
		-e 's,(.*NFP_PMD=).*,\1n,' \
		-e 's,(.*QEDE_PMD=).*,\1n,' \
		-e 's,(.*SFC_EFX_PMD=).*,\1n,' \
		-e 's,(.*PMD_SOFTNIC=).*,\1n,' \
		-e 's,(.*THUNDERX.*=).*,\1n,' \
		-e 's,(.*OCTEON.*=).*,\1n,' \
		-e 's,(.*LIO_PMD=).*,\1n,' \
		-e 's,(.*_BBDEV.*=).*,\1n,' \
		-e 's,(.*_CRYPTO.*=).*,\1n,' \
		-e 's,(.*_SECURITY=).*,\1n,' \
		-e 's,(.*_COMPRESS.*=).*,\1n,' \
		-e 's,(.*_EVENTDEV=).*,\1n,' \
		-e 's,(.*_RAWDEV=).*,\1n,' \
		-e 's,(.*_IPSEC=).*,\1n,' \
		-e 's,(.*_LIBRTE_PORT=).*,\1n,' \
		-e 's,(.*_LIBRTE_TABLE=).*,\1n,' \
		-e 's,(.*_LIBRTE_PIPELINE=).*,\1n,' \
		-e 's,(.*_APP_TEST=).*,\1n,' \
		-e 's,(.*_PROC_INFO=).*,\1n,' \
		$(TARGET)/.config
endif
	echo "CONFIG_RTE_MAJOR_ABI=\"$(DPDK_ABI)\"" >> \
		$(TARGET)/.config
	cp $(TARGET)/.config .config

override_dh_auto_build-indep:

override_dh_missing:
	dh_missing $(EXCLUDE)

override_dh_auto_install-indep:

override_dh_auto_build-arch:

	echo TARGET = $(TARGET)
	$(MAKE) V=$(DH_VERBOSE) O=$(TARGET) RTE_TARGET=$(RTE_TARGET)
	$(MAKE) V=$(DH_VERBOSE) O=$(TARGET) RTE_TARGET=$(RTE_TARGET) test-build

override_dh_auto_install-arch: LIBDIR=$(PREFIX)/lib
override_dh_auto_install-arch:

	$(MAKE) V=$(DH_VERBOSE) O=$(TARGET) RTE_TARGET=$(RTE_TARGET) prefix=$(PREFIX) libdir=$(LIBDIR) \
		DESTDIR=debian/mlnx-dpdk install
	mkdir -p debian/mlnx-dpdk/etc/mlnx-dpdk
	cp debian/mlnx-dpdk.interfaces debian/mlnx-dpdk/etc/mlnx-dpdk/interfaces
	mkdir -p debian/mlnx-dpdk$(PREFIX)/sbin
	rm -f debian/mlnx-dpdk$(PREFIX)/sbin/dpdk-devbind
	ln -s $(PREFIX)/share/dpdk/usertools/dpdk-devbind.py \
		debian/mlnx-dpdk$(PREFIX)/sbin/dpdk-devbind
	if [ -d debian/mlnx-dpdk/usr/share ] ; then \
		mkdir -p debian/mlnx-dpdk$(PREFIX)/share; \
		rsync -av debian/mlnx-dpdk/usr/share/* debian/mlnx-dpdk$(PREFIX)/share; \
		rm -rf debian/mlnx-dpdk/usr; \
	fi
	if [ "$(SHARED)" = y ]; then \
		mkdir -p debian/mlnx-dpdk/etc/ld.so.conf.d; \
		echo "$(PREFIX)/lib" > debian/mlnx-dpdk/etc/ld.so.conf.d/mlnx-dpdk.conf; \
	fi

	# Package: mlnx-dpdk-dev (build environment)
	# workaround to fix symbolic link creation
	mkdir -p debian/mlnx-dpdk-dev$(PREFIX)/share/dpdk
	mkdir -p debian/mlnx-dpdk-dev/$(LIBDIR)
	$(MAKE) V=$(DH_VERBOSE) O=$(TARGET) RTE_TARGET=$(RTE_TARGET) prefix=/usr libdir=$(LIBDIR) \
		DESTDIR=debian/mlnx-dpdk-dev install-sdk
	sed -e 's/SDK_TARGET/$(RTE_TARGET)/' debian/dpdk-sdk-env.sh.in > \
		debian/mlnx-dpdk-dev$(PREFIX)/share/dpdk/dpdk-sdk-env.sh
	# include the bundled autotest suite to be usable from the dpdk-dev package
	if test -e $(TARGET)/.config; then \
	if grep -qs 'CONFIG_RTE_APP_TEST=y' $(TARGET)/.config; then \
		mkdir -p debian/mlnx-dpdk-dev$(PREFIX)/share/dpdk/test; \
		cp -a test/test/autotest* debian/mlnx-dpdk-dev$(PREFIX)/share/dpdk/test; \
		cp $(TARGET)/app/test debian/mlnx-dpdk-dev$(PREFIX)/share/dpdk/test/; \
		cp $(TARGET)/app/testacl debian/mlnx-dpdk-dev$(PREFIX)/share/dpdk/test/; \
		cp $(TARGET)/app/testpipeline debian/mlnx-dpdk-dev$(PREFIX)/share/dpdk/test/; \
	fi; \
	fi
	rm -rf debian/mlnx-dpdk-dev$(PREFIX)/include
	mkdir -p debian/mlnx-dpdk-dev$(PREFIX)/include
	rsync -av debian/mlnx-dpdk$(PREFIX)/include/* debian/mlnx-dpdk-dev$(PREFIX)/include/
	rm -rf debian/mlnx-dpdk$(PREFIX)/include
	rsync -av debian/mlnx-dpdk$(PREFIX)/share/* debian/mlnx-dpdk-dev$(PREFIX)/share/
	rm -rf debian/mlnx-dpdk$(PREFIX)/share
	rm -rf debian/mlnx-dpdk-dev$(PREFIX)/share/dpdk/$(RTE_TARGET)/lib
	mkdir -p debian/mlnx-dpdk-dev$(PREFIX)/share/dpdk/$(RTE_TARGET)/lib
	if [ "$(SHARED)" = y ]; then \
		mv debian/mlnx-dpdk/$(LIBDIR)/*.so debian/mlnx-dpdk-dev$(PREFIX)/share/dpdk/$(RTE_TARGET)/lib; \
		mv $(TARGET)/lib/*.so debian/mlnx-dpdk-dev$(PREFIX)/share/dpdk/$(RTE_TARGET)/lib; \
		cp $(TARGET)/lib/*.so.* debian/mlnx-dpdk-dev$(PREFIX)/share/dpdk/$(RTE_TARGET)/lib; \
		mv $(TARGET)/lib/*.so.* debian/mlnx-dpdk$(LIBDIR); \
	else \
		mv debian/mlnx-dpdk/$(LIBDIR)/*.a debian/mlnx-dpdk-dev$(PREFIX)/share/dpdk/$(RTE_TARGET)/lib; \
		mv $(TARGET)/lib/*.a debian/mlnx-dpdk-dev$(PREFIX)/share/dpdk/$(RTE_TARGET)/lib; \
	fi
	ln -s lib debian/mlnx-dpdk$(LIBDIR)-glue
	# genereate the preinst to deal with the symlink -> directory transition smoothly
	sed "s/@@RTE_TARGET@@/$(RTE_TARGET)/g" debian/mlnx-dpdk-dev.preinst.in > debian/mlnx-dpdk-dev.preinst
	if [ -d debian/mlnx-dpdk-dev/usr/share ] ; then \
		mkdir -p debian/mlnx-dpdk-dev$(PREFIX)/share; \
		rsync -av debian/mlnx-dpdk-dev/usr/share/* debian/mlnx-dpdk-dev$(PREFIX)/share; \
		rm -rf debian/mlnx-dpdk-dev/usr; \
	fi

override_dh_shlibdeps:
	dh_shlibdeps -l$(PREFIX)/lib

override_dh_installinit:
	dh_installinit --no-start --no-stop-on-upgrade

override_dh_systemd_start:
	dh_systemd_start --no-start --no-stop-on-upgrade

override_dh_auto_test:

override_dh_python3:
	# dh_python only looks in /usr/share/package_name but dpdk-doc installs in
	# /usr/share/dpdk, so pass /usr to catch all
	# dh_python3 --shebang=$(PREFIX)/bin/python3 $(PREFIX)
