xref: /spdk/scripts/arm_cross_compile.sh (revision eb53c23236cccb6b698b7ca70ee783da1c574b5f)
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