File dpdk.spec of Package dpdk.4277

#
# spec file for package dpdk
#
# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
# upon. The license for this file, and modifications and additions to the
# file, is the same license as for the pristine package itself (unless the
# license for the pristine package is not an Open Source License, in which
# case the license is the MIT License). An "Open Source License" is a
# license that conforms to the Open Source Definition (Version 1.9)
# published by the Open Source Initiative.

# Please submit bugfixes or comments via http://bugs.opensuse.org/
#


%define machine native
%define machine2 default
%ifarch x86_64
%define machine native
%define target x86_64-%{machine}-linuxapp-gcc
%endif
%ifarch %ix86
%define machine native
%define target i686-%{machine}-linuxapp-gcc
%endif
%ifarch aarch64
%define machine2 armv8a
%define target arm64-%{machine2}-linuxapp-gcc
%endif

%ifarch ppc64le
%define machine2 power8
%define target ppc_64-%{machine2}-linuxapp-gcc
%endif

%bcond_without examples
%bcond_without shared
# Add option to build without tools
%bcond_without tools
Name:           dpdk
Version:        2.2.0
Release:        0
Summary:        Set of libraries and drivers for fast packet processing
License:        BSD-3-Clause and GPL-2.0 and LGPL-2.1
Group:          System/Libraries
Url:            http://dpdk.org
Source:         http://fast.dpdk.org/rel/dpdk-%{version}.tar.xz
Patch1:         0001-enic-fix-Type-punning-and-strict-aliasing-warning.patch
Patch2:         0002-examples-ip_pipeline-fix-implicit-declaration-of-fun.patch
Patch3:         0003-mk-fix-external-shared-library-dependencies-of-libraries.patch
Patch4:         0004-54f9e32-vhost-handle-dirty-pages-logging-request.patch
Patch5:         0005-d293dac-vhost-claim-support-of-guest-announce.patch
Patch6:         0006-d639996-vhost-enable-log_shmfd-protocol-feature.patch
#PATCH-FIX-UPSTREAM 0007-ixgbe-fix-VLAN-filter-missing-brackets.patch
Patch7:         0007-ixgbe-fix-VLAN-filter-missing-brackets.patch
#PATCH-FIX-UPSTREAM 0008-app-testpmd-handle-SIGINT-and-SIGTERM.patch
Patch8:         0008-app-testpmd-handle-SIGINT-and-SIGTERM.patch
#PATCH-FIX-UPSTREAM 0009-bonding-copy-entire-config-structure-in-mode-4.patch
Patch9:         0009-bonding-copy-entire-config-structure-in-mode-4.patch
#PATCH-FIX-UPSTREAM 0010-bonding-fix-active-slaves-with-no-primary.patch
Patch10:        0010-bonding-fix-active-slaves-with-no-primary.patch
#PATCH-FIX-UPSTREAM 0011-bonding-do-not-ignore-multicast-in-mode-4.patch
Patch11:        0011-bonding-do-not-ignore-multicast-in-mode-4.patch
#PATCH-FIX-UPSTREAM 0012-bonding-do-not-activate-slave-twice.patch
Patch12:        0012-bonding-do-not-activate-slave-twice.patch
#PATCH-FIX-UPSTREAM 0013-bonding-fix-crash-when-no-slave-device.patch
Patch13:        0013-bonding-fix-crash-when-no-slave-device.patch
#PATCH-FIX-UPSTREAM 0014-bonding-fix-detach-of-bonded-device.patch
Patch14:        0014-bonding-fix-detach-of-bonded-device.patch
#PATCH-FIX-UPSTREAM 0015-bonding-fix-detach-of-slave-devices.patch
Patch15:        0015-bonding-fix-detach-of-slave-devices.patch
#PATCH-FIX-UPSTREAM 0016-eal-linux-support-built-in-kernel-modules.patch
Patch16:        0016-eal-linux-support-built-in-kernel-modules.patch
#PATCH-FIX-UPSTREAM 0017-examples-l3fwd-handle-SIGINT-and-SIGTERM.patch
Patch17:        0017-examples-l3fwd-handle-SIGINT-and-SIGTERM.patch
#PATCH-FIX-UPSTREAM 0018-fm10k-fix-VLAN-flag-in-scattered-Rx.patch
Patch18:        0018-fm10k-fix-VLAN-flag-in-scattered-Rx.patch
#PATCH-FIX-UPSTREAM 0019-i40e-base-fix-driver-load-failure.patch
Patch19:        0019-i40e-base-fix-driver-load-failure.patch
#PATCH-FIX-UPSTREAM 0020-i40e-base-fix-missing-check-for-stopped-admin-queue.patch
Patch20:        0020-i40e-base-fix-missing-check-for-stopped-admin-queue.patch
#PATCH-FIX-UPSTREAM 0021-i40e-fix-inverted-check-for-no-refcount.patch
Patch21:        0021-i40e-fix-inverted-check-for-no-refcount.patch
#PATCH-FIX-UPSTREAM 0022-i40e-fix-overflow.patch
Patch22:        0022-i40e-fix-overflow.patch
#PATCH-FIX-UPSTREAM 0023-i40e-fix-VLAN-filtering.patch
Patch23:        0023-i40e-fix-VLAN-filtering.patch
#PATCH-FIX-UPSTREAM 0024-mempool-fix-leak-when-creation-fails.patch
Patch24:        0024-mempool-fix-leak-when-creation-fails.patch
#PATCH-FIX-UPSTREAM 0025-pcap-fix-captured-frame-length.patch
Patch25:        0025-pcap-fix-captured-frame-length.patch
#PATCH-FIX-UPSTREAM 0026-port-fix-crash-for-ethdev-writer-nodrop.patch
Patch26:        0026-port-fix-crash-for-ethdev-writer-nodrop.patch
#PATCH-FIX-UPSTREAM 0027-port-fix-crash-for-ring-writer-nodrop.patch
Patch27:        0027-port-fix-crash-for-ring-writer-nodrop.patch
#PATCH-FIX-UPSTREAM 0028-tools-fix-unbinding-failure-handling.patch
Patch28:        0028-tools-fix-unbinding-failure-handling.patch
#PATCH-FIX-UPSTREAM 0029-tools-support-Python-3-in-bind-script.patch
Patch29:        0029-tools-support-Python-3-in-bind-script.patch
#PATCH-FIX-UPSTREAM 0030-tools-support-binding-to-built-in-kernel-modules.patch
Patch30:        0030-tools-support-binding-to-built-in-kernel-modules.patch
#PATCH-FIX-UPSTREAM 0031-vhost-fix-leak-of-fds-and-mmaps.patch
Patch31:        0031-vhost-fix-leak-of-fds-and-mmaps.patch
#PATCH-FIX-UPSTREAM 0032-virtio-fix-crash-in-statistics-functions.patch
Patch32:        0032-virtio-fix-crash-in-statistics-functions.patch
#PATCH-FIX-UPSTREAM 0033-virtio-fix-descriptors-pointing-to-the-same-buffer.patch
Patch33:        0033-virtio-fix-descriptors-pointing-to-the-same-buffer.patch
#PATCH-FIX-UPSTREAM 0034-virtio-fix-restart.patch
Patch34:        0034-virtio-fix-restart.patch
#PATCH-FIX-OPENSUSE 0035-PAGE_SIZE-constant-is-not-defined-on-ARM-since-multi
Patch35:        0035-PAGE_SIZE-constant-is-not-defined-on-ARM-since-multi.patch
#PATCH-FIX-UPSTREAM 0036-examples-fix-build-dependencies
Patch36:        0036-examples-fix-build-dependencies.patch
#PATCH-FIX-UPSTREAM	0037-examples-ethtool-fix-build
Patch37:        0037-examples-ethtool-fix-build.patch
#PATCH-FIX-SLE	0038-aarch_drop_feature_crc
Patch38:		0038-aarch_drop_feature_crc.patch


