[ovs-dev] [PATCH dpdk-latest v4] build: Add support for DPDK meson build.

Sunil Pai G sunil.pai.g at intel.com
Wed Sep 2 18:06:29 UTC 2020


Make based build is deprecated in DPDK. Meson based
build to be used for future DPDK releases.

This updates travis, configure script and documentation
for using DPDK Meson with OVS.

Tested-at: https://travis-ci.org/github/Sunil-Pai-G/ovs-copy/builds/723510063
Signed-off-by: Sunil Pai G <sunil.pai.g at intel.com>
---
v3->v4:
- Fix checkpatch errors

v2->v3:
- Update Documentation for vhost-user

v1->v2:
- Update Documentation
- Simplify the pkg-config parsing script
- Rename and move the pkg-config parsing script to python dir
- Update travis to:
   - install DPDK to cached dir
   - disable DPDK tests
   - removed fPIC flag for DPDK
   - removed cross compilation for aarch64
---
 .travis.yml                              |  3 ++
 .travis/linux-build.sh                   | 39 ++++++++++-----
 .travis/linux-prepare.sh                 |  1 +
 Documentation/intro/install/afxdp.rst    |  2 +-
 Documentation/intro/install/dpdk.rst     | 63 ++++++++++++++++++++----
 Documentation/topics/dpdk/vhost-user.rst | 18 +------
 acinclude.m4                             | 44 +++++++++++------
 python/automake.mk                       |  3 +-
 python/build/pkgcfg.py                   | 30 +++++++++++
 9 files changed, 149 insertions(+), 54 deletions(-)
 create mode 100644 python/build/pkgcfg.py

diff --git a/.travis.yml b/.travis.yml
index 3dd5d1d23..a8f9a4d79 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -27,6 +27,9 @@ addons:
       - selinux-policy-dev
       - libunbound-dev
       - libunwind-dev
+      - python3-setuptools
+      - python3-wheel
+      - ninja-build
 
 before_install: ./.travis/${TRAVIS_OS_NAME}-prepare.sh
 
diff --git a/.travis/linux-build.sh b/.travis/linux-build.sh
index 817bf24aa..14ef833c9 100755
--- a/.travis/linux-build.sh
+++ b/.travis/linux-build.sh
@@ -85,17 +85,29 @@ function install_dpdk()
 {
     local DPDK_VER=$1
     local VERSION_FILE="dpdk-dir/travis-dpdk-cache-version"
+    local DPDK_OPTS=""
+    local DPDK_LIB=""
 
     if [ -z "$TRAVIS_ARCH" ] ||
        [ "$TRAVIS_ARCH" == "amd64" ]; then
-        TARGET="x86_64-native-linuxapp-gcc"
+        DPDK_LIB=$(pwd)/dpdk-dir/build/lib/x86_64-linux-gnu
     elif [ "$TRAVIS_ARCH" == "aarch64" ]; then
-        TARGET="arm64-armv8a-linuxapp-gcc"
+        DPDK_LIB=$(pwd)/dpdk-dir/build/lib/aarch64-linux-gnu
     else
         echo "Target is unknown"
         exit 1
     fi
 
+    if [ "$DPDK_SHARED" ]; then
+        EXTRA_OPTS="$EXTRA_OPTS --with-dpdk=shared"
+        export LD_LIBRARY_PATH=$DPDK_LIB/:$LD_LIBRARY_PATH
+    else
+        EXTRA_OPTS="$EXTRA_OPTS --with-dpdk=static"
+    fi
+
+    # Export the following path for pkg-config to find the .pc file.
+    export PKG_CONFIG_PATH=$DPDK_LIB/pkgconfig/:$PKG_CONFIG_PATH
+
     if [ "${DPDK_VER##refs/*/}" != "${DPDK_VER}" ]; then
         # Avoid using cache for git tree build.
         rm -rf dpdk-dir
@@ -108,7 +120,8 @@ function install_dpdk()
         if [ -f "${VERSION_FILE}" ]; then
             VER=$(cat ${VERSION_FILE})
             if [ "${VER}" = "${DPDK_VER}" ]; then
-                EXTRA_OPTS="${EXTRA_OPTS} --with-dpdk=$(pwd)/dpdk-dir/build"
+                # Update the library paths.
+                sudo ldconfig
                 echo "Found cached DPDK ${VER} build in $(pwd)/dpdk-dir"
                 return
             fi
@@ -122,16 +135,20 @@ function install_dpdk()
         pushd dpdk-dir
     fi
 
-    make config CC=gcc T=$TARGET
+    # Disable building DPDK unit tests. Not needed for OVS build or tests.
+    DPDK_OPTS="$DPDK_OPTS -Dtests=false"
 
-    if [ "$DPDK_SHARED" ]; then
-        sed -i '/CONFIG_RTE_BUILD_SHARED_LIB=n/s/=n/=y/' build/.config
-        export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)/$TARGET/lib
-    fi
+    # Install DPDK using prefix.
+    DPDK_OPTS="$DPDK_OPTS --prefix=$(pwd)/build"
+
+    CC=gcc meson $DPDK_OPTS build
+    ninja -C build
+    sudo ninja -C build install
+
+    # Update the library paths.
+    sudo ldconfig
 
