From eb0e12c0c2991b3e12ee015db8f86355f38dcffc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juraj=20Linke=C5=A1?= Date: Thu, 21 Jan 2021 16:51:44 +0100 Subject: [PATCH] doc: add clang to aarch64 cross build guide MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reorganize and update the aarch64 cross guide with clang cross compilation. Update the GNU toolchain version which clang also uses. Reorganize into common part, GNU part and clang part. Signed-off-by: Juraj Linkeš Acked-by: Ruifeng Wang --- .../linux_gsg/cross_build_dpdk_for_arm64.rst | 197 +++++++++++++----- 1 file changed, 142 insertions(+), 55 deletions(-) diff --git a/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst b/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst index d0d346c83c..faaf24b95b 100644 --- a/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst +++ b/doc/guides/linux_gsg/cross_build_dpdk_for_arm64.rst @@ -1,45 +1,23 @@ .. SPDX-License-Identifier: BSD-3-Clause - Copyright(c) 2018 ARM Corporation. + Copyright(c) 2020 ARM Corporation. -Cross compile DPDK for ARM64 -============================ +Cross compiling 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. + like with x86), it is also possible to cross compile DPDK for ARM64. + An ARM64 cross compiler GNU toolchain or an LLVM/clang toolchain + may be used for cross-compilation. -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. -It is always recommended to check and get the latest compiler tool from the page and use -it to generate better code. As of this writing 8.3-2019.03 is the newest, the following -description is an example of this version. +Prerequisites +------------- -.. code-block:: console - - wget https://developer.arm.com/-/media/Files/downloads/gnu-a/8.3-2019.03/binrel/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz - -Unzip and add into the PATH ---------------------------- - -.. code-block:: console - - tar -xvf gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu.tar.xz - export PATH=$PATH:/gcc-arm-8.3-2019.03-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/ - -.. _arm_cross_build_getting_the_prerequisite_library: - -Getting the prerequisite library --------------------------------- +NUMA library +~~~~~~~~~~~~ NUMA is required by most modern machines, not needed for non-NUMA architectures. @@ -55,15 +33,63 @@ NUMA is required by most modern machines, not needed for non-NUMA architectures. git checkout v2.0.13 -b v2.0.13 ./autogen.sh autoconf -i - ./configure --host=aarch64-linux-gnu CC=aarch64-linux-gnu-gcc --prefix= + ./configure --host=aarch64-linux-gnu CC= --prefix= make install -The numa header files and lib file is generated in the include and lib folder respectively under . +.. note:: -.. _augment_the_cross_toolchain_with_numa_support: + The compiler above can be either aarch64-linux-gnu-gcc or clang. + See below for information on how to get specific compilers. -Augment the cross toolchain with NUMA support ---------------------------------------------- +The numa header files and lib file is generated in the include and lib folder +respectively under ````. + +Meson prerequisites +~~~~~~~~~~~~~~~~~~~ + +Meson depends on pkgconfig to find the dependencies. +The package ``pkg-config-aarch64-linux-gnu`` is required for aarch64. +To install it in Ubuntu:: + + sudo apt install pkg-config-aarch64-linux-gnu + + +GNU toolchain +------------- + +.. _obtain_GNU_toolchain: + +Obtain the cross toolchain +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The latest GNU cross compiler toolchain can be downloaded from: +https://developer.arm.com/open-source/gnu-toolchain/gnu-a/downloads. + +It is always recommended to check and get the latest compiler tool +from the page and use it to generate better code. +As of this writing 9.2-2019.12 is the newest, +the following description is an example of this version. + +.. code-block:: console + + 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 + +Unzip and add into the PATH +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: console + + tar -xvf gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu.tar.xz + export PATH=$PATH:/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/bin + +.. note:: + + For the host requirements and other info, refer to the release note section: https://releases.linaro.org/components/toolchain/binaries/ + +.. _augment_the_gnu_toolchain_with_numa_support: + +Augment the GNU toolchain with NUMA support +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: @@ -73,32 +99,93 @@ Copy the NUMA header files and lib to the cross compiler's directories: .. code-block:: console - cp /include/numa*.h /gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/include/ - cp /lib/libnuma.a /gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/lib/gcc/aarch64-linux-gnu/8.3.0/ - cp /lib/libnuma.so /gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/lib/gcc/aarch64-linux-gnu/8.3.0/ + cp /include/numa*.h /gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/ + cp /lib/libnuma.a /gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/9.2.1/ + cp /lib/libnuma.so /gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/9.2.1/ -.. _configure_and_cross_compile_dpdk_build: - -Cross Compiling DPDK --------------------- - -Meson depends on pkgconfig to find the dependencies. -The package ``pkg-config-aarch64-linux-gnu`` is required for aarch64. -To install it in Ubuntu:: - - sudo apt-get install pkg-config-aarch64-linux-gnu +Cross Compiling DPDK with GNU toolchain using Meson +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ To cross-compile DPDK on a desired target machine we can use the following command:: - meson cross-build --cross-file - ninja -C cross-build + meson cross-build --cross-file + ninja -C cross-build -For example if the target machine is arm64 we can use the following +For example if the target machine is aarch64 we can use the following command:: - meson arm64-build --cross-file config/arm/arm64_armv8_linux_gcc - ninja -C arm64-build + meson aarch64-build-gcc --cross-file config/arm/arm64_armv8_linux_gcc + ninja -C aarch64-build-gcc + + +LLVM/Clang toolchain +-------------------- + +Obtain the cross tool chain +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The latest LLVM/Clang cross compiler toolchain can be downloaded from: +https://developer.arm.com/tools-and-software/open-source-software/developer-tools/llvm-toolchain. + +.. code-block:: console + + # Ubuntu binaries + 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 + +The LLVM/Clang toolchain does not implement the standard c library. +The GNU toolchain ships an implementation we can use. +Refer to obtain_GNU_toolchain_ to get the GNU toolchain. + +Unzip and add into the PATH +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. code-block:: console + + tar -xvf clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04.tar.xz + export PATH=$PATH:/clang+llvm-10.0.0-x86_64-linux-gnu-ubuntu-18.04/bin + +Cross Compiling DPDK with LLVM/Clang toolchain using Meson +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. note:: + + To use the NUMA library follow the same steps as for + augment_the_gnu_toolchain_with_numa_support_. + +The paths to GNU stdlib must be specified in a cross file. +Augmenting the default cross-file's ``c_args`` and ``c_link_args`` +``config/arm/arm64_armv8_linux_clang_ubuntu1804`` would look like this: + +.. code-block:: console + + ... + c_args = ['-target', 'aarch64-linux-gnu', '--sysroot', '/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc'] + c_link_args = ['-target', 'aarch64-linux-gnu', '-fuse-ld=lld', '--sysroot', '/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc', '--gcc-toolchain=/gcc-arm-9.2-2019.12-x86_64-aarch64-none-linux-gnu'] + +Assuming the file with augmented ``c_args`` and ``c_link_args`` +is named ``arm64_armv8_linux_clang``, +use the following command to cross-compile DPDK for the target machine:: + + meson aarch64-build-clang --cross-file config/arm/arm64_armv8_linux_clang + ninja -C aarch64-build-clang + +Cross Compiling DPDK with LLVM/Clang toolchain using Meson on Ubuntu 18.04 +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +On most popular Linux distribution it is not necessary to download +the toolchains, but rather use the packages provided by said distributions. +On Ubuntu 18.04, these packages are needed: + +.. code-block:: console + + sudo apt-get install pkg-config-aarch64-linux-gnu clang llvm llvm-dev lld + libc6-dev-arm64-cross libatomic1-arm64-cross libgcc-8-dev-arm64-cross + +Use the following command to cross-compile DPDK for the target machine:: + + meson aarch64-build-clang --cross-file config/arm/arm64_armv8_linux_clang_ubuntu1804 + ninja -C aarch64-build-clang Supported cross-compilation targets -----------------------------------