BuildRequires:  doxygen
BuildRequires:  fdupes
BuildRequires:  libnuma-devel
BuildRequires:  libpcap-devel
BuildRequires:  zlib-devel
ExclusiveArch:  aarch64 x86_64 %ix86 ppc64le

%description
The Data Plane Development Kit is a set of libraries and drivers for
fast packet processing in the user space.

%package devel
Summary:        Data Plane Development Kit development files
Group:          Development/Libraries/C and C++
Requires:       %{name} = %{version}

%description devel
This package contains the headers and other files needed for developing
applications with the Data Plane Development Kit.

%package doc
Summary:        Data Plane Development Kit API documentation
Group:          System/Libraries
BuildArch:      noarch

%description doc
API programming documentation for the Data Plane Development Kit.

%if %{with tools}
%package tools
Summary:        Tools for setting up Data Plane Development Kit environment
Group:          System/Libraries
Requires:       %{name} = %{version}
Requires:       findutils
Requires:       iproute
Requires:       kmod
Requires:       pciutils

%description tools
This package contains tools for setting up Data Plane Development Kit environment
%endif

%if %{with examples}
%package examples
Summary:        Data Plane Development Kit example applications
Group:          System/Libraries
BuildRequires:  libvirt-devel

%description examples
Example applications utilizing the Data Plane Development Kit, such
as L2 and L3 forwarding.
%endif

