Home | History | Annotate | Download | only in tools
      1 #!/bin/sh
      2 #
      3 # Copyright (C) 2011 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 # Rebuild all host toolchains and programs
     18 #
     19 
     20 PROGDIR=$(dirname $0)
     21 . $PROGDIR/prebuilt-common.sh
     22 
     23 NDK_DIR=$ANDROID_NDK_ROOT
     24 register_var_option "--ndk-dir=<path>" NDK_DIR "NDK installation directory"
     25 
     26 SYSTEMS=$HOST_TAG
     27 # Replace x86_64 by x86 at the end of SYSTEMS since we will produce
     28 # 32-bit toolchains by default, i.e. unless you use the --try-64 flag
     29 if [ "${SYSTEMS%%x86_64}" != "$SYSTEMS" ]; then
     30     SYSTEMS=${SYSTEMS%%x86_64}x86
     31 fi
     32 # If we are on Linux, we are able to generate the Windows binaries
     33 # with the mingw32 cross-toolchain.
     34 if [ "$SYSTEMS" = "linux-x86" ]; then
     35     SYSTEMS=$SYSTEMS",windows"
     36     # If darwin toolchain exist, build darwin too
     37     if [ -f "${DARWIN_TOOLCHAIN}-gcc" ]; then
     38         SYSTEMS=$SYSTEMS",darwin-x86"
     39     fi
     40 fi
     41 CUSTOM_SYSTEMS=
     42 register_option "--systems=<names>" do_SYSTEMS "List of host systems to build for"
     43 do_SYSTEMS () { CUSTOM_SYSTEMS=true; SYSTEMS=$1; }
     44 
     45 ARCHS=$DEFAULT_ARCHS
     46 register_var_option "--arch=<list>" ARCHS "List of target archs to build for"
     47 
     48 PACKAGE_DIR=
     49 register_var_option "--package-dir=<path>" PACKAGE_DIR "Package toolchain into this directory"
     50 
     51 DARWIN_SSH=
     52 register_var_option "--darwin-ssh=<hostname>" DARWIN_SSH "Generate darwin packages on remote host"
     53 
     54 NO_GEN_PLATFORMS=
     55 register_var_option "--no-gen-platforms" NO_GEN_PLATFORMS "Don't generate platforms/ directory, use existing one"
     56 
     57 LLVM_VERSION_LIST=$DEFAULT_LLVM_VERSION_LIST
     58 register_var_option "--llvm-version-list=<vers>" LLVM_VERSION_LIST "List of LLVM release versions"
     59 
     60 CHECK_FLAG=
     61 do_check_option () { CHECK_FLAG="--check"; }
     62 register_option "--check" do_check_option "Check host prebuilts"
     63 
     64 register_try64_option
     65 
     66 PROGRAM_PARAMETERS="<toolchain-src-dir>"
     67 PROGRAM_DESCRIPTION=\
     68 "This script can be used to rebuild all the host NDK toolchains at once.
     69 You need to give it the path to the toolchain source directory, as
     70 downloaded by the 'download-toolchain-sources.sh' dev-script."
     71 
     72 extract_parameters "$@"
     73 
     74 # Check toolchain source path
     75 SRC_DIR="$PARAMETERS"
     76 if [ -z "$SRC_DIR" ]; then
     77     echo "ERROR: Please provide the path to the toolchain source tree. See --help"
     78     exit 1
     79 fi
     80 
     81 if [ ! -d "$SRC_DIR" ]; then
     82     echo "ERROR: Not a directory: '$SRC_DIR'"
     83     exit 1
     84 fi
     85 
     86 if [ ! -f "$SRC_DIR/build/configure" -o ! -d "$SRC_DIR/gcc/gcc-$DEFAULT_GCC_VERSION" ]; then
     87     echo "ERROR: The file $SRC_DIR/build/configure or"
     88     echo "       the directory $SRC_DIR/gcc/gcc-$DEFAULT_GCC_VERSION does not exist"
     89     echo "This is not the top of a toolchain tree: $SRC_DIR"
     90     echo "You must give the path to a copy of the toolchain source directories"
     91     echo "created by 'download-toolchain-sources.sh."
     92     exit 1
     93 fi
     94 
     95 # Now we can do the build
     96 BUILDTOOLS=$ANDROID_NDK_ROOT/build/tools
     97 
     98 if [ -z "$NO_GEN_PLATFORMS" ]; then
     99     echo "Preparing the build..."
    100     run $BUILDTOOLS/gen-platforms.sh --minimal --dst-dir=$NDK_DIR --ndk-dir=$NDK_DIR --arch=$(spaces_to_commas $ARCHS)
    101     fail_panic "Could not generate minimal sysroot!"
    102 else
    103     if [ ! -d "$NDK_DIR/platforms" ]; then
    104         echo "ERROR: --no-gen-platforms used but directory missing: $NDK_DIR/platforms"
    105         exit 1
    106     fi
    107 fi
    108 
    109 SYSTEMS=$(commas_to_spaces $SYSTEMS)
    110 ARCHS=$(commas_to_spaces $ARCHS)
    111 LLVM_VERSION_LIST=$(commas_to_spaces $LLVM_VERSION_LIST)
    112 
    113 if [ "$DARWIN_SSH" -a -z "$CUSTOM_SYSTEMS" ]; then
    114     SYSTEMS=" darwin-x86"
    115 fi
    116 
    117 FLAGS=
    118 if [ "$VERBOSE" = "yes" ]; then
    119     FLAGS=$FLAGS" --verbose"
    120 fi
    121 if [ "$VERBOSE2" = "yes" ]; then
    122     FLAGS=$FLAGS" --verbose"
    123 fi
    124 if [ "$TRY64" = "yes" ]; then
    125     FLAGS=$FLAGS" --try-64"
    126 else
    127     force_32bit_binaries
    128 fi
    129 if [ "$PACKAGE_DIR" ]; then
    130     mkdir -p "$PACKAGE_DIR"
    131     fail_panic "Could not create package directory: $PACKAGE_DIR"
    132     FLAGS=$FLAGS" --package-dir=$PACKAGE_DIR"
    133 fi
    134 
    135 do_remote_host_build ()
    136 {
    137     local SYSTEM="$1"
    138     local ARCH="$2"
    139     local REMOTE_HOST="$3"
    140 
    141     # 1/ Copy the NDK toolchain build scripts
    142     # 2/ Copy the toolchain sources/package
    143     # 3/ Ssh to unpack the build scripts, and run them
    144     # 4/ Copy back the generated prebuilt binaries
    145     #
    146     dump "Preparing remote build on $REMOTE_HOST..."
    147 
    148     # First try to create a remote temp directory on the remote host
    149     # Do it first so we can fail fast, not after spending time preparing
    150     # large tarballs.
    151     dump "Creating remote temp directory"
    152     TMPREMOTE=/tmp/ndk-$USER/darwin-prebuild
    153     run ssh $REMOTE_HOST "mkdir -p $TMPREMOTE && rm -rf $TMPREMOTE/*"
    154     fail_panic "Could not create temporary build directory on $REMOTE_HOST"
    155 
    156     # Now, package all the stuff we're going to send in a temporary
    157     # directory here on the machine, except toolchain sources
    158     TMPDARWIN=$NDK_TMPDIR/darwin  # Where we're going to package stuff
    159     log "Using temporary work directory: $TMPDARWIN"
    160     mkdir -p "$TMPDARWIN"
    161     dump "Prepare NDK build scripts"
    162     copy_directory "$ANDROID_NDK_ROOT/build" "$TMPDARWIN/ndk/build"
    163     copy_file_list "$ANDROID_NDK_ROOT" "$TMPDARWIN/ndk" sources/android/libthread_db
    164     copy_file_list "$ANDROID_NDK_ROOT" "$TMPDARWIN/ndk" "$STLPORT_SUBDIR"
    165     copy_file_list "$ANDROID_NDK_ROOT" "$TMPDARWIN/ndk" "$GABIXX_SUBDIR"
    166     copy_file_list "$ANDROID_NDK_ROOT" "$TMPDARWIN/ndk" sources/host-tools
    167     dump "Prepare platforms files"
    168     copy_directory "$NDK_DIR/platforms" "$TMPDARWIN/ndk/platforms"
    169     dump "Copying NDK build scripts and platform files to remote..."
    170     (cd "$TMPDARWIN" && tar czf - ndk) | (ssh $REMOTE_HOST tar xzf - -C $TMPREMOTE)
    171     fail_panic "Could not copy!"
    172     rm -rf $TMPDARWIN
    173 
    174     # Copy the toolchain sources
    175     dump "Copy toolchain sources to remote"
    176     ssh $REMOTE_HOST mkdir -p $TMPREMOTE/toolchain &&
    177     (cd "$SRC_DIR" && tar czf - .) | (ssh $REMOTE_HOST tar xzf - -C $TMPREMOTE/toolchain)
    178     fail_panic "Could not copy toolchain!"
    179 
    180     # Time to run the show :-)
    181     for ARCH in $(commas_to_spaces $ARCHS); do
    182         dump "Running remote $ARCH toolchain build..."
    183         SYSROOT=$TMPREMOTE/ndk/platforms/android-$(get_default_api_level_for_arch $ARCH)/arch-$ARCH
    184         run ssh $REMOTE_HOST "$TMPREMOTE/ndk/build/tools/build-host-prebuilts.sh $TMPREMOTE/toolchain --package-dir=$TMPREMOTE/packages --arch=$ARCH --ndk-dir=$TMPREMOTE/ndk --no-gen-platforms"
    185         fail_panic "Could not build prebuilt $ARCH toolchain on Darwin!"
    186     done
    187     # Get the results
    188     dump "Copying back Darwin prebuilt packages..."
    189     mkdir -p $TMPDARWIN/packages && rm -rf $TMPDARWIN/packages/*
    190     run scp $REMOTE_HOST:$TMPREMOTE/packages/*-darwin-* $TMPDARWIN/packages
    191     fail_panic "Could not grab Darwin packages!"
    192 
    193     for PACK in $TMPDARWIN/packages/*; do
    194         if [ "$PACKAGE_DIR" ]; then
    195             echo "Copying $(basename $PACK) to $PACKAGE_DIR..."
    196             cp $PACK $PACKAGE_DIR/
    197         else
    198             echo "Unpacking $(basename $PACK) into $NDK_DIR..."
    199             unpack_archive $PACK $NDK_DIR
    200         fi
    201         fail_panic ""
    202     done
    203 
    204     dump "Cleaning up remote machine..."
    205     run ssh $REMOTE_HOST rm -rf $TMPREMOTE
    206 }
    207 
    208 for SYSTEM in $SYSTEMS; do
    209 
    210     # Add --mingw/--darwin flag
    211     TOOLCHAIN_FLAGS=$FLAGS
    212     CANADIAN_BUILD=no
    213     if [ "$HOST_TAG32" = "linux-x86" ]; then
    214         case "$SYSTEM" in
    215             windows)
    216                 TOOLCHAIN_FLAGS=$TOOLCHAIN_FLAGS" --mingw"
    217                 CANADIAN_BUILD=yes
    218                 ;;
    219             darwin-x86)
    220                 TOOLCHAIN_FLAGS=$TOOLCHAIN_FLAGS" --darwin"
    221                 CANADIAN_BUILD=yes
    222                 ;;
    223         esac
    224     fi
    225 
    226     # Should we do a remote build?
    227     if [ "$SYSTEM" != "$HOST_TAG32" -a "$CANADIAN_BUILD" != "yes" ]; then
    228         case $SYSTEM in
    229             darwin-*)
    230                 if [ "$DARWIN_SSH" ]; then
    231                     do_remote_host_build "$SYSTEM" "$ARCH" "$DARWIN_SSH"
    232                 else
    233                     echo "WARNING: Can't build $SYSTEM binaries on this system!"
    234                     echo "Consider using the --darwin-ssh option."
    235                 fi
    236                 continue
    237         esac
    238     fi
    239 
    240     # Determin the display system name
    241     SYSNAME=$SYSTEM
    242     if [ "$TRY64" = "yes" ]; then
    243         case $SYSTEM in
    244             darwin-x86|linux-x86)
    245                 SYSNAME=${SYSTEM%%x86}x86_64
    246                 ;;
    247             windows)
    248                 SYSNAME=windows-x86_64
    249                 ;;
    250         esac
    251     fi
    252 
    253     # First, ndk-stack
    254     if [ "$TRY64" != "yes" ]; then
    255         # Don't build ndk-stack in 64-bit because unlike other host toolchains
    256         # ndk-stack doesn't have separate directories for 32-bit and 64-bit.
    257         # 64-bit one will overwrite the 32-bit one
    258         echo "Building $SYSNAME ndk-stack"
    259         run $BUILDTOOLS/build-ndk-stack.sh $TOOLCHAIN_FLAGS
    260         fail_panic "ndk-stack build failure!"
    261     fi
    262     echo "Building $SYSNAME ndk-make"
    263     run $BUILDTOOLS/build-host-make.sh $TOOLCHAIN_FLAGS
    264     fail_panic "make build failure!"
    265 
    266     echo "Building $SYSNAME ndk-awk"
    267     run $BUILDTOOLS/build-host-awk.sh $TOOLCHAIN_FLAGS
    268     fail_panic "awk build failure!"
    269 
    270     echo "Building $SYSNAME ndk-sed"
    271     run $BUILDTOOLS/build-host-sed.sh $TOOLCHAIN_FLAGS
    272     fail_panic "sed build failure!"
    273 
    274     # ToDo: perl in windows
    275     if [ "$SYSTEM" != "windows" ]; then
    276         echo "Building $SYSNAME ndk-perl"
    277         run $BUILDTOOLS/build-host-perl.sh $TOOLCHAIN_FLAGS "$SRC_DIR"
    278         fail_panic "perl build failure!"
    279     fi
    280 
    281     if [ "$SYSTEM" = "windows" ]; then
    282         echo "Building $SYSNAME toolbox"
    283         run $BUILDTOOLS/build-host-toolbox.sh $FLAGS
    284         fail_panic "Windows toolbox build failure!"
    285     fi
    286 
    287     # Then the toolchains
    288     for ARCH in $ARCHS; do
    289         TOOLCHAIN_NAMES=$(get_toolchain_name_list_for_arch $ARCH)
    290         if [ -z "$TOOLCHAIN_NAMES" ]; then
    291             echo "ERROR: Invalid architecture name: $ARCH"
    292             exit 1
    293         fi
    294 
    295         for TOOLCHAIN_NAME in $TOOLCHAIN_NAMES; do
    296             echo "Building $SYSNAME toolchain for $ARCH architecture: $TOOLCHAIN_NAME"
    297             run $BUILDTOOLS/build-gcc.sh "$SRC_DIR" "$NDK_DIR" $TOOLCHAIN_NAME $TOOLCHAIN_FLAGS
    298             fail_panic "Could not build $TOOLCHAIN_NAME-$SYSNAME!"
    299         done
    300     done
    301 
    302     # Build llvm and clang
    303     POLLY_FLAGS=
    304     if [ "$TRY64" != "yes" -a "$SYSTEM" != "windows" ]; then
    305         POLLY_FLAGS="--with-polly"
    306     fi
    307     for LLVM_VERSION in $LLVM_VERSION_LIST; do
    308         echo "Building $SYSNAME clang/llvm-$LLVM_VERSION"
    309         run $BUILDTOOLS/build-llvm.sh "$SRC_DIR" "$NDK_DIR" "llvm-$LLVM_VERSION" $TOOLCHAIN_FLAGS $POLLY_FLAGS $CHECK_FLAG
    310         fail_panic "Could not build llvm for $SYSNAME"
    311     done
    312 
    313     # Deploy ld.mcld
    314     $PROGDIR/deploy-host-mcld.sh --package-dir=$PACKAGE_DIR --systems=$SYSNAME
    315     fail_panic "Could not deploy ld.mcld for $SYSNAME"
    316 
    317     # We're done for this system
    318 done
    319 
    320 # Build tools common to all system
    321 run $BUILDTOOLS/build-analyzer.sh "$SRC_DIR" "$NDK_DIR" "llvm-$DEFAULT_LLVM_VERSION" --package-dir="$PACKAGE_DIR"
    322 
    323 if [ "$PACKAGE_DIR" ]; then
    324     echo "Done, please look at $PACKAGE_DIR"
    325 else
    326     echo "Done"
    327 fi
    328 
    329 exit 0
    330