source: mainline/tools/toolchain.sh@ 2a7749d7

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 2a7749d7 was bfdb7c63, checked in by jzr <zarevucky.jiri@…>, 8 years ago

Change amd64 target to amd64-unknown-elf.

This fixes clang build on amd64.

  • Property mode set to 100755
File size: 15.6 KB
Line 
1#! /bin/bash
2
3#
4# Copyright (c) 2009 Martin Decky
5# All rights reserved.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10#
11# - Redistributions of source code must retain the above copyright
12# notice, this list of conditions and the following disclaimer.
13# - Redistributions in binary form must reproduce the above copyright
14# notice, this list of conditions and the following disclaimer in the
15# documentation and/or other materials provided with the distribution.
16# - The name of the author may not be used to endorse or promote products
17# derived from this software without specific prior written permission.
18#
19# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29#
30
31GMP_MAIN=<<EOF
32#define GCC_GMP_VERSION_NUM(a, b, c) \
33 (((a) << 16L) | ((b) << 8) | (c))
34
35#define GCC_GMP_VERSION \
36 GCC_GMP_VERSION_NUM(__GNU_MP_VERSION, __GNU_MP_VERSION_MINOR, __GNU_MP_VERSION_PATCHLEVEL)
37
38#if GCC_GMP_VERSION < GCC_GMP_VERSION_NUM(4, 3, 2)
39 choke me
40#endif
41EOF
42
43MPFR_MAIN=<<EOF
44#if MPFR_VERSION < MPFR_VERSION_NUM(2, 4, 2)
45 choke me
46#endif
47EOF
48
49MPC_MAIN=<<EOF
50#if MPC_VERSION < MPC_VERSION_NUM(0, 8, 1)
51 choke me
52#endif
53EOF
54
55ISL_MAIN=<<EOF
56isl_ctx_get_max_operations (isl_ctx_alloc ());
57EOF
58
59BINUTILS_VERSION="2.28"
60BINUTILS_RELEASE=""
61## BINUTILS_PATCHES="toolchain-binutils-2.23.1.patch"
62GCC_VERSION="7.1.0"
63## GCC_PATCHES="toolchain-gcc-4.8.1-targets.patch toolchain-gcc-4.8.1-headers.patch"
64GDB_VERSION="7.12.1"
65## GDB_PATCHES="toolchain-gdb-7.6.1.patch"
66
67BASEDIR="`pwd`"
68SRCDIR="$(readlink -f $(dirname "$0"))"
69BINUTILS="binutils-${BINUTILS_VERSION}${BINUTILS_RELEASE}.tar.bz2"
70GCC="gcc-${GCC_VERSION}.tar.bz2"
71GDB="gdb-${GDB_VERSION}.tar.gz"
72
73REAL_INSTALL=true
74USE_HELENOS_TARGET=false
75
76#
77# Check if the library described in the argument
78# exists and has acceptable version.
79#
80check_dependency() {
81 DEPENDENCY="$1"
82 HEADER="$2"
83 BODY="$3"
84
85 FNAME="/tmp/conftest-$$"
86
87 echo "#include ${HEADER}" > "${FNAME}.c"
88 echo >> "${FNAME}.c"
89 echo "int main()" >> "${FNAME}.c"
90 echo "{" >> "${FNAME}.c"
91 echo "${BODY}" >> "${FNAME}.c"
92 echo " return 0;" >> "${FNAME}.c"
93 echo "}" >> "${FNAME}.c"
94
95 cc $CFLAGS -c -o "${FNAME}.o" "${FNAME}.c" 2> "${FNAME}.log"
96 RC="$?"
97
98 if [ "$RC" -ne "0" ] ; then
99 echo " ${DEPENDENCY} not found, too old or compiler error."
100 echo " Please recheck manually the source file \"${FNAME}.c\"."
101 echo " The compilation of the toolchain is probably going to fail,"
102 echo " you have been warned."
103 echo
104 echo " ===== Compiler output ====="
105 cat "${FNAME}.log"
106 echo " ==========================="
107 echo
108 else
109 echo " ${DEPENDENCY} found"
110 rm -f "${FNAME}.log" "${FNAME}.o" "${FNAME}.c"
111 fi
112}
113
114check_dependecies() {
115 echo ">>> Basic dependency check"
116 check_dependency "GMP" "<gmp.h>" "${GMP_MAIN}"
117 check_dependency "MPFR" "<mpfr.h>" "${MPFR_MAIN}"
118 check_dependency "MPC" "<mpc.h>" "${MPC_MAIN}"
119 check_dependency "isl" "<isl/ctx.h>" "${ISL_MAIN}"
120 echo
121}
122
123check_error() {
124 if [ "$1" -ne "0" ] ; then
125 echo
126 echo "Script failed: $2"
127
128 exit 1
129 fi
130}
131
132check_md5() {
133 FILE="$1"
134 SUM="$2"
135
136 COMPUTED="`md5sum "${FILE}" | cut -d' ' -f1`"
137 if [ "${SUM}" != "${COMPUTED}" ] ; then
138 echo
139 echo "Checksum of ${FILE} does not match."
140
141 exit 2
142 fi
143}
144
145show_usage() {
146 echo "Cross-compiler toolchain build script"
147 echo
148 echo "Syntax:"
149 echo " $0 [--no-install] [--helenos-target] <platform>"
150 echo
151 echo "Possible target platforms are:"
152 echo " amd64 AMD64 (x86-64, x64)"
153 echo " arm32 ARM 32b"
154 echo " ia32 IA-32 (x86, i386)"
155 echo " ia64 IA-64 (Itanium)"
156 echo " mips32 MIPS little-endian 32b"
157 echo " mips32eb MIPS big-endian 32b"
158 echo " mips64 MIPS little-endian 64b"
159 echo " ppc32 PowerPC 32b"
160 echo " ppc64 PowerPC 64v"
161 echo " riscv64 RISC-V 64b"
162 echo " sparc64 SPARC V9"
163 echo " all build all targets"
164 echo " essential build only targets currently needed for HelenOS development"
165 echo " parallel same as 'all', but all in parallel"
166 echo " 2-way same as 'all', but 2-way parallel"
167 echo
168 echo "The toolchain is installed into directory specified by the"
169 echo "CROSS_PREFIX environment variable. If the variable is not"
170 echo "defined, /usr/local/cross/ is used as default."
171 echo
172 echo "If --no-install is present, the toolchain still uses the"
173 echo "CROSS_PREFIX as the target directory but the installation"
174 echo "copies the files into PKG/ subdirectory without affecting"
175 echo "the actual root file system. That is only useful if you do"
176 echo "not want to run the script under the super user."
177 echo
178 echo "The --helenos-target will build HelenOS-specific toolchain"
179 echo "(i.e. it will use *-helenos-* triplet instead of *-linux-*)."
180 echo "This toolchain is installed into /usr/local/cross-helenos by"
181 echo "default. The settings can be changed by setting environment"
182 echo "variable CROSS_HELENOS_PREFIX."
183 echo "Using the HelenOS-specific toolchain is still an experimental"
184 echo "feature that is not fully supported."
185 echo
186
187 exit 3
188}
189
190change_title() {
191 echo -en "\e]0;$1\a"
192}
193
194show_countdown() {
195 TM="$1"
196
197 if [ "${TM}" -eq 0 ] ; then
198 echo
199 return 0
200 fi
201
202 echo -n "${TM} "
203 change_title "${TM}"
204 sleep 1
205
206 TM="`expr "${TM}" - 1`"
207 show_countdown "${TM}"
208}
209
210show_dependencies() {
211 echo "IMPORTANT NOTICE:"
212 echo
213 echo "For a successful compilation and use of the cross-compiler"
214 echo "toolchain you need at least the following dependencies."
215 echo
216 echo "Please make sure that the dependencies are present in your"
217 echo "system. Otherwise the compilation process might fail after"
218 echo "a few seconds or minutes."
219 echo
220 echo " - SED, AWK, Flex, Bison, gzip, bzip2, Bourne Shell"
221 echo " - gettext, zlib, Texinfo, libelf, libgomp"
222 echo " - GNU Make, Coreutils, Sharutils, tar"
223 echo " - GNU Multiple Precision Library (GMP)"
224 echo " - MPFR"
225 echo " - MPC"
226 echo " - integer point manipulation library (isl)"
227 echo " - native C and C++ compiler, assembler and linker"
228 echo " - native C and C++ standard library with headers"
229 echo
230}
231
232download_fetch() {
233 SOURCE="$1"
234 FILE="$2"
235 CHECKSUM="$3"
236
237 if [ ! -f "${FILE}" ] ; then
238 change_title "Downloading ${FILE}"
239 wget -c "${SOURCE}${FILE}"
240 check_error $? "Error downloading ${FILE}."
241 fi
242
243 check_md5 "${FILE}" "${CHECKSUM}"
244}
245
246source_check() {
247 FILE="$1"
248
249 if [ ! -f "${FILE}" ] ; then
250 echo
251 echo "File ${FILE} not found."
252
253 exit 4
254 fi
255}
256
257cleanup_dir() {
258 DIR="$1"
259
260 if [ -d "${DIR}" ] ; then
261 change_title "Removing ${DIR}"
262 echo " >>> Removing ${DIR}"
263 rm -fr "${DIR}"
264 fi
265}
266
267create_dir() {
268 DIR="$1"
269 DESC="$2"
270
271 change_title "Creating ${DESC}"
272 echo ">>> Creating ${DESC}"
273
274 mkdir -p "${DIR}"
275 test -d "${DIR}"
276 check_error $? "Unable to create ${DIR}."
277}
278
279check_dirs() {
280 OUTSIDE="$1"
281 BASE="$2"
282 ORIGINAL="`pwd`"
283
284 mkdir -p "${OUTSIDE}"
285
286 cd "${OUTSIDE}"
287 check_error $? "Unable to change directory to ${OUTSIDE}."
288 ABS_OUTSIDE="`pwd`"
289
290 cd "${BASE}"
291 check_error $? "Unable to change directory to ${BASE}."
292 ABS_BASE="`pwd`"
293
294 cd "${ORIGINAL}"
295 check_error $? "Unable to change directory to ${ORIGINAL}."
296
297 BASE_LEN="${#ABS_BASE}"
298 OUTSIDE_TRIM="${ABS_OUTSIDE:0:${BASE_LEN}}"
299
300 if [ "${OUTSIDE_TRIM}" == "${ABS_BASE}" ] ; then
301 echo
302 echo "CROSS_PREFIX cannot reside within the working directory."
303
304 exit 5
305 fi
306}
307
308unpack_tarball() {
309 FILE="$1"
310 DESC="$2"
311
312 change_title "Unpacking ${DESC}"
313 echo " >>> Unpacking ${DESC}"
314
315 case "${FILE}" in
316 *.gz)
317 tar -xzf "${FILE}"
318 ;;
319 *.xz)
320 tar -xJf "${FILE}"
321 ;;
322 *.bz2)
323 tar -xjf "${FILE}"
324 ;;
325 *)
326 check_error 1 "Don't know how to unpack ${DESC}."
327 ;;
328 esac
329 check_error $? "Error unpacking ${DESC}."
330}
331
332patch_sources() {
333 PATCH_FILE="$1"
334 PATCH_STRIP="$2"
335 DESC="$3"
336
337 change_title "Patching ${DESC}"
338 echo " >>> Patching ${DESC} with ${PATCH_FILE}"
339
340 patch -t "-p${PATCH_STRIP}" <"$PATCH_FILE"
341 check_error $? "Error patching ${DESC}."
342}
343
344prepare() {
345 show_dependencies
346 check_dependecies
347 show_countdown 10
348
349 BINUTILS_SOURCE="ftp://ftp.gnu.org/gnu/binutils/"
350 GCC_SOURCE="ftp://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/"
351 GDB_SOURCE="ftp://ftp.gnu.org/gnu/gdb/"
352
353 download_fetch "${BINUTILS_SOURCE}" "${BINUTILS}" "9e8340c96626b469a603c15c9d843727"
354 download_fetch "${GCC_SOURCE}" "${GCC}" "6bf56a2bca9dac9dbbf8e8d1036964a8"
355 download_fetch "${GDB_SOURCE}" "${GDB}" "06c8f40521ed65fe36ebc2be29b56942"
356}
357
358set_target_from_platform() {
359 case "$1" in
360 "amd64")
361 LINUX_TARGET="amd64-unknown-elf"
362 HELENOS_TARGET="amd64-helenos"
363 ;;
364 "arm32")
365 LINUX_TARGET="arm-linux-gnueabi"
366 HELENOS_TARGET="arm-helenos-gnueabi"
367 ;;
368 "ia32")
369 LINUX_TARGET="i686-pc-linux-gnu"
370 HELENOS_TARGET="i686-pc-helenos"
371 ;;
372 "ia64")
373 LINUX_TARGET="ia64-pc-linux-gnu"
374 HELENOS_TARGET="ia64-pc-helenos"
375 ;;
376 "mips32")
377 LINUX_TARGET="mipsel-linux-gnu"
378 HELENOS_TARGET="mipsel-helenos"
379 ;;
380 "mips32eb")
381 LINUX_TARGET="mips-linux-gnu"
382 HELENOS_TARGET="mips-helenos"
383 ;;
384 "mips64")
385 LINUX_TARGET="mips64el-linux-gnu"
386 HELENOS_TARGET="mips64el-helenos"
387 ;;
388 "ppc32")
389 LINUX_TARGET="ppc-linux-gnu"
390 HELENOS_TARGET="ppc-helenos"
391 ;;
392 "ppc64")
393 LINUX_TARGET="ppc64-linux-gnu"
394 HELENOS_TARGET="ppc64-helenos"
395 ;;
396 "riscv64")
397 LINUX_TARGET="riscv64-unknown-linux-gnu"
398 HELENOS_TARGET="riscv64-helenos"
399 ;;
400 "sparc64")
401 LINUX_TARGET="sparc64-linux-gnu"
402 HELENOS_TARGET="sparc64-helenos"
403 ;;
404 *)
405 check_error 1 "No target known for $1."
406 ;;
407 esac
408}
409
410build_target() {
411 PLATFORM="$1"
412
413 # This sets the *_TARGET variables
414 set_target_from_platform "$PLATFORM"
415 if $USE_HELENOS_TARGET ; then
416 TARGET="$HELENOS_TARGET"
417 else
418 TARGET="$LINUX_TARGET"
419 fi
420
421 WORKDIR="${BASEDIR}/${TARGET}"
422 INSTALL_DIR="${WORKDIR}/PKG"
423 BINUTILSDIR="${WORKDIR}/binutils-${BINUTILS_VERSION}"
424 GCCDIR="${WORKDIR}/gcc-${GCC_VERSION}"
425 OBJDIR="${WORKDIR}/gcc-obj"
426 GDBDIR="${WORKDIR}/gdb-${GDB_VERSION}"
427
428 if [ -z "${CROSS_PREFIX}" ] ; then
429 CROSS_PREFIX="/usr/local/cross"
430 fi
431
432 PREFIX="${CROSS_PREFIX}/${TARGET}"
433
434 echo ">>> Downloading tarballs"
435 source_check "${BASEDIR}/${BINUTILS}"
436 source_check "${BASEDIR}/${GCC}"
437 source_check "${BASEDIR}/${GDB}"
438
439 echo ">>> Removing previous content"
440 cleanup_dir "${WORKDIR}"
441
442 create_dir "${OBJDIR}" "GCC object directory"
443
444 check_dirs "${PREFIX}" "${WORKDIR}"
445
446 echo ">>> Unpacking tarballs"
447 cd "${WORKDIR}"
448 check_error $? "Change directory failed."
449
450 unpack_tarball "${BASEDIR}/${BINUTILS}" "binutils"
451 unpack_tarball "${BASEDIR}/${GCC}" "GCC"
452 unpack_tarball "${BASEDIR}/${GDB}" "GDB"
453
454 echo ">>> Applying patches"
455 for p in $BINUTILS_PATCHES ; do
456 patch_sources "${SRCDIR}/${p}" 0 "binutils"
457 done
458 for p in $GCC_PATCHES ; do
459 patch_sources "${SRCDIR}/${p}" 0 "GCC"
460 done
461 for p in $GDB_PATCHES ; do
462 patch_sources "${SRCDIR}/${p}" 0 "GDB"
463 done
464
465 echo ">>> Processing binutils (${PLATFORM})"
466 cd "${BINUTILSDIR}"
467 check_error $? "Change directory failed."
468
469 change_title "binutils: configure (${PLATFORM})"
470 CFLAGS=-Wno-error ./configure \
471 "--target=${TARGET}" \
472 "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" \
473 --disable-nls --disable-werror --enable-gold
474 check_error $? "Error configuring binutils."
475
476 change_title "binutils: make (${PLATFORM})"
477 make all
478 check_error $? "Error compiling binutils."
479
480 change_title "binutils: install (${PLATFORM})"
481 make install "DESTDIR=${INSTALL_DIR}"
482 check_error $? "Error installing binutils."
483
484
485 echo ">>> Processing GCC (${PLATFORM})"
486 cd "${OBJDIR}"
487 check_error $? "Change directory failed."
488
489 change_title "GCC: configure (${PLATFORM})"
490 PATH="$PATH:${INSTALL_DIR}/${PREFIX}/bin" "${GCCDIR}/configure" \
491 "--target=${TARGET}" \
492 "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" \
493 --with-gnu-as --with-gnu-ld --disable-nls --disable-threads \
494 --enable-languages=c,objc,c++,obj-c++ \
495 --disable-multilib --disable-libgcj --without-headers \
496 --disable-shared --enable-lto --disable-werror
497 check_error $? "Error configuring GCC."
498
499 change_title "GCC: make (${PLATFORM})"
500 PATH="${PATH}:${PREFIX}/bin:${INSTALL_DIR}/${PREFIX}/bin" make all-gcc
501 check_error $? "Error compiling GCC."
502
503 change_title "GCC: install (${PLATFORM})"
504 PATH="${PATH}:${INSTALL_DIR}/${PREFIX}/bin" make install-gcc "DESTDIR=${INSTALL_DIR}"
505 check_error $? "Error installing GCC."
506
507
508 # No GDB support for RISC-V so far
509 if [ "$PLATFORM" != "riscv64" ] ; then
510 echo ">>> Processing GDB (${PLATFORM})"
511 cd "${GDBDIR}"
512 check_error $? "Change directory failed."
513
514 change_title "GDB: configure (${PLATFORM})"
515 PATH="$PATH:${INSTALL_DIR}/${PREFIX}/bin" ./configure \
516 "--target=${TARGET}" \
517 "--prefix=${PREFIX}" "--program-prefix=${TARGET}-" \
518 --enable-werror=no --without-guile
519 check_error $? "Error configuring GDB."
520
521 change_title "GDB: make (${PLATFORM})"
522 PATH="${PATH}:${PREFIX}/bin:${INSTALL_DIR}/${PREFIX}/bin" make all
523 check_error $? "Error compiling GDB."
524
525 change_title "GDB: make (${PLATFORM})"
526 PATH="${PATH}:${INSTALL_DIR}/${PREFIX}/bin" make install "DESTDIR=${INSTALL_DIR}"
527 check_error $? "Error installing GDB."
528 fi
529
530 # Symlink clang and lld to the install path.
531 CLANG=`which clang 2> /dev/null || echo "/usr/bin/clang"`
532 LLD=`which ld.lld 2> /dev/null || echo "/usr/bin/ld.lld"`
533
534 ln -s $CLANG "${INSTALL_DIR}/${PREFIX}/bin/${TARGET}-clang"
535 ln -s $LLD "${INSTALL_DIR}/${PREFIX}/bin/${TARGET}-ld.lld"
536
537 if $REAL_INSTALL ; then
538 echo ">>> Moving to the destination directory."
539 cleanup_dir "${PREFIX}"
540 echo mv "${INSTALL_DIR}/${PREFIX}" "${PREFIX}"
541 mv "${INSTALL_DIR}/${PREFIX}" "${PREFIX}"
542 fi
543
544 cd "${BASEDIR}"
545 check_error $? "Change directory failed."
546
547 echo ">>> Cleaning up"
548 cleanup_dir "${WORKDIR}"
549
550 echo
551 echo ">>> Cross-compiler for ${TARGET} installed."
552}
553
554while [ "$#" -gt 1 ] ; do
555 case "$1" in
556 --no-install)
557 REAL_INSTALL=false
558 shift
559 ;;
560 --helenos-target)
561 USE_HELENOS_TARGET=true
562 shift
563 ;;
564 *)
565 show_usage
566 ;;
567 esac
568done
569
570if [ "$#" -lt "1" ] ; then
571 show_usage
572fi
573
574case "$1" in
575 amd64|arm32|ia32|ia64|mips32|mips32eb|mips64|ppc32|ppc64|riscv64|sparc64)
576 prepare
577 build_target "$1"
578 ;;
579 "all")
580 prepare
581 build_target "amd64"
582 build_target "arm32"
583 build_target "ia32"
584 build_target "ia64"
585 build_target "mips32"
586 build_target "mips32eb"
587 build_target "mips64"
588 build_target "ppc32"
589 build_target "ppc64"
590 build_target "riscv64"
591 build_target "sparc64"
592 ;;
593 "essential")
594 prepare
595 build_target "amd64"
596 build_target "arm32"
597 build_target "ia32"
598 build_target "ia64"
599 build_target "mips32"
600 build_target "mips32eb"
601 build_target "ppc32"
602 build_target "sparc64"
603 ;;
604 "parallel")
605 prepare
606 build_target "amd64" &
607 build_target "arm32" &
608 build_target "ia32" &
609 build_target "ia64" &
610 build_target "mips32" &
611 build_target "mips32eb" &
612 build_target "mips64" &
613 build_target "ppc32" &
614 build_target "ppc64" &
615 build_target "riscv64" &
616 build_target "sparc64" &
617 wait
618 ;;
619 "2-way")
620 prepare
621 build_target "amd64" &
622 build_target "arm32" &
623 wait
624
625 build_target "ia32" &
626 build_target "ia64" &
627 wait
628
629 build_target "mips32" &
630 build_target "mips32eb" &
631 wait
632
633 build_target "mips64" &
634 build_target "ppc32" &
635 wait
636
637 build_target "riscv64" &
638 build_target "ppc64" &
639 wait
640
641 build_target "sparc64" &
642 wait
643 ;;
644 *)
645 show_usage
646 ;;
647esac
Note: See TracBrowser for help on using the repository browser.