aboutsummaryrefslogtreecommitdiffstats
path: root/docs/perf-triggers-design.rst
blob: 4a0232cde0fb9983a5f1a42bf07578b7cd7d8bc9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
Introduction
------------

Previous gerrit triggers for performance tests (
*vpp-csit-verify-hw-perf-{branch}* and *csit-vpp-verify-hw-perf-{branch}*) are
listed in [1]_ with jjb definition in [2]_. Mapping of triggers to CSIT test RF
tags [4]_ driving the selection of test cases for execution is listed in [3]_.

Previous mappings of trigger to RF tags
---------------------------------------

(vpp-csit job) vpp-verify-perf-{**keyword**} OR (csit-vpp job) verify-perf-{**keyword**}
  - **acl**:
     - 'mrrANDnic_intel-x520-da2AND1t1cANDacl'
     - 'mrrANDnic_intel-x520-da2AND2t2cANDacl'
  - **ip4**:
     - 'mrrANDnic_intel-x520-da2AND1t1cANDip4base'
     - 'mrrANDnic_intel-x520-da2AND1t1cANDip4fwdANDfib_2m'
  - **ip6**
     - 'mrrANDnic_intel-x520-da2AND1t1cANDip6base'
     - 'mrrANDnic_intel-x520-da2AND1t1cANDip6fwdANDfib_2m'
  - **ipsechw**
     - 'pdrdiscANDnic_intel-xl710AND1t1cANDipsechw'
     - 'pdrdiscANDnic_intel-xl710AND2t2cANDipsechw'
     - 'mrrANDnic_intel-xl710AND1t1cANDipsechw'
     - 'mrrANDnic_intel-xl710AND2t2cANDipsechw'
  - **l2**
     - 'mrrANDnic_intel-x520-da2AND1t1cANDl2xcbase'
     - 'mrrANDnic_intel-x520-da2AND1t1cANDl2bdbase'
     - 'mrrANDnic_intel-x520-da2AND1t1cANDdot1q'
     - '!lbond_dpdk'
  - **lisp**
     - 'mrrANDnic_intel-x520-da2AND1t1cANDlisp'
  - **memif**
     - 'pdrdiscANDnic_intel-x520-da2AND1t1cANDmemif'
     - 'pdrdiscANDnic_intel-x520-da2AND2t2cANDmemif'
     - 'mrrANDnic_intel-x520-da2AND1t1cANDmemif'
     - 'mrrANDnic_intel-x520-da2AND2t2cANDmemif'
  - **vhost**
     - 'mrrANDnic_intel-x520-da2AND1t1cANDvhost'
     - '!lbond_dpdk'
  - **vxlan**
     - 'mrrANDnic_intel-x520-da2AND1t1cANDvxlan'
  - **srv6**
     - 'mrrANDsrv6AND1t1c'
     - 'mrrANDsrv6AND2t2c'

Proposal for mapping triggers to RF tags
----------------------------------------

*Goal*
  make it simpler to use, scalable, parametrize and prepare for full CI/CD
  automation.

*Syntax*
  trigger_keyword [{tag1} {tag2}AND{tag3} !{tag4} !{tag5}]

*Inputs*
  - trigger_keyword for vpp-* jobs: 'perftest'
  - trigger_keyword for csit-* jobs: 'csit-perftest'
  - tags: existing CSIT tags [4]_ i.e. ip4base, ip6base, iacldst, memif

Set of default tags appended to user input, under control by CSIT
  - always-on for vpp-csit*.job: 'mrr' 'nic_intel_x710-da2' '1t1c'
  - if input with no tags, following set applied:
     - 'mrrANDnic_intel-x710AND1t1cAND64bANDip4base'
     - 'mrrANDnic_intel-x710AND1t1cAND78bANDip6base'
     - 'mrrANDnic_intel-x710AND1t1cAND64bANDl2bdbase'