%define sdkdir  %{_datadir}/%{name}
%define docdir  %{_docdir}/%{name}
%define incdir %{_includedir}/%{name}
%define pmddir %{_libdir}/%{name}-pmds

%prep
%setup -q
%patch1 -p1 -z .enic
%patch2 -p1 -z .examples
%patch3 -p1 -z .dtneeded
%patch4 -p1
%patch5 -p1
%patch6 -p1
%patch7 -p1
%patch8 -p1
%patch9 -p1
%patch10 -p1
%patch11 -p1
%patch12 -p1
%patch13 -p1
%patch14 -p1
%patch15 -p1
%patch16 -p1
%patch17 -p1
%patch18 -p1
%patch19 -p1
%patch20 -p1
%patch21 -p1
%patch22 -p1
%patch23 -p1
%patch24 -p1
%patch25 -p1
%patch26 -p1
%patch27 -p1
%patch28 -p1
%patch29 -p1
%patch30 -p1
%patch31 -p1
%patch32 -p1
%patch33 -p1
%patch34 -p1
%patch35 -p1
%patch36 -p1
%patch37 -p1
%patch38 -p1

%build
# set up a method for modifying the resulting .config file
function setconf() {
	if grep -q ^$1= %{target}/.config; then
		sed -i "s:^$1=.*$:$1=$2:g" %{target}/.config
	else
		echo $1=$2 >> %{target}/.config
	fi
}

# In case dpdk-devel is installed, we should ignore its hints about the SDK directories
unset RTE_SDK RTE_INCLUDE RTE_TARGET

# For the release, '-Wno-error=array-bounds' is done to prevent a spurious error
# generated by gcc 5.X against the 2.1 branch
export EXTRA_CFLAGS="%{optflags} -Wformat -fPIC -Wno-error=array-bounds"

# DPDK defaults to using builder-specific compiler flags.  However,
# the config has been changed by specifying CONFIG_RTE_MACHINE=default
# in order to build for a more generic host.  NOTE: It is possible that
# the compiler flags used still won't work for all Fedora-supported
# machines, but runtime checks in DPDK will catch those situations.

make V=1 O=%{target} T=%{target} %{?_smp_mflags} config

setconf CONFIG_RTE_MACHINE '"%{machine2}"'
# Disable experimental features
setconf CONFIG_RTE_NEXT_ABI n
setconf CONFIG_RTE_LIBRTE_CRYPTODEV n
setconf CONFIG_RTE_LIBRTE_MBUF_OFFLOAD n

# Enable automatic driver loading from this path
setconf CONFIG_RTE_EAL_PMD_PATH '"%{pmddir}"'

setconf CONFIG_RTE_LIBRTE_BNX2X_PMD y
setconf CONFIG_RTE_LIBRTE_PMD_PCAP y
setconf CONFIG_RTE_LIBRTE_VHOST_NUMA y

setconf CONFIG_RTE_EAL_IGB_UIO n
setconf CONFIG_RTE_LIBRTE_KNI n
setconf CONFIG_RTE_KNI_KMOD n
setconf CONFIG_RTE_KNI_PREEMPT_DEFAULT n

%if %{with shared}
setconf CONFIG_RTE_BUILD_SHARED_LIB y
%endif

%ifarch aarch64 ppc64le
setconf CONFIG_RTE_LIBRTE_DISTRIBUTOR n
%endif
%ifarch ppc64le
setconf CONFIG_RTE_LIBRTE_PMD_RING n
%endif

make V=1 O=%{target} %{?_smp_mflags}
make V=1 O=%{target} %{?_smp_mflags} doc-api-html

%if %{with examples}
make V=1 O=%{target}/examples T=%{target} %{?_smp_mflags} examples
%endif

%install
# In case dpdk-devel is installed
unset RTE_SDK RTE_INCLUDE RTE_TARGET

%make_install O=%{target} prefix=%{_usr} libdir=%{_libdir}

