#!/usr/bin/make -f
# -*- makefile -*-
#export DH_VERBOSE=1
export DEB_BUILD_MAINT_OPTIONS = hardening=+all

# While -fPIC is often the default, we explicitly enable it for this package
# because it is a requirement for successful linking the static libopenvswitch
# with shared libraries used for the Python JSON C extension.
#
# Ref: https://patchwork.ozlabs.org/project/openvswitch/patch/20220725121939.2710272-5-i.maximets@ovn.org/
export DEB_CFLAGS_MAINT_APPEND = -fPIC

%:
	dh $@

execute_after_dh_autoreconf:
	patch -f --no-backup-if-mismatch -i $(CURDIR)/debian/ltmain-whole-archive.diff build-aux/ltmain.sh

ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
PARALLEL = -j$(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
else
PARALLEL =
endif

PYTHON3S:=$(shell py3versions -vr)
DEB_HOST_ARCH?=$(shell dpkg-architecture -qDEB_HOST_ARCH)

override_dh_auto_configure:
	test -d _debian || mkdir _debian
	cd _debian && ( \
		test -e Makefile || \
		../configure --prefix=/usr --localstatedir=/var --enable-ssl \
					 --sysconfdir=/etc \
					 $(DATAPATH_CONFIGURE_OPTS) \
					 $(EXTRA_CONFIGURE_OPTS) \
					 )
ifneq (,$(filter i386 amd64 ppc64el arm64 riscv64, $(DEB_HOST_ARCH)))
	test -d _dpdk || mkdir _dpdk
	cd _dpdk && ( \
		test -e Makefile || \
        ../configure --prefix=/usr --localstatedir=/var --enable-ssl \
                     --with-dpdk=shared --sysconfdir=/etc \
					 $(DATAPATH_CONFIGURE_OPTS) \
					 $(EXTRA_CONFIGURE_OPTS) \
					 )
endif


# NOTE(jamespage): by default, just run all tests
TEST_LIST =
TEST_LIST_DPDK =

# armhf:
#  30: bfd - check that BFD works together with RSTP   FAILED (bfd.at:829)
ifneq (,$(filter armhf, $(DEB_HOST_ARCH)))
TEST_LIST = 1-29 31-
TEST_LIST_DPDK = $(TEST_LIST)
endif # armhf

# mipsel:
#    20: bfd - bfd decay FAILED (bfd.at:396)
#    21: bfd - bfd decay
#   917: ofproto - asynchronous message control (OpenFlow 1.2) (ofproto.at:3183)
#   918: ofproto - asynchronous message control (OpenFlow 1.3) FAILED (ovs-macros.at:241)
#   927: ofproto - asynchronous message control (OpenFlow 1.3)  FAILED (ofproto.at:3405)
#   919: ofproto - asynchronous message control (OpenFlow 1.4) FAILED (ovs-ofctl)
#  1035: ofproto-dpif - select group with weights
#  1036: ofproto-dpif - select group with weights        FAILED (ofproto-dpif.at:787)
#  1057: ofproto-dpif - controller action without megaflows FAILED (ofproto-dpif.at:1893)
#  1069: ofproto-dpif - controller action without megaflows
#  1102: ofproto-dpif - continuation - resubmit FAILED (ovs-macros.at:241)
#  1071: ofproto-dpif - controller action without megaflows
#  1072: ofproto-dpif - controller action without megaflows FAILED (ofproto-dpif.at:2145)
#  1136: ofproto-dpif - sFlow packet sampling - LACP structures
ifneq (,$(filter mipsel, $(DEB_HOST_ARCH)))
TEST_LIST = 1-19 22-531 533-916 920-926 928-1020 1022-1034 1037-1056 1058-1068 1070 1073-1101 1103-1135 1137-
TEST_LIST_DPDK = $(TEST_LIST)
endif # mipsel

# mips64el:
#    20: bfd - bfd decay FAILED (bfd.at:396)
#  1033: ofproto-dpif - select group with weights
#  1035: ofproto-dpif - select group with weights
#  1057: ofproto-dpif - controller action without megaflows FAILED (ofproto-dpif.at:1893)
#  1021: ofproto-dpif - select group with weights        FAILED (ofproto-dpif.at:535)
#  1069: ofproto-dpif - controller action without megaflows
ifneq (,$(filter mips64el, $(DEB_HOST_ARCH)))
TEST_LIST = 1-19 22-531 533-1020 1022-1032 1034 1037-1056 1058-1068 1070 1072-1120 1122-
TEST_LIST_DPDK = $(TEST_LIST)
endif # mips64el

# armel:
#    27: bfd - check that BFD works together with RSTP   FAILED (bfd.at:830)
#  1021: ofproto-dpif - select group with weights        FAILED (ofproto-dpif.at:535)
#  1123: ofproto-dpif - sFlow packet sampling - LACP structures FAILED (ofproto-dpif.at:6643)
ifneq (,$(filter armel, $(DEB_HOST_ARCH)))
TEST_LIST = 1-19 22-26 28-531 533-1020 1022-1056 1058-1122 1124-
TEST_LIST_DPDK = $(TEST_LIST)
endif #armel

# arm64:
#   159: ofp-actions - inconsistent MPLS actions         FAILED (ofp-actions.at:819)
#  1021: ofproto-dpif - select group with weights        FAILED (ofproto-dpif.at:535)
#  1057: ofproto-dpif - controller action without megaflows FAILED (ofproto-dpif.at:1893)
ifneq (,$(filter arm64, $(DEB_HOST_ARCH)))
TEST_LIST = 1-19 21-158 160-531 533-1020 1022-1056 1058-
TEST_LIST_DPDK = $(TEST_LIST)
endif #arm64

# alpha
#  2724: ovn -- dns lookup : 1 HV, 2 LS, 2 LSPs/LS       FAILED (ovn.at:7451)
#  2728: ovn -- vlan traffic for external network with distributed router gateway port FAILED (ovn.at:8563)
#  2737: ovn -- IPv6 periodic RA                         FAILED (ovn.at:9916)
ifneq (,$(filter alpha, $(DEB_HOST_ARCH)))
TEST_LIST = 1-19 22-531 533-2723 2725-2727 2729-2736 2738-
TEST_LIST_DPDK = $(TEST_LIST)
endif #alpha

# hppa
#    20: bfd - bfd decay FAILED (bfd.at:314)
#   758: tunnel - input with matching tunnel mask        FAILED (tunnel.at:132)
#   847: ofproto - bundle del group (OpenFlow 1.5) FAILED (ofproto.at:813)
#   850: ofproto - bundle remove group buckets FAILED (ofproto.at:1005)
#   916: ofproto - asynchronous message control (OpenFlow 1.0) FAILED (ovs-macros.at:241)
#   917: ofproto - asynchronous message control (OpenFlow 1.2) FAILED (ovs-macros.at:241)
#   919: ofproto - asynchronous message control (OpenFlow 1.4) FAILED (ovs-ofctl)
#   918: ofproto - asynchronous message control (OpenFlow 1.3) FAILED (ofproto.at:3371)
#   942: ofproto - flow monitoring pause and resume FAILED (ofproto.at:4850)
#   945: ofproto - asynchronous message control (OpenFlow 1.3) FAILED (ovs-macros.at:242)
#   946: ofproto - asynchronous message control (OpenFlow 1.4) FAILED (ofproto.at:3638)
#  1033: ofproto-dpif - masked set-field into metadata FAILED (ofproto-dpif.at:860)
#  1021: ofproto-dpif - select group with weights FAILED (ofproto-dpif.at:535)
#  1053: ofproto-dpif - balance-tcp bonding rebalance after link state changes FAILED (ofproto-dpif.at:482)
#  1057: ofproto-dpif - controller action without megaflows FAILED (ofproto-dpif.at:1893)
#  1102: ofproto-dpif - continuation - resubmit FAILED (ovs-macros.at:241)
#  1105: ofproto-dpif - continuation - mirroring FAILED (ovs-macros.at:241)
#  1123: ofproto-dpif - sFlow packet sampling - LACP structures FAILED (ofproto-dpif.at:6643)
#  1155: ofproto-dpif - continuation - resubmit - OpenFlow10 FAILED (ovs-macros.at:242)
#  1156: ofproto-dpif - continuation - resubmit - OpenFlow13 FAILED (ovs-macros.at:242)
#  1159: ofproto-dpif - continuation - goto_table - OpenFlow10 FAILED (ovs-macros.at:242)
#  1160: ofproto-dpif - continuation - goto_table - OpenFlow13 FAILED (ovs-macros.at:242)
#  1161: ofproto-dpif - continuation - write_metadata - OpenFlow10 FAILED (ovs-macros.at:242)
#  1162: ofproto-dpif - continuation - write_metadata - OpenFlow13 FAILED (ovs-macros.at:242)
#  1181: ofproto - bundle with variable bfd/cfm config   FAILED (ofproto-dpif.at:8749)
#  1187: ofproto-dpif - sFlow packet sampling - LACP structures FAILED (ofproto-dpif.at:7205)
#  1209: ofproto-dpif - conntrack - zones                FAILED (ofproto-dpif.at:9898)
#  1735: ovsdb-server combines updates on backlogged connections FAILED (ovsdb-server.at:1205)
#  1806: ovsdb-server transaction history size           FAILED (ovsdb-server.at:1282)
#  2193: RSTP - dummy interface FAILED (rstp.at:210)
ifneq (,$(filter hppa, $(DEB_HOST_ARCH)))
TEST_LIST = 1-19 22-531 533-757 759-846 848-849 851-915 920-941 943-944 947-1020 1022-1052 1054-1056 1058-1101 1103-1104 1106-1122 1124-1154 1157-1158 1163-1180 1182-1186 1188-1208 1210-1734 1736-1805 1807-2192 2194-
TEST_LIST_DPDK = $(TEST_LIST)
endif #hppa

# sparc64
#    20: bfd - bfd decay                                 FAILED (bfd.at:396)
#    26: bfd - check that BFD works together with RSTP   FAILED (bfd.at:829)
#   478: fuzz regression - ofp_print_fuzzer-5395207246839808 FAILED (fuzz-regression.at:12)
#   927: ofproto - bundle packet-out makes bundle commit to fail(OpenFlow 1.4) FAILED (ofproto.at:2181)
#   945: ofproto - asynchronous message control (OpenFlow 1.3) FAILED (ovs-macros.at:242)
#   969: ofproto - flow monitoring pause and resume      FAILED (ofproto.at:4851)
#   998: PMD - monitor threads                           FAILED (pmd.at:660)
#  1057: ofproto-dpif - controller action without megaflows FAILED (ofproto-dpif.at:1893)
#  1155: ofproto-dpif - continuation - resubmit - OpenFlow10 FAILED (ovs-macros.at:242)
#  1156: ofproto-dpif - continuation - resubmit - OpenFlow13 FAILED (ovs-macros.at:242)
#  1187: ofproto-dpif - sFlow packet sampling - LACP structures FAILED (ofproto-dpif.at:7205)
#  2184: STP - dummy interface                           FAILED (stp.at:439)
#  2185: STP - flush the fdb and mdb when topology changed FAILED (stp.at:529)
#  2249: auto-attach - packets                           FAILED (auto-attach.at:5)
ifneq (,$(filter sparc64, $(DEB_HOST_ARCH)))
TEST_LIST = 1-19 22-25 27-477 479-531 533-926 928-944 946-968 970-997 999-1056 1058-1154 1157-1186 1188-2183 2186-2248 2250-
TEST_LIST_DPDK = $(TEST_LIST)
endif #sparc64

# riscv64
#  758: tunnel - input with matching tunnel mask        FAILED (tunnel.at:132)
#  945: ofproto - asynchronous message control (OpenFlow 1.3) FAILED (ofproto.at:3372)
#  946: ofproto - asynchronous message control (OpenFlow 1.4) FAILED (ovs-macros.at:242)
#  969: ofproto - flow monitoring pause and resume      FAILED (ofproto.at:4851)
#  1036: ofproto-dpif - select group with weights        ok
#  1038: ALB - min num PMD/RxQ                           FAILED (ovs-macros.at:242)
#  1039: ALB - cross-numa                                FAILED (ovs-macros.at:242)
#  1040: ALB - PMD/RxQ assignment type                   FAILED (ovs-macros.at:242)
#  1069: ofproto-dpif - select group with weights        FAILED (ofproto-dpif.at:863)
#  1072: ofproto-dpif - controller action without megaflows FAILED (ofproto-dpif.at:2145)
#  1105: ofproto-dpif - controller action without megaflows FAILED (ofproto-dpif.at:2221)
#  1153: ofproto-dpif - continuation - actions - OpenFlow10 FAILED (ovs-macros.at:242)
#  1154: ofproto-dpif - continuation - actions - OpenFlow13 FAILED (ovs-macros.at:242)
#  1155: ofproto-dpif - continuation - resubmit - OpenFlow10 FAILED (ovs-macros.at:242)
#  1156: ofproto-dpif - continuation - resubmit - OpenFlow13 FAILED (ovs-macros.at:242)
#  1159: ofproto-dpif - continuation - goto_table - OpenFlow10 FAILED (ovs-macros.at:242)
#  1160: ofproto-dpif - continuation - goto_table - OpenFlow13 FAILED (ovs-macros.at:242)
#  1161: ofproto-dpif - continuation - write_metadata - OpenFlow10 FAILED (ovs-macros.at:242)
#  1162: ofproto-dpif - continuation - write_metadata - OpenFlow13 FAILED (ovs-macros.at:242)
#  1163: ofproto-dpif - continuation - data stack - OpenFlow10 FAILED (ovs-macros.at:242)
#  1164: ofproto-dpif - continuation - data stack - OpenFlow13 FAILED (ovs-macros.at:242)
#  1167: ofproto-dpif - continuation - patch ports - OpenFlow10 FAILED (ovs-macros.at:242)
#  1168: ofproto-dpif - continuation - patch ports - OpenFlow13 FAILED (ovs-macros.at:242)
#  1187: ofproto-dpif - sFlow packet sampling - LACP structures FAILED (ofproto-dpif.at:7205)
#  1805: ovsdb-server combines updates on backlogged connections FAILED (ovsdb-server.at:1213)
#  1806: ovsdb-server transaction history size           FAILED (ovsdb-server.at:1282)
ifneq (,$(filter riscv64, $(DEB_HOST_ARCH)))
TEST_LIST = 1-19 22-531 533-757 759-944 947-968 970-1020 1022-1035 1037 1041-1056 1058-1068 1070-1071 1073-1104 1106-1152 1157-1158 1165-1166 1169-1186 1188-1804 1807-
TEST_LIST_DPDK = $(TEST_LIST)
endif #riscv64

# ia64
#    20: bfd - bfd decay                                 FAILED (bfd.at:396)
#  1021: ofproto-dpif - select group with weights        FAILED (ofproto-dpif.at:535)
#  1057: ofproto-dpif - controller action without megaflows FAILED (ofproto-dpif.at:1893)
ifneq (,$(filter ia64, $(DEB_HOST_ARCH)))
TEST_LIST = 1-19 22-531 533-1020 1022-1056 1058-
TEST_LIST_DPDK = $(TEST_LIST)
endif #ia64

override_dh_auto_test:
ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
	if $(MAKE) -C _debian check TESTSUITEFLAGS='$(PARALLEL) $(TEST_LIST)' || \
                $(MAKE) -C _debian check TESTSUITEFLAGS='--recheck'; then :; \
	else \
		cat _debian/tests/testsuite.log; \
		exit 1; \
	fi
# Skip DPDK testing on arm64 as builders don't have crc32 support
# which is used in aarch64 based crc optimization in ovs >= 2.12.0~
ifneq (,$(filter i386 amd64 ppc64el riscv64, $(DEB_HOST_ARCH)))
	if $(MAKE) -C _dpdk check TESTSUITEFLAGS='$(PARALLEL) $(TEST_LIST_DPDK)' || \
				$(MAKE) -C _dpdk check TESTSUITEFLAGS='--recheck'; then :; \
	else \
		cat _dpdk/tests/testsuite.log; \
		exit 1; \
	fi
endif # i386/amd64/ppc64el
endif # nocheck

override_dh_auto_build:
	dh_auto_build --sourcedirectory=_debian -- dist distdir=openvswitch
	dh_auto_build --sourcedirectory=_debian
ifneq (,$(filter i386 amd64 ppc64el arm64 riscv64, $(DEB_HOST_ARCH)))
	dh_auto_build --sourcedirectory=_dpdk
endif

execute_before_dh_auto_clean:
	find . -name "*.pyc" -delete

override_dh_auto_install:
	dh_auto_install --sourcedirectory=_debian

execute_after_dh_install:
	set -e && for pyvers in $(PYTHON3S); do \
		cd python; \
		export PKG_CONFIG_PATH=$(CURDIR)/debian/tmp/usr/lib/pkgconfig; \
		export PKG_CONFIG_SYSROOT_DIR=$(CURDIR)/debian/tmp; \
		export PKG_CONFIG_SYSTEM_INCLUDE_PATH=/; \
		export PKG_CONFIG_SYSTEM_LIBRARY_PATH=/; \
		enable_shared=no \
		extra_cflags="`pkg-config --cflags libopenvswitch`" \
		extra_libs="-Wl,-Bstatic -lopenvswitch -Wl,-Bdynamic `pkg-config --libs --static libopenvswitch`" \
		python$$pyvers setup.py install --install-layout=deb \
			--root $(CURDIR)/debian/python3-openvswitch; \
		cd ..; \
		mkdir -p $(CURDIR)/debian/openvswitch-test/usr/lib/python$$pyvers/dist-packages/ovstest; \
		install -v -D python/ovstest/*.py \
			$(CURDIR)/debian/openvswitch-test/usr/lib/python$$pyvers/dist-packages/ovstest; \
	done

override_dh_installinit:
	dh_installinit --restart-after-upgrade
	dh_installinit -popenvswitch-switch --name=ovsdb-server --no-start
	dh_installinit -popenvswitch-switch --name=ovs-vswitchd --no-start
	dh_installinit -popenvswitch-switch --name=ovs-record-hostname --no-start

override_dh_installsystemd:
	dh_installsystemd -popenvswitch-switch --name=ovsdb-server --no-start
	dh_installsystemd -popenvswitch-switch --name=ovs-vswitchd --no-start
	dh_installsystemd -popenvswitch-switch --name=ovs-record-hostname --no-start
	dh_installsystemd --restart-after-upgrade -Xovs-vswitchd.service -Xovsdb-server.service -Xovs-record-hostname.service

override_dh_strip:
	dh_strip --dbgsym-migration='openvswitch-dbg (<< 2.17~)'

override_dh_python3:
	DEB_HOST_ARCH=$(DEB_HOST_ARCH) dh_python3 --shebang=/usr/bin/python3

# Helper target for creating snapshots from upstream git
DATE=$(shell date +%Y%m%d)
# Upstream branch to track
BRANCH=branch-3.1
VERSION=3.1.0

get-orig-snapshot:
	rm -Rf openvswitch-upstream
	git clone --branch $(BRANCH) --depth 1 https://github.com/openvswitch/ovs openvswitch-upstream
	cd openvswitch-upstream && \
		export COMMIT=`git rev-parse --short HEAD` && \
		git archive --format tgz --prefix=openvswitch-$(VERSION)~git$(DATE).$$COMMIT/ \
			-o ../../openvswitch_$(VERSION)~git$(DATE).$$COMMIT.orig.tar.gz $(BRANCH)
	rm -Rf openvswitch-upstream
