blob: 3d50e9ad799c12135ecee201044ad9cb2f2ce61b [file] [log] [blame]
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +01001#!/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
Andrew Hsieh9ada5ea2012-05-30 16:09:29 +08009CROSSPREFIX=arm-linux-androideabi-
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +010010CONFIG=goldfish
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +010011GCC_VERSION=4.7
12
13VALID_ARCHS="arm x86 x86_64 mips"
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +010014
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +010015# Determine the host architecture, and which default prebuilt tag we need.
16# For the toolchain auto-detection.
17#
18HOST_OS=`uname -s`
19case "$HOST_OS" in
20 Darwin)
21 HOST_OS=darwin
22 HOST_TAG=darwin-x86
23 BUILD_NUM_CPUS=$(sysctl -n hw.ncpu)
24 ;;
25 Linux)
26 # note that building 32-bit binaries on x86_64 is handled later
27 HOST_OS=linux
28 HOST_TAG=linux-x86
29 BUILD_NUM_CPUS=$(grep -c processor /proc/cpuinfo)
30 ;;
31 *)
32 echo "ERROR: Unsupported OS: $HOST_OS"
33 exit 1
34esac
35
36# Default number of parallel jobs during the build: cores * 2
37JOBS=$(( $BUILD_NUM_CPUS * 2 ))
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +010038
39ARCH=arm
40
41OPTION_HELP=no
Young-Ho Cha63e03bb2013-04-04 15:10:30 +090042OPTION_ARMV7=yes
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +010043OPTION_OUT=
44OPTION_CROSS=
45OPTION_ARCH=
46OPTION_CONFIG=
Young-Ho Cha86210482013-04-04 15:54:34 +090047OPTION_SAVEDEFCONFIG=no
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +010048OPTION_JOBS=
David 'Digit' Turnerebba0e72013-01-15 11:50:00 +010049OPTION_VERBOSE=
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +010050OPTION_GCC_VERSION=
Young-Ho Cha2905b202013-04-04 15:01:44 +090051CCACHE=
52
53case "$USE_CCACHE" in
54 "")
55 CCACHE=
56 ;;
57 *)
58 # use ccache bundled in AOSP source tree
59 CCACHE=${ANDROID_BUILD_TOP:-$(dirname $0)/../../..}/prebuilts/misc/$HOST_TAG/ccache/ccache
60 [ -x $CCACHE ] || CCACHE=
61 ;;
62esac
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +010063
64for opt do
65 optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)')
66 case $opt in
67 --help|-h|-\?) OPTION_HELP=yes
68 ;;
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +010069 --arch=*)
70 OPTION_ARCH=$optarg
71 ;;
Young-Ho Cha63e03bb2013-04-04 15:10:30 +090072 --armv5)
73 OPTION_ARMV7=no
74 ;;
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +010075 --armv7)
76 OPTION_ARMV7=yes
77 ;;
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +010078 --ccache=*)
79 CCACHE=$optarg
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +010080 ;;
81 --config=*)
82 OPTION_CONFIG=$optarg
83 ;;
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +010084 --cross=*)
85 OPTION_CROSS=$optarg
86 ;;
87 --gcc-version=*)
88 OPTION_GCC_VERSION=$optarg
89 ;;
90 -j*|--jobs=*)
91 OPTION_JOBS=$optarg
92 ;;
93 --out=*)
94 OPTION_OUT=$optarg
95 ;;
Young-Ho Cha86210482013-04-04 15:54:34 +090096 --savedefconfig)
97 OPTION_SAVEDEFCONFIG=yes
98 ;;
David 'Digit' Turnerebba0e72013-01-15 11:50:00 +010099 --verbose)
100 OPTION_VERBOSE=true
101 ;;
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100102 *)
103 echo "unknown option '$opt', use --help"
104 exit 1
105 esac
106done
107
108if [ $OPTION_HELP = "yes" ] ; then
109 echo "Rebuild the prebuilt kernel binary for Android's emulator."
110 echo ""
111 echo "options (defaults are within brackets):"
112 echo ""
113 echo " --help print this message"
114 echo " --arch=<arch> change target architecture [$ARCH]"
Young-Ho Cha63e03bb2013-04-04 15:10:30 +0900115 echo " --armv5 build ARMv5 binaries"
116 echo " --armv7 build ARMv7 binaries (default. see note below)"
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100117 echo " --out=<directory> output directory [$OUTPUT]"
118 echo " --cross=<prefix> cross-toolchain prefix [$CROSSPREFIX]"
119 echo " --config=<name> kernel config name [$CONFIG]"
Young-Ho Cha86210482013-04-04 15:54:34 +0900120 echo " --savedefconfig run savedefconfig"
Young-Ho Cha2905b202013-04-04 15:01:44 +0900121 echo " --ccache=<path> use compiler cache [${CCACHE:-not set}]"
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100122 echo " --gcc-version=<version> use specific GCC version [$GCC_VERSION]"
David 'Digit' Turnerebba0e72013-01-15 11:50:00 +0100123 echo " --verbose show build commands"
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +0100124 echo " -j<number> launch <number> parallel build jobs [$JOBS]"
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100125 echo ""
126 echo "NOTE: --armv7 is equivalent to --config=goldfish_armv7. It is"
127 echo " ignored if --config=<name> is used."
128 echo ""
129 exit 0
130fi
131
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100132if [ ! -f include/linux/vermagic.h ]; then
133 echo "ERROR: You must be in the top-level kernel source directory to run this script."
134 exit 1
135fi
136
137# Extract kernel version, we'll need to put this in the final binaries names
138# to ensure the emulator can trivially know it without probing the binary with
139# 'file' or other unreliable heuristics.
140KERNEL_MAJOR=$(awk '$1 == "VERSION" { print $3; }' Makefile)
141KERNEL_MINOR=$(awk '$1 == "PATCHLEVEL" { print $3; }' Makefile)
142KERNEL_PATCH=$(awk '$1 == "SUBLEVEL" { print $3; }' Makefile)
143KERNEL_VERSION="$KERNEL_MAJOR.$KERNEL_MINOR.$KERNEL_PATCH"
144echo "Found kernel version: $KERNEL_VERSION"
145
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100146if [ -n "$OPTION_ARCH" ]; then
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +0100147 ARCH=$OPTION_ARCH
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100148fi
149
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100150if [ -n "$OPTION_GCC_VERSION" ]; then
151 GCC_VERSION=$OPTION_GCC_VERSION
152else
153 if [ "$ARCH" = "x86" ]; then
154 # Work-around a nasty bug.
155 # Hence 132637 is 2.6.29.
156 if [ "$KERNEL_VERSION" = "2.6.29" ]; then
157 GCC_VERSION=4.6
158 echo "WARNING: android-goldfish-$KERNEL_VERSION doesn't build --arch=$ARCH with GCC 4.7"
159 fi
160 fi
David 'Digit' Turner8bb296a2014-05-27 11:36:13 +0200161 if [ "$ARCH" = "arm64" ]; then
162 # There is no GCC 4.7 toolchain to build AARCH64 binaries.
163 GCC_VERSION=4.8
164 fi
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100165 echo "Autoconfig: --gcc-version=$GCC_VERSION"
166fi
167
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100168if [ -n "$OPTION_CONFIG" ]; then
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +0100169 CONFIG=$OPTION_CONFIG
170else
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100171 case $ARCH in
172 arm)
173 CONFIG=goldfish_armv7
174 if [ "$OPTION_ARMV5" = "yes" ]; then
175 CONFIG=goldfish
176 fi
177 ;;
178 x86)
179 # Warning: this is ambiguous, should be 'goldfish' before 3.10,
180 # and 'i386_emu" after it.
181 if [ -f "arch/x86/configs/i386_emu_defconfig" ]; then
182 CONFIG=i386_emu
183 else
184 CONFIG=goldfish
185 fi
186 ;;
187 x86_64)
188 CONFIG=x86_64_emu
189 ;;
190 mips)
191 CONFIG=goldfish
192 ;;
David 'Digit' Turner8bb296a2014-05-27 11:36:13 +0200193 arm64)
194 # TODO(digit): Provide better config.
195 CONFIG=defconfig
196 ;;
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100197 *)
198 echo "ERROR: Invalid arch '$ARCH', try one of $VALID_ARCHS"
199 exit 1
200 esac
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +0100201 echo "Auto-config: --config=$CONFIG"
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100202fi
203
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100204# Check output directory.
205if [ -n "$OPTION_OUT" ] ; then
206 if [ ! -d "$OPTION_OUT" ] ; then
207 echo "Output directory '$OPTION_OUT' does not exist ! Aborting."
208 exit 1
209 fi
210 OUTPUT=$OPTION_OUT
211else
212 mkdir -p $OUTPUT
213fi
214
215if [ -n "$OPTION_CROSS" ] ; then
216 CROSSPREFIX="$OPTION_CROSS"
217else
218 case $ARCH in
219 arm)
Andrew Hsieh9ada5ea2012-05-30 16:09:29 +0800220 CROSSPREFIX=arm-linux-androideabi-
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100221 ;;
222 x86)
H.J. Lu0621eeb2012-04-20 17:32:56 -0700223 CROSSPREFIX=i686-linux-android-
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100224 ;;
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100225 x86_64)
226 CROSSPREFIX=x86_64-linux-android-
227 ;;
Bhanu Chetlapalli88f828e2012-05-21 16:39:51 -0700228 mips)
Bhanu Chetlapalli88f828e2012-05-21 16:39:51 -0700229 CROSSPREFIX=mipsel-linux-android-
230 ;;
David 'Digit' Turner8bb296a2014-05-27 11:36:13 +0200231 arm64)
232 CROSSPREFIX=aarch64-linux-android-
233 ;;
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100234 *)
235 echo "ERROR: Unsupported architecture!"
236 exit 1
237 ;;
238 esac
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100239 CROSSTOOLCHAIN=${CROSSPREFIX}$GCC_VERSION
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +0100240 echo "Auto-config: --cross=$CROSSPREFIX"
241fi
242
Andrew Hsieh6f0425a2011-11-03 17:20:32 +0800243ZIMAGE=zImage
244
245case $ARCH in
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100246 x86|x86_64)
Andrew Hsieh6f0425a2011-11-03 17:20:32 +0800247 ZIMAGE=bzImage
248 ;;
David 'Digit' Turner8bb296a2014-05-27 11:36:13 +0200249 arm64)
250 ZIMAGE=Image.gz
251 ;;
Bhanu Chetlapalli88f828e2012-05-21 16:39:51 -0700252 mips)
253 ZIMAGE=
254 ;;
Andrew Hsieh6f0425a2011-11-03 17:20:32 +0800255esac
256
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +0100257# If the cross-compiler is not in the path, try to find it automatically
258CROSS_COMPILER="${CROSSPREFIX}gcc"
259CROSS_COMPILER_VERSION=$($CROSS_COMPILER --version 2>/dev/null)
260if [ $? != 0 ] ; then
261 BUILD_TOP=$ANDROID_BUILD_TOP
262 if [ -z "$BUILD_TOP" ]; then
263 # Assume this script is under external/qemu/distrib/ in the
264 # Android source tree.
265 BUILD_TOP=$(dirname $0)/../../..
Andrew Hsieh9ada5ea2012-05-30 16:09:29 +0800266 if [ ! -d "$BUILD_TOP/prebuilts" ]; then
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +0100267 BUILD_TOP=
268 else
269 BUILD_TOP=$(cd $BUILD_TOP && pwd)
270 fi
271 fi
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100272 case $ARCH in
273 x86_64)
274 # x86_46 binaries are under prebuilts/gcc/<host>/x86 !!
275 PREBUILT_ARCH=x86
276 ;;
David 'Digit' Turner8bb296a2014-05-27 11:36:13 +0200277 arm64)
278 PREBUILT_ARCH=aarch64
279 ;;
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100280 *)
281 PREBUILT_ARCH=$ARCH
282 ;;
283 esac
284 CROSSPREFIX=$BUILD_TOP/prebuilts/gcc/$HOST_TAG/$PREBUILT_ARCH/$CROSSTOOLCHAIN/bin/$CROSSPREFIX
285 echo "Checking for ${CROSSPREFIX}gcc"
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +0100286 if [ "$BUILD_TOP" -a -f ${CROSSPREFIX}gcc ]; then
287 echo "Auto-config: --cross=$CROSSPREFIX"
288 else
289 echo "It looks like $CROSS_COMPILER is not in your path ! Aborting."
290 exit 1
291 fi
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100292fi
293
Young-Ho Cha2905b202013-04-04 15:01:44 +0900294if [ "$CCACHE" ] ; then
295 echo "Using ccache program: $CCACHE"
296 CROSSPREFIX="$CCACHE $CROSSPREFIX"
297fi
298
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100299export CROSS_COMPILE="$CROSSPREFIX" ARCH SUBARCH=$ARCH
300
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +0100301if [ "$OPTION_JOBS" ]; then
302 JOBS=$OPTION_JOBS
303else
304 echo "Auto-config: -j$JOBS"
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100305fi
306
David 'Digit' Turnerbc9cbbe2011-12-14 21:18:50 +0100307
308# Special magic redirection with our magic toolbox script
Andrew Hsieh9ada5ea2012-05-30 16:09:29 +0800309# This is needed to add extra compiler flags to compiler.
310# See kernel-toolchain/android-kernel-toolchain-* for details
David 'Digit' Turnerbc9cbbe2011-12-14 21:18:50 +0100311#
Andrew Hsieh9ada5ea2012-05-30 16:09:29 +0800312export REAL_CROSS_COMPILE="$CROSS_COMPILE"
313CROSS_COMPILE=$(dirname "$0")/kernel-toolchain/android-kernel-toolchain-
David 'Digit' Turnerbc9cbbe2011-12-14 21:18:50 +0100314
David 'Digit' Turnerebba0e72013-01-15 11:50:00 +0100315MAKE_FLAGS=
316if [ "$OPTION_VERBOSE" ]; then
317 MAKE_FLAGS="$MAKE_FLAGS V=1"
318fi
319
David 'Digit' Turner8bb296a2014-05-27 11:36:13 +0200320case $CONFIG in
321 defconfig)
322 MAKE_DEFCONFIG=$CONFIG
323 ;;
324 *)
325 MAKE_DEFCONFIG=${CONFIG}_defconfig
326 ;;
327esac
328
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +0100329# Do the build
330#
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100331rm -f include/asm &&
David 'Digit' Turner8bb296a2014-05-27 11:36:13 +0200332make $MAKE_DEFCONFIG && # configure the kernel
David 'Digit' Turnerebba0e72013-01-15 11:50:00 +0100333make -j$JOBS $MAKE_FLAGS # build it
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100334
335if [ $? != 0 ] ; then
336 echo "Could not build the kernel. Aborting !"
337 exit 1
338fi
339
Young-Ho Cha86210482013-04-04 15:54:34 +0900340if [ "$OPTION_SAVEDEFCONFIG" = "yes" ]; then
341 make savedefconfig
342 mv -f defconfig arch/$ARCH/configs/${CONFIG}_defconfig
343fi
344
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +0100345# Note: The exact names of the output files are important for the Android build,
346# do not change the definitions lightly.
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100347KERNEL_PREFIX=kernel-$KERNEL_VERSION
348
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +0100349case $CONFIG in
350 vbox*)
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100351 KERNEL_SUFFIX=vbox
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +0100352 ;;
353 goldfish)
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100354 if [ "$ARCH" = "arm" ]; then
355 KERNEL_SUFFIX=qemu-armv5
356 else
357 KERNEL_SUFFIX=qemu-$ARCH
358 fi
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +0100359 ;;
360 goldfish_armv7)
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100361 KERNEL_SUFFIX=qemu-armv7
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +0100362 ;;
363 *)
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100364 KERNEL_SUFFIX=qemu-$ARCH
David 'Digit' Turnerfe6c89d2011-03-09 18:41:26 +0100365esac
David 'Digit' Turnerb6bd3ac2014-01-31 01:41:18 +0100366OUTPUT_KERNEL=$KERNEL_PREFIX-$KERNEL_SUFFIX
367OUTPUT_VMLINUX=vmlinux-${OUTPUT_KERNEL##kernel-}
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100368
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100369cp -f vmlinux $OUTPUT/$OUTPUT_VMLINUX
Bhanu Chetlapalli88f828e2012-05-21 16:39:51 -0700370if [ ! -z $ZIMAGE ]; then
371 cp -f arch/$ARCH/boot/$ZIMAGE $OUTPUT/$OUTPUT_KERNEL
Bhanu Chetlapalli88f828e2012-05-21 16:39:51 -0700372else
Bhanu Chetlapalli9bc2c5e2012-06-05 13:23:00 -0700373 cp -f vmlinux $OUTPUT/$OUTPUT_KERNEL
Bhanu Chetlapalli88f828e2012-05-21 16:39:51 -0700374fi
Bhanu Chetlapalli9bc2c5e2012-06-05 13:23:00 -0700375echo "Kernel $CONFIG prebuilt images ($OUTPUT_KERNEL and $OUTPUT_VMLINUX) copied to $OUTPUT successfully !"
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100376
David 'Digit' Turner5c25d3d2011-03-05 00:20:16 +0100377exit 0