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