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-eabi-
     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-eabi-4.4.3
    131             CROSSPREFIX=arm-eabi-
    132             ;;
    133         x86)
    134             CROSSTOOLCHAIN=i686-android-linux-4.4.3
    135             CROSSPREFIX=i686-android-linux-
    136             ;;
    137         *)
    138             echo "ERROR: Unsupported architecture!"
    139             exit 1
    140             ;;
    141     esac
    142     echo "Auto-config: --cross=$CROSSPREFIX"
    143 fi
    144 
    145 ZIMAGE=zImage
    146 
    147 case $ARCH in
    148     x86)
    149         ZIMAGE=bzImage
    150         ;;
    151 esac
    152 
    153 # If the cross-compiler is not in the path, try to find it automatically
    154 CROSS_COMPILER="${CROSSPREFIX}gcc"
    155 CROSS_COMPILER_VERSION=$($CROSS_COMPILER --version 2>/dev/null)
    156 if [ $? != 0 ] ; then
    157     BUILD_TOP=$ANDROID_BUILD_TOP
    158     if [ -z "$BUILD_TOP" ]; then
    159         # Assume this script is under external/qemu/distrib/ in the
    160         # Android source tree.
    161         BUILD_TOP=$(dirname $0)/../../..
    162         if [ ! -d "$BUILD_TOP/prebuilt" ]; then
    163             BUILD_TOP=
    164         else
    165             BUILD_TOP=$(cd $BUILD_TOP && pwd)
    166         fi
    167     fi
    168     CROSSPREFIX=$BUILD_TOP/prebuilt/$HOST_TAG/toolchain/$CROSSTOOLCHAIN/bin/$CROSSPREFIX
    169     if [ "$BUILD_TOP" -a -f ${CROSSPREFIX}gcc ]; then
    170         echo "Auto-config: --cross=$CROSSPREFIX"
    171     else
    172         echo "It looks like $CROSS_COMPILER is not in your path ! Aborting."
    173         exit 1
    174     fi
    175 fi
    176 
    177 export CROSS_COMPILE="$CROSSPREFIX" ARCH SUBARCH=$ARCH
    178 
    179 if [ "$OPTION_JOBS" ]; then
    180     JOBS=$OPTION_JOBS
    181 else
    182     echo "Auto-config: -j$JOBS"
    183 fi
    184 
    185 
    186 # Special magic redirection with our magic toolbox script
    187 # This is needed to add extra compiler flags for x86
    188 #
    189 # We could use that for ARM, but don't need to at the moment.
    190 #
    191 if [ "$ARCH" = "x86" ]; then
    192     export REAL_CROSS_COMPILE="$CROSS_COMPILE"
    193     export ARCH
    194     CROSS_COMPILE=$(dirname "$0")/kernel-toolchain/android-kernel-toolchain-
    195 fi
    196 
    197 # Do the build
    198 #
    199 rm -f include/asm &&
    200 make ${CONFIG}_defconfig &&    # configure the kernel
    201 make -j$JOBS                   # build it
    202 
    203 if [ $? != 0 ] ; then
    204     echo "Could not build the kernel. Aborting !"
    205     exit 1
    206 fi
    207 
    208 # Note: The exact names of the output files are important for the Android build,
    209 #       do not change the definitions lightly.
    210 case $CONFIG in
    211     vbox*)
    212         OUTPUT_KERNEL=kernel-vbox
    213         OUTPUT_VMLINUX=vmlinux-vbox
    214         ;;
    215     goldfish)
    216         OUTPUT_KERNEL=kernel-qemu
    217         OUTPUT_VMLINUX=vmlinux-qemu
    218         ;;
    219     goldfish_armv7)
    220         OUTPUT_KERNEL=kernel-qemu-armv7
    221         OUTPUT_VMLINUX=vmlinux-qemu-armv7
    222         ;;
    223     *)
    224         OUTPUT_KERNEL=kernel-$CONFIG
    225         OUTPUT_VMLINUX=vmlinux-$CONFIG
    226 esac
    227 
    228 cp -f arch/$ARCH/boot/$ZIMAGE $OUTPUT/$OUTPUT_KERNEL
    229 cp -f vmlinux $OUTPUT/$OUTPUT_VMLINUX
    230 
    231 echo "Kernel $CONFIG prebuilt images ($OUTPUT_KERNEL and $OUTPUT_VMLINUX) copied to $OUTPUT successfully !"
    232 exit 0
    233