Home | History | Annotate | Download | only in distrib
      1 #!/bin/sh
      2 #
      3 # A small script used to rebuild the Android goldfish kernel image
      4 # See docs/KERNEL.TXT for usage instructions.
      5 #
      6 MACHINE=goldfish
      7 VARIANT=goldfish
      8 OUTPUT=/tmp/kernel-qemu
      9 CROSSPREFIX=arm-linux-androideabi-
     10 CONFIG=goldfish
     11 
     12 # Determine the host architecture, and which default prebuilt tag we need.
     13 # For the toolchain auto-detection.
     14 #
     15 HOST_OS=`uname -s`
     16 case "$HOST_OS" in
     17     Darwin)
     18         HOST_OS=darwin
     19         HOST_TAG=darwin-x86
     20         BUILD_NUM_CPUS=$(sysctl -n hw.ncpu)
     21         ;;
     22     Linux)
     23         # note that building  32-bit binaries on x86_64 is handled later
     24         HOST_OS=linux
     25         HOST_TAG=linux-x86
     26         BUILD_NUM_CPUS=$(grep -c processor /proc/cpuinfo)
     27         ;;
     28     *)
     29         echo "ERROR: Unsupported OS: $HOST_OS"
     30         exit 1
     31 esac
     32 
     33 # Default number of parallel jobs during the build: cores * 2
     34 JOBS=$(( $BUILD_NUM_CPUS * 2 ))
     35 
     36 ARCH=arm
     37 
     38 OPTION_HELP=no
     39 OPTION_ARMV7=no
     40 OPTION_OUT=
     41 OPTION_CROSS=
     42 OPTION_ARCH=
     43 OPTION_CONFIG=
     44 OPTION_JOBS=
     45 
     46 for opt do
     47     optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
     48     case $opt in
     49     --help|-h|-\?) OPTION_HELP=yes
     50         ;;
     51     --armv7)
     52         OPTION_ARMV7=yes
     53         ;;
     54     --out=*)
     55         OPTION_OUT=$optarg
     56         ;;
     57     --cross=*)
     58         OPTION_CROSS=$optarg
     59         ;;
     60     --arch=*)
     61         OPTION_ARCH=$optarg
     62         ;;
     63     --config=*)
     64         OPTION_CONFIG=$optarg
     65         ;;
     66     -j*)
     67         OPTION_JOBS=$optarg
     68         ;;
     69     *)
     70         echo "unknown option '$opt', use --help"
     71         exit 1
     72     esac
     73 done
     74 
     75 if [ $OPTION_HELP = "yes" ] ; then
     76     echo "Rebuild the prebuilt kernel binary for Android's emulator."
     77     echo ""
     78     echo "options (defaults are within brackets):"
     79     echo ""
     80     echo "  --help                   print this message"
     81     echo "  --arch=<arch>            change target architecture [$ARCH]"
     82     echo "  --armv7                  build ARMv7 binaries (see note below)"
     83     echo "  --out=<directory>        output directory [$OUTPUT]"
     84     echo "  --cross=<prefix>         cross-toolchain prefix [$CROSSPREFIX]"
     85     echo "  --config=<name>          kernel config name [$CONFIG]"
     86     echo "  -j<number>               launch <number> parallel build jobs [$JOBS]"
     87     echo ""
     88     echo "NOTE: --armv7 is equivalent to --config=goldfish_armv7. It is"
     89     echo "      ignored if --config=<name> is used."
     90     echo ""
     91     exit 0
     92 fi
     93 
     94 if [ -n "$OPTION_ARCH" ]; then
     95     ARCH=$OPTION_ARCH
     96 fi
     97 
     98 if [ -n "$OPTION_CONFIG" ]; then
     99     CONFIG=$OPTION_CONFIG
    100 else
    101     if [ "$OPTION_ARMV7" = "yes" ]; then
    102         CONFIG=goldfish_armv7
    103     fi
    104     echo "Auto-config: --config=$CONFIG"
    105 fi
    106 
    107 # Check that we are in the kernel directory
    108 if [ ! -d arch/$ARCH/mach-$MACHINE ] ; then
    109     echo "Cannot find arch/$ARCH/mach-$MACHINE. Please cd to the kernel source directory."
    110     echo "Aborting."
    111     #exit 1
    112 fi
    113 
    114 # Check output directory.
    115 if [ -n "$OPTION_OUT" ] ; then
    116     if [ ! -d "$OPTION_OUT" ] ; then
    117         echo "Output directory '$OPTION_OUT' does not exist ! Aborting."
    118         exit 1
    119     fi
    120     OUTPUT=$OPTION_OUT
    121 else
    122     mkdir -p $OUTPUT
    123 fi
    124 
    125 if [ -n "$OPTION_CROSS" ] ; then
    126     CROSSPREFIX="$OPTION_CROSS"
    127 else
    128     case $ARCH in
    129         arm)
    130             CROSSTOOLCHAIN=arm-linux-androideabi-4.6
    131             CROSSPREFIX=arm-linux-androideabi-
    132             ;;
    133         x86)
    134             CROSSTOOLCHAIN=i686-linux-android-4.6
    135             CROSSPREFIX=i686-linux-android-
    136             ;;
    137         mips)
    138             CROSSTOOLCHAIN=mipsel-linux-android-4.6
    139             CROSSPREFIX=mipsel-linux-android-
    140             ;;
    141         *)
    142             echo "ERROR: Unsupported architecture!"
    143             exit 1
    144             ;;
    145     esac
    146     echo "Auto-config: --cross=$CROSSPREFIX"
    147 fi
    148 
    149 ZIMAGE=zImage
    150 
    151 case $ARCH in
    152     x86)
    153         ZIMAGE=bzImage
    154         ;;
    155     mips)
    156         ZIMAGE=
    157         ;;
    158 esac
    159 
    160 # If the cross-compiler is not in the path, try to find it automatically
    161 CROSS_COMPILER="${CROSSPREFIX}gcc"
    162 CROSS_COMPILER_VERSION=$($CROSS_COMPILER --version 2>/dev/null)
    163 if [ $? != 0 ] ; then
    164     BUILD_TOP=$ANDROID_BUILD_TOP
    165     if [ -z "$BUILD_TOP" ]; then
    166         # Assume this script is under external/qemu/distrib/ in the
    167         # Android source tree.
    168         BUILD_TOP=$(dirname $0)/../../..
    169         if [ ! -d "$BUILD_TOP/prebuilts" ]; then
    170             BUILD_TOP=
    171         else
    172             BUILD_TOP=$(cd $BUILD_TOP && pwd)
    173         fi
    174     fi
    175     CROSSPREFIX=$BUILD_TOP/prebuilts/gcc/$HOST_TAG/$ARCH/$CROSSTOOLCHAIN/bin/$CROSSPREFIX
    176     if [ "$BUILD_TOP" -a -f ${CROSSPREFIX}gcc ]; then
    177         echo "Auto-config: --cross=$CROSSPREFIX"
    178     else
    179         echo "It looks like $CROSS_COMPILER is not in your path ! Aborting."
    180         exit 1
    181     fi
    182 fi
    183 
    184 export CROSS_COMPILE="$CROSSPREFIX" ARCH SUBARCH=$ARCH
    185 
    186 if [ "$OPTION_JOBS" ]; then
    187     JOBS=$OPTION_JOBS
    188 else
    189     echo "Auto-config: -j$JOBS"
    190 fi
    191 
    192 
    193 # Special magic redirection with our magic toolbox script
    194 # This is needed to add extra compiler flags to compiler.
    195 # See kernel-toolchain/android-kernel-toolchain-* for details
    196 #
    197 export REAL_CROSS_COMPILE="$CROSS_COMPILE"
    198 CROSS_COMPILE=$(dirname "$0")/kernel-toolchain/android-kernel-toolchain-
    199 
    200 # Do the build
    201 #
    202 rm -f include/asm &&
    203 make ${CONFIG}_defconfig &&    # configure the kernel
    204 make -j$JOBS                   # build it
    205 
    206 if [ $? != 0 ] ; then
    207     echo "Could not build the kernel. Aborting !"
    208     exit 1
    209 fi
    210 
    211 # Note: The exact names of the output files are important for the Android build,
    212 #       do not change the definitions lightly.
    213 case $CONFIG in
    214     vbox*)
    215         OUTPUT_KERNEL=kernel-vbox
    216         OUTPUT_VMLINUX=vmlinux-vbox
    217         ;;
    218     goldfish)
    219         OUTPUT_KERNEL=kernel-qemu
    220         OUTPUT_VMLINUX=vmlinux-qemu
    221         ;;
    222     goldfish_armv7)
    223         OUTPUT_KERNEL=kernel-qemu-armv7
    224         OUTPUT_VMLINUX=vmlinux-qemu-armv7
    225         ;;
    226     *)
    227         OUTPUT_KERNEL=kernel-$CONFIG
    228         OUTPUT_VMLINUX=vmlinux-$CONFIG
    229 esac
    230 
    231 cp -f vmlinux $OUTPUT/$OUTPUT_VMLINUX
    232 if [ ! -z $ZIMAGE ]; then
    233     cp -f arch/$ARCH/boot/$ZIMAGE $OUTPUT/$OUTPUT_KERNEL
    234 else
    235     cp -f vmlinux $OUTPUT/$OUTPUT_KERNEL
    236 fi
    237 echo "Kernel $CONFIG prebuilt images ($OUTPUT_KERNEL and $OUTPUT_VMLINUX) copied to $OUTPUT successfully !"
    238 
    239 exit 0
    240