build-kernel.sh revision 6f0425a8f6d386d7ca10e69ad90cbd5d5c5228a9
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# 6MACHINE=goldfish 7VARIANT=goldfish 8OUTPUT=/tmp/kernel-qemu 9CROSSPREFIX=arm-eabi- 10CONFIG=goldfish 11 12# Determine the host architecture, and which default prebuilt tag we need. 13# For the toolchain auto-detection. 14# 15HOST_OS=`uname -s` 16case "$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 31esac 32 33# Default number of parallel jobs during the build: cores * 2 34JOBS=$(( $BUILD_NUM_CPUS * 2 )) 35 36ARCH=arm 37 38OPTION_HELP=no 39OPTION_ARMV7=no 40OPTION_OUT= 41OPTION_CROSS= 42OPTION_ARCH= 43OPTION_CONFIG= 44OPTION_JOBS= 45 46for 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 73done 74 75if [ $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 92fi 93 94if [ -n "$OPTION_ARCH" ]; then 95 ARCH=$OPTION_ARCH 96fi 97 98if [ -n "$OPTION_CONFIG" ]; then 99 CONFIG=$OPTION_CONFIG 100else 101 if [ "$OPTION_ARMV7" = "yes" ]; then 102 CONFIG=goldfish_armv7 103 fi 104 echo "Auto-config: --config=$CONFIG" 105fi 106 107# Check that we are in the kernel directory 108if [ ! -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 112fi 113 114# Check output directory. 115if [ -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 121else 122 mkdir -p $OUTPUT 123fi 124 125if [ -n "$OPTION_CROSS" ] ; then 126 CROSSPREFIX="$OPTION_CROSS" 127else 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" 143fi 144 145ZIMAGE=zImage 146 147case $ARCH in 148 x86) 149 ZIMAGE=bzImage 150 ;; 151esac 152 153# If the cross-compiler is not in the path, try to find it automatically 154CROSS_COMPILER="${CROSSPREFIX}gcc" 155CROSS_COMPILER_VERSION=$($CROSS_COMPILER --version 2>/dev/null) 156if [ $? != 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 175fi 176 177export CROSS_COMPILE="$CROSSPREFIX" ARCH SUBARCH=$ARCH 178 179if [ "$OPTION_JOBS" ]; then 180 JOBS=$OPTION_JOBS 181else 182 echo "Auto-config: -j$JOBS" 183fi 184 185# Do the build 186# 187rm -f include/asm && 188make ${CONFIG}_defconfig && # configure the kernel 189make -j$JOBS # build it 190 191if [ $? != 0 ] ; then 192 echo "Could not build the kernel. Aborting !" 193 exit 1 194fi 195 196# Note: The exact names of the output files are important for the Android build, 197# do not change the definitions lightly. 198case $CONFIG in 199 vbox*) 200 OUTPUT_KERNEL=kernel-vbox 201 OUTPUT_VMLINUX=vmlinux-vbox 202 ;; 203 goldfish) 204 OUTPUT_KERNEL=kernel-qemu 205 OUTPUT_VMLINUX=vmlinux-qemu 206 ;; 207 goldfish_armv7) 208 OUTPUT_KERNEL=kernel-qemu-armv7 209 OUTPUT_VMLINUX=vmlinux-qemu-armv7 210 ;; 211 *) 212 OUTPUT_KERNEL=kernel-$CONFIG 213 OUTPUT_VMLINUX=vmlinux-$CONFIG 214esac 215 216cp -f arch/$ARCH/boot/$ZIMAGE $OUTPUT/$OUTPUT_KERNEL 217cp -f vmlinux $OUTPUT/$OUTPUT_VMLINUX 218 219echo "Kernel $CONFIG prebuilt images ($OUTPUT_KERNEL and $OUTPUT_VMLINUX) copied to $OUTPUT successfully !" 220exit 0 221