xref: /dpdk/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst (revision 68a03efeed657e6e05f281479b33b51102797e15)
1..  SPDX-License-Identifier: BSD-3-Clause
2    Copyright(c) 2020 ARM Corporation.
3
4Cross compiling DPDK for ARM64
5==============================
6This chapter describes how to cross compile DPDK for ARM64 from x86 build hosts.
7
8.. note::
9
10   Whilst it is recommended to natively build DPDK on ARM64 (just
11   like with x86), it is also possible to cross compile DPDK for ARM64.
12   An ARM64 cross compiler GNU toolchain or an LLVM/clang toolchain
13   may be used for cross-compilation.
14
15
16Prerequisites
17-------------
18
19NUMA library
20~~~~~~~~~~~~
21
22NUMA is required by most modern machines, not needed for non-NUMA architectures.
23
24.. note::
25
26   For compiling the NUMA lib, run libtool --version to ensure the libtool version >= 2.2,
27   otherwise the compilation will fail with errors.
28
29.. code-block:: console
30
31   git clone https://github.com/numactl/numactl.git
32   cd numactl
33   git checkout v2.0.13 -b v2.0.13
34   ./autogen.sh
35   autoconf -i
36   ./configure --host=aarch64-linux-gnu CC=<compiler> --prefix=<numa install dir>
37   make install
38
39.. note::
40
41   The compiler above can be either aarch64-linux-gnu-gcc or clang.
42   See below for information on how to get specific compilers.
43
44The numa header files and lib file is generated in the include and lib folder
45respectively under ``<numa install dir>``.
46
47Meson prerequisites
48~~~~~~~~~~~~~~~~~~~
49
50Meson depends on pkgconfig to find the dependencies.
51The package ``pkg-config-aarch64-linux-gnu`` is required for aarch64.
52To install it in Ubuntu::
53
54   sudo apt install pkg-config-aarch64-linux-gnu
55
56
57GNU toolchain
58-------------
59
60.. _obtain_GNU_toolchain:
61
62Obtain the cross toolchain
63~~~~~~~~~~~~~~~~~~~~~~~~~~
64
65The latest GNU cross compiler toolchain can be downloaded from:
66https://developer.arm.com/open-source/gnu-toolchain/gnu-a/downloads.
67
68It is always recommended to check and get the latest compiler tool
69from the page and use it to generate better code.
70As of this writing 9.2-2019.12 is the newest,
71the following description is an example of this version.
72
73.. code-block:: console
74
75   wget https://developer.arm.com/-/media/Files/downloads/gnu-a/9.2-2019.12/binrel/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
76
77Unzip and add into the PATH
78~~~~~~~~~~~~~~~~~~~~~~~~~~~
79
80.. code-block:: console
81
82   tar -xvf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz
83   export PATH=$PATH:<cross_install_dir>/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin
84
85.. note::
86
87   For the host requirements and other info, refer to the release note section: https://releases.linaro.org/components/toolchain/binaries/
88
89.. _augment_the_gnu_toolchain_with_numa_support:
90
91Augment the GNU toolchain with NUMA support
92~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
93
94.. note::
95
96   This way is optional, an alternative is to use extra CFLAGS and LDFLAGS.
97
98Copy the NUMA header files and lib to the cross compiler's directories:
99
100.. code-block:: console
101
102   cp <numa_install_dir>/include/numa*.h <cross_install_dir>/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/
103   cp <numa_install_dir>/lib/libnuma.a <cross_install_dir>/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/9.2.1/
104   cp <numa_install_dir>/lib/libnuma.so <cross_install_dir>/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/9.2.1/
105
106Cross Compiling DPDK with GNU toolchain using Meson
107~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
108
109To cross-compile DPDK on a desired target machine we can use the following
110command::
111
112   meson cross-build --cross-file <target_machine_configuration>
113   ninja -C cross-build
114
115For example if the target machine is aarch64 we can use the following
116command::
117
118   meson aarch64-build-gcc --cross-file config/arm/arm64_armv8_linux_gcc
119   ninja -C aarch64-build-gcc
120
121
122LLVM/Clang toolchain
123--------------------
124
125Obtain the cross tool chain
126~~~~~~~~~~~~~~~~~~~~~~~~~~~
127
128The latest LLVM/Clang cross compiler toolchain can be downloaded from:
129https://developer.arm.com/tools-and-software/open-source-software/developer-tools/llvm-toolchain.
130
131.. code-block:: console
132
133   # Ubuntu binaries
134   wget https://github.com/llvm/llvm-project/releases/download/llvmorg-10.0.0/clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz
135
136The LLVM/Clang toolchain does not implement the standard c library.
137The GNU toolchain ships an implementation we can use.
138Refer to obtain_GNU_toolchain_ to get the GNU toolchain.
139
140Unzip and add into the PATH
141~~~~~~~~~~~~~~~~~~~~~~~~~~~
142
143.. code-block:: console
144
145   tar -xvf clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz
146   export PATH=$PATH:<cross_install_dir>/clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04/bin
147
148Cross Compiling DPDK with LLVM/Clang toolchain using Meson
149~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
150
151.. note::
152
153   To use the NUMA library follow the same steps as for
154   augment_the_gnu_toolchain_with_numa_support_.
155
156The paths to GNU stdlib must be specified in a cross file.
157Augmenting the default cross-file's ``c_args`` and ``c_link_args``
158``config/arm/arm64_armv8_linux_clang_ubuntu1804`` would look like this:
159
160.. code-block:: console
161
162   ...
163   c_args = ['-target', 'aarch64-linux-gnu', '--sysroot', '<cross_install_dir>/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc']
164   c_link_args = ['-target', 'aarch64-linux-gnu', '-fuse-ld=lld', '--sysroot', '<cross_install_dir>/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc', '--gcc-toolchain=<cross_install_dir>/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu']
165
166Assuming the file with augmented ``c_args`` and ``c_link_args``
167is named ``arm64_armv8_linux_clang``,
168use the following command to cross-compile DPDK for the target machine::
169
170   meson aarch64-build-clang --cross-file config/arm/arm64_armv8_linux_clang
171   ninja -C aarch64-build-clang
172
173Cross Compiling DPDK with LLVM/Clang toolchain using Meson on Ubuntu 18.04
174~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
175
176On most popular Linux distribution it is not necessary to download
177the toolchains, but rather use the packages provided by said distributions.
178On Ubuntu 18.04, these packages are needed:
179
180.. code-block:: console
181
182   sudo apt-get install pkg-config-aarch64-linux-gnu clang llvm llvm-dev lld
183   libc6-dev-arm64-cross libatomic1-arm64-cross libgcc-8-dev-arm64-cross
184
185Use the following command to cross-compile DPDK for the target machine::
186
187   meson aarch64-build-clang --cross-file config/arm/arm64_armv8_linux_clang_ubuntu1804
188   ninja -C aarch64-build-clang
189
190Supported cross-compilation targets
191-----------------------------------
192
193If you wish to build for a target which is not among the current cross-files,
194you may use various combinations of implementer/part number::
195
196   Supported implementers:
197      'generic': Generic armv8
198      '0x41':    Arm
199      '0x43':    Cavium
200      '0x50':    Ampere Computing
201      '0x56':    Marvell ARMADA
202      'dpaa':    NXP DPAA
203
204   Supported part_numbers for generic:
205      'generic': valid for all armv8-a architectures (unoptimized portable build)
206
207   Supported part_numbers for 0x41, 0x56, dpaa:
208      '0xd03':   cortex-a53
209      '0xd04':   cortex-a35
210      '0xd09':   cortex-a73
211      '0xd0a':   cortex-a75
212      '0xd0b':   cortex-a76
213      '0xd0c':   neoverse-n1
214
215   Supported part_numbers for 0x43:
216      '0xa1':    thunderxt88
217      '0xa2':    thunderxt81
218      '0xa3':    thunderxt83
219      '0xaf':    thunderx2t99
220      '0xb2':    octeontx2
221
222   Supported part_numbers for 0x50:
223      '0x0':     emag
224
225Other cross file options
226------------------------
227
228There are other options you may specify in a cross file to tailor the build::
229
230   Supported extra configuration
231      max_numa_nodes = n  # will set RTE_MAX_NUMA_NODES
232      max_lcores = n      # will set RTE_MAX_LCORE
233
234      numa = false        # set to false to force building for a non-NUMA system
235         # if not set or set to true, the build system will build for a NUMA
236         # system only if libnuma is installed
237