-    make -j4 CC=gcc EXTRA_CFLAGS='-fPIC'
-    EXTRA_OPTS="$EXTRA_OPTS --with-dpdk=$(pwd)/build"
-    echo "Installed DPDK source in $(pwd)"
+    echo "Installed DPDK source"
     popd
     echo "${DPDK_VER}" > ${VERSION_FILE}
 }
diff --git a/.travis/linux-prepare.sh b/.travis/linux-prepare.sh
index 71eb347e8..1baa11641 100755
--- a/.travis/linux-prepare.sh
+++ b/.travis/linux-prepare.sh
@@ -22,6 +22,7 @@ cd ..
 
 pip3 install --disable-pip-version-check --user flake8 hacking
 pip3 install --user --upgrade docutils
+pip3 install --user  'meson==0.47.1'
 
 if [ "$M32" ]; then
     # Installing 32-bit libraries.
diff --git a/Documentation/intro/install/afxdp.rst b/Documentation/intro/install/afxdp.rst
index 3c8f78825..327f2b3df 100644
--- a/Documentation/intro/install/afxdp.rst
+++ b/Documentation/intro/install/afxdp.rst
@@ -396,7 +396,7 @@ PVP using vhostuser device
 --------------------------
 First, build OVS with DPDK and AFXDP::
 
-  ./configure  --enable-afxdp --with-dpdk=<dpdk path>
+  ./configure  --enable-afxdp --with-dpdk=shared|static|<dpdk path>
   make -j4 && make install
 
 Create a vhost-user port from OVS::
diff --git a/Documentation/intro/install/dpdk.rst b/Documentation/intro/install/dpdk.rst
index 39544f835..cd7e51c75 100644
--- a/Documentation/intro/install/dpdk.rst
+++ b/Documentation/intro/install/dpdk.rst
@@ -62,6 +62,8 @@ Detailed system requirements can be found at `DPDK requirements`_.
 .. _DPDK supported NIC: http://dpdk.org/doc/nics
 .. _DPDK requirements: http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html
 
+.. _dpdk-install:
+
 Installing
 ----------
 
@@ -76,10 +78,31 @@ Install DPDK
        $ export DPDK_DIR=/usr/src/dpdk-stable-19.11.2
        $ cd $DPDK_DIR
 
+#. Configure and install DPDK using Meson
+
+   Meson is the preferred tool to build recent DPDK releases
+   as Make support is deprecated and will be removed from DPDK 20.11.
+   OVS supports DPDK Meson builds from DPDK 19.11 onwards.
+
+   Build and install the DPDK library::
+
+       $ export DPDK_TARGET=x86_64-native-linuxapp-gcc
+       $ export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
+       $ meson $DPDK_TARGET
+       $ ninja -C $DPDK_TARGET
+       $ sudo ninja -C $DPDK_TARGET install
+       $ sudo ldconfig
+
+   Detailed information can be found at `DPDK documentation`_.
+
 #. (Optional) Configure DPDK as a shared library
 
-   DPDK can be built as either a static library or a shared library.  By
-   default, it is configured for the former. If you wish to use the latter, set
+   When using Meson, DPDK is built both as static and shared library.
+   So no extra configuration is required in this case.
+
+   In case of Make, DPDK can be built as either a static library or a shared
+   library.  By default, it is configured for the former. If you wish to use
+   the latter, set
    ``CONFIG_RTE_BUILD_SHARED_LIB=y`` in ``$DPDK_DIR/config/common_base``.
 
    .. note::
@@ -87,7 +110,7 @@ Install DPDK
       Minor performance loss is expected when using OVS with a shared DPDK
       library compared to a static DPDK library.
 
-#. Configure and install DPDK
+#. Configure and install DPDK using Make
 
    Build and install the DPDK library::
 
@@ -97,12 +120,22 @@ Install DPDK
 
 #. (Optional) Export the DPDK shared library location
 
-   If DPDK was built as a shared library, export the path to this library for
-   use when building OVS::
+   If DPDK was built as a shared library using Make, export the path to this
+   library for use when building OVS::
 
        $ export LD_LIBRARY_PATH=$DPDK_DIR/x86_64-native-linuxapp-gcc/lib
 