%if ! %{with tools}
rm -rf %{buildroot}%{sdkdir}/tools
rm -rf %{buildroot}%{_sbindir}/dpdk_nic_bind
%endif
rm -f %{buildroot}%{sdkdir}/tools/setup.sh

%if %{with examples}
find %{target}/examples/ -name "*.map" | xargs rm -f
for f in %{target}/examples/*/%{target}/app/*; do
    bn=`basename ${f}`
    cp -p ${f} %{buildroot}%{_bindir}/dpdk_example_${bn}
done
%endif

# Create a driver directory with symlinks to all pmds
mkdir -p %{buildroot}/%{pmddir}
for f in %{buildroot}/%{_libdir}/*_pmd_*.so.*; do
    bn=$(basename ${f})
    ln -s ../${bn} %{buildroot}%{pmddir}/${bn}
done

# Setup RTE_SDK environment as expected by apps etc
mkdir -p %{buildroot}/%{_sysconfdir}/profile.d
cat << EOF > %{buildroot}/%{_sysconfdir}/profile.d/dpdk-sdk-%{_arch}.sh
if [ -z "\${RTE_SDK}" ]; then
    export RTE_SDK="%{sdkdir}"
    export RTE_TARGET="%{target}"
    export RTE_INCLUDE="%{incdir}"
fi
EOF

cat << EOF > %{buildroot}/%{_sysconfdir}/profile.d/dpdk-sdk-%{_arch}.csh
if ( ! \$RTE_SDK ) then
    setenv RTE_SDK "%{sdkdir}"
    setenv RTE_TARGET "%{target}"
    setenv RTE_INCLUDE "%{incdir}"
endif
EOF

# Fixup target machine mismatch
sed -i -e 's:-%{machine}-:-%{machine2}-:g' %{buildroot}/%{_sysconfdir}/profile.d/dpdk-sdk*

# Upstream has an option to build a combined library but it's bloatware which
# wont work at all when library versions start moving, replace it with a
# linker script which avoids these issues. Linking against the script during
# build resolves into links to the actual used libraries which is just fine
# for us, so this combined library is a build-time only construct now.
%if %{with shared}
libext=so
%else
libext=a
%endif
comblib=libdpdk.${libext}

echo "GROUP (" > ${comblib}
find %{buildroot}/%{_libdir}/ -name "*.${libext}" |\
	sed -e "s:^%{buildroot}/:  :g" >> ${comblib}
echo ")" >> ${comblib}
install -m 644 ${comblib} %{buildroot}/%{_libdir}/${comblib}
#doc
mkdir %{buildroot}%{_docdir}/
mv   %{buildroot}%{_datadir}/doc/dpdk %{buildroot}%{_docdir}/

# Remove unwanted binaries "-f" so if the file
# doesn't exist --> don't complain!
rm -f %{buildroot}%{_bindir}/cmdline_test
rm -f %{buildroot}%{_bindir}/test
rm -f %{buildroot}%{_bindir}/testpipeline
rm -f %{buildroot}%{_bindir}/testacl
rm -f %{buildroot}%{_bindir}/*.map
# Remove duplicates
%fdupes %{buildroot}/%{_prefix}

%post devel -p /sbin/ldconfig
%postun devel -p /sbin/ldconfig
%post  -p /sbin/ldconfig
%postun -p /sbin/ldconfig

%files
%defattr(-,root,root)
# BSD
%{_bindir}/testpmd
%{_bindir}/dpdk_proc_info

%if %{with shared}
%dir %{_libdir}/dpdk-pmds

%{_libdir}/*.so.*
%{pmddir}/
%endif

%files doc
%defattr(-,root,root)
#BSD
%docdir
%doc LICENSE.GPL LICENSE.LGPL

%files devel
%defattr(-,root,root)
#BSD
%{incdir}/
%{sdkdir}
%if %{with tools}
%exclude %{sdkdir}/tools/
%endif

%if %{with examples}
%exclude %{sdkdir}/examples/
%endif

%{_sysconfdir}/profile.d/dpdk-sdk-*.*
%if ! %{with shared}
%{_libdir}/*.a
%else
%{_libdir}/*.so
%endif

%if %{with tools}
%files tools
%defattr(-,root,root)
%{sdkdir}/tools/
%{_sbindir}/dpdk_nic_bind
%endif

%if %{with examples}
%files examples
%defattr(-,root,root)
%{_bindir}/dpdk_example_*
%doc %{sdkdir}/examples
%endif

%changelog
openSUSE Build Service is sponsored by