Examples
  input: 'perftest'
    expanded: 'mrrANDnic_intel_x710-da2AND1t1cAND64bANDl2bdbase mrrANDnic_intel_x710-da2AND1t1cAND64bANDip4base mrrANDnic_intel_x710-da2AND1t1cAND78bANDip6base'
  input: 'perftest l2bdbase l2xcbase'
    expanded: 'mrrANDnic_intel_x710-da2ANDl2bdbase mrrANDnic_intel_x710-da2ANDl2xcbase'
  input: 'perftest ip4base !feature'
    expanded: 'mrrANDnic_intel_x710-da2ANDip4base' not 'feature'
  input: 'perftest ip4base !feature !lbond_dpdk'
    expanded: 'mrrANDnic_intel_x710-da2ANDip4base' not 'feature' not 'lbond_dpdk'
  input: 'perftestxyx ip4base !feature !lbond_dpdk'
    invalid: detected as error
  input: 'perftestip4base !feature !lbond_dpdk'
    invalid: detected as error
  input: 'perftest ip4base!feature!lbond_dpdk'
    invalid expand: 'mrrANDnic_intel_x710-da2ANDip4base!feature!lbond_dpdk'
    execution of RobotFramework will fail

Constrains
  Trigger keyword must be different for every job to avoid running multiple jobs
  at once. Trigger keyword must not be substring of job name or any other
  message printed by JJB bach to gerrit message which can lead to recursive
  execution.

Implementation
--------------

Implementation is separated into two projects.

CI-MANGEMENT
~~~~~~~~~~~~

https://gerrit.fd.io/r/#/c/13027/

Implementing new gerrit keyword `csit-perftest` in JJB for
*csit-vpp-perf-verify-{stream}* and `perftest` for
*vpp-csit-verify-hw-perf-{stream}* performance jobs.