+   In case of Meson, exporting the path to library is not necessary if
+   the DPDK libraries are system installed. For libraries installed using
+   a prefix(assuming $DPDK_INSTALL in the below case), export the path to this
+   library and also update the $PKG_CONFIG_PATH for use before building OVS::
+
+      $ export $DPDK_LIB=$DPDK_INSTALL/lib/x86_64-linux-gnu
+      $ export LD_LIBRARY_PATH=$DPDK_LIB/:$LD_LIBRARY_PATH
+      $ export PKG_CONFIG_PATH=$DPDK_LIB/pkgconfig/:$PKG_CONFIG_PATH
+
 .. _DPDK sources: http://dpdk.org/rel
+.. _DPDK documentation: https://doc.dpdk.org/guides/linux_gsg/build_dpdk.html
 
 Install OVS
 ~~~~~~~~~~~
@@ -121,17 +154,27 @@ has to be configured to build against the DPDK library (``--with-dpdk``).
 
 #. Bootstrap, if required, as described in :ref:`general-bootstrapping`
 
-#. Configure the package using the ``--with-dpdk`` flag::
+#. Configure the package using the ``--with-dpdk`` flag:
+
+   Depending on the tool used to build DPDK and the type of
+   DPDK library to use, one can configure OVS as follows:
+
+   When DPDK is built using Meson, and OVS must consume DPDK shared libraries
+   (also equivalent to leaving --with-dpdk option empty)::
+
+       $ ./configure --with-dpdk=shared
+
+   When DPDK is built using Meson, and OVS must consume DPDK static libraries::
+
+       $ ./configure --with-dpdk=static
+
+   When DPDK is built using Make(for shared or static)::
 
        $ ./configure --with-dpdk=$DPDK_BUILD
 
    where ``DPDK_BUILD`` is the path to the built DPDK library. This can be
    skipped if DPDK library is installed in its default location.
 
-   If no path is provided to ``--with-dpdk``, but a pkg-config configuration
-   for libdpdk is available the include paths will be generated via an
-   equivalent ``pkg-config --cflags libdpdk``.
-
    .. note::
      While ``--with-dpdk`` is required, you can pass any other configuration
      option described in :ref:`general-configuring`.
diff --git a/Documentation/topics/dpdk/vhost-user.rst b/Documentation/topics/dpdk/vhost-user.rst
index 4af738d11..da3c4c9fa 100644
--- a/Documentation/topics/dpdk/vhost-user.rst
+++ b/Documentation/topics/dpdk/vhost-user.rst
@@ -389,23 +389,7 @@ application in the VM.
 
 To begin, instantiate a guest as described in :ref:`dpdk-vhost-user` or
 :ref:`dpdk-vhost-user-client`. Once started, connect to the VM, download the
-DPDK sources to VM and build DPDK::
-
-    $ cd /root/dpdk/
-    $ wget https://fast.dpdk.org/rel/dpdk-19.11.2.tar.xz
-    $ tar xf dpdk-19.11.2.tar.xz
-    $ export DPDK_DIR=/root/dpdk/dpdk-stable-19.11.2
-    $ export DPDK_TARGET=x86_64-native-linuxapp-gcc
-    $ export DPDK_BUILD=$DPDK_DIR/$DPDK_TARGET
-    $ cd $DPDK_DIR
-    $ make install T=$DPDK_TARGET DESTDIR=install
-
-Build the test-pmd application::
-
-    $ cd app/test-pmd
-    $ export RTE_SDK=$DPDK_DIR
-    $ export RTE_TARGET=$DPDK_TARGET
-    $ make
+DPDK sources to VM and build DPDK as described in :ref:`dpdk-install`.
 
 Setup huge pages and DPDK devices using UIO::
 
