1#!/bin/sh 2# 3# Copyright (C) 2010 The Android Open Source Project 4# 5# Licensed under the Apache License, Version 2.0 (the "License"); 6# you may not use this file except in compliance with the License. 7# You may obtain a copy of the License at 8# 9# http://www.apache.org/licenses/LICENSE-2.0 10# 11# Unless required by applicable law or agreed to in writing, software 12# distributed under the License is distributed on an "AS IS" BASIS, 13# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14# See the License for the specific language governing permissions and 15# limitations under the License. 16# 17# This shell script is used to rebuild the gcc and toolchain binaries 18# for the Android NDK. 19# 20 21# include common function and variable definitions 22. `dirname $0`/prebuilt-common.sh 23 24PROGRAM_PARAMETERS="<src-dir> <ndk-dir> <toolchain>" 25 26PROGRAM_DESCRIPTION=\ 27"Rebuild the gcc toolchain prebuilt binaries for the Android NDK. 28 29Where <src-dir> is the location of toolchain sources, <ndk-dir> is 30the top-level NDK installation path and <toolchain> is the name of 31the toolchain to use (e.g. arm-linux-androideabi-4.6)." 32 33RELEASE=`date +%Y%m%d` 34BUILD_OUT=/tmp/ndk-$USER/build/toolchain 35OPTION_BUILD_OUT= 36register_var_option "--build-out=<path>" OPTION_BUILD_OUT "Set temporary build directory" 37 38# Note: platform API level 9 or higher is needed for proper C++ support 39register_var_option "--platform=<name>" PLATFORM "Specify platform name" 40 41OPTION_SYSROOT= 42register_var_option "--sysroot=<path>" OPTION_SYSROOT "Specify sysroot directory directly" 43 44GDB_VERSION=$DEFAULT_GDB_VERSION 45EXPLICIT_GDB_VERSION= 46register_option "--gdb-version=<version>" do_gdb_version "Specify gdb version" "$GDB_VERSION" 47do_gdb_version () { 48 GDB_VERSION=$1 49 EXPLICIT_GDB_VERSION=true 50} 51 52BINUTILS_VERSION=$DEFAULT_BINUTILS_VERSION 53EXPLICIT_BINUTILS_VERSION= 54register_option "--binutils-version=<version>" do_binutils_version "Specify binutils version" "$BINUTILS_VERSION" 55do_binutils_version () { 56 BINUTILS_VERSION=$1 57 EXPLICIT_BINUTILS_VERSION=true 58} 59 60GMP_VERSION=$DEFAULT_GMP_VERSION 61register_var_option "--gmp-version=<version>" GMP_VERSION "Specify gmp version" 62 63MPFR_VERSION=$DEFAULT_MPFR_VERSION 64register_var_option "--mpfr-version=<version>" MPFR_VERSION "Specify mpfr version" 65 66MPC_VERSION=$DEFAULT_MPC_VERSION 67register_var_option "--mpc-version=<version>" MPC_VERSION "Specify mpc version" 68 69CLOOG_VERSION=$DEFAULT_CLOOG_VERSION 70register_var_option "--cloog-version=<version>" CLOOG_VERSION "Specify cloog version" 71 72ISL_VERSION=$DEFAULT_ISL_VERSION 73register_var_option "--isl-version=<version>" ISL_VERSION "Specify ISL version" 74 75PPL_VERSION=$DEFAULT_PPL_VERSION 76register_var_option "--ppl-version=<version>" PPL_VERSION "Specify ppl version" 77 78WITH_PYTHON= 79register_var_option "--with-python=<path/to/python-config.sh>" WITH_PYTHON "Specify python config script, or prebuilt" 80 81PACKAGE_DIR= 82register_var_option "--package-dir=<path>" PACKAGE_DIR "Create archive tarball in specific directory" 83 84register_jobs_option 85register_canadian_option 86register_try64_option 87 88extract_parameters "$@" 89 90prepare_canadian_toolchain /tmp/ndk-$USER/build 91 92fix_option BUILD_OUT "$OPTION_BUILD_OUT" "build directory" 93setup_default_log_file $BUILD_OUT/config.log 94 95set_parameters () 96{ 97 SRC_DIR="$1" 98 NDK_DIR="$2" 99 TOOLCHAIN="$3" 100 101 # Check source directory 102 # 103 if [ -z "$SRC_DIR" ] ; then 104 echo "ERROR: Missing source directory parameter. See --help for details." 105 exit 1 106 fi 107 108 if [ ! -d "$SRC_DIR/gcc" ] ; then 109 echo "ERROR: Source directory does not contain gcc sources: $SRC_DIR" 110 exit 1 111 fi 112 SRC_DIR=`cd $SRC_DIR; pwd` 113 log "Using source directory: $SRC_DIR" 114 115 # Check NDK installation directory 116 # 117 if [ -z "$NDK_DIR" ] ; then 118 echo "ERROR: Missing NDK directory parameter. See --help for details." 119 exit 1 120 fi 121 122 if [ ! -d "$NDK_DIR" ] ; then 123 mkdir -p $NDK_DIR 124 if [ $? != 0 ] ; then 125 echo "ERROR: Could not create target NDK installation path: $NDK_DIR" 126 exit 1 127 fi 128 fi 129 NDK_DIR=`cd $NDK_DIR; pwd` 130 log "Using NDK directory: $NDK_DIR" 131 132 # Check toolchain name 133 # 134 if [ -z "$TOOLCHAIN" ] ; then 135 echo "ERROR: Missing toolchain name parameter. See --help for details." 136 exit 1 137 fi 138} 139 140set_parameters $PARAMETERS 141 142# Disable x86_64 build for toolchains older than 4.7 143case "$TOOLCHAIN" in 144 x86_64-4.4.3|x86_64-4.6) 145 echo "ERROR: x86_64 toolchain is enabled in 4.7+. Please try to build newer version." 146 exit 1 147 ;; 148esac 149 150prepare_target_build 151 152parse_toolchain_name $TOOLCHAIN 153 154if [ -z "$PLATFORM" ]; then 155 PLATFORM="android-"$(get_default_api_level_for_arch $ARCH) 156fi 157 158fix_sysroot "$OPTION_SYSROOT" 159 160check_toolchain_src_dir "$SRC_DIR" 161 162if [ ! -d $SRC_DIR/gdb/gdb-$GDB_VERSION ] ; then 163 echo "ERROR: Missing gdb sources: $SRC_DIR/gdb/gdb-$GDB_VERSION" 164 echo " Use --gdb-version=<version> to specify alternative." 165 exit 1 166fi 167 168if [ -z "$EXPLICIT_BINUTILS_VERSION" ]; then 169 BINUTILS_VERSION=$(get_default_binutils_version_for_gcc $TOOLCHAIN) 170 dump "Auto-config: --binutils-version=$BINUTILS_VERSION" 171fi 172 173if [ ! -d $SRC_DIR/binutils/binutils-$BINUTILS_VERSION ] ; then 174 echo "ERROR: Missing binutils sources: $SRC_DIR/binutils/binutils-$BINUTILS_VERSION" 175 echo " Use --binutils-version=<version> to specify alternative." 176 exit 1 177fi 178 179if [ -z "$EXPLICIT_GDB_VERSION" ]; then 180 GDB_VERSION=$(get_default_gdb_version_for_gcc $TOOLCHAIN) 181 dump "Auto-config: --gdb-version=$GDB_VERSION" 182fi 183 184if [ ! -d $SRC_DIR/gdb/gdb-$GDB_VERSION ] ; then 185 echo "ERROR: Missing gdb sources: $SRC_DIR/gdb/gdb-$GDB_VERSION" 186 echo " Use --gdb-version=<version> to specify alternative." 187 exit 1 188fi 189 190if [ ! -z "$WITH_PYTHON" ] ; then 191 if [ "$WITH_PYTHON" = "prebuilt" ] ; then 192 WITH_PYTHON_SCRIPT="$ANDROID_NDK_ROOT/prebuilt/$HOST_TAG/bin/python-config.sh" 193 fi 194 if [ ! -f "$WITH_PYTHON_SCRIPT" ] ; then 195 echo "ERROR: --with-python ($WITH_PYTHON_SCRIPT)" 196 echo " Does not exist!" 197 exit 1 198 else 199 WITH_PYTHON="--with-python=$WITH_PYTHON_SCRIPT" 200 fi 201fi 202 203fix_option MPFR_VERSION "$OPTION_MPFR_VERSION" "mpfr version" 204if [ ! -f $SRC_DIR/mpfr/mpfr-$MPFR_VERSION.tar.bz2 ] ; then 205 echo "ERROR: Missing mpfr sources: $SRC_DIR/mpfr/mpfr-$MPFR_VERSION.tar.bz2" 206 echo " Use --mpfr-version=<version> to specify alternative." 207 exit 1 208fi 209 210if [ "$PACKAGE_DIR" ]; then 211 mkdir -p "$PACKAGE_DIR" 212 fail_panic "Could not create package directory: $PACKAGE_DIR" 213fi 214 215set_toolchain_ndk $NDK_DIR $TOOLCHAIN 216 217if [ "$MINGW" != "yes" -a "$DARWIN" != "yes" ] ; then 218 dump "Using C compiler: $CC" 219 dump "Using C++ compiler: $CXX" 220fi 221 222rm -rf $BUILD_OUT 223mkdir -p $BUILD_OUT 224 225# Location where the toolchain license files are 226TOOLCHAIN_LICENSES=$ANDROID_NDK_ROOT/build/tools/toolchain-licenses 227 228# Without option "--sysroot" (and its variations), GCC will attempt to 229# search path specified by "--with-sysroot" at build time for headers/libs. 230# Path at --with-sysroot contains minimal headers and libs to boostrap 231# toolchain build, and it's not needed afterward (NOTE: NDK provides 232# sysroot at specified API level,and Android build explicit lists header/lib 233# dependencies. 234# 235# It's better to point --with-sysroot to local directory otherwise the 236# path may be found at compile-time and bad things can happen: eg. 237# 1) The path exists and contain incorrect headers/libs 238# 2) The path exists at remote server and blocks GCC for seconds 239# 3) The path exists but not accessible, which crashes GCC! 240# 241# For canadian build --with-sysroot has to be sub-directory of --prefix. 242# Put TOOLCHAIN_BUILD_PREFIX to BUILD_OUT which is in /tmp by default, 243# and TOOLCHAIN_BUILD_SYSROOT underneath. 244 245TOOLCHAIN_BUILD_PREFIX=$BUILD_OUT/prefix 246TOOLCHAIN_BUILD_SYSROOT=$TOOLCHAIN_BUILD_PREFIX/sysroot 247dump "Sysroot : Copying: $SYSROOT --> $TOOLCHAIN_BUILD_SYSROOT" 248mkdir -p $TOOLCHAIN_BUILD_SYSROOT && (cd $SYSROOT && tar chf - *) | (cd $TOOLCHAIN_BUILD_SYSROOT && tar xf -) 249if [ $? != 0 ] ; then 250 echo "Error while copying sysroot files. See $TMPLOG" 251 exit 1 252fi 253 254# configure the toolchain 255# 256dump "Configure: $TOOLCHAIN toolchain build" 257# Old versions of the toolchain source packages placed the 258# configure script at the top-level. Newer ones place it under 259# the build directory though. Probe the file system to check 260# this. 261BUILD_SRCDIR=$SRC_DIR/build 262if [ ! -d $BUILD_SRCDIR ] ; then 263 BUILD_SRCDIR=$SRC_DIR 264fi 265OLD_ABI="${ABI}" 266export CC CXX 267export CFLAGS_FOR_TARGET="$ABI_CFLAGS_FOR_TARGET" 268export CXXFLAGS_FOR_TARGET="$ABI_CXXFLAGS_FOR_TARGET" 269# Needed to build a 32-bit gmp on 64-bit systems 270export ABI=$HOST_GMP_ABI 271 272# Note that the following flags only apply for "build" in canadian 273# -Wno-error is needed because our gdb-6.6 sources use -Werror by default 274# and fail to build with recent GCC versions. 275CFLAGS_FOR_BUILD="-O2 -s -Wno-error" 276LDFLAGS_FOR_BUILD= 277 278if [ "$MINGW" = "yes" ] ; then 279 CFLAGS_FOR_BUILD=$CFLAGS_FOR_BUILD" -D__USE_MINGW_ANSI_STDIO=1" 280fi 281 282CFLAGS="$CFLAGS_FOR_BUILD $HOST_CFLAGS" 283LDFLAGS="$LDFLAGS_FOR_BUILD $HOST_LDFLAGS" 284 285export CFLAGS LDFLAGS CFLAGS_FOR_BUILD LDFLAGS_FOR_BUILD 286 287# This extra flag is used to slightly speed up the build 288EXTRA_CONFIG_FLAGS="--disable-bootstrap" 289 290# This is to disable GCC 4.6 specific features that don't compile well 291# the flags are ignored for older GCC versions. 292EXTRA_CONFIG_FLAGS=$EXTRA_CONFIG_FLAGS" --disable-libquadmath" 293if [ "$DARWIN" = "yes" ]; then 294 # Disable plugin because in canadian cross build, plugin gengtype 295 # will be incorrectly linked with build's library and fails. 296 # ToDo 297 EXTRA_CONFIG_FLAGS=$EXTRA_CONFIG_FLAGS" --disable-plugin" 298else 299 # Plugins are not supported well before 4.7. On 4.7 it's required to have 300 # -flto working. Flag --enable-plugins (note 's') is actually for binutils, 301 # this is compiler requirement to have binutils configured this way. Flag 302 # --disable-plugin is for gcc. 303 case "$GCC_VERSION" in 304 4.4.3) 305 EXTRA_CONFIG_FLAGS=$EXTRA_CONFIG_FLAGS" --disable-plugin" 306 ;; 307 *) 308 EXTRA_CONFIG_FLAGS=$EXTRA_CONFIG_FLAGS" --enable-plugins" 309 ;; 310 esac 311fi 312 313# Enable OpenMP 314case "$TOOLCHAIN" in 315 *) EXTRA_CONFIG_FLAGS=$EXTRA_CONFIG_FLAGS" --enable-libgomp" ;; 316esac 317 318# Disable libcilkrts which needs C++ for now, because libstdlibc++ in NDK is built separately... 319case "$TOOLCHAIN" in 320 x86*-4.9) EXTRA_CONFIG_FLAGS=$EXTRA_CONFIG_FLAGS" --disable-libcilkrts" 321esac 322 323# Disable libsanitizer (which depends on libstdc++ built separately) for now 324EXTRA_CONFIG_FLAGS=$EXTRA_CONFIG_FLAGS" --disable-libsanitizer" 325 326# Enable Gold as default 327case "$TOOLCHAIN" in 328 # Note that only ARM and X86 >= GCC 4.6 are supported 329 mips*) 330 ;; 331 *-4.4.3) 332 ;; 333 *) 334 EXTRA_CONFIG_FLAGS=$EXTRA_CONFIG_FLAGS" --enable-gold=default" 335 ;; 336esac 337 338# Enable Graphite 339case "$TOOLCHAIN" in 340 *-4.4.3) ;; 341 *-4.6|*-4.7) 342 EXTRA_CONFIG_FLAGS=$EXTRA_CONFIG_FLAGS" --enable-graphite=yes --with-cloog-version=$CLOOG_VERSION --with-ppl-version=$PPL_VERSION" 343 ;; 344 *) 345 EXTRA_CONFIG_FLAGS=$EXTRA_CONFIG_FLAGS" --enable-graphite=yes --with-cloog-version=$CLOOG_VERSION --with-isl-version=$ISL_VERSION" 346 ;; 347esac 348 349# Enable linker option -eh-frame-hdr also for static executable 350EXTRA_CONFIG_FLAGS=$EXTRA_CONFIG_FLAGS" --enable-eh-frame-hdr-for-static" 351 352MAY_FAIL_DUE_TO_RACE_CONDITION= 353if [ "$MINGW" = "yes" -o "$DARWIN" = "yes" ]; then 354 MAY_FAIL_DUE_TO_RACE_CONDITION=yes 355fi 356 357# hack to use different set of sources 358CONFIGURE_GCC_VERSION=$GCC_VERSION 359case "$TOOLCHAIN" in 360 *4.9l) 361 CONFIGURE_GCC_VERSION=4.9l 362 ;; 363 *4.8l) 364 CONFIGURE_GCC_VERSION=4.8l 365 ;; 366esac 367 368cd $BUILD_OUT && run \ 369$BUILD_SRCDIR/configure --target=$ABI_CONFIGURE_TARGET \ 370 --enable-initfini-array \ 371 --host=$ABI_CONFIGURE_HOST \ 372 --build=$ABI_CONFIGURE_BUILD \ 373 --disable-nls \ 374 --prefix=$TOOLCHAIN_BUILD_PREFIX \ 375 --with-sysroot=$TOOLCHAIN_BUILD_SYSROOT \ 376 --with-binutils-version=$BINUTILS_VERSION \ 377 --with-mpfr-version=$MPFR_VERSION \ 378 --with-mpc-version=$MPC_VERSION \ 379 --with-gmp-version=$GMP_VERSION \ 380 --with-gcc-version=$CONFIGURE_GCC_VERSION \ 381 --with-gdb-version=$GDB_VERSION \ 382 $WITH_PYTHON \ 383 --with-gxx-include-dir=$TOOLCHAIN_BUILD_PREFIX/include/c++/$GCC_VERSION \ 384 --with-bugurl=$DEFAULT_ISSUE_TRACKER_URL \ 385 $EXTRA_CONFIG_FLAGS \ 386 $ABI_CONFIGURE_EXTRA_FLAGS 387if [ $? != 0 ] ; then 388 dump "Error while trying to configure toolchain build. See $TMPLOG" 389 exit 1 390fi 391 392ABI="$OLD_ABI" 393# build the toolchain 394dump "Building : $TOOLCHAIN toolchain [this can take a long time]." 395cd $BUILD_OUT 396export CC CXX 397export ABI=$HOST_GMP_ABI 398export NUM_JOBS 399 400while [ -n "1" ]; do 401 run make -j$NUM_JOBS 402 if [ $? = 0 ] ; then 403 break 404 else 405 if [ "$MAY_FAIL_DUE_TO_RACE_CONDITION" = "yes" ] ; then 406 # Unfortunately, there is a bug in the GCC build scripts that prevent 407 # parallel mingw/darwin canadian cross builds to work properly on some 408 # multi-core machines (but not all, sounds like a race condition). Detect 409 # this and restart in less parallelism, until -j1 also fail 410 NUM_JOBS=$((NUM_JOBS/2)) 411 export NUM_JOBS 412 if [ $NUM_JOBS -lt 1 ] ; then 413 echo "Error while building mingw/darwin toolchain. See $TMPLOG" 414 exit 1 415 fi 416 dump "Parallel canadian build failed - continuing in less parallelism -j$NUM_JOBS" 417 else 418 echo "Error while building toolchain. See $TMPLOG" 419 exit 1 420 fi 421 fi 422done 423 424ABI="$OLD_ABI" 425 426# install the toolchain to its final location. 427dump "Install : $TOOLCHAIN toolchain binaries." 428cd $BUILD_OUT && run make install 429if [ $? != 0 ] ; then 430 # try "-j1", eg. for aarch64-linux-android-4.8 with libatomic may fail to install due to race condition (missing prefix/lib/../lib64/./libiberty.an) 431 NUM_JOBS=1 432 export NUM_JOBS 433 run make install -j$NUM_JOBS 434 if [ $? != 0 ] ; then 435 echo "Error while installing toolchain. See $TMPLOG" 436 exit 1 437 fi 438fi 439 440unwind_library_for_abi () 441{ 442 local ABI="$1" 443 local BASE_DIR OBJS UNWIND_OBJS 444 445 case $ABI in 446 armeabi) 447 BASE_DIR="$BUILD_OUT/gcc-$CONFIGURE_GCC_VERSION/$ABI_CONFIGURE_TARGET/libgcc/" 448 OBJS="unwind-arm.o \ 449 libunwind.o \ 450 pr-support.o \ 451 unwind-c.o" 452 ;; 453 armeabi-v7a) 454 BASE_DIR="$BUILD_OUT/gcc-$CONFIGURE_GCC_VERSION/$ABI_CONFIGURE_TARGET/armv7-a/libgcc/" 455 OBJS="unwind-arm.o \ 456 libunwind.o \ 457 pr-support.o \ 458 unwind-c.o" 459 ;; 460 armeabi-v7a-hard) 461 BASE_DIR="$BUILD_OUT/gcc-$CONFIGURE_GCC_VERSION/$ABI_CONFIGURE_TARGET/armv7-a/hard/libgcc/" 462 OBJS="unwind-arm.o \ 463 libunwind.o \ 464 pr-support.o \ 465 unwind-c.o" 466 ;; 467 x86|mips) 468 BASE_DIR="$BUILD_OUT/gcc-$CONFIGURE_GCC_VERSION/$ABI_CONFIGURE_TARGET/libgcc/" 469 if [ "$GCC_VERSION" = "4.6" -o "$GCC_VERSION" = "4.4.3" ]; then 470 OBJS="unwind-c.o \ 471 unwind-dw2-fde-glibc.o \ 472 unwind-dw2.o" 473 else 474 OBJS="unwind-c.o \ 475 unwind-dw2-fde-dip.o \ 476 unwind-dw2.o" 477 fi 478 ;; 479 arm64-v8a|x86_64|mips64) 480 BASE_DIR="$BUILD_OUT/gcc-$CONFIGURE_GCC_VERSION/$ABI_CONFIGURE_TARGET/libgcc/" 481 OBJS="unwind-c.o \ 482 unwind-dw2-fde-dip.o \ 483 unwind-dw2.o" 484 ;; 485 esac 486 487 for OBJ in $OBJS; do 488 UNWIND_OBJS=$UNWIND_OBJS" $BASE_DIR/$OBJ" 489 done 490 echo $UNWIND_OBJS 491} 492 493# Create libgccunwind.a for app linking 494# $1: arch name 495# $2: NDK_DIR 496create_unwind_library () 497{ 498 local ARCH="$1" 499 local NDK_DIR="$2" 500 local ABIS="$(commas_to_spaces $(convert_archs_to_abis $ARCH))" 501 local ABI UNWIND_OBJS UNWIND_LIB 502 for ABI in $ABIS; do 503 UNWIND_OBJS=$(unwind_library_for_abi $ABI) 504 UNWIND_LIB_DIR="$NDK_DIR/$GCCUNWIND_SUBDIR/libs/$ABI/" 505 run mkdir -p $UNWIND_LIB_DIR 506 run ar crsD $UNWIND_LIB_DIR/libgccunwind.a $UNWIND_OBJS 507 done 508} 509 510# Only create libgccunwind.a when building default version of gcc 511DEFAULT_GCC_VERSION=$(get_default_gcc_version_for_arch $ARCH) 512if [ "$HOST_OS" = "linux" -a "$GCC_VERSION" = "$DEFAULT_GCC_VERSION" ]; then 513 run create_unwind_library $ARCH $NDK_DIR 514fi 515 516# copy to toolchain path 517run copy_directory "$TOOLCHAIN_BUILD_PREFIX" "$TOOLCHAIN_PATH" 518 519if [ "$MINGW" = "yes" -o "$DARWIN" = "yes" ] ; then 520 # For some reasons, libraries in $ABI_CONFIGURE_TARGET (*) are not installed. 521 # Hack here to copy them over. 522 # (*) FYI: libgcc.a and libgcov.a not installed there in the first place 523 INSTALL_TARGET_LIB_PATH="$BUILD_OUT/host-$ABI_CONFIGURE_BUILD/install/$ABI_CONFIGURE_TARGET/lib" 524 TOOLCHAIN_TARGET_LIB_PATH="$TOOLCHAIN_PATH/$ABI_CONFIGURE_TARGET/lib" 525 (cd "$INSTALL_TARGET_LIB_PATH" && 526 find . \( -name "*.a" -o -name "*.la" -o -name "*.spec" \) -exec install -D "{}" "$TOOLCHAIN_TARGET_LIB_PATH/{}" \;) 527fi 528 529# build the gdb stub and replace gdb with it. This is done post-install 530# so files are in the correct place when determining the relative path. 531if [ -n "$WITH_PYTHON" -a "$MINGW" = "yes" ] ; then 532 WITH_PYTHON_PREFIX=$(dirname $(dirname "$WITH_PYTHON_SCRIPT")) 533 dump "Building : $TOOLCHAIN GDB stub. "$TOOLCHAIN_PATH/bin/${ABI_CONFIGURE_TARGET}-gdb.exe", "$WITH_PYTHON_PREFIX", $ABI_CONFIGURE_HOST-gcc" 534 GCC_FOR_STUB=$ABI_CONFIGURE_HOST-gcc 535 if [ "$TRY64" != "yes" ]; then 536 # The i586-mingw32msvc-gcc is missing CreateJobObject, SetInformationJobObject, and 537 # AssignProcessToJobObject needed for gdb-stub.c. Hack to use i686-w64-mingw32-gcc. ToDo: 538 GCC_FOR_STUB_TARGET=`$GCC_FOR_STUB -dumpmachine` 539 if [ "$GCC_FOR_STUB_TARGET" = "i586-mingw32msvc" ]; then 540 GCC_FOR_STUB=i686-w64-mingw32-gcc 541 dump "Override compiler for gdb-stub: $GCC_FOR_STUB" 542 fi 543 fi 544 run $NDK_DIR/build/tools/build-gdb-stub.sh --gdb-executable-path="$TOOLCHAIN_PATH/bin/${ABI_CONFIGURE_TARGET}-gdb.exe" \ 545 --python-prefix-dir=${WITH_PYTHON_PREFIX} \ 546 --mingw-w64-gcc=$GCC_FOR_STUB 547 fail_panic "Could not build gdb-stub" 548fi 549 550# don't forget to copy the GPL and LGPL license files 551run cp -f $TOOLCHAIN_LICENSES/COPYING $TOOLCHAIN_LICENSES/COPYING.LIB $TOOLCHAIN_PATH 552 553# remove some unneeded files 554run rm -f $TOOLCHAIN_PATH/bin/*-gccbug 555run rm -f $TOOLCHAIN_PATH/bin/*gdbtui$HOST_EXE 556run rm -f $TOOLCHAIN_PATH/bin/*-run$HOST_EXE 557run rm -rf $TOOLCHAIN_PATH/info 558run rm -rf $TOOLCHAIN_PATH/man 559run rm -rf $TOOLCHAIN_PATH/share/info 560run rm -rf $TOOLCHAIN_PATH/share/man 561run rm -rf $TOOLCHAIN_PATH/lib/gcc/$ABI_CONFIGURE_TARGET/*/install-tools 562run rm -rf $TOOLCHAIN_PATH/lib/gcc/$ABI_CONFIGURE_TARGET/*/plugin 563run rm -rf $TOOLCHAIN_PATH/libexec/gcc/$ABI_CONFIGURE_TARGET/*/install-tools 564run rm -rf $TOOLCHAIN_PATH/lib/libiberty.a 565run rm -rf $TOOLCHAIN_PATH/$ABI_CONFIGURE_TARGET/lib/libiberty.a 566run rm -rf $TOOLCHAIN_PATH/$ABI_CONFIGURE_TARGET/lib/*/libiberty.a 567run rm -rf $TOOLCHAIN_PATH/$ABI_CONFIGURE_TARGET/lib/*/*/libiberty.a 568find $TOOLCHAIN_PATH -name "*.la" -exec rm -f {} \; 569# Remove host install in cross compilation 570if [ "$ABI_CONFIGURE_HOST" != "$ABI_CONFIGURE_TARGET" ]; then 571 run rm -rf "$TOOLCHAIN_PATH/$ABI_CONFIGURE_HOST" 572fi 573# remove sysroot 574run rm -rf "$TOOLCHAIN_PATH/sysroot" 575 576# Remove libstdc++ for now (will add it differently later) 577# We had to build it to get libsupc++ which we keep. 578run rm -rf $TOOLCHAIN_PATH/$ABI_CONFIGURE_TARGET/lib/libstdc++.* 579run rm -rf $TOOLCHAIN_PATH/$ABI_CONFIGURE_TARGET/lib/*/libstdc++.* 580run rm -rf $TOOLCHAIN_PATH/$ABI_CONFIGURE_TARGET/include/c++ 581 582# strip binaries to reduce final package size 583test -z "$STRIP" && STRIP=strip 584# because libpython is statically linked to GDB, it introduces symbols 585# that are only used by Python modules that must not be stripped. This 586# is not true of Windows which dynamically links to Python. 587if [ "$MINGW" = "yes" ] ; then 588 run $STRIP $TOOLCHAIN_PATH/bin/* 589else 590 find $TOOLCHAIN_PATH/bin -type f -not -name "*gdb" \ 591 | while read EXECUTABLE; do run $STRIP "$EXECUTABLE"; done 592fi 593run $STRIP $TOOLCHAIN_PATH/$ABI_CONFIGURE_TARGET/bin/* 594run $STRIP $TOOLCHAIN_PATH/libexec/gcc/*/*/cc1$HOST_EXE 595run $STRIP $TOOLCHAIN_PATH/libexec/gcc/*/*/cc1plus$HOST_EXE 596run $STRIP $TOOLCHAIN_PATH/libexec/gcc/*/*/collect2$HOST_EXE 597run $STRIP $TOOLCHAIN_PATH/libexec/gcc/*/*/lto*$HOST_EXE 598 599# Some of the files should really be links to save space. 600# This is mostly to reduce the size of the Windows zip archives, 601# since: 602# - The toolchain install script actually use hard-links 603# - Tar automatically detects hard links and will only store a 604# single copy of each file anyway. 605 606# $1: Source file (will be changed to a link) 607# $2: Destination (relative to source). 608do_relink () { 609 log "Relink: $1 --> $2" 610 local BASENAME DIRNAME 611 DIRNAME=$(dirname "$1") 612 BASENAME=$(basename "$1") 613 ( cd "$DIRNAME" && rm -f "$BASENAME" && ln -s "$2" "$BASENAME" ) 614 fail_panic "Can't relink $1 to $2" 615} 616 617# <config>/bin/<name> should point to ../../<config>-<name> 618LINK_FILES=$(cd $TOOLCHAIN_PATH/$ABI_CONFIGURE_TARGET/bin && ls * 2>/dev/null) 619for LINK_FILE in $LINK_FILES; do 620 do_relink $TOOLCHAIN_PATH/$ABI_CONFIGURE_TARGET/bin/$LINK_FILE ../../bin/$ABI_CONFIGURE_TARGET-$LINK_FILE 621done 622 623# $1: Source file prefix (e.g. 'c++') 624# $2: Destination file prefix (e.g. 'g++') 625# $3: Alternative file prefix if $2 doesn't exist (eg. ld.bfd) 626do_relink_bin () { 627 local DST_FILE=$2 628 if [ ! -f "$TOOLCHAIN_PATH/bin/$ABI_CONFIGURE_TARGET-$DST_FILE$HOST_EXE" ]; then 629 DST_FILE=$3 630 fi 631 if [ ! -f "$TOOLCHAIN_PATH/bin/$ABI_CONFIGURE_TARGET-$DST_FILE$HOST_EXE" ]; then 632 echo "ERROR: Can't relink $1 to $DST_FILE because $DST_FILE doesn't exist" 633 exit 1 634 fi 635 do_relink \ 636 $TOOLCHAIN_PATH/bin/$ABI_CONFIGURE_TARGET-$1$HOST_EXE \ 637 $ABI_CONFIGURE_TARGET-$DST_FILE$HOST_EXE 638} 639 640do_relink_bin c++ g++ 641do_relink_bin gcc-$GCC_VERSION gcc 642# symlink ld to either ld.gold or ld.bfd 643do_relink_bin ld ld.gold ld.bfd 644 645# copy SOURCES file if present 646if [ -f "$SRC_DIR/SOURCES" ]; then 647 cp "$SRC_DIR/SOURCES" "$TOOLCHAIN_PATH/SOURCES" 648fi 649 650if [ "$PACKAGE_DIR" ]; then 651 ARCHIVE="$TOOLCHAIN-$HOST_TAG.tar.bz2" 652 SUBDIR=$(get_toolchain_install_subdir $TOOLCHAIN $HOST_TAG) 653 dump "Packaging $ARCHIVE" 654 # exlude ld.mcld 655 EXCLUSIONS= 656 if [ -f $SUBDIR/bin/$ABI_CONFIGURE_TARGET-ld.mcld${HOST_EXE} ] ; then 657 EXCLUSIONS=$EXCLUSIONS" --exclude=$SUBDIR/bin/$ABI_CONFIGURE_TARGET-ld.mcld${HOST_EXE}" 658 fi 659 if [ -f $SUBDIR/$ABI_CONFIGURE_TARGET/bin/ld.mcld${HOST_EXE} ] ; then 660 EXCLUSIONS=$EXCLUSIONS" --exclude=$SUBDIR/$ABI_CONFIGURE_TARGET/bin/ld.mcld${HOST_EXE}" 661 fi 662 pack_archive "$PACKAGE_DIR/$ARCHIVE" "$NDK_DIR" "$SUBDIR" $EXCLUSIONS 663 # package libgccunwind.a 664 if [ "$HOST_OS" = "linux" -a "$GCC_VERSION" = "$DEFAULT_GCC_VERSION" ]; then 665 ABIS=$(commas_to_spaces $(convert_archs_to_abis $ARCH)) 666 for ABI in $ABIS; do 667 FILES="$GCCUNWIND_SUBDIR/libs/$ABI/libgccunwind.a" 668 PACKAGE="$PACKAGE_DIR/libgccunwind-libs-$ABI.tar.bz2" 669 log "Packaging: $PACKAGE" 670 pack_archive "$PACKAGE" "$NDK_DIR" "$FILES" 671 fail_panic "Could not package $ABI libgccunwind binaries!" 672 dump "Packaging: $PACKAGE" 673 done 674 fi 675fi 676 677dump "Done." 678if [ -z "$OPTION_BUILD_OUT" ] ; then 679 rm -rf $BUILD_OUT 680fi 681