::

  if [[ ${GERRIT_EVENT_TYPE} == 'comment-added' ]]; then
      TRIGGER=`echo ${GERRIT_EVENT_COMMENT_TEXT} \
          | grep -oE '(perftest$|perftest[[:space:]].+$)'`
  else
      TRIGGER=''
  fi
  # Export test type
  export TEST_TAG="VERIFY-PERF-PATCH"
  # Export test tags as string
  export TEST_TAG_STRING=${TRIGGER#$"perftest"}

Code is automatically detecting trigger type and parse the gerrit comment
massage. Stripped TAGs are exported as bash variable `$TEST_TAG_STRING` together
with `$TEST_TAG`.

CSIT
~~~~

https://gerrit.fd.io/r/#/c/13025/

Implementing `$TEST_TAG_STRING` variable post processing. String of TAGs is
automatically converted into array to be able to loop the items. If variable is
empty default set of TAGs is applied.

Array is then converted into Robot Framework parameter notation where every word
means new `--include` parameter. Having multiple words (multiple includes) means
logical OR in selection of test cases and could be applied to add additional
test cases that have no common more specific match. See exmaples section for
more details. Script also detects an exclamation mark before TAG that is
translated to as a `--exclude` parameter.

References
----------

.. [1] https://wiki.fd.io/view/CSIT/Jobs
.. [2] https://git.fd.io/ci-management/tree/jjb/vpp/vpp.yaml#n762
.. [3] https://git.fd.io/csit/tree/bootstrap-verify-perf.sh#n235
.. [4] https://git.fd.io/csit/tree/docs/tag_documentation.rst
class="cp">endif ISA_L_CRYPTO_VER := 2.18.0 ifeq ($(MACHINE),$(filter $(MACHINE),x86_64)) AESNI ?= y # DPDK pre 17.08 depends on ISA-L Crypto library for GCM PMD ifneq ($(firstword $(sort $(DPDK_VERSION), 17.08)), 17.08) ISA_L_CRYPTO_LIB = y IPSEC_MB_VER = 0.45 $(info Building ISA-L Crypto $(ISA_L_CRYPTO_VER) library) endif $(info Building IPSec-MB $(IPSEC_MB_VER) library) else AESNI ?= N endif AESNIMB_LIB_TARBALL := v$(IPSEC_MB_VER).tar.gz AESNIMB_LIB_TARBALL_URL := http://github.com/01org/intel-ipsec-mb/archive/$(AESNIMB_LIB_TARBALL) AESNIMB_LIB_SOURCE := $(B)/intel-ipsec-mb-$(IPSEC_MB_VER) ISA_L_CRYPTO_LIB_TARBALL := v$(ISA_L_CRYPTO_VER).tar.gz ISA_L_CRYPTO_LIB_TARBALL_URL := http://github.com/01org/isa-l_crypto/archive/$(ISA_L_CRYPTO_LIB_TARBALL) ISA_L_CRYPTO_LIB_SOURCE := $(B)/isa-l_crypto-$(ISA_L_CRYPTO_VER) ISA_L_CRYPTO_INSTALL_DIR := $(ISA_L_CRYPTO_LIB_SOURCE)/install ifneq (,$(findstring clang,$(CC))) DPDK_CC=clang else ifneq (,$(findstring icc,$(CC))) DPDK_CC=icc else DPDK_CC=gcc endif ############################################################################## # Intel x86 ############################################################################## ifeq ($(MACHINE),$(filter $(MACHINE),x86_64 i686)) DPDK_TARGET ?= $(MACHINE)-native-linuxapp-$(DPDK_CC) DPDK_MACHINE ?= nhm DPDK_TUNE ?= core-avx2 ############################################################################## # ARM64 ############################################################################## else ifeq ($(MACHINE),aarch64) export CROSS="" DPDK_TARGET ?= arm64-armv8a-linuxapp-$(DPDK_CC) DPDK_MACHINE ?= armv8a DPDK_TUNE ?= generic CPU_IMP_ARM = 0x41 CPU_IMP_CAVIUM = 0x43 CPU_PART_ARM_CORTEX_A53 = 0xd03 CPU_PART_ARM_CORTEX_A57 = 0xd07 CPU_PART_ARM_CORTEX_A72 = 0xd08 CPU_PART_ARM_CORTEX_A73 = 0xd09 CPU_PART_CAVIUM_THUNDERX = 0x0a1 CPU_PART_CAVIUM_THUNDERX_81XX = 0x0a2 CPU_PART_CAVIUM_THUNDERX_83XX = 0x0a3 MIDR_IMPLEMENTER=$(shell awk '/implementer/ {print $$4;exit}' /proc/cpuinfo) MIDR_PARTNUM=$(shell awk '/part/ {print $$4;exit}' /proc/cpuinfo) ifeq ($(MIDR_IMPLEMENTER),$(CPU_IMP_ARM)) ############################################################################## # Arm Cortex ############################################################################## CPU_PART_ARM_TUNE := $(CPU_PART_ARM_CORTEX_A53)/cortex-a53 \ $(CPU_PART_ARM_CORTEX_A57)/cortex-a57 \ $(CPU_PART_ARM_CORTEX_A72)/cortex-a72 \ $(CPU_PART_ARM_CORTEX_A73)/cortex-a73 CPU_TUNE = $(notdir $(filter $(MIDR_PARTNUM)/%,$(CPU_PART_ARM_TUNE))) ifneq ($(CPU_TUNE),) DPDK_TUNE = $(CPU_TUNE) else $(warning Unknown Arm CPU) endif else ifeq ($(MIDR_IMPLEMENTER),$(CPU_IMP_CAVIUM)) ############################################################################## # Cavium ThunderX ############################################################################## ifneq (,$(findstring $(MIDR_PARTNUM),$(CPU_PART_CAVIUM_THUNDERX) \ $(CPU_PART_CAVIUM_THUNDERX_81XX) $(CPU_PART_CAVIUM_THUNDERX_83XX))) DPDK_TARGET = arm64-thunderx-linuxapp-$(DPDK_CC) DPDK_MACHINE = thunderx else $(warning Unknown Cavium CPU) endif endif ############################################################################## # Unknown platform ############################################################################## else $(error Unknown platform) endif # /proc/cpuinfo does not exist on platforms without a /proc and on some # platforms, notably inside containers, it has no content. In those cases # we assume there's 1 processor; we use 2*ncpu for the -j option. # NB: GNU Make 4.2 will let us use '$(file </proc/cpuinfo)' to both test # for file presence and content; for now this will have to do. JOBS := $(if $(shell [ -f /proc/cpuinfo ] && head /proc/cpuinfo),\ $(shell grep -c ^processor /proc/cpuinfo), 2) # compiler/linker custom arguments DPDK_CPU_CFLAGS := -pie -fPIC ifeq ($(DPDK_DEBUG),n) DPDK_EXTRA_CFLAGS := -g -mtune=$(DPDK_TUNE) else DPDK_EXTRA_CFLAGS := -g -O0 endif ifeq ($(ISA_L_CRYPTO_LIB),y) DPDK_EXTRA_CFLAGS += -I$(ISA_L_CRYPTO_INSTALL_DIR)/include -Wl,-z,muldefs DPDK_EXTRA_LDFLAGS += -L$(I)/lib endif DPDK_MAKE_EXTRA_ARGS += AESNI_MULTI_BUFFER_LIB_PATH=$(AESNIMB_LIB_SOURCE) # assemble DPDK make arguments DPDK_MAKE_ARGS := -C $(DPDK_SOURCE) -j $(JOBS) \ T=$(DPDK_TARGET) \ RTE_CONFIG_TEMPLATE=../custom-config \ EXTRA_CFLAGS="$(DPDK_EXTRA_CFLAGS)" \ EXTRA_LDFLAGS="$(DPDK_EXTRA_LDFLAGS)" \ CPU_CFLAGS="$(DPDK_CPU_CFLAGS)" \ DESTDIR=$(I) \ $(DPDK_MAKE_EXTRA_ARGS) define set @if grep -q CONFIG_$1 $@ ; \ then sed -i -e 's/.*\(CONFIG_$1=\).*/\1$2/' $@ ; \ else echo CONFIG_$1=$2 >> $@ ; \ fi endef all: build $(B)/custom-config: $(B)/.patch.ok Makefile @echo --- generating custom config from $(DPDK_SOURCE)/config/defconfig_$(DPDK_TARGET) --- @cpp -undef -ffreestanding -x assembler-with-cpp $(DPDK_SOURCE)/config/defconfig_$(DPDK_TARGET) $@ $(call set,RTE_MACHINE,$(DPDK_MACHINE)) @# modify options $(call set,RTE_MAX_LCORE,256) $(call set,RTE_PKTMBUF_HEADROOM,$(DPDK_PKTMBUF_HEADROOM)) $(call set,RTE_LIBEAL_USE_HPET,y) $(call set,RTE_BUILD_COMBINE_LIBS,y) $(call set,RTE_PCI_CONFIG,y) $(call set,RTE_PCI_EXTENDED_TAG,"on") $(call set,RTE_PCI_MAX_READ_REQUEST_SIZE,4096) @# enable debug init for device drivers $(call set,RTE_LIBRTE_I40E_DEBUG_INIT,$(DPDK_DEBUG)) $(call set,RTE_LIBRTE_IXGBE_DEBUG_INIT,$(DPDK_DEBUG)) $(call set,RTE_LIBRTE_E1000_DEBUG_INIT,$(DPDK_DEBUG)) $(call set,RTE_LIBRTE_VIRTIO_DEBUG_INIT,$(DPDK_DEBUG)) $(call set,RTE_LIBRTE_VMXNET3_DEBUG_INIT,$(DPDK_DEBUG)) $(call set,RTE_LIBRTE_PMD_BOND,y) $(call set,RTE_LIBRTE_IP_FRAG,y) $(call set,RTE_LIBRTE_PMD_QAT,y) $(call set,RTE_LIBRTE_PMD_AESNI_MB,$(AESNI)) $(call set,RTE_LIBRTE_PMD_AESNI_GCM,$(AESNI)) $(call set,RTE_LIBRTE_MLX4_PMD,$(DPDK_MLX4_PMD)) $(call set,RTE_LIBRTE_MLX5_PMD,$(DPDK_MLX5_PMD)) @# not needed $(call set,RTE_LIBRTE_PMD_TAP,n) $(call set,RTE_LIBRTE_TIMER,n) $(call set,RTE_LIBRTE_CFGFILE,n) $(call set,RTE_LIBRTE_LPM,n) $(call set,RTE_LIBRTE_ACL,n) $(call set,RTE_LIBRTE_POWER,n) $(call set,RTE_LIBRTE_DISTRIBUTOR,n) $(call set,RTE_LIBRTE_PORT,n) $(call set,RTE_LIBRTE_TABLE,n) $(call set,RTE_LIBRTE_PIPELINE,n) $(call set,RTE_LIBRTE_FLOW_CLASSIFY,n) $(call set,RTE_KNI_KMOD,n) $(call set,RTE_EAL_IGB_UIO,n) @rm -f .config.ok $(CURDIR)/$(DPDK_TARBALL): @if [ -e $(DPDK_DOWNLOAD_DIR)/$(DPDK_TARBALL) ] ; \ then cp $(DPDK_DOWNLOAD_DIR)/$(DPDK_TARBALL) $(CURDIR) ; \ else curl -o $(CURDIR)/$(DPDK_TARBALL) -LO $(DPDK_TAR_URL) ; \ fi @rm -f $(B)/.download.ok $(CURDIR)/$(NASM_TARBALL): @if [ -e $(DPDK_DOWNLOAD_DIR)/$(NASM_TARBALL) ] ; \ then cp $(DPDK_DOWNLOAD_DIR)/$(NASM_TARBALL) $(CURDIR) ; \ else curl -o $(CURDIR)/$(NASM_TARBALL) -LO $(NASM_TAR_URL) ; \ fi $(CURDIR)/$(AESNIMB_LIB_TARBALL): @if [ -e $(DPDK_DOWNLOAD_DIR)/$(AESNIMB_LIB_TARBALL) ] ; \ then cp $(DPDK_DOWNLOAD_DIR)/$(AESNIMB_LIB_TARBALL) $(CURDIR) ; \ else curl -o $@ -LO $(AESNIMB_LIB_TARBALL_URL) ; \ fi $(CURDIR)/$(ISA_L_CRYPTO_LIB_TARBALL): @if [ -e $(DPDK_DOWNLOAD_DIR)/$(ISA_L_CRYPTO_LIB_TARBALL) ] ; \ then cp $(DPDK_DOWNLOAD_DIR)/$(ISA_L_CRYPTO_LIB_TARBALL) $(CURDIR) ; \ else curl -o $@ -LO $(ISA_L_CRYPTO_LIB_TARBALL_URL) ; \ fi DPDK_DOWNLOADS = $(CURDIR)/$(DPDK_TARBALL) ifeq ($(AESNI),y) DPDK_DOWNLOADS += $(CURDIR)/$(NASM_TARBALL) DPDK_DOWNLOADS += $(CURDIR)/$(AESNIMB_LIB_TARBALL) endif ifeq ($(ISA_L_CRYPTO_LIB),y) DPDK_DOWNLOADS += $(CURDIR)/$(ISA_L_CRYPTO_LIB_TARBALL) endif $(B)/.download.ok: $(DPDK_DOWNLOADS) @mkdir -p $(B) @openssl md5 $< | cut -f 2 -d " " - > $(B)/$(DPDK_TARBALL).md5sum @([ "$$(<$(B)/$(DPDK_TARBALL).md5sum)" = "$(DPDK_$(DPDK_VERSION)_TARBALL_MD5_CKSUM)" ] || \ ( echo "Bad Checksum! Please remove $< and retry" && \ rm $(B)/$(DPDK_TARBALL).md5sum && false )) @touch $@ .PHONY: download download: $(B)/.download.ok $(B)/.extract.ok: $(B)/.download.ok @echo --- extracting $(DPDK_TARBALL) --- @tar --directory $(B) --extract --file $(CURDIR)/$(DPDK_TARBALL) ifeq ($(AESNI),y) @echo --- extracting $(NASM_TARBALL) --- @tar --directory $(B) --extract --file $(CURDIR)/$(NASM_TARBALL) @echo --- extracting $(AESNIMB_LIB_TARBALL) --- @tar --directory $(B) --extract --file $(CURDIR)/$(AESNIMB_LIB_TARBALL) endif ifeq ($(ISA_L_CRYPTO_LIB),y) @echo --- extracting $(ISA_L_CRYPTO_LIB_TARBALL) --- @tar --directory $(B) --extract --file $(CURDIR)/$(ISA_L_CRYPTO_LIB_TARBALL) endif @touch $@ .PHONY: extract extract: $(B)/.extract.ok $(B)/.patch.ok: $(B)/.extract.ok ifneq ($(wildcard $(CURDIR)/dpdk-$(DPDK_VERSION)_patches/*.patch),) @echo --- patching --- @for f in $(CURDIR)/dpdk-$(DPDK_VERSION)_patches/*.patch ; do \ echo Applying patch: $$(basename $$f) ; \ patch -p1 -d $(DPDK_SOURCE) < $$f ; \ done endif @touch $@ .PHONY: patch patch: $(B)/.patch.ok $(B)/.config.ok: $(B)/.patch.ok $(B)/custom-config @make $(DPDK_MAKE_ARGS) config @touch $@ .PHONY: config config: $(B)/.config.ok .PHONY: build-nasm build-nasm: cd $(NASM_SOURCE) && sh configure && make -j .PHONY: build-ipsec-mb build-ipsec-mb: mkdir -p $(I)/lib/ # Do not build GCM stuff if we are building ISA_L make -C $(AESNIMB_LIB_SOURCE) -j NO_GCM=$(ISA_L_CRYPTO_LIB) \ DEBUG=$(DPDK_DEBUG) EXTRA_CFLAGS=-fPIC NASM=$(NASM_SOURCE)/nasm cp $(AESNIMB_LIB_SOURCE)/libIPSec_MB.a $(I)/lib/ .PHONY: build-isal-crypto build-isal-crypto: mkdir -p $(I)/lib/ cd $(ISA_L_CRYPTO_LIB_SOURCE) && ./autogen.sh && \ ./configure --prefix=$(ISA_L_CRYPTO_INSTALL_DIR) \ --libdir=$(ISA_L_CRYPTO_INSTALL_DIR)/lib CFLAGS='-fPIC -DPIC -O2' make -C $(ISA_L_CRYPTO_LIB_SOURCE) -j install cp $(ISA_L_CRYPTO_INSTALL_DIR)/lib/libisal_crypto.a $(I)/lib/ .PHONY: build-dpdk build-dpdk: @if [ ! -e $(B)/.config.ok ] ; then echo 'Please run "make config" first' && false ; fi @make $(DPDK_MAKE_ARGS) install # Order matters ifeq ($(AESNI),y) BUILD_TARGETS += build-nasm BUILD_TARGETS += build-ipsec-mb endif ifeq ($(ISA_L_CRYPTO_LIB),y) BUILD_TARGETS += build-isal-crypto endif BUILD_TARGETS += build-dpdk $(B)/.build.ok: $(BUILD_TARGETS) @touch $@ .PHONY: build build: $(B)/.build.ok .PHONY: install install: $(B)/.build.ok .PHONY: clean clean: @rm -rf $(B) $(I) ############################################################################## # .deb packaging ############################################################################## DEB_ARCH=$(shell dpkg --print-architecture 2> /dev/null) DEV_DEB=vpp-dpdk-dev_$(DPDK_VERSION)-$(PKG_SUFFIX)_$(DEB_ARCH).deb INSTALLED_DEB_VER=$(shell dpkg-query --showformat='$${Version}' --show vpp-dpdk-dev 2> /dev/null) .PHONY: build-deb install-deb check-deb deb/debian/changelog: Makefile @echo "vpp-dpdk ($(DPDK_VERSION)-$(PKG_SUFFIX)) unstable; urgency=low" > $@ @echo "" >> $@ @echo " * DPDK Release $(DPDK_VERSION)" >> $@ @echo "" >> $@ @echo " -- VPP Dev <vpp-dev@lists.fd.io> $(shell date -R)" >> $@ $(DEV_DEB): deb/debian/changelog @cd deb && dpkg-buildpackage -b -uc -us git clean -fdx deb build-deb: $(DEV_DEB) install-deb: ifneq ($(INSTALLED_DEB_VER),$(DPDK_VERSION)-$(PKG_SUFFIX)) @make $(DEV_DEB) @sudo dpkg -i $(DEV_DEB) else @echo "==========================================================" @echo " Up-to-date DPDK package already installed" @echo "==========================================================" endif check-deb: ifneq ($(INSTALLED_DEB_VER),$(DPDK_VERSION)-$(PKG_SUFFIX)) @echo "==========================================================" @echo " Outdated DPDK package detected:" @echo " Installed: vpp-dpdk-dev $(INSTALLED_DEB_VER)" @echo " Current: vpp-dpdk-dev $(DPDK_VERSION)-$(PKG_SUFFIX)" @echo "" @echo " Please upgrade by invoking 'make dpdk-install-dev'" @echo " from the top level directory." @echo "==========================================================" endif ############################################################################## # .rpm packaging ############################################################################## RPM_ARCH=$(shell rpm --eval "%{_arch}" 2> /dev/null) DEV_RPM=vpp-dpdk-devel-$(DPDK_VERSION)-$(PKG_SUFFIX).$(RPM_ARCH).rpm INSTALLED_RPM_VER=$(shell rpm -q --queryformat '%{VERSION}-%{RELEASE}' vpp-dpdk-devel 2> /dev/null | grep -v "not inst") .PHONY: build-rpm install-rpm check-rpm $(DEV_RPM): Makefile rpm/vpp-dpdk.spec @rpmbuild -bb \ --define "_topdir $(CURDIR)/rpm" \ --define "_version $(DPDK_VERSION)" \ --define "_release $(PKG_SUFFIX)" \ $(CURDIR)/rpm/vpp-dpdk.spec mv rpm/RPMS/$(RPM_ARCH)/*.rpm . git clean -fdx rpm build-rpm: $(DEV_RPM) install-rpm: ifneq ($(INSTALLED_RPM_VER),$(DPDK_VERSION)-$(PKG_SUFFIX)) @$(MAKE) $(DEV_RPM) sudo rpm -Uih $(DEV_RPM) else @echo "==========================================================" @echo " Up-to-date DPDK package already installed" @echo "==========================================================" endif check-rpm: ifneq ($(INSTALLED_RPM_VER),$(DPDK_VERSION)-$(PKG_SUFFIX)) @echo "==========================================================" @echo " Outdated DPDK package detected:" @echo " Installed: vpp-dpdk-devel $(INSTALLED_RPM_VER)" @echo " Current: vpp-dpdk-devel $(DPDK_VERSION)-$(PKG_SUFFIX)" @echo "" @echo " Please upgrade by invoking 'make dpdk-install-dev'" @echo " from the top level directory." @echo "==========================================================" endif ############################################################################## # ebuild support ############################################################################## .PHONY: ebuild-build ebuild-install ebuild-build: ifeq ($(INSTALLED_DEB_VER)$(INSTALLED_RPM_VER),) @echo "==========================================================" @echo "Building DPDK from source. Consider installing development" @echo "package by invoking 'make dpdk-install-dev' from the" @echo "top level directory" @echo "==========================================================" make config else ifneq ($(INSTALLED_DEB_VER),) make check-deb endif ifneq ($(INSTALLED_RPM_VER),) make check-rpm endif endif ebuild-install: ifeq ($(INSTALLED_DEB_VER)$(INSTALLED_RPM_VER),) make install endif