From 16bec677aab8482a0fc9e26a4356fb5cce502e5a Mon Sep 17 00:00:00 2001 From: Ilya Maximets Date: Thu, 14 Jul 2022 17:55:46 +0200 Subject: [PATCH] debian: Add option to build without DPDK. Co-authored-by: Frode Nordahl Signed-off-by: Frode Nordahl Signed-off-by: Ilya Maximets --- .ci/linux-build.sh | 3 +- .github/workflows/build-and-test.yml | 15 ++++++- .gitignore | 1 + Documentation/intro/install/debian.rst | 36 ++++++---------- debian/.gitignore | 21 +++++++++ debian/automake.mk | 51 +++++++++++++++++++--- debian/clean | 4 +- debian/{control => control.in} | 60 +++++++++++++------------- debian/rules | 6 +++ 9 files changed, 134 insertions(+), 63 deletions(-) create mode 100644 debian/.gitignore rename debian/{control => control.in} (85%) diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh index a8c437aaf97..b7d93f36b04 100755 --- a/.ci/linux-build.sh +++ b/.ci/linux-build.sh @@ -204,9 +204,10 @@ function build_ovs() } if [ "$DEB_PACKAGE" ]; then + ./boot.sh && ./configure --with-dpdk=$DPDK && make debian mk-build-deps --install --root-cmd sudo --remove debian/control dpkg-checkbuilddeps - DEB_BUILD_OPTIONS='parallel=4 nocheck' fakeroot debian/rules binary + make debian-deb packages=$(ls $(pwd)/../*.deb) deps="" for pkg in $packages; do diff --git a/.github/workflows/build-and-test.yml b/.github/workflows/build-and-test.yml index 90fe173774c..4c84b3a96c9 100644 --- a/.github/workflows/build-and-test.yml +++ b/.github/workflows/build-and-test.yml @@ -216,11 +216,19 @@ jobs: deb_dependencies: | linux-headers-$(uname -r) build-essential fakeroot devscripts equivs DEB_PACKAGE: yes + DPDK: ${{ matrix.dpdk }} - name: linux deb + name: linux deb ${{ matrix.dpdk }} dpdk runs-on: ubuntu-22.04 timeout-minutes: 30 + strategy: + fail-fast: false + matrix: + include: + - dpdk: no + - dpdk: shared + steps: - name: checkout uses: actions/checkout@v2 @@ -234,6 +242,9 @@ jobs: run: sudo apt update || true - name: install dependencies for debian packages run: sudo apt install -y ${{ env.deb_dependencies }} + - name: install dpdk-dev + if: matrix.dpdk != 'no' + run: sudo apt install -y libdpdk-dev - name: prepare run: ./.ci/linux-prepare.sh @@ -244,5 +255,5 @@ jobs: - name: upload deb packages uses: actions/upload-artifact@v2 with: - name: deb-packages + name: deb-packages-${{ matrix.dpdk }}-dpdk path: '/home/runner/work/ovs/*.deb' diff --git a/.gitignore b/.gitignore index f1cdcf124f2..b0098f46a7a 100644 --- a/.gitignore +++ b/.gitignore @@ -68,6 +68,7 @@ TAGS cscope.* tags _debian +_dpdk odp-netlink.h odp-netlink-macros.h OvsDpInterface.h diff --git a/Documentation/intro/install/debian.rst b/Documentation/intro/install/debian.rst index 4024dc07a70..6d268783070 100644 --- a/Documentation/intro/install/debian.rst +++ b/Documentation/intro/install/debian.rst @@ -58,38 +58,28 @@ You do not need to be the superuser to build the Debian packages. top level directory. 3. Install the build dependencies listed under "Build-Depends:" near the top of - ``debian/control``. You can install these any way you like, e.g. with + ``debian/control.in``. You can install these any way you like, e.g. with ``apt-get install``. -Check your work by running ``dpkg-checkbuilddeps`` in the top level of your OVS -directory. If you've installed all the dependencies properly, -``dpkg-checkbuilddeps`` will exit without printing anything. If you forgot to -install some dependencies, it will tell you which ones. - -4. Build the package:: - - $ fakeroot debian/rules binary +4. Prepare the package source. - This will do a serial build that runs the unit tests. This will take - approximately 8 to 10 minutes. If you prefer, you can run a faster parallel - build:: + If you want to build the package with DPDK support execute the following + command:: - $ DEB_BUILD_OPTIONS='parallel=8' fakeroot debian/rules binary + $ ./boot.sh && ./configure --with-dpdk=shared && make debian - If you are in a big hurry, you can even skip the unit tests:: + If not:: - $ DEB_BUILD_OPTIONS='parallel=8 nocheck' fakeroot debian/rules binary + $ ./boot.sh && ./configure && make debian -.. note:: - - There are a few pitfalls in the Debian packaging building system so that, - occasionally, you may find that in a tree that you have using for a while, - the build command above exits immediately without actually building anything. - To fix the problem, run:: +Check your work by running ``dpkg-checkbuilddeps`` in the top level of your OVS +directory. If you've installed all the dependencies properly, +``dpkg-checkbuilddeps`` will exit without printing anything. If you forgot to +install some dependencies, it will tell you which ones. - $ fakeroot debian/rules clean +5. Build the package:: - or start over from a fresh copy of the source tree. + $ make debian-deb 5. The generated .deb files will be in the parent directory of the Open vSwitch source distribution. diff --git a/debian/.gitignore b/debian/.gitignore new file mode 100644 index 00000000000..0523941c6be --- /dev/null +++ b/debian/.gitignore @@ -0,0 +1,21 @@ +*.debhelper +*.debhelper.log +*.substvars +/autoreconf.after +/autoreconf.before +/control +/copyright +/debhelper-build-stamp +/files +/openvswitch-common +/openvswitch-doc +/openvswitch-ipsec +/openvswitch-pki +/openvswitch-source +/openvswitch-switch +/openvswitch-switch-dpdk +/openvswitch-test +/openvswitch-testcontroller +/openvswitch-vtep +/python3-openvswitch +/tmp diff --git a/debian/automake.mk b/debian/automake.mk index a3c2d7289b4..7b2afafae1a 100644 --- a/debian/automake.mk +++ b/debian/automake.mk @@ -2,8 +2,7 @@ EXTRA_DIST += \ debian/README.Debian \ debian/changelog \ debian/clean \ - debian/control \ - debian/copyright \ + debian/control.in \ debian/copyright.in \ debian/dirs \ debian/gbp.conf \ @@ -80,12 +79,54 @@ check-debian-changelog-version: ALL_LOCAL += check-debian-changelog-version DIST_HOOKS += check-debian-changelog-version -$(srcdir)/debian/copyright: AUTHORS.rst debian/copyright.in + +update_deb_copyright = \ $(AM_V_GEN) \ { sed -n -e '/%AUTHORS%/q' -e p < $(srcdir)/debian/copyright.in; \ tail -n +28 $(srcdir)/AUTHORS.rst | sed '1,/^$$/d' | \ sed -n -e '/^$$/q' -e 's/^/ /p'; \ sed -e '1,/%AUTHORS%/d' $(srcdir)/debian/copyright.in; \ - } > $@ + } > debian/copyright + +debian/copyright: AUTHORS.rst debian/copyright.in + $(update_deb_copyright) + +CLEANFILES += debian/copyright + + +if DPDK_NETDEV +update_deb_control = \ + $(AM_V_GEN) sed -e 's/^\# DPDK_NETDEV //' \ + < $(srcdir)/debian/control.in > debian/control +else +update_deb_control = \ + $(AM_V_GEN) grep -v '^\# DPDK_NETDEV' \ + < $(srcdir)/debian/control.in > debian/control +endif + +debian/control: $(srcdir)/debian/control.in Makefile + $(update_deb_control) -DISTCLEANFILES += debian/copyright +CLEANFILES += debian/control + + +debian: debian/copyright debian/control +.PHONY: debian + + +debian-deb: debian + @if test X"$(srcdir)" != X"$(top_builddir)"; then \ + echo "Debian packages should be built from $(abs_srcdir)/"; \ + exit 1; \ + fi + $(MAKE) distclean + $(update_deb_copyright) + $(update_deb_control) + $(AM_V_GEN) fakeroot debian/rules clean +if DPDK_NETDEV + $(AM_V_GEN) DEB_BUILD_OPTIONS="nocheck parallel=`nproc`" \ + fakeroot debian/rules binary +else + $(AM_V_GEN) DEB_BUILD_OPTIONS="nocheck parallel=`nproc` nodpdk" \ + fakeroot debian/rules binary +endif diff --git a/debian/clean b/debian/clean index 3b2e48901c2..43da304ce4d 100644 --- a/debian/clean +++ b/debian/clean @@ -1,2 +1,2 @@ -_debian -_dpdk +_debian/ +_dpdk/ diff --git a/debian/control b/debian/control.in similarity index 85% rename from debian/control rename to debian/control.in index 0ff894461eb..fa7ee79324b 100644 --- a/debian/control +++ b/debian/control.in @@ -12,7 +12,7 @@ Build-Depends: autoconf (>= 2.64), automake (>= 1.10), bzip2, - debhelper-compat (= 13), + debhelper-compat (= 10), dh-exec, dh-python, dh-sequence-python3, @@ -21,7 +21,7 @@ Build-Depends: iproute2, libcap-ng-dev, libdbus-1-dev [amd64 i386 ppc64el arm64], - libdpdk-dev (>= 21.11) [amd64 i386 ppc64el arm64], +# DPDK_NETDEV libdpdk-dev (>= 21.11) [amd64 i386 ppc64el arm64], libnuma-dev [amd64 i386 ppc64el arm64], libpcap-dev [amd64 i386 ppc64el arm64], libssl-dev, @@ -176,34 +176,34 @@ Description: Open vSwitch switch implementations openvswitch-switch provides the userspace components and utilities for the Open vSwitch kernel-based switch. -Package: openvswitch-switch-dpdk -Architecture: amd64 arm64 i386 ppc64el -Pre-Depends: ${misc:Pre-Depends}, -Depends: - dpdk, - openvswitch-switch (= ${binary:Version}), - ${misc:Depends}, - ${python3:Depends}, - ${shlibs:Depends}, -Enhances: - openvswitch-switch, -Description: DPDK enabled Open vSwitch switch implementation - Open vSwitch is a production quality, multilayer, software-based, - Ethernet virtual switch. It is designed to enable massive network - automation through programmatic extension, while still supporting - standard management interfaces and protocols (e.g. NetFlow, IPFIX, - sFlow, SPAN, RSPAN, CLI, LACP, 802.1ag). In addition, it is designed - to support distribution across multiple physical servers similar to - VMware's vNetwork distributed vswitch or Cisco's Nexus 1000V. - . - openvswitch-switch provides the userspace components and utilities for - the Open vSwitch kernel-based switch. - . - DPDK is a set of libraries for fast packet processing. Applications run - in user-space and communicate directly with dedicated network interfaces. - . - This package provides a DPDK enabled implementation of the ovs-vswitchd - binary. +# DPDK_NETDEV Package: openvswitch-switch-dpdk +# DPDK_NETDEV Architecture: amd64 arm64 i386 ppc64el +# DPDK_NETDEV Pre-Depends: ${misc:Pre-Depends}, +# DPDK_NETDEV Depends: +# DPDK_NETDEV dpdk, +# DPDK_NETDEV openvswitch-switch (= ${binary:Version}), +# DPDK_NETDEV ${misc:Depends}, +# DPDK_NETDEV ${python3:Depends}, +# DPDK_NETDEV ${shlibs:Depends}, +# DPDK_NETDEV Enhances: +# DPDK_NETDEV openvswitch-switch, +# DPDK_NETDEV Description: DPDK enabled Open vSwitch switch implementation +# DPDK_NETDEV Open vSwitch is a production quality, multilayer, software-based, +# DPDK_NETDEV Ethernet virtual switch. It is designed to enable massive network +# DPDK_NETDEV automation through programmatic extension, while still supporting +# DPDK_NETDEV standard management interfaces and protocols (e.g. NetFlow, IPFIX, +# DPDK_NETDEV sFlow, SPAN, RSPAN, CLI, LACP, 802.1ag). In addition, it is designed +# DPDK_NETDEV to support distribution across multiple physical servers similar to +# DPDK_NETDEV VMware's vNetwork distributed vswitch or Cisco's Nexus 1000V. +# DPDK_NETDEV . +# DPDK_NETDEV openvswitch-switch provides the userspace components and utilities for +# DPDK_NETDEV the Open vSwitch kernel-based switch. +# DPDK_NETDEV . +# DPDK_NETDEV DPDK is a set of libraries for fast packet processing. Applications run +# DPDK_NETDEV in user-space and communicate directly with dedicated network interfaces. +# DPDK_NETDEV . +# DPDK_NETDEV This package provides a DPDK enabled implementation of the ovs-vswitchd +# DPDK_NETDEV binary. Package: openvswitch-test Architecture: all diff --git a/debian/rules b/debian/rules index 9a2f8ac1c28..f3202ac304e 100755 --- a/debian/rules +++ b/debian/rules @@ -28,6 +28,7 @@ override_dh_auto_configure: $(EXTRA_CONFIGURE_OPTS) \ ) ifneq (,$(filter i386 amd64 ppc64el arm64, $(DEB_HOST_ARCH))) +ifeq (,$(filter nodpdk, $(DEB_BUILD_OPTIONS))) test -d _dpdk || mkdir _dpdk cd _dpdk && ( \ test -e Makefile || \ @@ -37,6 +38,7 @@ ifneq (,$(filter i386 amd64 ppc64el arm64, $(DEB_HOST_ARCH))) $(EXTRA_CONFIGURE_OPTS) \ ) endif +endif # NOTE(jamespage): by default, just run all tests @@ -61,12 +63,14 @@ ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS))) # 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, $(DEB_HOST_ARCH))) +ifeq (,$(filter nodpdk, $(DEB_BUILD_OPTIONS))) 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 # nodpdk endif # i386/amd64/ppc64el endif # nocheck @@ -74,8 +78,10 @@ override_dh_auto_build: dh_auto_build --sourcedirectory=_debian -- dist distdir=openvswitch dh_auto_build --sourcedirectory=_debian ifneq (,$(filter i386 amd64 ppc64el arm64, $(DEB_HOST_ARCH))) +ifeq (,$(filter nodpdk, $(DEB_BUILD_OPTIONS))) dh_auto_build --sourcedirectory=_dpdk endif +endif execute_before_dh_auto_clean: find . -name "*.pyc" -delete