1#!/usr/bin/env bash 2# SPDX-License-Identifier: BSD-3-Clause 3# All rights reserved. 4# 5 6# exit on errors 7set -e 8 9ROOT_DIR=$(readlink -f $(dirname $0))/../.. 10export CROSS_COMPILE_DIR=$ROOT_DIR/cross_compiling 11export SPDK_DIR=$ROOT_DIR/spdk 12export DPDK_DIR=$SPDK_DIR/dpdk 13 14# Get Toolchain 15function get_cc_toolchain() { 16 cd $CROSS_COMPILE_DIR 17 18 if [ ! -d "$CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu" ]; then 19 echo -e "Getting ARM Cross Compiler Toolchain..." 20 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 21 tar xvf gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu.tar.xz 22 else 23 echo -e "ARM Cross Compiler Toolchain already downloaded" 24 fi 25 26 export PATH=$PATH:$CROSS_COMPILE_DIR/gcc-arm-10.2-2020.11-x86_64-aarch64-none-linux-gnu/bin 27} 28 29# NUMA 30function cross_compile_numa() { 31 cd $CROSS_COMPILE_DIR 32 33 # Download NUMA library 34 if [ ! -d "$CROSS_COMPILE_DIR/numactl" ]; then 35 echo -e "Downloading NUMA library..." 36 git clone https://github.com/numactl/numactl.git 37 cd numactl/ 38 git checkout v2.0.13 -b v2.0.13 39 else 40 echo -e "NUMA library already downloaded" 41 cd numactl/ 42 fi 43 44 # Build NUMA library 45 if [ ! -d "$CROSS_COMPILE_DIR/numactl/build" ]; then 46 echo -e "Building NUMA library..." 47 ./autogen.sh 48 autoconf -i 49 mkdir build 50 ./configure --host=aarch64-none-linux-gnu CC=aarch64-none-linux-gnu-gcc --prefix=$CROSS_COMPILE_DIR/numactl/build 51 make -j install 52 53 # Copy NUMA related dependencies 54 echo -e "Copying NUMA library dependencies..." 55 56 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/ 57 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/ 58 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/ 59 else 60 echo -e "NUMA library already built" 61 fi 62} 63 64# util-linux UUID 65function cross_compile_uuid() { 66 cd $CROSS_COMPILE_DIR 67 68 # Download util-linux UUID library 69 if [ ! -d "$CROSS_COMPILE_DIR/util-linux" ]; then 70 echo -e "Downloading util-linux UUID library..." 71 git clone https://github.com/karelzak/util-linux.git 72 else 73 echo -e "util-linux UUID library already downloaded" 74 fi 75 76 if [ ! -d "$CROSS_COMPILE_DIR/util-linux/.libs" ]; then 77 cd util-linux/ 78 79 # Build util-linux UUID library 80 echo -e "Building util-linux UUID library..." 81 82 ./autogen.sh 83 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 84 make clean 85 make -j 86 87 # Copy util-linux UUID related dependencies 88 echo -e "Copying util-linux UUID library dependencies..." 89 90 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 91 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/ 92 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/ 93 else 94 echo -e "util-linux UUID library already built" 95 fi 96} 97 98# Openssl Crypto and SSL 99function cross_compile_crypto_ssl() { 100 cd $CROSS_COMPILE_DIR 101 102 # Download Openssl Crypto and SSL libraries 103 if [ ! -d "$CROSS_COMPILE_DIR/openssl" ]; then 104 echo -e "Downloading Openssl Crypto and SSL libraries..." 105 git clone https://github.com/openssl/openssl.git 106 else 107 echo -e "Openssl Crypto and SSL libraries already downloaded" 108 fi 109 110 if [ ! -d "$CROSS_COMPILE_DIR/openssl/build" ]; then 111 cd openssl 112 113 # Build Openssl Crypto and SSL libraries 114 echo -e "Building Openssl Crypto and SSL libraries..." 115 116 mkdir build 117 ./Configure linux-aarch64 --prefix=$CROSS_COMPILE_DIR/openssl/build --cross-compile-prefix=aarch64-none-linux-gnu- 118 make -j 119 make -j install 120 121 # Copy Openssl Crypto and SSL related dependencies 122 echo -e "Copying Openssl Crypto and SSL libraries dependencies..." 123 124 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/ 125 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 126 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 127 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 128 else 129 echo -e "Openssl Crypto and SSL libraries already built" 130 fi 131} 132 133# Libaio 134function cross_compile_libaio() { 135 cd $CROSS_COMPILE_DIR 136 137 # Download libaio library 138 if [ ! -d "$CROSS_COMPILE_DIR/libaio" ]; then 139 echo -e "Downloading libaio library..." 140 141 wget https://ftp.debian.org/debian/pool/main/liba/libaio/libaio_0.3.112.orig.tar.xz --no-check-certificate 142 tar xvf libaio_0.3.112.orig.tar.xz 143 mv libaio-0.3.112 libaio 144 else 145 echo -e "libaio library already downloaded" 146 fi 147 148 if [ ! -d "$CROSS_COMPILE_DIR/libaio/build" ]; then 149 cd libaio 150 151 # Build libaio library 152 echo -e "Building libaio library..." 153 154 mkdir build 155 CC=aarch64-none-linux-gnu-gcc CXX=aarch64-none-linux-gnu-g++ LD=aarch64-none-linux-gnu-ld make -j 156 make -j install DESTDIR=$CROSS_COMPILE_DIR/libaio/build 157 158 # Copy libaio related dependencies 159 echo -e "Copying libaio library dependencies..." 160 161 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/ 162 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 163 else 164 echo -e "libaio library already built" 165 fi 166} 167 168# Ncurses 169function cross_compile_ncurses() { 170 cd $CROSS_COMPILE_DIR 171 172 # Download ncurses library 173 if [ ! -d "$CROSS_COMPILE_DIR/ncurses" ]; then 174 echo -e "Downloading ncurses library..." 175 176 wget https://ftp.gnu.org/pub/gnu/ncurses/ncurses-6.2.tar.gz --no-check-certificate 177 tar xvf ncurses-6.2.tar.gz 178 mv ncurses-6.2 ncurses 179 else 180 echo -e "ncurses library already downloaded" 181 fi 182 183 if [ ! -d "$CROSS_COMPILE_DIR/ncurses_build" ]; then 184 mkdir ncurses_build 185 186 # Build ncurses library 187 echo -e "Building ncurses library..." 188 189 (cd ncurses && ./configure --host=aarch64-none-linux-gnu --prefix=$CROSS_COMPILE_DIR/ncurses_build --disable-stripping && make -j install) 190 191 # Copy ncurses related dependencies 192 echo -e "Copying ncurses library dependencies..." 193 194 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/ 195 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/ 196 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/ 197 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/ 198 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/ 199 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/ 200 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/ 201 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/ 202 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/ 203 else 204 echo -e "ncurses library already built" 205 fi 206 207} 208 209# CUnit 210function cross_compile_cunit() { 211 cd $CROSS_COMPILE_DIR 212 213 # Download cunit library 214 if [ ! -d "$CROSS_COMPILE_DIR/CUnit" ]; then 215 echo -e "Downloading cunit library..." 216 217 git clone https://github.com/jacklicn/CUnit.git 218 else 219 echo -e "cunit library already downloaded" 220 fi 221 222 if [ ! -d "$CROSS_COMPILE_DIR/CUnit/build" ]; then 223 cd CUnit 224 225 # Build cunit library 226 echo -e "Building cunit library..." 227 228 mkdir build 229 libtoolize --force 230 aclocal 231 autoheader 232 automake --force-missing --add-missing 233 autoconf 234 ./configure --host=aarch64-none-linux-gnu --prefix=$CROSS_COMPILE_DIR/CUnit/build 235 make -j 236 make -j install 237 238 # Copy cunit related dependencies 239 echo -e "Copying cunit library dependencies..." 240 241 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/ 242 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/ 243 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 244 else 245 echo -e "cunit library already built" 246 fi 247} 248 249# ISA-L 250function cross_compile_isal() { 251 cd $SPDK_DIR 252 253 if [ ! -d "$SPDK_DIR/isa-l/build" ]; then 254 # Build ISA-L library 255 echo -e "Building ISA-L library..." 256 257 cd isa-l 258 ./autogen.sh 259 mkdir -p build/lib 260 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 261 make -j 262 make -j install 263 264 # Copy ISAL related dependencies 265 echo -e "Copying ISA-L library dependencies..." 266 267 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/ 268 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/ 269 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/ 270 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/ 271 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 272 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 273 else 274 echo -e "ISA-L library already built" 275 fi 276} 277 278# DPDK 279function cross_compile_dpdk() { 280 cd $DPDK_DIR 281 282 if [ ! -d "$DPDK_DIR/build" ]; then 283 # Build DPDK libraries 284 echo -e "Building DPDK libraries..." 285 286 apt install pkg-config-aarch64-linux-gnu 287 meson aarch64-build-gcc --cross-file config/arm/arm64_armv8_linux_gcc -Dprefix=$DPDK_DIR/build 288 ninja -C aarch64-build-gcc 289 ninja -C aarch64-build-gcc install 290 cd .. 291 292 # Copy DPDK related dependencies 293 echo -e "Copying DPDK libraries dependencies..." 294 295 cp -fr dpdk/build/bin dpdk/aarch64-build-gcc/ 296 cp -fr dpdk/build/include dpdk/aarch64-build-gcc/ 297 cp -fr dpdk/build/share dpdk/aarch64-build-gcc/ 298 cp -fr dpdk/build/lib/* dpdk/aarch64-build-gcc/lib/ 299 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/ 300 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/ 301 else 302 echo -e "DPDK libraries already built" 303 fi 304} 305 306# SPDK 307function cross_compile_spdk() { 308 cd $SPDK_DIR 309 310 # Build SPDK libraries and binaries 311 echo -e "Building SPDK libraries and binaries..." 312 313 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 314 315 make -j 316} 317 318mkdir -p $CROSS_COMPILE_DIR 319 320get_cc_toolchain 321 322cross_compile_packages=(numa uuid crypto_ssl libaio ncurses cunit isal dpdk spdk) 323 324for index in "${cross_compile_packages[@]}"; do 325 cross_compile_$index 326done 327