source: mainline/tools/toolchain.sh@ b3536a0

Last change on this file since b3536a0 was b3536a0, checked in by Kai Liu <nebulabox@…>, 8 years ago

Run make with -j to improve the build speed.

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