scripts: ARM64 Cross-Compilation Support

This script contains the necessary steps for the cross-compilation
of SPDK and the libraries needed by SPDK for aarch64 on x64 machines.

Signed-off-by: Krishna Kanth Reddy <krish.reddy@samsung.com>
Change-Id: I6319f461242b267ca4b63f276d98ee8820085bfe
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/8784
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Reviewed-by: Aleksey Marchuk <alexeymar@mellanox.com>
Reviewed-by: Jim Harris <james.r.harris@intel.com>
This commit is contained in:
Krishna Kanth Reddy 2021-07-15 10:31:33 +05:30 committed by Jim Harris
parent 064cc9edac
commit 654c1fc8f3

323
scripts/arm_cross_compile.sh Executable file
View File

@ -0,0 +1,323 @@
#!/usr/bin/env bash
# exit on errors
set -e
ROOT_DIR=$(readlink -f $(dirname $0))/../..
export CROSS_COMPILE_DIR=$ROOT_DIR/cross_compiling
export SPDK_DIR=$ROOT_DIR/spdk
export DPDK_DIR=$SPDK_DIR/dpdk
# Get Toolchain
function get_cc_toolchain() {
cd $CROSS_COMPILE_DIR
if [ ! -d "$CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu" ]; then
echo -e "Getting ARM Cross Compiler Toolchain..."
wget https://developer.arm.com/-/media/Files/downloads/gnu-a/10.2-2020.11/binrel/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz --no-check-certificate
tar xvf gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz
else
echo -e "ARM Cross Compiler Toolchain already downloaded"
fi
export PATH=$PATH:$CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin
}
# NUMA
function cross_compile_numa() {
cd $CROSS_COMPILE_DIR
# Download NUMA library
if [ ! -d "$CROSS_COMPILE_DIR/numactl" ]; then
echo -e "Downloading NUMA library..."
git clone https://github.com/numactl/numactl.git
cd numactl/
git checkout v2.0.13 -b v2.0.13
else
echo -e "NUMA library already downloaded"
cd numactl/
fi
# Build NUMA library
if [ ! -d "$CROSS_COMPILE_DIR/numactl/build" ]; then
echo -e "Building NUMA library..."
./autogen.sh
autoconf -i
mkdir build
./configure --host=aarch64-none-linux-gnu CC=aarch64-none-linux-gnu-gcc --prefix=$CROSS_COMPILE_DIR/numactl/build
make -j install
# Copy NUMA related dependencies
echo -e "Copying NUMA library dependencies..."
cp build/include/numa*.h $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/
cp build/lib/libnuma.a $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/
cp build/lib/libnuma.so $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/
else
echo -e "NUMA library already built"
fi
}
# util-linux UUID
function cross_compile_uuid() {
cd $CROSS_COMPILE_DIR
# Download util-linux UUID library
if [ ! -d "$CROSS_COMPILE_DIR/util-linux" ]; then
echo -e "Downloading util-linux UUID library..."
git clone https://github.com/karelzak/util-linux.git
else
echo -e "util-linux UUID library already downloaded"
fi
if [ ! -d "$CROSS_COMPILE_DIR/util-linux/.libs" ]; then
cd util-linux/
# Build util-linux UUID library
echo -e "Building util-linux UUID library..."
./autogen.sh
CC=aarch64-none-linux-gnu-gcc CXX=aarch64-none-linux-gnu-g++ LD=aarch64-none-linux-gnu-ld CFLAGS+=-Wl,-rpath=$CROSS_COMPILE_DIR/util-linux/.libs ./configure --host=aarch64-none-linux-gnu --without-tinfo --without-ncurses --without-ncursesw --disable-mount --disable-libmount --disable-pylibmount --disable-libblkid --disable-fdisks --disable-libfdisk
make clean
make -j
# Copy util-linux UUID related dependencies
echo -e "Copying util-linux UUID library dependencies..."
cp .libs/libuuid.so.1.3.0 $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/libuuid.so
mkdir -p $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/uuid/
cp libuuid/src/uuid.h $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/uuid/
else
echo -e "util-linux UUID library already built"
fi
}
# Openssl Crypto and SSL
function cross_compile_crypto_ssl() {
cd $CROSS_COMPILE_DIR
# Download Openssl Crypto and SSL libraries
if [ ! -d "$CROSS_COMPILE_DIR/openssl" ]; then
echo -e "Downloading Openssl Crypto and SSL libraries..."
git clone https://github.com/openssl/openssl.git
else
echo -e "Openssl Crypto and SSL libraries already downloaded"
fi
if [ ! -d "$CROSS_COMPILE_DIR/openssl/build" ]; then
cd openssl
# Build Openssl Crypto and SSL libraries
echo -e "Building Openssl Crypto and SSL libraries..."
mkdir build
./Configure linux-aarch64 --prefix=$CROSS_COMPILE_DIR/openssl/build --cross-compile-prefix=aarch64-none-linux-gnu-
make -j
make -j install
# Copy Openssl Crypto and SSL related dependencies
echo -e "Copying Openssl Crypto and SSL libraries dependencies..."
cp -fr build/include/openssl $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/
cp build/lib/libcrypto.so.3 $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/libcrypto.so
cp build/lib/libcrypto.so.3 $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/libcrypto.so.3
cp build/lib/libssl.so.3 $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/libssl.so
else
echo -e "Openssl Crypto and SSL libraries already built"
fi
}
# Libaio
function cross_compile_libaio() {
cd $CROSS_COMPILE_DIR
# Download libaio library
if [ ! -d "$CROSS_COMPILE_DIR/libaio" ]; then
echo -e "Downloading libaio library..."
wget https://ftp.debian.org/debian/pool/main/liba/libaio/libaio_0.3.112.orig.tar.xz --no-check-certificate
tar xvf libaio_0.3.112.orig.tar.xz
mv libaio-0.3.112 libaio
else
echo -e "libaio library already downloaded"
fi
if [ ! -d "$CROSS_COMPILE_DIR/libaio/build" ]; then
cd libaio
# Build libaio library
echo -e "Building libaio library..."
mkdir build
CC=aarch64-none-linux-gnu-gcc CXX=aarch64-none-linux-gnu-g++ LD=aarch64-none-linux-gnu-ld make -j
make -j install DESTDIR=$CROSS_COMPILE_DIR/libaio/build
# Copy libaio related dependencies
echo -e "Copying libaio library dependencies..."
cp build/usr/include/libaio.h $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/
cp build/usr/lib/libaio.so.1.0.1 $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/libaio.so
else
echo -e "libaio library already built"
fi
}
# Ncurses
function cross_compile_ncurses() {
cd $CROSS_COMPILE_DIR
# Download ncurses library
if [ ! -d "$CROSS_COMPILE_DIR/ncurses" ]; then
echo -e "Downloading ncurses library..."
wget https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.2.tar.gz --no-check-certificate
tar xvf ncurses-6.2.tar.gz
mv ncurses-6.2 ncurses
else
echo -e "ncurses library already downloaded"
fi
if [ ! -d "$CROSS_COMPILE_DIR/ncurses_build" ]; then
mkdir ncurses_build
# Build ncurses library
echo -e "Building ncurses library..."
(cd ncurses && ./configure --host=aarch64-none-linux-gnu --prefix=$CROSS_COMPILE_DIR/ncurses_build --disable-stripping && make -j install)
# Copy ncurses related dependencies
echo -e "Copying ncurses library dependencies..."
cp ncurses_build/include/ncurses/ncurses.h $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/
cp ncurses_build/include/ncurses/curses.h $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/
cp -fr ncurses_build/include/ncurses $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/
cp ncurses_build/include/ncurses/menu.h $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/
cp ncurses_build/include/ncurses/eti.h $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/
cp ncurses_build/include/ncurses/panel.h $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/
cp ncurses_build/lib/libncurses* $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/
cp ncurses_build/lib/libmenu.a $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/
cp ncurses_build/lib/libpanel.a $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/
else
echo -e "ncurses library already built"
fi
}
# CUnit
function cross_compile_cunit() {
cd $CROSS_COMPILE_DIR
# Download cunit library
if [ ! -d "$CROSS_COMPILE_DIR/CUnit" ]; then
echo -e "Downloading cunit library..."
git clone https://github.com/jacklicn/CUnit.git
else
echo -e "cunit library already downloaded"
fi
if [ ! -d "$CROSS_COMPILE_DIR/CUnit/build" ]; then
cd CUnit
# Build cunit library
echo -e "Building cunit library..."
mkdir build
libtoolize --force
aclocal
autoheader
automake --force-missing --add-missing
autoconf
./configure --host=aarch64-none-linux-gnu --prefix=$CROSS_COMPILE_DIR/CUnit/build
make -j
make -j install
# Copy cunit related dependencies
echo -e "Copying cunit library dependencies..."
cp -fr build/include/CUnit $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/
cp build/lib/libcunit.a $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/
cp build/lib/libcunit.so.1.0.1 $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/libcunit.so
else
echo -e "cunit library already built"
fi
}
# ISA-L
function cross_compile_isal() {
cd $SPDK_DIR
if [ ! -d "$SPDK_DIR/isa-l/build" ]; then
# Build ISA-L library
echo -e "Building ISA-L library..."
cd isa-l
./autogen.sh
mkdir -p build/lib
ac_cv_func_malloc_0_nonnull=yes ac_cv_func_realloc_0_nonnull=yes ./configure --prefix=$SPDK_DIR/isa-l/build --libdir=$SPDK_DIR/isa-l/build/lib --host=aarch64-none-linux-gnu
make -j
make -j install
# Copy ISAL related dependencies
echo -e "Copying ISA-L library dependencies..."
cp -fr build/include/isa-l $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/
cp build/include/isa-l.h $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/aarch64-none-linux-gnu/libc/usr/include/
cp build/lib/libisal.a $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/
cp build/lib/libisal.so.2.0.30 $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/
ln -sf $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/libisal.so.2.0.30 $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/libisal.so
ln -sf $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/libisal.so.2.0.30 $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/libisal.so.2
else
echo -e "ISA-L library already built"
fi
}
# DPDK
function cross_compile_dpdk() {
cd $DPDK_DIR
if [ ! -d "$DPDK_DIR/build" ]; then
# Build DPDK libraries
echo -e "Building DPDK libraries..."
apt install pkg-config-aarch64-linux-gnu
meson aarch64-build-gcc --cross-file config/arm/arm64_armv8_linux_gcc -Dprefix=$DPDK_DIR/build
ninja -C aarch64-build-gcc
ninja -C aarch64-build-gcc install
cd ..
# Copy DPDK related dependencies
echo -e "Copying DPDK libraries dependencies..."
cp -fr dpdk/build/bin dpdk/aarch64-build-gcc/
cp -fr dpdk/build/include dpdk/aarch64-build-gcc/
cp -fr dpdk/build/share dpdk/aarch64-build-gcc/
cp -fr dpdk/build/lib/* dpdk/aarch64-build-gcc/lib/
cp $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/libcrypto.so.3 dpdk/aarch64-build-gcc/lib/
cp $CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/lib/gcc/aarch64-none-linux-gnu/10.2.1/libcrypto.so dpdk/aarch64-build-gcc/lib/
else
echo -e "DPDK libraries already built"
fi
}
# SPDK
function cross_compile_spdk() {
cd $SPDK_DIR
# Build SPDK libraries and binaries
echo -e "Building SPDK libraries and binaries..."
CC=aarch64-none-linux-gnu-gcc CXX=aarch64-none-linux-gnu-g++ LD=aarch64-none-linux-gnu-ld CFLAGS+=-I$DPDK_DIR/aarch64-build-gcc/include ./configure --cross-prefix=aarch64-none-linux-gnu --without-vhost --with-dpdk=$DPDK_DIR/aarch64-build-gcc --target-arch=armv8-a
make -j
}
mkdir -p $CROSS_COMPILE_DIR
get_cc_toolchain
cross_compile_packages=(numa uuid crypto_ssl libaio ncurses cunit isal dpdk spdk)
for index in ${cross_compile_packages[*]}; do
cross_compile_$index
done