Skip to content

Commit

Permalink
build: Add support for DPDK meson build.
Browse files Browse the repository at this point in the history
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@intel.com>
Signed-off-by: 0-day Robot <robot@bytheb.org>
  • Loading branch information
Sunil Pai G authored and ovsrobot committed Sep 2, 2020
1 parent d9ca8ec commit 83dc623
Show file tree
Hide file tree
Showing 9 changed files with 149 additions and 54 deletions.
3 changes: 3 additions & 0 deletions .travis.yml
Expand Up @@ -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

Expand Down
39 changes: 28 additions & 11 deletions .travis/linux-build.sh
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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}
}
Expand Down
1 change: 1 addition & 0 deletions .travis/linux-prepare.sh
Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion Documentation/intro/install/afxdp.rst
Expand Up @@ -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::
Expand Down
63 changes: 53 additions & 10 deletions Documentation/intro/install/dpdk.rst
Expand Up @@ -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
----------

Expand All @@ -76,18 +78,39 @@ 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::

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::

Expand All @@ -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
~~~~~~~~~~~
Expand All @@ -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`.
Expand Down
18 changes: 1 addition & 17 deletions Documentation/topics/dpdk/vhost-user.rst
Expand Up @@ -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::

Expand Down
44 changes: 30 additions & 14 deletions acinclude.m4
Expand Up @@ -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])
Expand All @@ -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"
Expand Down Expand Up @@ -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
Expand All @@ -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
Expand Down
3 changes: 2 additions & 1 deletion python/automake.mk
Expand Up @@ -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 += \
Expand Down
30 changes: 30 additions & 0 deletions 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:]))

0 comments on commit 83dc623

Please sign in to comment.