aboutsummaryrefslogtreecommitdiffstats
path: root/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst
blob: fd7a46c80d76f09b66ca12213f165e131c65f642 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
..  SPDX-License-Identifier: BSD-3-Clause
    Copyright(c) 2018 ARM Corporation.

Cross compile DPDK for ARM64
============================
This chapter describes how to cross compile DPDK for ARM64 from x86 build hosts.

.. note::

   Whilst it is recommended to natively build DPDK on ARM64 (just
   like with x86), it is also possible to cross-build DPDK for ARM64. An
   ARM64 cross compile GNU toolchain is used for this.

Obtain the cross tool chain
---------------------------
The latest cross compile tool chain can be downloaded from:
https://developer.arm.com/open-source/gnu-toolchain/gnu-a/downloads.

Following is the step to get the version 8.2, latest one at the time of this writing.

.. code-block:: console

   wget https://developer.arm.com/-/media/Files/downloads/gnu-a/8.2-2019.01/gcc-arm-8.2-2019.01-x86_64-aarch64-linux-gnu.tar.xz

Unzip and add into the PATH
---------------------------

.. code-block:: console

   tar -xvf gcc-arm-8.2-2019.01-x86_64-aarch64-linux-gnu.tar.xz
   export PATH=$PATH:<cross_install_dir>/gcc-arm-8.2-2019.01-x86_64-aarch64-linux-gnu/bin

.. note::

   For the host requirements and other info, refer to the release note section: https://releases.linaro.org/components/toolchain/binaries/

Getting the prerequisite library
--------------------------------

NUMA is required by most modern machines, not needed for non-NUMA architectures.

.. note::

   For compiling the NUMA lib, run libtool --version to ensure the libtool version >= 2.2,
   otherwise the compilation will fail with errors.

.. code-block:: console

   git clone https://github.com/numactl/numactl.git
   cd numactl
   git checkout v2.0.11 -b v2.0.11
   ./autogen.sh
   autoconf -i
   ./configure --host=aarch64-linux-gnu CC=aarch64-linux-gnu-gcc --prefix=<numa install dir>
   make install

The numa header files and lib file is generated in the include and lib folder respectively under <numa install dir>.

.. _augment_the_cross_toolchain_with_numa_support:

Augment the cross toolchain with NUMA support
---------------------------------------------

.. note::

   This way is optional, an alternative is to use extra CFLAGS and LDFLAGS, depicted in :ref:`configure_and_cross_compile_dpdk_build` below.

Copy the NUMA header files and lib to the cross compiler's directories:

.. code-block:: console

   cp <numa_install_dir>/include/numa*.h <cross_install_dir>/gcc-arm-8.2-2019.01-x86_64-aarch64-linux-gnu/bin/../aarch64-linux-gnu/libc/usr/include/
   cp <numa_install_dir>/lib/libnuma.a <cross_install_dir>/gcc-arm-8.2-2019.01-x86_64-aarch64-linux-gnu/lib/gcc/aarch64-linux-gnu/8.2/

.. _configure_and_cross_compile_dpdk_build:

Configure and cross compile DPDK Build
--------------------------------------
To configure a build, choose one of the target configurations, like arm64-dpaa2-linuxapp-gcc and arm64-thunderx-linuxapp-gcc.

.. code-block:: console

   make config T=arm64-armv8a-linuxapp-gcc

To cross-compile, without compiling the kernel modules, use the following command:

.. code-block:: console

   make -j CROSS=aarch64-linux-gnu- CONFIG_RTE_KNI_KMOD=n CONFIG_RTE_EAL_IGB_UIO=n

To cross-compile, including the kernel modules, the kernel source tree needs to be specified by setting
RTE_KERNELDIR:

.. code-block:: console

   make -j CROSS=aarch64-linux-gnu- RTE_KERNELDIR=<kernel_src_rootdir> CROSS_COMPILE=aarch64-linux-gnu-

To compile for non-NUMA targets, without compiling the kernel modules, use the following command:

.. code-block:: console

   make -j CROSS=aarch64-linux-gnu- CONFIG_RTE_KNI_KMOD=n CONFIG_RTE_EAL_IGB_UIO=n CONFIG_RTE_LIBRTE_VHOST_NUMA=n CONFIG_RTE_EAL_NUMA_AWARE_HUGEPAGES=n

.. note::

   1. EXTRA_CFLAGS and EXTRA_LDFLAGS should be added to include the NUMA headers and link the library respectively,
   if the above step :ref:`augment_the_cross_toolchain_with_numa_support` was skipped therefore the toolchain was not
   augmented with NUMA support.

   2. "-isystem <numa_install_dir>/include" should be add to EXTRA_CFLAGS, otherwise the numa.h file will get a lot of compiling
   errors of Werror=cast-qual, Werror=strict-prototypes and Werror=old-style-definition.

   An example is given below:

   .. code-block:: console

      make -j CROSS=aarch64-linux-gnu- CONFIG_RTE_KNI_KMOD=n CONFIG_RTE_EAL_IGB_UIO=n EXTRA_CFLAGS="-isystem <numa_install_dir>/include" EXTRA_LDFLAGS="-L<numa_install_dir>/lib -lnuma"

Meson Cross Compiling DPDK
--------------------------

To cross-compile DPDK on a desired target machine we can use the following
command::

	meson cross-build --cross-file <target_machine_configuration>
	ninja -C cross-build

For example if the target machine is arm64 we can use the following
command::

	meson arm64-build --cross-file config/arm/arm64_armv8_linuxapp_gcc
	ninja -C arm64-build