blob: a526b50c08caea19a90db6478e0e1e50d279cf1d [file] [log] [blame]
Martin Roth0ad5fbd2020-12-24 12:06:38 -07001#!/usr/bin/env sh
Martin Roth987d42d2018-07-22 11:45:29 -06002# shellcheck disable=SC2030,SC2031,SC2059
3# The above line must be directly after the shebang line.
4# Disables these warnings:
5# 2030 - Modification of var is local (to subshell caused by pipeline).
6# shell check 0.4.6 gets confused by the read -t 1 command and interprets
7# the '1' as $1 getting modified.
8# 2031 - var was modified in a subshell. That change might be lost.
9# caused by shell check bug with SC2030? This causes any $1 from that
10# point on to be flagged.
11# 2059 - Don't use variables in the printf format string. Use printf "..%s.." "$foo".
12# This is used for all of our color printing.
13
Stefan Reinauer074d9132009-09-26 16:43:17 +000014#
Patrick Georgi7333a112020-05-08 20:48:04 +020015# SPDX-License-Identifier: GPL-2.0-only
Stefan Reinauer074d9132009-09-26 16:43:17 +000016
Martin Roth987d42d2018-07-22 11:45:29 -060017cd "$(dirname "$0")" || exit 1
Patrick Georgi8135dba2015-03-17 21:05:20 +010018
Felix Singer02750d02021-10-17 15:43:21 +020019if [ -z "$CROSSGCC_VERSION" ]; then
20 CROSSGCC_VERSION="$(git log -n 1 --pretty=%cd --date=short .)_$(git log -n 1 --pretty=%h .)"
21fi
Stefan Reinauer074d9132009-09-26 16:43:17 +000022
23# default settings
Stefan Reinauer85b07d62015-06-09 14:45:14 -070024PACKAGE=GCC
Stefan Reinauerd7649122015-06-09 11:44:25 -070025TARGETDIR=$(pwd)/xgcc
Stefan Reinauer074d9132009-09-26 16:43:17 +000026TARGETARCH=i386-elf
Nico Huber66c2c1a2016-09-20 13:09:29 +020027DEFAULT_LANGUAGES=c
28LANGUAGES=
Stefan Reinauer074d9132009-09-26 16:43:17 +000029DESTDIR=
Stefan Reinauer85b07d62015-06-09 14:45:14 -070030SAVETEMPS=0
Nico Huber234d2462016-01-26 16:10:17 +010031BOOTSTRAP=0
Martin Roth2c6a8062016-11-14 11:58:39 -070032THREADS=1
Martin Roth3b32af92022-11-27 12:55:31 -070033USE_COREBOOT_MIRROR=0
34COREBOOT_MIRROR_URL="https://www.coreboot.org/releases/crossgcc-sources"
Stefan Reinauer074d9132009-09-26 16:43:17 +000035
Stefan Reinauer699ac272015-06-05 12:43:28 -070036# GCC toolchain version numbers
Patrick Georgi0afb90a2021-05-10 23:34:18 +020037GMP_VERSION=6.2.1
Elyes Haouas8aebfd32022-11-18 13:50:25 +010038MPFR_VERSION=4.1.1
Elyes Haouasd15a9f92022-12-10 06:00:08 +010039MPC_VERSION=1.3.1
Patrick Georgib0d87f72021-05-10 23:39:45 +020040GCC_VERSION=11.2.0
Patrick Georgif28e3682021-05-10 23:33:00 +020041BINUTILS_VERSION=2.37
Felix Singer60a42272022-11-26 11:03:03 +000042IASL_VERSION="R10_20_22"
Stefan Reinauer14ce2132015-06-05 13:01:13 -070043# CLANG version number
Elyes Haouasd7d8e0d2022-11-30 12:39:38 +010044CLANG_VERSION=15.0.6
Elyes Haouas49838af2022-11-17 09:44:54 +010045CMAKE_VERSION=3.25.0
Elyes HAOUAS1ba663c2020-08-23 07:50:32 +020046NASM_VERSION=2.15.05
Stefan Reinauer074d9132009-09-26 16:43:17 +000047
Martin Roth3b32af92022-11-27 12:55:31 -070048# Filename for each package
49GMP_ARCHIVE="gmp-${GMP_VERSION}.tar.xz"
50MPFR_ARCHIVE="mpfr-${MPFR_VERSION}.tar.xz"
51MPC_ARCHIVE="mpc-${MPC_VERSION}.tar.gz"
52GCC_ARCHIVE="gcc-${GCC_VERSION}.tar.xz"
53BINUTILS_ARCHIVE="binutils-${BINUTILS_VERSION}.tar.xz"
54IASL_ARCHIVE="${IASL_VERSION}.tar.gz"
55# CLANG toolchain FILE locations
56LLVM_ARCHIVE="llvm-${CLANG_VERSION}.src.tar.xz"
57CLANG_ARCHIVE="clang-${CLANG_VERSION}.src.tar.xz"
58CRT_ARCHIVE="compiler-rt-${CLANG_VERSION}.src.tar.xz"
59CTE_ARCHIVE="clang-tools-extra-${CLANG_VERSION}.src.tar.xz"
60LLVMCMAKE_ARCHIVE="cmake-${CLANG_VERSION}.src.tar.xz"
61CMAKE_ARCHIVE="cmake-${CMAKE_VERSION}.tar.gz"
62NASM_ARCHIVE="nasm-${NASM_VERSION}.tar.bz2"
63
64# These URLs are sanitized by the jenkins toolchain test builder, so if
Martin Roth1484c032016-03-08 09:37:14 -070065# a completely new URL is added here, it probably needs to be added
66# to the jenkins build as well, or the builder won't download it.
Stefan Reinauer074d9132009-09-26 16:43:17 +000067
Martin Roth3b32af92022-11-27 12:55:31 -070068# GCC toolchain archive locations
69GMP_BASE_URL="https://ftpmirror.gnu.org/gmp"
70MPFR_BASE_URL="https://ftpmirror.gnu.org/mpfr"
71MPC_BASE_URL="https://ftpmirror.gnu.org/mpc"
72GCC_BASE_URL="https://ftpmirror.gnu.org/gcc/gcc-${GCC_VERSION}"
73BINUTILS_BASE_URL="https://ftpmirror.gnu.org/binutils"
Elyes Haouas6ac0a462023-01-16 07:30:05 +010074IASL_BASE_URL="https://github.com/acpica/acpica/archive/refs/tags"
Martin Roth3b32af92022-11-27 12:55:31 -070075# CLANG toolchain archive locations
76LLVM_BASE_URL="https://github.com/llvm/llvm-project/releases/download/llvmorg-${CLANG_VERSION}"
77CLANG_BASE_URL="https://github.com/llvm/llvm-project/releases/download/llvmorg-${CLANG_VERSION}"
78CRT_BASE_URL="https://github.com/llvm/llvm-project/releases/download/llvmorg-${CLANG_VERSION}"
79CTE_BASE_URL="https://github.com/llvm/llvm-project/releases/download/llvmorg-${CLANG_VERSION}"
80LLVMCMAKE_BASE_URL="https://github.com/llvm/llvm-project/releases/download/llvmorg-${CLANG_VERSION}"
81CMAKE_BASE_URL="https://cmake.org/files/v${CMAKE_VERSION%.*}"
82NASM_BASE_URL="https://www.nasm.us/pub/nasm/releasebuilds/${NASM_VERSION}"
83
84ALL_ARCHIVES="$GMP_BASE_URL/$GMP_ARCHIVE $MPFR_BASE_URL/$MPFR_ARCHIVE $MPC_BASE_URL/$MPC_ARCHIVE \
85 $GCC_BASE_URL/$GCC_ARCHIVE $BINUTILS_BASE_URL/$BINUTILS_ARCHIVE $IASL_BASE_URL/$IASL_ARCHIVE \
86 $LLVM_BASE_URL/$LLVM_ARCHIVE $CLANG_BASE_URL/$CLANG_ARCHIVE $LLVMCMAKE_BASE_URL/$LLVMCMAKE_ARCHIVE \
87 $CRT_BASE_URL/$CRT_ARCHIVE $CTE_BASE_URL/$CTE_ARCHIVE $CMAKE_BASE_URL/$CMAKE_ARCHIVE $NASM_BASE_URL/$NASM_ARCHIVE"
Martin Roth58c68d52016-03-01 15:22:42 -070088
Stefan Reinauer699ac272015-06-05 12:43:28 -070089# GCC toolchain directories
Stefan Reinauer074d9132009-09-26 16:43:17 +000090GMP_DIR="gmp-${GMP_VERSION}"
91MPFR_DIR="mpfr-${MPFR_VERSION}"
Stefan Reinauer5f1ad892010-05-17 11:02:25 +000092MPC_DIR="mpc-${MPC_VERSION}"
Martin Roth987d42d2018-07-22 11:45:29 -060093# shellcheck disable=SC2034
Stefan Reinauer074d9132009-09-26 16:43:17 +000094GCC_DIR="gcc-${GCC_VERSION}"
Martin Roth987d42d2018-07-22 11:45:29 -060095# shellcheck disable=SC2034
Stefan Reinauer074d9132009-09-26 16:43:17 +000096BINUTILS_DIR="binutils-${BINUTILS_VERSION}"
Felix Singer60a42272022-11-26 11:03:03 +000097IASL_DIR="acpica-${IASL_VERSION}"
Stefan Reinauer14ce2132015-06-05 13:01:13 -070098# CLANG toolchain directories
99LLVM_DIR="llvm-${CLANG_VERSION}.src"
Elyes HAOUAS8f1853c2020-08-02 09:46:15 +0200100CLANG_DIR="clang-${CLANG_VERSION}.src"
Stefan Reinauer14ce2132015-06-05 13:01:13 -0700101CRT_DIR="compiler-rt-${CLANG_VERSION}.src"
102CTE_DIR="clang-tools-extra-${CLANG_VERSION}.src"
Elyes Haouasc8870b12022-09-16 12:10:00 +0200103LLVMCMAKE_DIR="cmake-${CLANG_VERSION}.src"
Stefan Reinauer3b593492017-06-19 17:28:54 -0700104CMAKE_DIR="cmake-${CMAKE_VERSION}"
Martin Rothd70f5fa2019-05-26 17:24:19 -0600105NASM_DIR="nasm-${NASM_VERSION}"
Stefan Reinauer074d9132009-09-26 16:43:17 +0000106
Patrick Georgi6321f522015-02-27 23:36:26 +0100107unset MAKELEVEL MAKEFLAGS
108
Patrick Georgi1861ff72011-10-31 12:15:55 +0100109red='\033[0;31m'
110RED='\033[1;31m'
111green='\033[0;32m'
112GREEN='\033[1;32m'
113blue='\033[0;34m'
Patrick Georgi1861ff72011-10-31 12:15:55 +0100114CYAN='\033[1;36m'
115NC='\033[0m' # No Color
Stefan Reinauer074d9132009-09-26 16:43:17 +0000116
Martin Roth987d42d2018-07-22 11:45:29 -0600117UNAME=$(if uname | grep -iq cygwin; then echo Cygwin; else uname; fi)
Martin Roth88463822016-01-07 11:03:36 -0700118HALT_FOR_TOOLS=0
Stefan Reinauer0d2119d2013-07-10 14:27:56 -0700119
Nico Huber08bb8372017-06-24 19:50:35 +0200120hostcc()
121{
122 # $1 "host" or "target"
Martin Roth987d42d2018-07-22 11:45:29 -0600123 if [ "$BOOTSTRAP" = 1 ] && [ "$1" = target ]; then
124 echo "$DESTDIR$TARGETDIR/bin/gcc"
Nico Huber08bb8372017-06-24 19:50:35 +0200125 else
Martin Roth987d42d2018-07-22 11:45:29 -0600126 echo "$CC"
Nico Huber08bb8372017-06-24 19:50:35 +0200127 fi
128}
129
130hostcxx()
131{
132 # $1 "host" or "target"
Martin Roth987d42d2018-07-22 11:45:29 -0600133 if [ "$BOOTSTRAP" = 1 ] && [ "$1" = target ]; then
134 echo "$DESTDIR$TARGETDIR/bin/g++"
Nico Huber08bb8372017-06-24 19:50:35 +0200135 else
Martin Roth987d42d2018-07-22 11:45:29 -0600136 echo "$CXX"
Nico Huber08bb8372017-06-24 19:50:35 +0200137 fi
138}
139
Patrick Georgi198d23c2012-12-08 08:02:44 +0100140normalize_dirs()
141{
Martin Roth987d42d2018-07-22 11:45:29 -0600142 mkdir -p "$DESTDIR$TARGETDIR/lib"
143 test -d "$DESTDIR$TARGETDIR/lib32" && mv "$DESTDIR$TARGETDIR"/lib32/* "$DESTDIR$TARGETDIR/lib"
144 test -d "$DESTDIR$TARGETDIR/lib64" && mv "$DESTDIR$TARGETDIR"/lib64/* "$DESTDIR$TARGETDIR/lib"
Martin Roth1039d272022-01-31 10:17:43 -0700145 rm -rf "$DESTDIR$TARGETDIR/lib32" "$DESTDIR$TARGETDIR/lib64"
Patrick Georgi198d23c2012-12-08 08:02:44 +0100146
Martin Roth987d42d2018-07-22 11:45:29 -0600147 perl -pi -e "s,/lib32,/lib," "$DESTDIR$TARGETDIR"/lib/*.la
148 perl -pi -e "s,/lib64,/lib," "$DESTDIR$TARGETDIR"/lib/*.la
Patrick Georgi198d23c2012-12-08 08:02:44 +0100149}
150
Nico Hubercd87e1b2017-06-24 20:35:59 +0200151countdown()
152{
153 tout=${1:-10}
154
Martin Roth987d42d2018-07-22 11:45:29 -0600155 printf "\nPress Ctrl-C to abort, Enter to continue... %2ds" "$tout"
156 while [ "$tout" -gt 0 ]; do
Nico Hubercd87e1b2017-06-24 20:35:59 +0200157 sleep 1
158 tout=$((tout - 1))
159 printf "\b\b\b%2ds" $tout
160 done
161 printf "\n"
162}
163
164timeout()
165{
166 tout=${1:-10}
167
168 # Ignore SIGUSR1, should interrupt `read` though.
169 trap false USR1
170 # Clean up in case the user aborts.
171 trap 'kill $counter > /dev/null 2>&1' EXIT
172
Martin Roth987d42d2018-07-22 11:45:29 -0600173 (countdown "$tout"; kill -USR1 $$)&
Nico Hubercd87e1b2017-06-24 20:35:59 +0200174 counter=$!
175
176 # Some shells with sh compatibility mode (e.g. zsh, mksh) only
177 # let us interrupt `read` if a non-standard -t parameter is given.
Martin Roth987d42d2018-07-22 11:45:29 -0600178 # shellcheck disable=SC2034,SC2039,SC2162
Nico Hubercd87e1b2017-06-24 20:35:59 +0200179 if echo | read -t 1 foo 2>/dev/null; then
180 read -t $((tout + 1)) foo
181 else
182 read foo
183 fi
184
185 kill $counter > /dev/null 2>&1
186 trap - USR1 EXIT
187}
188
Stefan Reinauer93a96302015-06-15 12:36:53 -0700189please_install()
190{
Martin Roth88463822016-01-07 11:03:36 -0700191 HALT_FOR_TOOLS=1
Martin Roth987d42d2018-07-22 11:45:29 -0600192 # shellcheck disable=SC1091
Patrick Georgi5da95dc2015-07-17 23:33:05 +0200193 test -r /etc/os-release && . /etc/os-release
Alex Thiessen72d10892018-01-12 01:45:53 +0000194 # vanilla debian doesn't define `ID_LIKE`, just `ID`
195 if [ -z "${ID_LIKE}" ] && [ -n "${ID}" ]; then
196 ID_LIKE=${ID}
197 fi
Stefan Reinauer93a96302015-06-15 12:36:53 -0700198 case "$ID_LIKE" in
199 debian) solution="sudo apt-get install $1" ;;
200 suse) solution="sudo zypper install $1" ;;
201 *) solution="using your OS packaging system" ;;
202 esac
203
Patrick Georgidf1ff232017-01-07 09:28:43 +0100204 printf "${RED}ERROR:${red} Missing tool: Please install '$1'. (eg $solution)${NC}\n" >&2
Martin Rothe3963172016-01-06 13:54:32 -0700205 if [ -n "$2" ]; then
Patrick Georgidf1ff232017-01-07 09:28:43 +0100206 printf "${RED}ERROR:${red} or install '$2'.${NC}\n" >&2
Martin Rothe3963172016-01-06 13:54:32 -0700207 fi
Stefan Reinauer93a96302015-06-15 12:36:53 -0700208}
209
Patrick Georgib7062882015-02-24 10:52:14 +0100210searchtool()
Stefan Reinauer074d9132009-09-26 16:43:17 +0000211{
212 # $1 short name
Patrick Georgib7062882015-02-24 10:52:14 +0100213 # $2 search string
214 # $3 soft fail if set
Martin Rothe3963172016-01-06 13:54:32 -0700215 # $4 alternative package to install on failure
Patrick Georgib7062882015-02-24 10:52:14 +0100216 # result: file name of that tool on stdout
217 # or no output if nothing suitable was found
218 search=GNU
219 if [ -n "$2" ]; then
220 search="$2"
221 fi
Stefan Reinauer074d9132009-09-26 16:43:17 +0000222 for i in "$1" "g$1" "gnu$1"; do
Martin Roth987d42d2018-07-22 11:45:29 -0600223 if [ -x "$(command -v "$i" 2>/dev/null)" ]; then
Stefan Reinauerdbc00872015-06-09 11:50:05 -0700224 if [ "$(cat /dev/null | $i --version 2>&1 | grep -c "$search")" \
225 -gt 0 ]; then
Martin Roth987d42d2018-07-22 11:45:29 -0600226 echo "$i"
Stefan Reinauer074d9132009-09-26 16:43:17 +0000227 return
228 fi
229 fi
230 done
Andrew Wub67e9a12014-04-28 18:13:44 +0800231 # A workaround for OSX 10.9 and some BSDs, whose nongnu
232 # patch and tar also work.
Martin Roth987d42d2018-07-22 11:45:29 -0600233 if [ "$UNAME" = "Darwin" ] || [ "$UNAME" = "FreeBSD" ] || [ "$UNAME" = "NetBSD" ] || [ "$UNAME" = "OpenBSD" ]; then
234 if [ "$1" = "patch" ] || [ "$1" = "tar" ]; then
235 if [ -x "$(command -v "$1" 2>/dev/null)" ]; then
236 echo "$1"
Zheng Bao36156ff2012-09-28 16:18:58 +0800237 return
238 fi
239 fi
240 fi
Martin Roth987d42d2018-07-22 11:45:29 -0600241 if echo "$1" | grep -q "sum" ; then
242 algor=$(echo "$1" | sed -e 's,sum,,')
243 if [ -x "$(command -v "$1" 2>/dev/null)" ]; then
zbao5cf758d2015-09-01 22:28:57 -0400244 #xxxsum [file]
Martin Roth987d42d2018-07-22 11:45:29 -0600245 echo "$1"
zbao5cf758d2015-09-01 22:28:57 -0400246 return
Martin Roth987d42d2018-07-22 11:45:29 -0600247 elif [ -x "$(command -v "$algor" 2>/dev/null)" ]; then
zbao5cf758d2015-09-01 22:28:57 -0400248 #xxx [file]
Martin Roth987d42d2018-07-22 11:45:29 -0600249 echo "$algor"
zbao5cf758d2015-09-01 22:28:57 -0400250 return
Martin Rothd55f5eb2017-06-15 11:37:26 -0600251 elif [ -x "$(command -v openssl 2>/dev/null)" ]; then
zbao5cf758d2015-09-01 22:28:57 -0400252 #openssl xxx [file]
Martin Roth987d42d2018-07-22 11:45:29 -0600253 echo openssl "$algor"
zbao5cf758d2015-09-01 22:28:57 -0400254 return
Martin Rothd55f5eb2017-06-15 11:37:26 -0600255 elif [ -x "$(command -v cksum 2>/dev/null)" ]; then
zbao5cf758d2015-09-01 22:28:57 -0400256 #cksum -a xxx [file]
257 #cksum has special options in NetBSD. Actually, NetBSD will use the second case above.
Martin Roth987d42d2018-07-22 11:45:29 -0600258 echo "buildgcc" | cksum -a "$algor" > /dev/null 2>/dev/null && \
259 echo cksum -a "$algor"
zbao5cf758d2015-09-01 22:28:57 -0400260 return
zbao939dc842015-04-30 04:44:07 +0800261 fi
262 fi
Martin Rothe3963172016-01-06 13:54:32 -0700263
Martin Roth987d42d2018-07-22 11:45:29 -0600264 [ -z "$3" ] && please_install "$1" "$4"
Patrick Georgib7062882015-02-24 10:52:14 +0100265 false
Stefan Reinauer074d9132009-09-26 16:43:17 +0000266}
267
Martin Roth591790f2016-03-20 20:39:04 -0600268# Run a compile check of the specified library option to see if it's installed
269check_for_library() {
Martin Roth987d42d2018-07-22 11:45:29 -0600270 LIBRARY_FLAGS="$1"
271 LIBRARY_PACKAGES="$2"
272 LIBTEST_FILE=.libtest
Martin Roth591790f2016-03-20 20:39:04 -0600273
274 echo "int main(int argc, char **argv) { (void) argc; (void) argv; return 0; }" > "${LIBTEST_FILE}.c"
275
Martin Roth987d42d2018-07-22 11:45:29 -0600276 # shellcheck disable=SC2086
Nico Huber08bb8372017-06-24 19:50:35 +0200277 "$CC" $CFLAGS $LIBRARY_FLAGS "${LIBTEST_FILE}.c" -o "${LIBTEST_FILE}" >/dev/null 2>&1 || \
Martin Roth591790f2016-03-20 20:39:04 -0600278 please_install "$LIBRARY_PACKAGES"
279 rm -rf "${LIBTEST_FILE}.c" "${LIBTEST_FILE}"
280}
281
Nico Huberaee7f462016-09-20 12:55:19 +0200282buildcc_major() {
283 echo "${GCC_VERSION}" | cut -d. -f1
284}
285
Nico Huber26267a72016-12-04 02:45:58 +0100286buildcc_minor() {
287 echo "${GCC_VERSION}" | cut -d. -f2
288}
289
Nico Huberaee7f462016-09-20 12:55:19 +0200290buildcc_version() {
291 echo "${GCC_VERSION}" | cut -d. -f1-2
292}
293
294hostcc_major() {
295 (echo __GNUC__ | ${CC} -E - 2>/dev/null || echo 0) | tail -1
296}
297
298hostcc_minor() {
299 (echo __GNUC_MINOR__ | ${CC} -E - 2>/dev/null || echo 0) | tail -1
300}
301
302hostcc_version() {
303 printf "%d.%d" "$(hostcc_major)" "$(hostcc_minor)"
304}
305
Nico Huber75797162016-09-20 13:01:57 +0200306hostcc_has_gnat1() {
307 [ -x "$(${CC} -print-prog-name=gnat1)" ]
308}
309
Nico Hubercd87e1b2017-06-24 20:35:59 +0200310have_gnat() {
311 hostcc_has_gnat1 && \
312 searchtool gnatbind "Free Software Foundation" nofail > /dev/null
313}
314
Nico Huber75797162016-09-20 13:01:57 +0200315ada_requested() {
316 echo "${LANGUAGES}" | grep -q '\<ada\>'
317}
318
Stefan Reinauer88935482015-06-05 09:51:10 -0700319download() {
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700320 package=$1
Martin Roth987d42d2018-07-22 11:45:29 -0600321 # shellcheck disable=SC2086
Martin Roth3b32af92022-11-27 12:55:31 -0700322 if [ "${USE_COREBOOT_MIRROR}" -eq 0 ]; then
323 url="$(eval echo \$$package"_BASE_URL")"
324 else
325 url="${COREBOOT_MIRROR_URL}"
326 fi
Stefan Reinauer699ac272015-06-05 12:43:28 -0700327
Martin Roth3b32af92022-11-27 12:55:31 -0700328 file="$(eval echo \$$package"_ARCHIVE")"
329 printf " * ${file} "
Stefan Reinauer88935482015-06-05 09:51:10 -0700330
Martin Roth3b32af92022-11-27 12:55:31 -0700331 if test -f "tarballs/${file}"; then
Jonathan Neuschäfer92d483a2017-09-26 22:33:53 +0200332 printf "(cached)... "
zbaod22b9ea2015-08-30 23:35:16 -0400333 else
Martin Roth3b32af92022-11-27 12:55:31 -0700334 printf "(downloading from ${url}/${file})"
335 rm -f "tarballs/${file}"
Martin Roth987d42d2018-07-22 11:45:29 -0600336 cd tarballs || exit 1
Martin Roth3b32af92022-11-27 12:55:31 -0700337 download_showing_percentage "${url}/${file}"
Stefan Reinauer88935482015-06-05 09:51:10 -0700338 cd ..
zbaod22b9ea2015-08-30 23:35:16 -0400339 fi
340
Martin Roth3b32af92022-11-27 12:55:31 -0700341 if [ ! -f "tarballs/${file}" ]; then
342 printf "${RED}Failed to download ${file}.${NC}\n"
Stefan Reinauerdbc00872015-06-09 11:50:05 -0700343 exit 1
344 fi
Stefan Reinauer88935482015-06-05 09:51:10 -0700345}
346
Jonathan Neuschäfer92d483a2017-09-26 22:33:53 +0200347# Compute the hash of the package given in $1, and print it raw (just the
348# hexadecimal hash).
349compute_hash() {
350 package=$1
Martin Roth987d42d2018-07-22 11:45:29 -0600351 # shellcheck disable=SC2086
Martin Roth3b32af92022-11-27 12:55:31 -0700352 file="$(eval echo \$$package"_ARCHIVE")"
Jonathan Neuschäfer92d483a2017-09-26 22:33:53 +0200353
354 if test -z "$CHECKSUM"; then
355 echo "${RED}\$CHECKSUM program missing. This is bad.${NC}" 1>&2
356 exit 1
357 fi
358
359 $CHECKSUM "tarballs/$file" 2>/dev/null | sed -e 's@.*\([0-9a-f]\{40,\}\).*@\1@'
360}
361
362error_hash_missing() {
363 package="$1"
Martin Roth987d42d2018-07-22 11:45:29 -0600364 # shellcheck disable=SC2086
Martin Roth3b32af92022-11-27 12:55:31 -0700365 file="$(eval echo \$$package"_ARCHIVE")"
Jonathan Neuschäfer92d483a2017-09-26 22:33:53 +0200366
367 fullhashfile="util/crossgcc/sum/$file.cksum"
368 printf "${RED}hash file missing:${NC}\n\n" 1>&2
369 printf "Please verify util/crossgcc/tarball/$file carefully\n" 1>&2
370 printf "(using PGP if possible), and then rename\n" 1>&2
371 printf " ${CYAN}${fullhashfile}.calc${NC}\n" 1>&2
372 printf " to ${CYAN}${fullhashfile}${NC}\n\n" 1>&2
373
374 exit 1
375}
376
377# Read the known hash file of the package given in $1, and print it raw.
378get_known_hash() {
379 package=$1
Martin Roth987d42d2018-07-22 11:45:29 -0600380 # shellcheck disable=SC2086
Martin Roth3b32af92022-11-27 12:55:31 -0700381 file="$(eval echo \$$package"_ARCHIVE")"
Jonathan Neuschäfer92d483a2017-09-26 22:33:53 +0200382 hashfile="sum/$file.cksum"
383
384 if [ ! -f "$hashfile" ]; then
385 calc_hash="$(compute_hash "$package")" || exit 1
386 echo "$calc_hash tarballs/$file" > "${hashfile}.calc"
387
388 error_hash_missing "$package"
389 exit 1
390 fi
391
Martin Roth987d42d2018-07-22 11:45:29 -0600392 sed -e 's@.*\([0-9a-f]\{40,\}\).*@\1@' < "$hashfile"
Jonathan Neuschäfer92d483a2017-09-26 22:33:53 +0200393}
394
395error_hash_mismatch() {
396 package=$1
397 known_hash="$2"
398 computed_hash="$3"
Martin Roth987d42d2018-07-22 11:45:29 -0600399 # shellcheck disable=SC2086
Martin Roth3b32af92022-11-27 12:55:31 -0700400 file="$(eval echo \$$package"_ARCHIVE")"
Jonathan Neuschäfer92d483a2017-09-26 22:33:53 +0200401
402 printf "${RED}hash mismatch:${NC}\n\n"
403 printf " expected (known) hash: $known_hash\n"
404 printf "calculated hash of downloaded file: $computed_hash\n\n"
405
406 printf "If you think this is due to a network error, please delete\n"
407 printf " ${CYAN}util/crossgcc/tarballs/$file${NC}\n"
408 printf "and try again. If the problem persists, it may be due to an\n"
409 printf "administration error on the file server, or you might be\n"
410 printf "subject to a Man-in-the-Middle attack\n\n"
411
412 exit 1
413}
414
415# verify_hash - Check that the hash of the file given in $1 matches the known
416# hash; Bail out on mismatch or missing hash file.
417verify_hash() {
418 package=$1
Jonathan Neuschäfer92d483a2017-09-26 22:33:53 +0200419
420 known_hash="$(get_known_hash "$package")" || exit "$?"
421 computed_hash="$(compute_hash "$package")" || exit "$?"
422
423 if [ "$known_hash" != "$computed_hash" ]; then
424 error_hash_mismatch "$package" "$known_hash" "$computed_hash"
425 exit 1
426 fi
427
Jonathan Neuschäfercb76069e2018-10-01 09:45:49 +0200428 printf "${GREEN}hash verified (${known_hash})${NC}\n"
Jonathan Neuschäfer92d483a2017-09-26 22:33:53 +0200429}
430
Stefan Reinauer88935482015-06-05 09:51:10 -0700431unpack_and_patch() {
Martin Roth987d42d2018-07-22 11:45:29 -0600432 package="$1"
433 # shellcheck disable=SC2086
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700434 archive="$(eval echo \$$package"_ARCHIVE")"
Martin Roth987d42d2018-07-22 11:45:29 -0600435 # shellcheck disable=SC2086
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700436 dir="$(eval echo \$$package"_DIR")"
Martin Roth987d42d2018-07-22 11:45:29 -0600437 test -d "${dir}" && test -f "${dir}/.unpack_success" || (
Martin Roth3b32af92022-11-27 12:55:31 -0700438 printf " * "$archive"\n"
Stefan Reinauer88935482015-06-05 09:51:10 -0700439 FLAGS=zxf
Martin Roth987d42d2018-07-22 11:45:29 -0600440 suffix=$(echo "$archive" | sed 's,.*\.,,')
Martin Roth95f7b222016-03-20 12:38:48 -0600441 if [ "$suffix" = "gz" ] && [ -n "$PIGZ" ]; then FLAGS="-I pigz -xf"
442 elif [ "$suffix" = "gz" ]; then FLAGS=zxf
443 elif [ "$suffix" = "bz2" ] && [ -n "$LBZIP2" ]; then FLAGS="-I lbzip2 -xf"
444 elif [ "$suffix" = "bz2" ]; then FLAGS=jxf
445 elif [ "$suffix" = "xz" ]; then FLAGS="--xz -xf"
446 elif [ "$suffix" = "lzma" ]; then FLAGS="--lzma -xf"
447 fi
Martin Roth987d42d2018-07-22 11:45:29 -0600448 # shellcheck disable=SC2086
Martin Roth3b32af92022-11-27 12:55:31 -0700449 $TAR $FLAGS "tarballs/$archive"
Stefan Reinauer88935482015-06-05 09:51:10 -0700450 for patch in patches/${dir}_*.patch; do
Martin Roth987d42d2018-07-22 11:45:29 -0600451 test -r "$patch" || continue
452 printf " o $(basename "$patch")\n"
453 (cd "${dir}" || exit 1; $PATCH -s -N -p1 <"../${patch}") || {
Stefan Reinauer88935482015-06-05 09:51:10 -0700454 printf "\n${RED}Failed $patch.${NC}\n"
Stefan Reinauer916b8452015-06-09 11:54:49 -0700455 exit 1
456 }
Stefan Reinauer88935482015-06-05 09:51:10 -0700457 done
Martin Roth987d42d2018-07-22 11:45:29 -0600458 touch "${dir}/.unpack_success"
Stefan Reinauer88935482015-06-05 09:51:10 -0700459 )
460}
461
Stefan Reinauer1c70e052015-06-09 11:47:28 -0700462fn_exists()
463{
Martin Roth987d42d2018-07-22 11:45:29 -0600464 # shellcheck disable=SC2039
465 type "$1" >/dev/null 2>&1
Patrick Georgi74c06422015-03-25 18:40:13 +0100466}
467
Patrick Georgif2c15f52015-06-11 21:07:31 +0200468is_package_enabled()
469{
470 echo "$PACKAGES" |grep -q "\<$1\>"
471}
472
Martin Roth444ece22016-04-01 18:46:29 -0600473package_uses_targetarch()
474{
Patrick Georgif32eed12021-10-16 10:50:00 +0200475 if [ "$1" = "GCC" ] || [ "$1" = "BINUTILS" ]; then
Martin Roth444ece22016-04-01 18:46:29 -0600476 true
477 else
478 false
479 fi
480}
481
Nico Huber11ea2b32016-01-26 16:09:31 +0100482generic_build()
483{
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700484 package=$1
Nico Huber11ea2b32016-01-26 16:09:31 +0100485 host_target=$2
486 builddir=$3
487 success=$4
Martin Rothc295d5e2016-11-14 11:56:11 -0700488 version=$5
Stefan Reinauer1c70e052015-06-09 11:47:28 -0700489
Martin Roth987d42d2018-07-22 11:45:29 -0600490 fn_exists "build_$package" || return
Stefan Reinauer1c70e052015-06-09 11:47:28 -0700491
Nico Huber11ea2b32016-01-26 16:09:31 +0100492 mkdir -p "$builddir"
Stefan Reinauer1c70e052015-06-09 11:47:28 -0700493
Nico Huber11ea2b32016-01-26 16:09:31 +0100494 if [ -f "$success" ]; then
Martin Roth2c6a8062016-11-14 11:58:39 -0700495 printf "Skipping $package v$version for $host_target as it is already built\n"
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700496 else
Martin Roth2c6a8062016-11-14 11:58:39 -0700497 printf "Building $package v$version for $host_target ... "
Nico Huber11ea2b32016-01-26 16:09:31 +0100498 DIR="$PWD"
Martin Roth987d42d2018-07-22 11:45:29 -0600499 cd "$builddir" || exit 1
Stefan Reinauer1c70e052015-06-09 11:47:28 -0700500 rm -f .failed
Martin Roth987d42d2018-07-22 11:45:29 -0600501 "build_${package}" "$host_target" > build.log 2>&1
502 cd "$DIR" || exit 1
Nico Huber11ea2b32016-01-26 16:09:31 +0100503 if [ ! -f "$builddir/.failed" ]; then
504 touch "$success";
505 else
Idwer Volleringe2ef3cf2017-08-15 00:53:13 +0200506 printf "${RED}failed${NC}. Check '$builddir/build.log'.\n"
Stefan Reinauer1c70e052015-06-09 11:47:28 -0700507 exit 1
508 fi
509 printf "${green}ok${NC}\n"
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700510 fi
511}
512
Nico Huber11ea2b32016-01-26 16:09:31 +0100513build_for_host()
514{
Martin Rothc295d5e2016-11-14 11:56:11 -0700515 package="$1"
Martin Roth987d42d2018-07-22 11:45:29 -0600516 # shellcheck disable=SC2086
Martin Rothc295d5e2016-11-14 11:56:11 -0700517 version="$(eval echo \$$package"_VERSION")"
Patrick Georgi1b593e52016-11-25 15:27:41 +0100518 generic_build "$package" host "build-$package" "${DESTDIR}${TARGETDIR}/.${package}.${version}.success" "$version"
Nico Huber11ea2b32016-01-26 16:09:31 +0100519}
520
521build_for_target()
522{
Martin Rothc295d5e2016-11-14 11:56:11 -0700523 package="$1"
Martin Roth987d42d2018-07-22 11:45:29 -0600524 # shellcheck disable=SC2086
Martin Rothc295d5e2016-11-14 11:56:11 -0700525 version="$(eval echo \$$package"_VERSION")"
Patrick Georgi1b593e52016-11-25 15:27:41 +0100526 generic_build "$package" target "build-${TARGETARCH}-$package" "${DESTDIR}${TARGETDIR}/.${TARGETARCH}-${package}.${version}.success" "$version"
Nico Huber11ea2b32016-01-26 16:09:31 +0100527}
528
529build()
530{
Martin Roth987d42d2018-07-22 11:45:29 -0600531 if package_uses_targetarch "$1"; then
532 if [ $BOOTSTRAP -eq 1 ] && [ ! -f "${DESTDIR}${TARGETDIR}/.GCC.${GCC_VERSION}.success" ]; then
Nico Huber234d2462016-01-26 16:10:17 +0100533 build_for_host GCC
534 fi
Martin Roth987d42d2018-07-22 11:45:29 -0600535 build_for_target "$1"
Nico Huber11ea2b32016-01-26 16:09:31 +0100536 else
Martin Roth987d42d2018-07-22 11:45:29 -0600537 build_for_host "$1"
Nico Huber11ea2b32016-01-26 16:09:31 +0100538 fi
539}
540
Nico Huber18c74d62017-06-24 20:35:59 +0200541exit_handler()
Zheng Baobb003c82016-08-05 13:41:51 +0800542{
543 printf "${NC}Stop\n"
544 exit 1
545}
546
Stefan Reinauer074d9132009-09-26 16:43:17 +0000547cleanup()
548{
Stefan Reinauer88e83e52016-04-06 15:39:48 -0700549 if [ $SAVETEMPS -ne 0 ]; then
550 printf "Leaving temporary files around... ${green}ok${NC}\n"
551 return
552 fi
553
Stefan Reinauer074d9132009-09-26 16:43:17 +0000554 printf "Cleaning up temporary files... "
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700555 for package in $PACKAGES; do
Martin Roth987d42d2018-07-22 11:45:29 -0600556 # shellcheck disable=SC2086
557 rm -rf "build-${TARGETARCH}-$package" "build-$package" "$(eval echo \$$package"_DIR")"
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700558 done
zbaoff3f15c2015-08-26 22:00:31 -0400559 rm -f getopt
Stefan Reinauer074d9132009-09-26 16:43:17 +0000560 printf "${green}ok${NC}\n"
561}
562
563myhelp()
564{
Stefan Reinauer14ce2132015-06-05 13:01:13 -0700565 printf "Usage: $0 [-V] [-c] [-p <platform>] [-d <target directory>] [-D <dest dir>] [-C] [-G] [-S]\n"
Stefan Reinauer074d9132009-09-26 16:43:17 +0000566 printf " $0 [-V|--version]\n"
567 printf " $0 [-h|--help]\n\n"
568
569 printf "Options:\n"
Felix Singer60c56be2021-10-17 14:54:12 +0200570 printf " [-W|--print-version Print machine readable version\n"
Stefan Reinauer074d9132009-09-26 16:43:17 +0000571 printf " [-V|--version] print version number and exit\n"
572 printf " [-h|--help] print this help and exit\n"
573 printf " [-c|--clean] remove temporary files before build\n"
574 printf " [-t|--savetemps] don't remove temporary files after build\n"
Patrick Georgic1a75b12011-11-04 21:37:14 +0100575 printf " [-y|--ccache] Use ccache when building cross compiler\n"
Nico Huber152e78e2016-09-20 15:38:40 +0200576 printf " [-n|--nocolor] don't print color codes in output\n"
577 printf " [-u|--urls] print the urls for all packages\n"
Patrick Georgi73166c72010-04-14 20:42:42 +0000578 printf " [-j|--jobs <num>] run <num> jobs in parallel in make\n"
Martin Roth588c79d2016-03-20 12:03:20 -0600579 printf " [-s]--supported <tool> print supported version of a tool\n"
Stefan Reinauer074d9132009-09-26 16:43:17 +0000580 printf " [-d|--directory <target dir>] target directory to install cross compiler to\n"
Martin Roth588c79d2016-03-20 12:03:20 -0600581 printf " (defaults to $TARGETDIR)\n\n"
Stefan Reinauer074d9132009-09-26 16:43:17 +0000582 printf " [-D|--destdir <dest dir>] destination directory to install cross compiler to\n"
Stefan Reinauer2c3cd122011-11-01 21:43:50 +0100583 printf " (for RPM builds, default unset)\n"
Patrick Georgif32eed12021-10-16 10:50:00 +0200584 printf " [-P|--package <package>] Build a specific package: GCC, CLANG, IASL\n"
Stefan Reinauer85b07d62015-06-09 14:45:14 -0700585 printf " (defaults to $PACKAGE)\n"
586 printf "GCC specific options:\n"
Nico Huber234d2462016-01-26 16:10:17 +0100587 printf " [-b|--bootstrap] bootstrap the host compiler before building\n"
588 printf " the cross compiler\n"
Stefan Reinauer85b07d62015-06-09 14:45:14 -0700589 printf " [-p|--platform <platform>] target platform to build cross compiler for\n"
590 printf " (defaults to $TARGETARCH)\n"
Nico Huberbb313bf2015-09-08 12:30:27 +0200591 printf " [-l|--languages <languages>] comma separated list of target languages\n"
Nico Huber66c2c1a2016-09-20 13:09:29 +0200592 printf " (defaults to $DEFAULT_LANGUAGES)\n"
Patrick Georgif32eed12021-10-16 10:50:00 +0200593 printf "Platforms for GCC:\n"
Julius Wernerf96d9052019-08-16 15:35:39 -0700594 printf " x86_64 i386-elf i386-mingw32 riscv-elf arm aarch64\n"
Jonathan Neuschäferf14f6402016-03-11 20:22:23 +0100595 printf " powerpc64le-linux-gnu nds32le-elf\n\n"
Stefan Reinauer074d9132009-09-26 16:43:17 +0000596}
597
Martin Rothedf965a2015-11-25 16:58:33 -0700598printversion() {
Martin Roth7014f822020-12-21 15:49:33 -0700599 printf "${blue}Welcome to the ${red}coreboot${blue} cross toolchain builder v$CROSSGCC_VERSION ${NC}\n\n"
Martin Rothedf965a2015-11-25 16:58:33 -0700600}
601
Stefan Reinauer074d9132009-09-26 16:43:17 +0000602myversion()
603{
Martin Rothedf965a2015-11-25 16:58:33 -0700604 printversion
Stefan Reinauer074d9132009-09-26 16:43:17 +0000605
606 cat << EOF
Stefan Reinauer5f1ad892010-05-17 11:02:25 +0000607Copyright (C) 2008-2010 by coresystems GmbH
Marc Jones2aac3f62011-08-08 16:07:50 -0600608Copyright (C) 2011 by Sage Electronic Engineering
Stefan Reinauer074d9132009-09-26 16:43:17 +0000609
610This program is free software; you can redistribute it and/or modify
611it under the terms of the GNU General Public License as published by
612the Free Software Foundation; version 2 of the License.
613
614This program is distributed in the hope that it will be useful,
615but WITHOUT ANY WARRANTY; without even the implied warranty of
616MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
617GNU General Public License for more details.
618
619EOF
620}
621
Nico Huber5f72f962016-01-31 23:05:19 +0100622have_hostcflags_from_gmp() {
Martin Roth987d42d2018-07-22 11:45:29 -0600623 grep -q __GMP_CFLAGS "$DESTDIR$TARGETDIR/include/gmp.h" >/dev/null 2>&1
Nico Huber5f72f962016-01-31 23:05:19 +0100624}
625
626set_hostcflags_from_gmp() {
627 # Now set CFLAGS to match GMP CFLAGS but strip out -pedantic
628 # as GCC 4.6.x fails if it's there.
Martin Roth987d42d2018-07-22 11:45:29 -0600629 HOSTCFLAGS="$(grep __GMP_CFLAGS "$DESTDIR$TARGETDIR/include/gmp.h" |cut -d\" -f2 |\
Idwer Volleringba349ab2016-07-24 02:10:19 +0200630 sed s,-pedantic,,)"
Martin Roth987d42d2018-07-22 11:45:29 -0600631 export HOSTCFLAGS
Nico Huber5f72f962016-01-31 23:05:19 +0100632}
633
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700634build_GMP() {
Nico Huber8bbd5962016-12-22 16:05:54 +0100635 # Check if GCC enables `-pie` by default (possible since GCC 6).
636 # We need PIC in all static libraries then.
Nico Huber2c1c02e2017-01-02 20:51:28 +0100637 if $CC -dumpspecs 2>/dev/null | grep -q '[{;][[:space:]]*:-pie\>'
Nico Huber8bbd5962016-12-22 16:05:54 +0100638 then
639 OPTIONS="$OPTIONS --with-pic"
640 fi
641
Martin Roth987d42d2018-07-22 11:45:29 -0600642 # shellcheck disable=SC2086
Nico Huber08bb8372017-06-24 19:50:35 +0200643 CC="$(hostcc host)" CXX="$(hostcxx host)" \
Felix Singerf8157af2022-11-23 10:12:26 +0100644 ../${GMP_DIR}/configure \
645 --disable-shared \
646 --enable-fat \
647 --prefix="$TARGETDIR" \
648 $OPTIONS || touch .failed
Martin Roth987d42d2018-07-22 11:45:29 -0600649 # shellcheck disable=SC2086
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700650 $MAKE $JOBS || touch .failed
651 $MAKE install DESTDIR=$DESTDIR || touch .failed
652
653 normalize_dirs
Stefan Reinauer1c70e052015-06-09 11:47:28 -0700654
Nico Huber5f72f962016-01-31 23:05:19 +0100655 set_hostcflags_from_gmp
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700656}
657
658build_MPFR() {
Martin Roth987d42d2018-07-22 11:45:29 -0600659 test "$UNAME" = "Darwin" && CFLAGS="$CFLAGS -force_cpusubtype_ALL"
Nico Huber08bb8372017-06-24 19:50:35 +0200660 CC="$(hostcc host)" CXX="$(hostcxx host)" \
Felix Singerf8157af2022-11-23 10:12:26 +0100661 ../${MPFR_DIR}/configure \
662 --disable-shared \
663 --prefix="$TARGETDIR" \
Martin Roth987d42d2018-07-22 11:45:29 -0600664 --infodir="$TARGETDIR/info" \
Felix Singerf8157af2022-11-23 10:12:26 +0100665 --with-gmp="$DESTDIR$TARGETDIR" \
666 CFLAGS="$HOSTCFLAGS" || touch .failed
Martin Roth987d42d2018-07-22 11:45:29 -0600667 # shellcheck disable=SC2086
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700668 $MAKE $JOBS || touch .failed
669 $MAKE install DESTDIR=$DESTDIR || touch .failed
670
671 normalize_dirs
672
673 # work around build problem of libgmp.la
674 if [ "$DESTDIR" != "" ]; then
Martin Roth987d42d2018-07-22 11:45:29 -0600675 perl -pi -e "s,$DESTDIR,," "$DESTDIR$TARGETDIR/lib/libgmp.la"
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700676 fi
677}
678
679build_MPC() {
Nico Huber08bb8372017-06-24 19:50:35 +0200680 CC="$(hostcc host)" CXX="$(hostcxx host)" \
Felix Singerf8157af2022-11-23 10:12:26 +0100681 ../${MPC_DIR}/configure \
682 --disable-shared \
683 --prefix="$TARGETDIR" \
684 --infodir="$TARGETDIR/info" \
685 --with-mpfr="$DESTDIR$TARGETDIR" \
686 --with-gmp="$DESTDIR$TARGETDIR" \
687 CFLAGS="$HOSTCFLAGS" || touch .failed
Patrick Georgi790aab62017-04-26 17:35:35 +0200688
689 # work around build problem of libmpfr.la
690 if [ "$DESTDIR" != "" ]; then
Martin Roth987d42d2018-07-22 11:45:29 -0600691 perl -pi -e "s,$TARGETDIR/lib/libgmp.la,$DESTDIR\$&," "$DESTDIR$TARGETDIR/lib/libmpfr.la"
Patrick Georgi790aab62017-04-26 17:35:35 +0200692 fi
693
Martin Roth987d42d2018-07-22 11:45:29 -0600694 # shellcheck disable=SC2086
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700695 $MAKE $JOBS || touch .failed
696 $MAKE install DESTDIR=$DESTDIR || touch .failed
697
Patrick Georgi790aab62017-04-26 17:35:35 +0200698 # work around build problem of libmpfr.la
699 if [ "$DESTDIR" != "" ]; then
Martin Roth987d42d2018-07-22 11:45:29 -0600700 perl -pi -e "s,$DESTDIR,," "$DESTDIR$TARGETDIR/lib/libmpfr.la"
Patrick Georgi790aab62017-04-26 17:35:35 +0200701 fi
702
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700703 normalize_dirs
704}
705
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700706build_BINUTILS() {
Nico Huberae6187f2016-12-22 22:16:39 +0100707 if [ $TARGETARCH = "x86_64-elf" ]; then
Stefan Reinauer682a90c2015-06-09 14:59:58 -0700708 ADDITIONALTARGET=",i386-elf"
709 fi
Patrick Georgif0d5f672022-09-08 20:25:46 +0200710 # shellcheck disable=SC2086
Nico Huber08bb8372017-06-24 19:50:35 +0200711 CC="$(hostcc target)" CXX="$(hostcxx target)" \
Felix Singerf8157af2022-11-23 10:12:26 +0100712 ../binutils-${BINUTILS_VERSION}/configure \
713 --prefix="$TARGETDIR" \
714 --target=${TARGETARCH} \
715 --enable-targets=${TARGETARCH}${ADDITIONALTARGET} \
716 --disable-werror \
717 --disable-nls \
718 --enable-lto \
719 --enable-gold \
720 --enable-multilib \
Patrick Georgif0d5f672022-09-08 20:25:46 +0200721 ${BINUTILS_OPTIONS} \
Nico Huber010ecf802016-12-22 16:19:37 +0100722 CFLAGS="$HOSTCFLAGS" \
Felix Singerf8157af2022-11-23 10:12:26 +0100723 CXXFLAGS="$HOSTCFLAGS" || touch .failed
Martin Roth987d42d2018-07-22 11:45:29 -0600724 # shellcheck disable=SC2086
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700725 $MAKE $JOBS || touch .failed
726 $MAKE install DESTDIR=$DESTDIR || touch .failed
727}
728
Nico Huber234d2462016-01-26 16:10:17 +0100729bootstrap_GCC() {
Martin Roth987d42d2018-07-22 11:45:29 -0600730 # shellcheck disable=SC2086
Nico Huber08bb8372017-06-24 19:50:35 +0200731 CC="$(hostcc host)" CXX="$(hostcxx host)" \
Nico Huber234d2462016-01-26 16:10:17 +0100732 CFLAGS="$HOSTCFLAGS" \
733 CFLAGS_FOR_BUILD="$HOSTCFLAGS" \
734 CFLAGS_FOR_TARGET="$HOSTCFLAGS -fPIC" \
735 CXXFLAGS="$HOSTCFLAGS" \
736 CXXFLAGS_FOR_BUILD="$HOSTCFLAGS" \
737 CXXFLAGS_FOR_TARGET="$HOSTCFLAGS -fPIC" \
738 ../gcc-${GCC_VERSION}/configure \
Felix Singerf8157af2022-11-23 10:12:26 +0100739 --prefix="$TARGETDIR" \
740 --libexecdir="$TARGETDIR/lib" \
Nico Huber234d2462016-01-26 16:10:17 +0100741 --enable-bootstrap \
Felix Singerf8157af2022-11-23 10:12:26 +0100742 --disable-werror \
743 --disable-nls \
744 --disable-shared \
745 --disable-multilib \
746 --disable-libssp \
747 --disable-libquadmath \
748 --disable-libcc1 \
Patrick Georgi97a9df42017-04-26 22:18:18 +0200749 --disable-libsanitizer \
Felix Singerf8157af2022-11-23 10:12:26 +0100750 ${GCC_OPTIONS} \
751 --enable-languages="${LANGUAGES}" \
752 --with-gmp="$DESTDIR$TARGETDIR" \
753 --with-mpfr="$DESTDIR$TARGETDIR" \
Martin Roth987d42d2018-07-22 11:45:29 -0600754 --with-mpc="$DESTDIR$TARGETDIR" \
Martin Roth7014f822020-12-21 15:49:33 -0700755 --with-pkgversion="coreboot bootstrap v$CROSSGCC_VERSION" \
Nico Huber234d2462016-01-26 16:10:17 +0100756 && \
Martin Roth987d42d2018-07-22 11:45:29 -0600757 # shellcheck disable=SC2086
Nico Huber234d2462016-01-26 16:10:17 +0100758 $MAKE $JOBS BOOT_CFLAGS="$HOSTCFLAGS" BUILD_CONFIG="" bootstrap && \
759 $MAKE install-gcc \
760 install-target-libgcc \
761 maybe-install-target-libada \
762 maybe-install-target-libstdc++-v3 \
Nico Huber08bb8372017-06-24 19:50:35 +0200763 DESTDIR=$DESTDIR || touch .failed
Nico Huber234d2462016-01-26 16:10:17 +0100764}
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700765
Nico Huber234d2462016-01-26 16:10:17 +0100766build_cross_GCC() {
Stefan Reinauer45f77b82016-04-03 20:52:01 -0700767 # Work around crazy code generator in GCC that confuses CLANG.
Aaron Durbinb2229dc2016-04-07 16:58:10 -0500768 $CC --version | grep clang >/dev/null 2>&1 && \
Patrick Georgia7a5a562017-06-26 07:21:46 +0200769 CLANGFLAGS="-fbracket-depth=1024"
Nico Huber3f12d932017-08-31 23:11:18 +0200770 [ -n "$CXX" ] && $CXX --version | grep clang >/dev/null 2>&1 && \
Patrick Georgia7a5a562017-06-26 07:21:46 +0200771 CLANGCXXFLAGS="-fbracket-depth=1024"
Stefan Reinauer45f77b82016-04-03 20:52:01 -0700772
Stefan Reinauerd0f83722015-06-09 11:52:28 -0700773 # GCC does not honor HOSTCFLAGS at all. CFLAGS are used for
774 # both target and host object files.
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700775 # There's a work-around called CFLAGS_FOR_BUILD and CFLAGS_FOR_TARGET
776 # but it does not seem to work properly. At least the host library
777 # libiberty is not compiled with CFLAGS_FOR_BUILD.
Stefan Reinauer45f77b82016-04-03 20:52:01 -0700778 # Also set the CXX version of the flags because GCC is now compiled
779 # using C++.
Martin Roth987d42d2018-07-22 11:45:29 -0600780 # shellcheck disable=SC2086
Nico Huber08bb8372017-06-24 19:50:35 +0200781 CC="$(hostcc target)" CXX="$(hostcxx target)" \
Nico Huber3f12d932017-08-31 23:11:18 +0200782 CFLAGS_FOR_TARGET="-O2 -Dinhibit_libc" \
Patrick Georgia7a5a562017-06-26 07:21:46 +0200783 CFLAGS="$HOSTCFLAGS $CLANGFLAGS" \
784 CFLAGS_FOR_BUILD="$HOSTCFLAGS $CLANGFLAGS" \
785 CXXFLAGS="$HOSTCFLAGS $CLANGCXXFLAGS" \
786 CXXFLAGS_FOR_BUILD="$HOSTCFLAGS $CLANGCXXFLAGS" \
787 ../gcc-${GCC_VERSION}/configure \
Felix Singerf8157af2022-11-23 10:12:26 +0100788 --prefix="$TARGETDIR" \
789 --libexecdir="$TARGETDIR/lib" \
790 --target=${TARGETARCH} \
791 --disable-werror \
792 --disable-shared \
793 --enable-lto \
794 --enable-plugins \
795 --enable-gold \
796 --enable-ld=default \
797 --disable-libssp \
798 --disable-bootstrap \
799 --disable-nls \
800 --disable-libquadmath \
801 --without-headers \
Patrick Georgi0a97d7e2016-01-25 09:51:22 +0100802 --disable-threads \
Felix Singerf8157af2022-11-23 10:12:26 +0100803 --enable-interwork \
804 --enable-multilib \
805 --enable-targets=all \
806 --disable-libatomic \
807 --disable-libcc1 \
808 --disable-decimal-float \
809 ${GCC_OPTIONS} \
810 --enable-languages="${LANGUAGES}" \
Ronald G. Minnich7ee16b72016-02-12 21:54:59 +0000811 --with-system-zlib \
Felix Singerf8157af2022-11-23 10:12:26 +0100812 --with-gmp="$DESTDIR$TARGETDIR" \
813 --with-mpfr="$DESTDIR$TARGETDIR" \
Martin Roth987d42d2018-07-22 11:45:29 -0600814 --with-mpc="$DESTDIR$TARGETDIR" \
Felix Singerf8157af2022-11-23 10:12:26 +0100815 --with-gnu-as \
816 --with-gnu-ld \
Martin Roth7014f822020-12-21 15:49:33 -0700817 --with-pkgversion="coreboot toolchain v$CROSSGCC_VERSION" \
Nico Huber659f40b2018-05-23 17:06:53 +0200818 && \
Patrick Georgi095db332018-06-26 21:00:58 +0200819 mkdir -p gcc/$TARGETARCH && \
Nico Hubere87fcd42020-12-21 00:11:54 +0100820 rm -f "gcc/$TARGETARCH/$GCC_VERSION" && \
Martin Roth987d42d2018-07-22 11:45:29 -0600821 ln -s "$DESTDIR$TARGETDIR/$TARGETARCH/bin" "gcc/$TARGETARCH/$GCC_VERSION" && \
Nico Huber659f40b2018-05-23 17:06:53 +0200822 $MAKE $JOBS CFLAGS_FOR_BUILD="$HOSTCFLAGS" all-gcc && \
Martin Roth987d42d2018-07-22 11:45:29 -0600823 $MAKE install-gcc DESTDIR="$DESTDIR" || touch .failed
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700824
Martin Roth987d42d2018-07-22 11:45:29 -0600825 if [ ! -f .failed ] && [ "$(echo $TARGETARCH | grep -c -- -mingw32)" -eq 0 ]; then
826 # shellcheck disable=SC2086
Nico Huber659f40b2018-05-23 17:06:53 +0200827 $MAKE $JOBS CFLAGS_FOR_BUILD="$HOSTCFLAGS" all-target-libgcc && \
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700828 $MAKE install-target-libgcc DESTDIR=$DESTDIR || touch .failed
829 fi
830}
831
Nico Huber234d2462016-01-26 16:10:17 +0100832build_GCC() {
833 if [ "$1" = host ]; then
Martin Roth987d42d2018-07-22 11:45:29 -0600834 bootstrap_GCC "$1"
Nico Huber234d2462016-01-26 16:10:17 +0100835 else
Martin Roth987d42d2018-07-22 11:45:29 -0600836 build_cross_GCC "$1"
Nico Huber234d2462016-01-26 16:10:17 +0100837 fi
838}
839
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700840build_IASL() {
841 RDIR=$PWD
Martin Roth987d42d2018-07-22 11:45:29 -0600842 cd ../$IASL_DIR/generate/unix || exit 1
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700843 CFLAGS="$HOSTCFLAGS"
844 HOST="_LINUX"
Martin Roth987d42d2018-07-22 11:45:29 -0600845 test "$UNAME" = "Darwin" && HOST="_APPLE"
846 test "$UNAME" = "FreeBSD" && HOST="_FreeBSD"
847 test "$UNAME" = "Cygwin" && HOST="_CYGWIN"
Nico Huber08bb8372017-06-24 19:50:35 +0200848 HOST="$HOST" CFLAGS="$CFLAGS" \
Martin Roth7014f822020-12-21 15:49:33 -0700849 OPT_CFLAGS="-O -D_FORTIFY_SOURCE=2 -D COREBOOT_TOOLCHAIN_VERSION='\"coreboot toolchain v$CROSSGCC_VERSION\"' " \
Elyes HAOUAS157851f2020-05-29 10:20:14 +0200850 $MAKE $JOBS CC="$(hostcc host)" iasl acpibin acpidump acpiexec acpihelp acpisrc acpixtract
Patrick Georgi54f86a52021-05-11 15:06:37 +0200851 mkdir -p "$DESTDIR$TARGETDIR/bin/"
852 (cd "$DESTDIR$TARGETDIR/bin" && rm -f iasl acpibin acpidump acpiexec acpihelp acpisrc acpixtract) || touch "$RDIR/.failed"
853 (cd bin && cp iasl acpibin acpidump acpiexec acpihelp acpisrc acpixtract "$DESTDIR$TARGETDIR/bin") || touch "$RDIR/.failed"
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700854}
855
856build_LLVM() {
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700857
Patrick Georgi5a76a532021-06-03 08:48:26 +0200858 ln -nsf "$LLVM_DIR" ../llvm
859 ln -nsf "$CLANG_DIR" ../clang
860 ln -nsf "$CTE_DIR" ../clang-tools-extra
861 ln -nsf "$CRT_DIR" ../compiler-rt
Elyes Haouasc8870b12022-09-16 12:10:00 +0200862 ln -nsf "$LLVMCMAKE_DIR" ../cmake
Martin Roth987d42d2018-07-22 11:45:29 -0600863
Felix Singerf8157af2022-11-23 10:12:26 +0100864 $CMAKE -G "Unix Makefiles" \
865 -DCMAKE_INSTALL_PREFIX="$DESTDIR$TARGETDIR" \
Martin Roth7014f822020-12-21 15:49:33 -0700866 -DCLANG_VENDOR="coreboot toolchain v$CROSSGCC_VERSION - " \
Patrick Georgi5a76a532021-06-03 08:48:26 +0200867 -DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;compiler-rt" \
Felix Singerf8157af2022-11-23 10:12:26 +0100868 -DLLVM_INCLUDE_BENCHMARKS="OFF" \
Felix Singer52191f22022-11-23 10:20:11 +0100869 -DLLVM_INCLUDE_TESTS="OFF" \
870 -DLLVM_INCLUDE_EXAMPLES="OFF" \
Felix Singerf8157af2022-11-23 10:12:26 +0100871 -DCMAKE_BUILD_TYPE=Release \
Felix Singer3e7438b2022-11-23 10:02:10 +0100872 -DLLVM_TARGETS_TO_BUILD="AArch64;ARM;PowerPC;RISCV;X86" \
873 ../llvm || touch .failed
Martin Roth987d42d2018-07-22 11:45:29 -0600874 # shellcheck disable=SC2086
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700875 $MAKE $JOBS || touch .failed
876 $MAKE install || touch .failed
877
Elyes Haouas49119422022-11-21 11:19:14 +0100878 rm -f ../llvm ../clang ../clang-tools-extra ../compiler-rt ../cmake
Patrick Georgi5a76a532021-06-03 08:48:26 +0200879
Elyes HAOUAS8f1853c2020-08-02 09:46:15 +0200880 cp -a ../$CLANG_DIR/tools/scan-build/* "$DESTDIR$TARGETDIR/bin"
881 cp -a ../$CLANG_DIR/tools/scan-view/* "$DESTDIR$TARGETDIR/bin"
Stefan Reinauere9e6e3d2015-07-07 00:20:42 +0200882
883 # create symlinks to work around broken --print-librt-file-name
884 # when used with -target.
Martin Roth987d42d2018-07-22 11:45:29 -0600885 cd "$DESTDIR$TARGETDIR/lib/clang/${CLANG_VERSION}/lib" || exit 1
Stefan Reinauere9e6e3d2015-07-07 00:20:42 +0200886 for i in */libclang_rt.builtins*.a; do
Martin Roth987d42d2018-07-22 11:45:29 -0600887 ln -s "$i" .
Stefan Reinauere9e6e3d2015-07-07 00:20:42 +0200888 done
Stefan Reinauere7757bd2015-06-05 13:59:44 -0700889}
890
Stefan Reinauer3b593492017-06-19 17:28:54 -0700891build_CMAKE() {
Nico Huber08bb8372017-06-24 19:50:35 +0200892 CC="$(hostcc host)" CXX="$(hostcxx host)" CFLAGS="$HOSTCFLAGS" \
Felix Singerf8157af2022-11-23 10:12:26 +0100893 ../${CMAKE_DIR}/configure \
894 --prefix="$TARGETDIR" || touch .failed
Martin Roth987d42d2018-07-22 11:45:29 -0600895 # shellcheck disable=SC2086
Stefan Reinauer3b593492017-06-19 17:28:54 -0700896 $MAKE $JOBS || touch .failed
897 $MAKE install DESTDIR=$DESTDIR || touch .failed
Stefan Reinauer3b593492017-06-19 17:28:54 -0700898}
899
Martin Rothd70f5fa2019-05-26 17:24:19 -0600900build_NASM() {
Elyes Haouas8d50e422023-01-28 12:54:28 +0100901 CC="$(hostcc host)" CXX="$(hostcxx host)" CFLAGS="$HOSTCFLAGS" \
Felix Singerf8157af2022-11-23 10:12:26 +0100902 ../${NASM_DIR}/configure \
903 --prefix="$TARGETDIR" || touch .failed
Martin Rothd70f5fa2019-05-26 17:24:19 -0600904 # shellcheck disable=SC2086
905 $MAKE $JOBS || touch .failed
906 $MAKE install DESTDIR=$DESTDIR || touch .failed
907
908 normalize_dirs
909}
910
Stefan Reinauerc66fd3c2017-06-21 14:57:28 -0700911print_supported() {
912 case "$PRINTSUPPORTED" in
Martin Rothedf965a2015-11-25 16:58:33 -0700913 BINUTILS|binutils) printf "%s\n" "$BINUTILS_VERSION";;
914 CLANG|clang) printf "%s\n" "$CLANG_VERSION";;
Martin Rothedf965a2015-11-25 16:58:33 -0700915 GCC|gcc) printf "%s\n" "$GCC_VERSION";;
Martin Rothedf965a2015-11-25 16:58:33 -0700916 GMP|gmp) printf "%s\n" "$GMP_VERSION";;
917 IASL|iasl) printf "%s\n" "$IASL_VERSION";;
Martin Rothedf965a2015-11-25 16:58:33 -0700918 MPC|mpc) printf "%s\n" "$MPC_VERSION";;
919 MPFR|mpfr) printf "%s\n" "$MPFR_VERSION";;
Martin Rothd70f5fa2019-05-26 17:24:19 -0600920 NASM|nasm) printf "%s\n" "${NASM_VERSION}";;
Stefan Reinauerc66fd3c2017-06-21 14:57:28 -0700921 *) printf "Unknown tool %s\n" "$PRINTSUPPORTED";;
Martin Rothedf965a2015-11-25 16:58:33 -0700922 esac
923}
Stefan Reinauer074d9132009-09-26 16:43:17 +0000924
Nico Huber18c74d62017-06-24 20:35:59 +0200925trap exit_handler 1 2 3 15
Zheng Baobb003c82016-08-05 13:41:51 +0800926
Patrick Georgi6bba29f2010-01-29 17:40:52 +0000927# Look if we have getopt. If not, build it.
928export PATH=$PATH:.
929getopt - > /dev/null 2>/dev/null || gcc -o getopt getopt.c
930
Stefan Reinauer074d9132009-09-26 16:43:17 +0000931# parse parameters.. try to find out whether we're running GNU getopt
Nico Huber27e8412b2017-12-05 22:02:21 +0100932getoptbrand="$(getopt -V 2>/dev/null | sed -e '1!d' -e 's,^\(......\).*,\1,')"
Peter Stuge09377b72011-08-21 06:24:55 +0200933if [ "${getoptbrand}" = "getopt" ]; then
Stefan Reinauer074d9132009-09-26 16:43:17 +0000934 # Detected GNU getopt that supports long options.
Martin Roth3b32af92022-11-27 12:55:31 -0700935 args=$(getopt -l print-version,version,help,clean,directory:,bootstrap,bootstrap-only,platform:,languages:,package:,jobs:,destdir:,savetemps,scripting,ccache,supported:,urls,nocolor,mirror -o WVhcd:bBp:l:P:j:D:tSys:unm -- "$@")
Nico Huber78df0bf2016-09-20 14:11:53 +0200936 getopt_ret=$?
Nico Hubercc414dd2016-09-20 13:59:38 +0200937 eval set -- "$args"
Stefan Reinauer074d9132009-09-26 16:43:17 +0000938else
939 # Detected non-GNU getopt
Martin Roth3b32af92022-11-27 12:55:31 -0700940 args=$(getopt WVhcd:bBp:l:P:j:D:tSys:unm $*)
Nico Huber78df0bf2016-09-20 14:11:53 +0200941 getopt_ret=$?
Martin Roth987d42d2018-07-22 11:45:29 -0600942 # shellcheck disable=SC2086
Stefan Reinauer074d9132009-09-26 16:43:17 +0000943 set -- $args
944fi
945
Nico Huber78df0bf2016-09-20 14:11:53 +0200946if [ $getopt_ret != 0 ]; then
Stefan Reinauer074d9132009-09-26 16:43:17 +0000947 myhelp
948 exit 1
949fi
950
951while true ; do
952 case "$1" in
Felix Singer60c56be2021-10-17 14:54:12 +0200953 -W|--print-version) shift; echo $CROSSGCC_VERSION; exit 0;;
Patrick Georgi9681cdc2017-09-22 18:57:10 +0200954 -V|--version) shift; myversion; exit 0;;
955 -h|--help) shift; myhelp; exit 0;;
956 -c|--clean) shift; clean=1;;
957 -t|--savetemps) shift; SAVETEMPS=1;;
958 -d|--directory) shift; TARGETDIR="$1"; shift;;
959 -b|--bootstrap) shift; BOOTSTRAP=1;;
960 -B|--bootstrap-only) shift; BOOTSTRAPONLY=1; BOOTSTRAP=1;;
961 -p|--platform) shift; TARGETARCH="$1"; shift;;
962 -l|--languages) shift; LANGUAGES="$1"; shift;;
Martin Roth3b32af92022-11-27 12:55:31 -0700963 -m|--mirror) shift; USE_COREBOOT_MIRROR=1;;
Patrick Georgi9681cdc2017-09-22 18:57:10 +0200964 -D|--destdir) shift; DESTDIR="$1"; shift;;
965 -j|--jobs) shift; THREADS="$1"; JOBS="-j $1"; shift;;
966 -P|--package) shift; PACKAGE="$1"; shift;;
Patrick Georgi9681cdc2017-09-22 18:57:10 +0200967 -y|--ccache) shift; USECCACHE=1;;
968 -s|--supported) shift; PRINTSUPPORTED="$1"; shift;;
969 -u|--urls) shift; printf "%s\n" "$ALL_ARCHIVES"; exit 0;;
970 -n|--nocolor) shift; \
Martin Roth4a53db02016-03-01 15:21:07 -0700971 unset red RED green GREEN blue BLUE cyan CYAN NC;;
Patrick Georgid2e0dd52013-06-09 08:05:45 +0200972 --) shift; break;;
Patrick Georgid2e0dd52013-06-09 08:05:45 +0200973 *) break;;
Stefan Reinauer074d9132009-09-26 16:43:17 +0000974 esac
975done
976
Nico Huberbd74d562016-09-20 14:16:43 +0200977if [ $# -gt 0 ]; then
978 printf "Excessive arguments: $*\n"
979 myhelp
980 exit 1
981fi
982
Stefan Reinauerc66fd3c2017-06-21 14:57:28 -0700983if [ -n "$PRINTSUPPORTED" ]; then
984 print_supported
Martin Rothedf965a2015-11-25 16:58:33 -0700985 exit 0
986fi
987
988#print toolchain builder version string as the header
989printversion
990
Martin Roth2c6a8062016-11-14 11:58:39 -0700991printf "Building toolchain using %d thread(s).\n\n" "$THREADS"
992
Ronald G. Minnichb460a662013-05-26 05:33:35 -0700993case "$TARGETARCH" in
Timothy Pearsona9f62352015-12-30 18:59:00 -0600994 x86_64-elf) ;;
995 x86_64*) TARGETARCH=x86_64-elf;;
996 i386-elf) ;;
997 i386-mingw32) ;;
Patrick Georgif0d5f672022-09-08 20:25:46 +0200998 riscv-elf) TARGETARCH=riscv64-elf
999 GCC_OPTIONS="$GCC_OPTIONS --with-isa-spec=20191213"
1000 BINUTILS_OPTIONS="$BINUTILS_OPTIONS --with-isa-spec=20191213";;
Patrick Georgi0a97d7e2016-01-25 09:51:22 +01001001 powerpc64*-linux*) ;;
Timothy Pearsona9f62352015-12-30 18:59:00 -06001002 i386*) TARGETARCH=i386-elf;;
Stefan Reinauer27522ad2016-01-29 17:31:34 -08001003 arm*) TARGETARCH=arm-eabi;;
Timothy Pearsona9f62352015-12-30 18:59:00 -06001004 aarch64*) TARGETARCH=aarch64-elf;;
Martin Roth3e0f74d2016-03-08 12:07:04 -07001005 nds32le-elf) ;;
Timothy Pearsona9f62352015-12-30 18:59:00 -06001006 *) printf "${red}WARNING: Unsupported architecture $TARGETARCH.${NC}\n\n"; ;;
Ronald G. Minnichb460a662013-05-26 05:33:35 -07001007esac
1008
Stefan Reinauer5dd26352015-06-09 14:52:22 -07001009# Figure out which packages to build
Stefan Reinauer699ac272015-06-05 12:43:28 -07001010
Stefan Reinauer85b07d62015-06-09 14:45:14 -07001011case "$PACKAGE" in
1012 GCC|gcc)
Stefan Reinauer81693d42017-06-21 15:25:36 -07001013 echo "Target architecture is $TARGETARCH"
Stefan Reinauer85b07d62015-06-09 14:45:14 -07001014 NAME="${TARGETARCH} cross GCC"
Nico Huberafda56e2017-12-07 17:50:53 +01001015 PACKAGES="GMP MPFR MPC BINUTILS GCC"
Stefan Reinauer85b07d62015-06-09 14:45:14 -07001016 ;;
Stefan Reinauer85b07d62015-06-09 14:45:14 -07001017 CLANG|clang)
Stefan Reinauer81693d42017-06-21 15:25:36 -07001018 NAME="LLVM clang"
1019 LLVM_VERSION=${CLANG_VERSION}
Elyes Haouasc8870b12022-09-16 12:10:00 +02001020 PACKAGES="CMAKE LLVM CLANG CRT CTE LLVMCMAKE"
Stefan Reinauerca117e72017-06-19 17:29:08 -07001021 CMAKE=${DESTDIR}${TARGETDIR}/bin/cmake
Stefan Reinauer85b07d62015-06-09 14:45:14 -07001022 ;;
1023 IASL|iasl)
1024 NAME="IASL ACPI compiler"
1025 PACKAGES=IASL
1026 ;;
Stefan Reinauer3b593492017-06-19 17:28:54 -07001027 CMAKE|cmake)
1028 NAME="CMake"
1029 PACKAGES=CMAKE
1030 ;;
Martin Rothd70f5fa2019-05-26 17:24:19 -06001031 NASM|nasm)
1032 NAME="NASM"
1033 PACKAGES=NASM
1034 ;;
Stefan Reinauer85b07d62015-06-09 14:45:14 -07001035 *)
Patrick Georgif32eed12021-10-16 10:50:00 +02001036 printf "${red}ERROR: Unsupported package $PACKAGE. (Supported packages are GCC, CLANG, IASL, and NASM)${NC}\n\n";
Stefan Reinauer85b07d62015-06-09 14:45:14 -07001037 exit 1
1038 ;;
1039esac
Peter Stugeceacd772011-06-09 04:54:16 +02001040
Stefan Reinauer66e93352015-06-16 22:38:23 +02001041# Find all the required tools:
1042
1043TAR=$(searchtool tar) || exit $?
1044PATCH=$(searchtool patch) || exit $?
1045MAKE=$(searchtool make) || exit $?
1046SHA1SUM=$(searchtool sha1sum)
zbao5cf758d2015-09-01 22:28:57 -04001047#SHA512SUM=$(searchtool sha512sum)
1048#MD5SUM=$(searchtool md5sum)
Stefan Reinauer66e93352015-06-16 22:38:23 +02001049CHECKSUM=$SHA1SUM
Martin Roth95f7b222016-03-20 12:38:48 -06001050LBZIP2=$(searchtool lbzip2 "" nofail)
1051PIGZ=$(searchtool pigz "" nofail)
Stefan Reinauer66e93352015-06-16 22:38:23 +02001052
1053searchtool m4 > /dev/null
1054searchtool bison > /dev/null
1055searchtool flex flex > /dev/null
Stefan Reinauer66e93352015-06-16 22:38:23 +02001056searchtool bzip2 "bzip2," > /dev/null
Nico Huber0ff3b392017-03-12 16:07:33 +01001057searchtool xz "XZ Utils" "" "xz-utils" > /dev/null
Stefan Reinauer66e93352015-06-16 22:38:23 +02001058
Patrick Georgidf1ff232017-01-07 09:28:43 +01001059if searchtool wget "GNU" nofail > /dev/null; then
1060 download_showing_percentage() {
1061 url=$1
Stefan Reinauer81693d42017-06-21 15:25:36 -07001062 printf "... ${red} 0%%"
Martin Roth82a30a12020-11-07 15:17:45 -07001063 wget --tries=3 "$url" 2>&1 | while read -r line; do
Martin Roth987d42d2018-07-22 11:45:29 -06001064 echo "$line" | grep -o "[0-9]\+%" | awk '{printf("\b\b\b\b%4s", $1)}'
Patrick Georgidf1ff232017-01-07 09:28:43 +01001065 done
Jonathan Neuschäfer92d483a2017-09-26 22:33:53 +02001066 printf "${NC}... "
Patrick Georgidf1ff232017-01-07 09:28:43 +01001067 }
1068elif searchtool curl "^curl " > /dev/null; then
1069 download_showing_percentage() {
1070 url=$1
1071 echo
Idwer Vollering5190f422020-11-24 15:13:16 +01001072 curl -O --progress-bar --location --retry 3 "$url"
Patrick Georgidf1ff232017-01-07 09:28:43 +01001073 }
1074fi
1075
Nico Huber08bb8372017-06-24 19:50:35 +02001076# Allow $CC override from the environment.
1077if [ -n "$CC" ]; then
1078 if [ ! -x "$(command -v "$CC" 2>/dev/null)" ]; then
1079 printf "${RED}ERROR:${red} CC is set to '%s' but wasn't found.${NC}\n" "$CC"
1080 HALT_FOR_TOOLS=1
1081 fi
1082else
Patrick Georgi8f2cdad2017-07-10 11:48:34 +02001083 if searchtool gnatgcc "Free Software Foundation" nofail > /dev/null; then
1084 CC=gnatgcc
1085 elif searchtool gcc "Free Software Foundation" nofail > /dev/null; then
Nico Huber08bb8372017-06-24 19:50:35 +02001086 CC=gcc
1087 else
1088 searchtool cc '^' nofail > /dev/null || please_install gcc
1089 CC=cc
1090 fi
1091fi
Martin Roth591790f2016-03-20 20:39:04 -06001092
Nico Huber08bb8372017-06-24 19:50:35 +02001093# We can leave $CXX empty if it's not set since *buildgcc* never
1094# calls it directly. This way configure scripts can search for
1095# themselves and we still override it when a bootstrapped g++ is
1096# to be used (cf. hostcxx()).
1097if [ -n "$CXX" ]; then
1098 if [ ! -x "$(command -v "$CXX" 2>/dev/null)" ]; then
1099 printf "${RED}ERROR:${red} CXX is set to '%s' but wasn't found.${NC}\n" "$CXX"
1100 HALT_FOR_TOOLS=1
1101 fi
1102else
1103 searchtool g++ "Free Software Foundation" nofail > /dev/null || \
1104 searchtool clang "clang version" nofail > /dev/null || \
1105 searchtool clang "LLVM" "" "g++" > /dev/null
1106fi
1107
1108check_for_library "-lz" "zlib (zlib1g-dev or zlib-devel)"
Nico Huber156d87c2016-09-20 12:59:53 +02001109
Martin Roth88463822016-01-07 11:03:36 -07001110if [ "$HALT_FOR_TOOLS" -ne 0 ]; then
1111 exit 1
1112fi
1113
Stefan Reinauer5dd26352015-06-09 14:52:22 -07001114# This initial cleanup is useful when updating the toolchain script.
Stefan Reinauer5f1ad892010-05-17 11:02:25 +00001115
Stefan Reinauer5dd26352015-06-09 14:52:22 -07001116if [ "$clean" = "1" ]; then
1117 cleanup
1118fi
Stefan Reinauer074d9132009-09-26 16:43:17 +00001119
Stefan Reinauer5dd26352015-06-09 14:52:22 -07001120# Set up host compiler and flags needed for various OSes
Stefan Reinauer074d9132009-09-26 16:43:17 +00001121
Patrick Georgif2c15f52015-06-11 21:07:31 +02001122if is_package_enabled "GCC"; then
Patrick Georgie8253fe2017-07-18 11:35:35 +02001123# sane preset: let the configure script figure out things by itself
1124# more importantly, avoid any values that might already linger in the variable
1125OPTIONS="ABI="
Martin Roth987d42d2018-07-22 11:45:29 -06001126if [ "$UNAME" = "Darwin" ]; then
Stefan Reinauer5f1ad892010-05-17 11:02:25 +00001127 #GCC_OPTIONS="$GCC_OPTIONS --enable-threads=posix"
1128
1129 # generally the OS X compiler can create x64 binaries.
1130 # Per default it generated i386 binaries in 10.5 and x64
1131 # binaries in 10.6 (even if the kernel is 32bit)
1132 # For some weird reason, 10.5 autodetects an ABI=64 though
1133 # so we're setting the ABI explicitly here.
Martin Roth987d42d2018-07-22 11:45:29 -06001134 if [ "$(sysctl -n hw.optional.x86_64 2>/dev/null)" -eq 1 ] 2>/dev/null; then
Stefan Reinauer5f1ad892010-05-17 11:02:25 +00001135 OPTIONS="ABI=64"
1136 else
1137 OPTIONS="ABI=32"
1138 fi
Stefan Reinauer9491b4d2011-10-11 22:37:59 -07001139
Stefan Reinauer4266b922012-12-05 16:18:32 -08001140 # In Xcode 4.5.2 the default compiler is clang.
1141 # However, this compiler fails to compile gcc 4.7.x. As a
1142 # workaround it's possible to compile gcc with llvm-gcc.
Stefan Reinauer9491b4d2011-10-11 22:37:59 -07001143 if $CC -v 2>&1 | grep -q LLVM; then
Stefan Reinauer4266b922012-12-05 16:18:32 -08001144 CC=llvm-gcc
Stefan Reinauer9491b4d2011-10-11 22:37:59 -07001145 fi
Martin Roth987d42d2018-07-22 11:45:29 -06001146elif [ "$UNAME" = "Linux" ] || [ "$UNAME" = "Cygwin" ]; then
Patrick Georgiddb8f802015-07-04 17:45:54 +02001147 # gmp is overeager with detecting 64bit CPUs even if they run
1148 # a 32bit kernel and userland.
1149 if [ "$(uname -m 2>/dev/null)" = "i686" ]; then
1150 OPTIONS="ABI=32"
1151 fi
Martin Roth987d42d2018-07-22 11:45:29 -06001152elif [ "$UNAME" = "NetBSD" ]; then
Nico Huberde45c592016-01-20 23:22:33 +01001153 # same for NetBSD but this one reports an i386
1154 if [ "$(uname -m 2>/dev/null)" = "i386" ]; then
1155 OPTIONS="ABI=32"
1156 fi
Stefan Reinauer5f1ad892010-05-17 11:02:25 +00001157fi
Nico Huber66c2c1a2016-09-20 13:09:29 +02001158if [ -z "${LANGUAGES}" ]; then
Nico Hubercd87e1b2017-06-24 20:35:59 +02001159 if have_gnat; then
Nico Huber66c2c1a2016-09-20 13:09:29 +02001160 printf "\nFound compatible Ada compiler, enabling Ada support by default.\n\n"
1161 LANGUAGES="ada,${DEFAULT_LANGUAGES}"
1162 else
Nico Hubercd87e1b2017-06-24 20:35:59 +02001163 printf "\n${red}WARNING${NC}\n"
1164 printf "No compatible Ada compiler (GNAT) found. You can continue without\n"
1165 printf "Ada support, but this will limit the features of ${blue}coreboot${NC} (e.g.\n"
1166 printf "native graphics initialization won't be available on most Intel\n"
1167 printf "boards).\n\n"
1168
1169 printf "Usually, you can install GNAT with your package management system\n"
1170 printf "(the package is called \`gnat\` or \`gcc-ada\`). It has to match the\n"
1171 printf "\`gcc\` package in version. If there are multiple versions of GCC in-\n"
1172 printf "stalled, you can point this script to the matching version through\n"
1173 printf "the \`CC\` and \`CXX\` environment variables.\n\n"
1174
1175 printf "e.g. on Ubuntu 14.04, if \`gcc\` is \`gcc-4.8\`:\n"
1176 printf " apt-get install gnat-4.8 && make crossgcc\n\n"
1177
1178 printf "on Ubuntu 16.04, if \`gcc\` is \`gcc-5\`:\n"
1179 printf " apt-get install gnat-5 && make crossgcc\n"
1180 timeout 30
Nico Huber66c2c1a2016-09-20 13:09:29 +02001181 LANGUAGES="${DEFAULT_LANGUAGES}"
1182 fi
1183fi
Patrick Georgif2741aa2020-07-06 16:35:56 +02001184if [ "$BOOTSTRAP" != 1 ] && \
1185 { [ "$(hostcc_major)" -lt 4 ] || \
1186 { [ "$(hostcc_major)" -eq 4 ] && \
1187 [ "$(hostcc_minor)" -lt 9 ] ; } ; }
1188then
1189 printf "\n${red}WARNING${NC}\n"
1190 printf "Building coreboot requires a host compiler newer than 4.9.x while\n"
1191 printf "yours is $(hostcc_version).\n"
1192 printf "Enabling bootstrapping to provide a sufficiently new compiler:\n"
1193 printf "This will take significantly longer than a usual build.\n"
1194 printf "Alternatively you can abort now and update your host compiler.\n"
1195 timeout 15
1196 BOOTSTRAP=1
1197fi
Nico Hubercd87e1b2017-06-24 20:35:59 +02001198if ada_requested; then
Patrick Georgif2741aa2020-07-06 16:35:56 +02001199 if ! have_gnat; then
Nico Hubercd87e1b2017-06-24 20:35:59 +02001200 please_install gnat gcc-ada
1201 exit 1
1202 fi
Nico Hubercd87e1b2017-06-24 20:35:59 +02001203fi
Stefan Reinauer14ce2132015-06-05 13:01:13 -07001204fi # GCC
Stefan Reinauer5f1ad892010-05-17 11:02:25 +00001205
Nico Huber5f72f962016-01-31 23:05:19 +01001206export HOSTCFLAGS="-Os"
1207if have_hostcflags_from_gmp; then
1208 set_hostcflags_from_gmp
1209fi
1210
Patrick Georgic1a75b12011-11-04 21:37:14 +01001211if [ "$USECCACHE" = 1 ]; then
1212 CC="ccache $CC"
1213fi
1214
Stefan Reinauer5dd26352015-06-09 14:52:22 -07001215# Prepare target directory for building GCC
1216# (dependencies must be in the PATH)
Martin Roth987d42d2018-07-22 11:45:29 -06001217mkdir -p "$DESTDIR$TARGETDIR/bin"
1218mkdir -p "$DESTDIR$TARGETDIR/share"
Stefan Reinauer16bd7892012-12-07 23:57:01 +01001219export PATH=$DESTDIR$TARGETDIR/bin:$PATH
1220
Stefan Reinauer5dd26352015-06-09 14:52:22 -07001221# Download, unpack, patch and build all packages
1222
Idwer Vollering458e7df2020-09-25 12:26:51 +02001223printf "Downloading and verifying tarballs ...\n"
Stefan Reinauer5dd26352015-06-09 14:52:22 -07001224mkdir -p tarballs
1225for P in $PACKAGES; do
Jonathan Neuschäfer92d483a2017-09-26 22:33:53 +02001226 download "$P" || exit "$?"
1227 verify_hash "$P" || exit "$?"
Stefan Reinauer5dd26352015-06-09 14:52:22 -07001228done
Martin Roth03625172016-02-17 14:44:14 -07001229printf "Downloaded tarballs ... ${green}ok${NC}\n"
Stefan Reinauer5dd26352015-06-09 14:52:22 -07001230
Elyes HAOUASb0f19882018-06-09 11:59:00 +02001231printf "Unpacking and patching ...\n"
Stefan Reinauer5dd26352015-06-09 14:52:22 -07001232for P in $PACKAGES; do
1233 unpack_and_patch $P || exit 1
1234done
1235printf "Unpacked and patched ... ${green}ok${NC}\n"
1236
Patrick Georgi9681cdc2017-09-22 18:57:10 +02001237if [ -n "$BOOTSTRAPONLY" ]; then
Elyes HAOUASb0f19882018-06-09 11:59:00 +02001238 printf "Building bootstrap compiler only ...\n"
Nico Huberafda56e2017-12-07 17:50:53 +01001239 for pkg in GMP MPFR MPC GCC; do
Patrick Georgi9681cdc2017-09-22 18:57:10 +02001240 build_for_host $pkg
1241 done
1242 exit 0
1243fi
1244
Elyes HAOUASb0f19882018-06-09 11:59:00 +02001245printf "Building packages ...\n"
Stefan Reinauer1c70e052015-06-09 11:47:28 -07001246for package in $PACKAGES; do
1247 build $package
1248done
Stefan Reinauer5dd26352015-06-09 14:52:22 -07001249printf "Packages built ... ${green}ok${NC}\n"
Stefan Reinauer14ce2132015-06-05 13:01:13 -07001250
Stefan Reinauer699ac272015-06-05 12:43:28 -07001251# Adding git information of current tree to target directory
1252# for reproducibility
Stefan Reinauerd7649122015-06-09 11:44:25 -07001253PROGNAME=$(basename "$0")
Stefan Reinauer88352d72016-04-06 15:57:03 -07001254rm -f "$DESTDIR$TARGETDIR/share/$PROGNAME-*"
Felix Singer62fcffb2021-10-19 13:25:18 +02001255cp "$PROGNAME" "$DESTDIR$TARGETDIR/share/$PROGNAME-$CROSSGCC_VERSION"
Zheng Bao30b895f2013-02-06 18:04:40 +08001256
Patrick Georgi0c2df6f2017-11-22 16:14:09 -05001257# Adding edk2 tools template
1258mkdir -p "$DESTDIR$TARGETDIR/share/edk2config"
1259sed -e "s,@@PREFIX@@,$TARGETDIR,g" edk2tools.txt > "$DESTDIR$TARGETDIR/share/edk2config/tools_def.txt"
1260printf "Copied EDK2 tools template ... ${green}ok${NC}\n"
1261
Stefan Reinauer88e83e52016-04-06 15:39:48 -07001262cleanup
Stefan Reinauer074d9132009-09-26 16:43:17 +00001263
Stefan Reinauer81693d42017-06-21 15:25:36 -07001264printf "\n${green}You can now run $NAME from $TARGETDIR.${NC}\n"