diff --git a/acinclude.m4 b/acinclude.m4
index 84f344da0..412b2dd55 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -334,8 +334,10 @@ dnl
 dnl Configure DPDK source tree
 AC_DEFUN([OVS_CHECK_DPDK], [
   AC_ARG_WITH([dpdk],
-              [AC_HELP_STRING([--with-dpdk=/path/to/dpdk],
-                              [Specify the DPDK build directory])],
+              [AC_HELP_STRING([--with-dpdk=static|shared|/path/to/dpdk],
+                              [Specify "static" or "shared" depending on the
+                              DPDK libraries to use only if built using Meson
+                              OR the DPDK build directory in case of Make])],
               [have_dpdk=true])
 
   AC_MSG_CHECKING([whether dpdk is enabled])
@@ -345,13 +347,24 @@ AC_DEFUN([OVS_CHECK_DPDK], [
   else
     AC_MSG_RESULT([yes])
     case "$with_dpdk" in
-      yes)
+      "shared" | "static" | "yes")
         DPDK_AUTO_DISCOVER="true"
-        PKG_CHECK_MODULES_STATIC([DPDK], [libdpdk], [
-            DPDK_INCLUDE="$DPDK_CFLAGS"
-            DPDK_LIB="$DPDK_LIBS"], [
-            DPDK_INCLUDE="-I/usr/local/include/dpdk -I/usr/include/dpdk"
-            DPDK_LIB="-ldpdk"])
+        case "$with_dpdk" in
+          "shared" | "yes")
+             PKG_CHECK_MODULES([DPDK], [libdpdk], [
+                 DPDK_INCLUDE="$DPDK_CFLAGS"
+                 DPDK_LIB="$DPDK_LIBS"], [
+                 DPDK_INCLUDE="-I/usr/local/include/dpdk -I/usr/include/dpdk"
+                 DPDK_LIB="-ldpdk"])
+                 ;;
+           "static")
+             PKG_CHECK_MODULES_STATIC([DPDK], [libdpdk], [
+                 DPDK_INCLUDE="$DPDK_CFLAGS"
+                 DPDK_LIB="$DPDK_LIBS"], [
+                 DPDK_INCLUDE="-I/usr/local/include/dpdk -I/usr/include/dpdk"
+                 DPDK_LIB="-ldpdk"])
+                ;;
+        esac
         ;;
       *)
         DPDK_AUTO_DISCOVER="false"
@@ -424,8 +437,9 @@ AC_DEFUN([OVS_CHECK_DPDK], [
       [AC_MSG_RESULT([no])
        if test "$DPDK_AUTO_DISCOVER" = "true"; then
          AC_MSG_ERROR(m4_normalize([
-            Could not find DPDK library in default search path, Use --with-dpdk
-            to specify the DPDK library installed in non-standard location]))
+            Could not find DPDK library in default search path, update
+            PKG_CONFIG_PATH for pkg-config to find the .pc file in
+            non-standard location]))
        else
          AC_MSG_ERROR([Could not find DPDK libraries in $DPDK_LIB_DIR])
        fi
@@ -451,10 +465,12 @@ AC_DEFUN([OVS_CHECK_DPDK], [
     # OTOH newer versions of dpdk pkg-config (generated with Meson)
     # will already have flagged just the right set of libs with
     # --whole-archive - in those cases do not wrap it once more.
-    case "$DPDK_LIB" in
-      *whole-archive*) DPDK_vswitchd_LDFLAGS=$DPDK_LIB;;
-      *) DPDK_vswitchd_LDFLAGS=-Wl,--whole-archive,$DPDK_LIB,--no-whole-archive
-    esac
+    if [[ "$pkg_failed" != "no" ]];then
+      DPDK_vswitchd_LDFLAGS=-Wl,--whole-archive,$DPDK_LIB,--no-whole-archive
+    else
+      DPDK_vswitchd_LDFLAGS=`python3 ${srcdir}/python/build/pkgcfg.py $DPDK_LIB`
+    fi
+
     AC_SUBST([DPDK_vswitchd_LDFLAGS])
     AC_DEFINE([DPDK_NETDEV], [1], [System uses the DPDK module.])
   fi
diff --git a/python/automake.mk b/python/automake.mk
index 2f08c7701..69d9800f9 100644
--- a/python/automake.mk
+++ b/python/automake.mk
@@ -47,7 +47,8 @@ ovs_pyfiles = \
 EXTRA_DIST += \
 	python/build/__init__.py \
 	python/build/nroff.py \
-	python/build/soutil.py
+	python/build/soutil.py \
+	python/build/pkgcfg.py
 
 # PyPI support.
 EXTRA_DIST += \
diff --git a/python/build/pkgcfg.py b/python/build/pkgcfg.py
new file mode 100644
index 000000000..7cee3cb03
--- /dev/null
+++ b/python/build/pkgcfg.py
@@ -0,0 +1,30 @@
+# Copyright (c) 2020 Intel, Inc.
+#
+# 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.
+
+# The purpose of this script is to parse the libraries
+# From pkg-config in case of DPDK Meson builds.
+
+import sys
+def parse_pkg_cfg_libs(arg):
+    linker_prefix = "-Wl,"
+    # Libtool expects libraries to be comma separated
+    # And -Wl must appear only once.
+    final_string = ','.join(map(str.strip,arg[1:])).replace('-Wl,','')
+    final_string = arg[0]+" "+linker_prefix+final_string
+    # Ld only understands -lpthread.
+    final_string = final_string.replace('-pthread','-lpthread')
+    return final_string
+
+if __name__ == "__main__":
+    print(parse_pkg_cfg_libs(sys.argv[1:]))
-- 
2.17.1



More information about the dev mailing list