# Copyright (c) 2021 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at: # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. export WS_ROOT=$(CURDIR) export BR=$(WS_ROOT)/build-root CCACHE_DIR?=$(BR)/.ccache SHELL:=/bin/bash GDB?=gdb PLATFORM?=vpp SAMPLE_PLUGIN?=no STARTUP_DIR?=$(PWD) MACHINE=$(shell uname -m) SUDO?=sudo -E DPDK_CONFIG?=no-pci ,:=, define disable_plugins $(if $(1), \ "plugins {" \ $(patsubst %,"plugin %_plugin.so { disable }",$(subst $(,), ,$(1))) \ " }" \ ,) endef MINIMAL_STARTUP_CONF=" \ unix { \ interactive \ cli-listen /run/vpp/cli.sock \ gid $(shell id -g) \ $(if $(wildcard startup.vpp),"exec startup.vpp",) \ } \ $(if $(DPDK_CONFIG), "dpdk { $(DPDK_CONFIG) }",) \ $(call disable_plugins,$(DISABLED_PLUGINS)) \ " GDB_ARGS= -ex "handle SIGUSR1 noprint nostop" # # OS Detection # # We allow Darwin (MacOS) for docs generation; VPP build will still fail. ifneq ($(shell uname),Darwin) OS_ID = $(shell grep '^ID=' /etc/os-release | cut -f2- -d= | sed -e 's/\"//g') OS_VERSION_ID= $(shell grep '^VERSION_ID=' /etc/os-release | cut -f2- -d= | sed -e 's/\"//g') endif ifeq ($(filter ubuntu debian,$(OS_ID)),$(OS_ID)) PKG=deb else ifeq ($(filter rhel centos fedora opensuse-leap,$(OS_ID)),$(OS_ID)) PKG=rpm endif # +libganglia1-dev if building the gmond plugin DEB_DEPENDS = curl build-essential autoconf automake ccache DEB_DEPENDS += debhelper dkms git libtool libapr1-dev dh-python DEB_DEPENDS += libconfuse-dev git-review exuberant-ctags cscope pkg-config DEB_DEPENDS += lcov chrpath autoconf libnuma-dev DEB_DEPENDS += python3-all python3-setuptools check DEB_DEPENDS += libffi-dev python3-ply DEB_DEPENDS += cmake ninja-build uuid-dev python3-jsonschema python3-yaml DEB_DEPENDS += python3-venv # ensurepip DEB_DEPENDS += python3-dev python3-pip DEB_DEPENDS += libnl-3-dev libnl-route-3-dev libmnl-dev # DEB_DEPENDS += enchant # for docs DEB_DEPENDS += python3-virtualenv DEB_DEPENDS += libssl-dev DEB_DEPENDS += libelf-dev # for libbpf (af_xdp) DEB_DEPENDS += iperf3 # for 'make test TEST=vcl' DEB_DEPENDS += nasm LIBFFI=libffi6 # works on all but 20.04 and debian-testing ifeq ($(OS_VERSION_ID),20.04) DEB_DEPENDS += python3-virtualenv DEB_DEPENDS += libssl-dev DEB_DEPENDS += libelf-dev # for libbpf (af_xdp) DEB_DEPENDS += clang clang-format-11 LIBFFI=libffi7 DEB_DEPENDS += enchant-2 # for docs else ifeq ($(OS_VERSION_ID),20.10) DEB_DEPENDS += clang clang-format-11 LIBFFI=libffi8ubuntu1 else ifeq ($(OS_ID)-$(OS_VERSION_ID),debian-10) DEB_DEPENDS += virtualenv else ifeq ($(OS_ID)-$(OS_VERSION_ID),debian-11) DEB_DEPENDS += virtualenv DEB_DEPENDS += clang clang-format-11 LIBFFI=libffi7 else DEB_DEPENDS += clang-11 clang-format-11 LIBFFI=libffi7 DEB_DEPENDS += enchant-2 # for docs endif DEB_DEPENDS += $(LIBFFI) RPM_DEPENDS = redhat-lsb glibc-static RPM_DEPENDS += apr-devel RPM_DEPENDS += numactl-devel RPM_DEPENDS += check check-devel RPM_DEPENDS += selinux-policy selinux-policy-devel RPM_DEPENDS += ninja-build RPM_DEPENDS += libuuid-devel RPM_DEPENDS += ccache RPM_DEPENDS += xmlto RPM_DEPENDS += elfutils-libelf-devel RPM_DEPENDS += libnl3-devel libmnl-devel RPM_DEPENDS += nasm ifeq ($(OS_ID),fedora) RPM_DEPENDS += dnf-utils RPM_DEPENDS += subunit subunit-devel RPM_DEPENDS += compat-openssl10-devel RPM_DEPENDS += python3-devel # needed for python3 -m pip install psutil RPM_DEPENDS += python3-ply # for vppapigen RPM_DEPENDS += python3-virtualenv python3-jsonschema RPM_DEPENDS += cmake RPM_DEPENDS_GROUPS = 'C Development Tools and Libraries' else ifeq ($(OS_ID)-$(OS_VERSION_ID),centos-8) RPM_DEPENDS += yum-utils RPM_DEPENDS += compat-openssl10 openssl-devel RPM_DEPENDS += python2-devel python36-devel python3-ply RPM_DEPENDS += python3-virtualenv python3-jsonschema RPM_DEPENDS += libarchive cmake RPM_DEPENDS_GROUPS = 'Development Tools' else RPM_DEPENDS += yum-utils RPM_DEPENDS += openssl-devel RPM_DEPENDS += python36-ply # for vppapigen RPM_DEPENDS += python3-devel python3-pip RPM_DEPENDS += python-virtualenv python36-jsonschema RPM_DEPENDS += devtoolset-9 devtoolset-9-libasan-devel RPM_DEPENDS += cmake3 RPM_DEPENDS_GROUPS = 'Development Tools' endif # +ganglia-devel if building the ganglia plugin RPM_DEPENDS += chrpath libffi-devel rpm-build RPM_DEPENDS_DEBUG = glibc-debuginfo e2fsprogs-debuginfo RPM_DEPENDS_DEBUG += krb5-debuginfo openssl-debuginfo RPM_DEPENDS_DEBUG += zlib-debuginfo nss-softokn-debuginfo RPM_DEPENDS_DEBUG += yum-plugin-auto-update-debug-info RPM_SUSE_BUILDTOOLS_DEPS = autoconf automake ccache check-devel chrpath RPM_SUSE_BUILDTOOLS_DEPS += clang cmake indent libtool make ninja python3-ply RPM_SUSE_DEVEL_DEPS = glibc-devel-static libnuma-devel libelf-devel nasm RPM_SUSE_DEVEL_DEPS += libopenssl-devel openssl-devel libuuid-devel RPM_SUSE_PYTHON_DEPS = python-devel python3-devel python-pip python3-pip RPM_SUSE_PYTHON_DEPS += python-rpm-macros python3-rpm-macros RPM_SUSE_PLATFORM_DEPS = distribution-release shadow rpm-build ifeq ($(OS_ID),opensuse-leap) ifeq ($(OS_VERSION_ID),15.3) RPM_SUSE_DEVEL_DEPS += curl libstdc++-devel bison gcc-c++ zlib-devel xmlto RPM_SUSE_DEVEL_DEPS += lsb-release RPM_SUSE_DEVEL_DEPS += asciidoc git RPM_SUSE_PYTHON_DEPS += python3 python2-ply endif ifeq ($(OS_VERSION_ID),15.0) RPM_SUSE_DEVEL_DEPS += gcc git curl RPM_SUSE_PYTHON_DEPS += python3-ply python2-virtualenv endif endif RPM_SUSE_DEPENDS += $(RPM_SUSE_BUILDTOOLS_DEPS) $(RPM_SUSE_DEVEL_DEPS) $(RPM_SUSE_PYTHON_DEPS) $(RPM_SUSE_PLATFORM_DEPS) ifneq ($(wildcard $(STARTUP_DIR)/startup.conf),) STARTUP_CONF ?= $(STARTUP_DIR)/startup.conf endif ifeq ($(findstring y,$(UNATTENDED)),y) CONFIRM=-y FORCE=--force-yes endif TARGETS = vpp ifneq ($(SAMPLE_PLUGIN),no) TARGETS += sample-plugin endif define banner @echo "========================================================================" @echo " $(1)" @echo "========================================================================" @echo " " endef .PHONY: help help: @echo "Make Targets:" @echo " install-dep[s] - install software dependencies" @echo " wipe - wipe all products of debug build " @echo " wipe-release - wipe all products of release build " @echo " build - build debug binaries" @echo " build-release - build release binaries" @echo " build-coverity - build coverity artifacts" @echo " rebuild - wipe and build debug binaries" @echo " rebuild-release - wipe and build release binaries" @echo " run - run debug binary" @echo " run-release - run release binary" @echo " debug - run debug binary with debugger" @echo " debug-release - run release binary with debugger" @echo " test - build and run tests" @echo " test-help - show help on test framework" @echo " run-vat - run vpp-api-test tool" @echo " pkg-deb - build DEB packages" @echo " pkg-deb-debug - build DEB debug packages" @echo " pkg-snap - build SNAP package" @echo " snap-clean - clean up snap build environment" @echo " pkg-rpm - build RPM packages" @echo " install-ext-dep[s] - install external development dependencies" @echo " ctags - (re)generate ctags database" @echo " gtags - (re)generate gtags database" @echo " cscope - (re)generate cscope database" @echo " compdb - (re)generate compile_commands.json" @echo " checkstyle - check coding style" @echo " checkstyle-commit - check commit message format" @ec<style>.highlight .hll { background-color: #ffffcc } .highlight .c { color: #888888 } /* Comment */ .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ .highlight .k { color: #008800; font-weight: bold } /* Keyword */ .highlight .ch { color: #888888 } /* Comment.Hashbang */ .highlight .cm { color: #888888 } /* Comment.Multiline */ .highlight .cp { color: #cc0000; font-weight: bold } /* Comment.Preproc */ .highlight .cpf { color: #888888 } /* Comment.PreprocFile */ .highlight .c1 { color: #888888 } /* Comment.Single */ .highlight .cs { color: #cc0000; font-weight: bold; background-color: #fff0f0 } /* Comment.Special */ .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ .highlight .ge { font-style: italic } /* Generic.Emph */ .highlight .gr { color: #aa0000 } /* Generic.Error */ .highlight .gh { color: #333333 } /* Generic.Heading */ .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ .highlight .go { color: #888888 } /* Generic.Output */ .highlight .gp { color: #555555 } /* Generic.Prompt */ .highlight .gs { font-weight: bold } /* Generic.Strong */ .highlight .gu { color: #666666 } /* Generic.Subheading */ .highlight .gt { color: #aa0000 } /* Generic.Traceback */ .highlight .kc { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */</style><div class="highlight"><pre><span></span><span class="cm">/*</span> <span class="cm"> * mactime.h - time-based src mac address filtration</span> <span class="cm"> *</span> <span class="cm"> * Copyright (c) <current-year> <your-organization></span> <span class="cm"> * Licensed under the Apache License, Version 2.0 (the "License");</span> <span class="cm"> * you may not use this file except in compliance with the License.</span> <span class="cm"> * You may obtain a copy of the License at:</span> <span class="cm"> *</span> <span class="cm"> * http://www.apache.org/licenses/LICENSE-2.0</span> <span class="cm"> *</span> <span class="cm"> * Unless required by applicable law or agreed to in writing, software</span> <span class="cm"> * distributed under the License is distributed on an "AS IS" BASIS,</span> <span class="cm"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span> <span class="cm"> * See the License for the specific language governing permissions and</span> <span class="cm"> * limitations under the License.</span> <span class="cm"> */</span> <span class="cp">#ifndef __included_mactime_h__</span> <span class="cp">#define __included_mactime_h__</span> <span class="cp">#include</span> <span class="cpf"><vnet/vnet.h></span><span class="cp"></span> <span class="cp">#include</span> <span class="cpf"><vnet/ip/ip.h></span><span class="cp"></span> <span class="cp">#include</span> <span class="cpf"><vnet/ethernet/ethernet.h></span><span class="cp"></span> <span class="c1">//#include <vnet/ethernet/arp.h></span> <span class="cp">#include</span> <span class="cpf"><vlib/counter.h></span><span class="cp"></span> <span class="cp">#include</span> <span class="cpf"><vppinfra/hash.h></span><span class="cp"></span> <span class="cp">#include</span> <span class="cpf"><vppinfra/error.h></span><span class="cp"></span> <span class="cp">#include</span> <span class="cpf"><vppinfra/time_range.h></span><span class="cp"></span> <span class="cp">#include</span> <span class="cpf"><vppinfra/bihash_8_8.h></span><span class="cp"></span> <span class="cp">#include</span> <span class="cpf"><mactime/mactime_device.h></span><span class="cp"></span> <span class="k">typedef</span> <span class="k">struct</span> <span class="p">{</span> <span class="k">union</span> <span class="p">{</span> <span class="n">u8</span> <span class="n">mac_address</span><span class="p">[</span><span class="mi">6</span><span class="p">];</span> <span class="n">u64</span> <span class="n">as_u64</span><span class="p">;</span> <span class="p">};</span> <span class="p">}</span> <span class="n">mactime_key_t</span><span class="p">;</span> <span class="k">typedef</span> <span class="k">struct</span> <span class="p">{</span> <span class="cm">/* API message ID base */</span> <span class="n">u16</span> <span class="n">msg_id_base</span><span class="p">;</span> <span class="cm">/* Timebase */</span> <span class="n">clib_timebase_t</span> <span class="n">timebase</span><span class="p">;</span> <span class="cm">/* cached sunday midnight */</span> <span class="n">f64</span> <span class="n">sunday_midnight</span><span class="p">;</span> <span class="cm">/* Lookup table */</span> <span class="n">clib_bihash_8_8_t</span> <span class="n">lookup_table</span><span class="p">;</span> <span class="cm">/* Device table */</span> <span class="n">mactime_device_t</span> <span class="o">*</span><span class="n">devices</span><span class="p">;</span> <span class="n">u32</span> <span class="n">device_table_epoch</span><span class="p">;</span> <span class="cm">/* Counters */</span> <span class="n">vlib_combined_counter_main_t</span> <span class="n">allow_counters</span><span class="p">;</span> <span class="n">vlib_combined_counter_main_t</span> <span class="n">drop_counters</span><span class="p">;</span> <span class="cm">/* config parameters */</span> <span class="n">u32</span> <span class="n">lookup_table_num_buckets</span><span class="p">;</span> <span class="n">uword</span> <span class="n">lookup_table_memory_size</span><span class="p">;</span> <span class="n">i32</span> <span class="n">timezone_offset</span><span class="p">;</span> <span class="cm">/* Once-only data structure create flag */</span> <span class="kt">int</span> <span class="n">feature_initialized</span><span class="p">;</span> <span class="cm">/* arp cache copy, for "show mactime" */</span> <span class="n">index_t</span> <span class="o">*</span><span class="n">arp_cache_copy</span><span class="p">;</span> <span class="cm">/* convenience */</span> <span class="n">vlib_main_t</span> <span class="o">*</span><span class="n">vlib_main</span><span class="p">;</span> <span class="n">vnet_main_t</span> <span class="o">*</span><span class="n">vnet_main</span><span class="p">;</span> <span class="n">ethernet_main_t</span> <span class="o">*</span><span class="n">ethernet_main</span><span class="p">;</span> <span class="p">}</span> <span class="n">mactime_main_t</span><span class="p">;</span> <span class="cm">/* size for an hgw use-case */</span> <span class="cp">#define MACTIME_NUM_BUCKETS 128</span> <span class="cp">#define MACTIME_MEMORY_SIZE (256<<10)</span> <span class="k">extern</span> <span class="n">mactime_main_t</span> <span class="n">mactime_main</span><span class="p">;</span> <span class="k">extern</span> <span class="n">vlib_node_registration_t</span> <span class="n">mactime_node</span><span class="p">;</span> <span class="k">extern</span> <span class="n">vlib_node_registration_t</span> <span class="n">mactime_tx_node</span><span class="p">;</span> <span class="kt">void</span> <span class="nf">mactime_send_create_entry_message</span> <span class="p">(</span><span class="n">u8</span> <span class="o">*</span> <span class="n">mac_address</span><span class="p">);</span> <span class="kt">void</span> <span class="nf">mactime_url_init</span> <span class="p">(</span><span class="n">vlib_main_t</span> <span class="o">*</span> <span class="n">vm</span><span class="p">);</span> <span class="cm">/* Periodic function events */</span> <span class="cp">#define MACTIME_EVENT1 1</span> <span class="cp">#define MACTIME_EVENT2 2</span> <span class="cp">#define MACTIME_EVENT_PERIODIC_ENABLE_DISABLE 3</span> <span class="cp">#endif </span><span class="cm">/* __included_mactime_h__ */</span><span class="cp"></span> <span class="cm">/*</span> <span class="cm"> * fd.io coding-style-patch-verification: ON</span> <span class="cm"> *</span> <span class="cm"> * Local Variables:</span> <span class="cm"> * eval: (c-set-style "gnu")</span> <span class="cm"> * End:</span> <span class="cm"> */</span> </pre></div> </code></pre></td></tr></table> </div> <!-- class=content --> <div id="lfcollabprojects-footer"> <div class="gray-diagonal"> <div class="footer-inner"> <p> © 2016 <a href="https://www.fd.io/">FD.io</a> a Linux Foundation Collaborative Project. All Rights Reserved. </p> <p> Linux Foundation is a registered trademark of The Linux Foundation. Linux is a registered <a href="http://www.linuxfoundation.org/programs/legal/trademark" title="Linux Mark Institute" >trademark</a > of Linus Torvalds. </p> <p> Please see our <a href="http://www.linuxfoundation.org/privacy">privacy policy</a> and <a href="http://www.linuxfoundation.org/terms">terms of use</a> </p> </div> </div> </div> </div> <!-- id=cgit --> </body> </html> tyle-python checkstyle-python: @make -C test checkstyle-python-all .PHONY: checkstyle-all checkstyle-all: checkstyle-commit checkstyle checkstyle-python .PHONY: fixstyle fixstyle: @extras/scripts/checkstyle.sh --fix # Note: All python venv consolidated in test/Makefile, test/requirements*.txt .PHONY: fixstyle-python fixstyle-python: @make -C test fixstyle-python-all .PHONY: checkstyle-api checkstyle-api: @extras/scripts/crcchecker.py --check-patchset # necessary because Bug 1696324 - Update to python3.6 breaks PyYAML dependencies # Status: CLOSED CANTFIX # https://bugzilla.redhat.com/show_bug.cgi?id=1696324 .PHONY: centos-pyyaml centos-pyyaml: ifeq ($(OS_ID)-$(OS_VERSION_ID),centos-8) @sudo -E yum install $(CONFIRM) python3-pyyaml endif .PHONY: featurelist featurelist: centos-pyyaml @extras/scripts/fts.py --all --markdown .PHONY: checkfeaturelist checkfeaturelist: centos-pyyaml @extras/scripts/fts.py --validate --all # # Build the documentation # .PHONY: bootstrap-doxygen bootstrap-doxygen: @echo "make bootstrap-doxygen is DEPRECATED" sleep 300 .PHONY: doxygen doxygen: docs @echo "make doxygen is DEPRECATED: use 'make docs'" sleep 300 .PHONY: wipe-doxygen wipe-doxygen: @echo "make wipe-doxygen is DEPRECATED" sleep 300 .PHONY: docs-% docs-%: @make -C $(WS_ROOT)/docs $* .PHONY: docs docs: @make -C $(WS_ROOT)/docs docs .PHONY: pkg-verify pkg-verify: install-dep $(BR)/.deps.ok install-ext-deps $(call banner,"Building for PLATFORM=vpp using gcc") @make -C build-root PLATFORM=vpp TAG=vpp wipe-all install-packages $(call banner,"Building sample-plugin") @make -C build-root PLATFORM=vpp TAG=vpp sample-plugin-install $(call banner,"Building libmemif") @make -C build-root PLATFORM=vpp TAG=vpp libmemif-install $(call banner,"Building $(PKG) packages") @make pkg-$(PKG) MAKE_VERIFY_GATE_OS ?= ubuntu-20.04 .PHONY: verify verify: pkg-verify ifeq ($(OS_ID)-$(OS_VERSION_ID),$(MAKE_VERIFY_GATE_OS)) $(call banner,"Testing vppapigen") @src/tools/vppapigen/test_vppapigen.py $(call banner,"Running tests") @make COMPRESS_FAILED_TEST_LOGS=yes RETRIES=3 test else $(call banner,"Skipping tests. Tests under 'make verify' supported on $(MAKE_VERIFY_GATE_OS)") endif