15c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner#!/bin/sh 25c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner# 35c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner# A small script used to rebuild the Android goldfish kernel image 45c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner# See docs/KERNEL.TXT for usage instructions. 55c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner# 65c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' TurnerMACHINE=goldfish 75c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' TurnerVARIANT=goldfish 85c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' TurnerOUTPUT=/tmp/kernel-qemu 99ada5ea3626964561ed983c64cf04bcdf44e6806Andrew HsiehCROSSPREFIX=arm-linux-androideabi- 105c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' TurnerCONFIG=goldfish 11b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' TurnerGCC_VERSION=4.7 12b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner 13b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' TurnerVALID_ARCHS="arm x86 x86_64 mips" 145c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner 15fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner# Determine the host architecture, and which default prebuilt tag we need. 16fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner# For the toolchain auto-detection. 17fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner# 18fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' TurnerHOST_OS=`uname -s` 19fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turnercase "$HOST_OS" in 20fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner Darwin) 21fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner HOST_OS=darwin 22fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner HOST_TAG=darwin-x86 23fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner BUILD_NUM_CPUS=$(sysctl -n hw.ncpu) 24fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner ;; 25fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner Linux) 26fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner # note that building 32-bit binaries on x86_64 is handled later 27fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner HOST_OS=linux 28fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner HOST_TAG=linux-x86 29fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner BUILD_NUM_CPUS=$(grep -c processor /proc/cpuinfo) 30fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner ;; 31fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner *) 32fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner echo "ERROR: Unsupported OS: $HOST_OS" 33fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner exit 1 34fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turneresac 35fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner 36fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner# Default number of parallel jobs during the build: cores * 2 37fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' TurnerJOBS=$(( $BUILD_NUM_CPUS * 2 )) 385c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner 395c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' TurnerARCH=arm 405c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner 415c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' TurnerOPTION_HELP=no 4263e03bb38594807c04d9bb184e3204235916e689Young-Ho ChaOPTION_ARMV7=yes 435c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' TurnerOPTION_OUT= 445c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' TurnerOPTION_CROSS= 455c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' TurnerOPTION_ARCH= 465c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' TurnerOPTION_CONFIG= 478621048ded576220927651915e2d6942096f31bcYoung-Ho ChaOPTION_SAVEDEFCONFIG=no 48fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' TurnerOPTION_JOBS= 49ebba0e7bc8fe2cddaf2c7fd13c04a00353793726David 'Digit' TurnerOPTION_VERBOSE= 50b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' TurnerOPTION_GCC_VERSION= 512905b20226f06f50140804fe130764e98f2bd975Young-Ho ChaCCACHE= 522905b20226f06f50140804fe130764e98f2bd975Young-Ho Cha 532905b20226f06f50140804fe130764e98f2bd975Young-Ho Chacase "$USE_CCACHE" in 542905b20226f06f50140804fe130764e98f2bd975Young-Ho Cha "") 552905b20226f06f50140804fe130764e98f2bd975Young-Ho Cha CCACHE= 562905b20226f06f50140804fe130764e98f2bd975Young-Ho Cha ;; 572905b20226f06f50140804fe130764e98f2bd975Young-Ho Cha *) 582905b20226f06f50140804fe130764e98f2bd975Young-Ho Cha # use ccache bundled in AOSP source tree 592905b20226f06f50140804fe130764e98f2bd975Young-Ho Cha CCACHE=${ANDROID_BUILD_TOP:-$(dirname $0)/../../..}/prebuilts/misc/$HOST_TAG/ccache/ccache 602905b20226f06f50140804fe130764e98f2bd975Young-Ho Cha [ -x $CCACHE ] || CCACHE= 612905b20226f06f50140804fe130764e98f2bd975Young-Ho Cha ;; 622905b20226f06f50140804fe130764e98f2bd975Young-Ho Chaesac 635c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner 645c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerfor opt do 655c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner optarg=$(expr "x$opt" : 'x[^=]*=\(.*\)') 665c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner case $opt in 675c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner --help|-h|-\?) OPTION_HELP=yes 685c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner ;; 69b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner --arch=*) 70b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner OPTION_ARCH=$optarg 71b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner ;; 7263e03bb38594807c04d9bb184e3204235916e689Young-Ho Cha --armv5) 7363e03bb38594807c04d9bb184e3204235916e689Young-Ho Cha OPTION_ARMV7=no 7463e03bb38594807c04d9bb184e3204235916e689Young-Ho Cha ;; 755c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner --armv7) 765c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner OPTION_ARMV7=yes 775c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner ;; 78b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner --ccache=*) 79b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner CCACHE=$optarg 80b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner ;; 81b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner --config=*) 82b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner OPTION_CONFIG=$optarg 835c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner ;; 845c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner --cross=*) 855c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner OPTION_CROSS=$optarg 865c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner ;; 87b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner --gcc-version=*) 88b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner OPTION_GCC_VERSION=$optarg 895c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner ;; 90b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner -j*|--jobs=*) 91b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner OPTION_JOBS=$optarg 92b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner ;; 93b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner --out=*) 94b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner OPTION_OUT=$optarg 955c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner ;; 968621048ded576220927651915e2d6942096f31bcYoung-Ho Cha --savedefconfig) 978621048ded576220927651915e2d6942096f31bcYoung-Ho Cha OPTION_SAVEDEFCONFIG=yes 988621048ded576220927651915e2d6942096f31bcYoung-Ho Cha ;; 99ebba0e7bc8fe2cddaf2c7fd13c04a00353793726David 'Digit' Turner --verbose) 100ebba0e7bc8fe2cddaf2c7fd13c04a00353793726David 'Digit' Turner OPTION_VERBOSE=true 101ebba0e7bc8fe2cddaf2c7fd13c04a00353793726David 'Digit' Turner ;; 1025c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner *) 1035c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo "unknown option '$opt', use --help" 1045c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner exit 1 1055c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner esac 1065c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerdone 1075c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner 1085c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerif [ $OPTION_HELP = "yes" ] ; then 1095c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo "Rebuild the prebuilt kernel binary for Android's emulator." 1105c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo "" 1115c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo "options (defaults are within brackets):" 1125c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo "" 1135c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo " --help print this message" 1145c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo " --arch=<arch> change target architecture [$ARCH]" 11563e03bb38594807c04d9bb184e3204235916e689Young-Ho Cha echo " --armv5 build ARMv5 binaries" 11663e03bb38594807c04d9bb184e3204235916e689Young-Ho Cha echo " --armv7 build ARMv7 binaries (default. see note below)" 1175c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo " --out=<directory> output directory [$OUTPUT]" 1185c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo " --cross=<prefix> cross-toolchain prefix [$CROSSPREFIX]" 1195c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo " --config=<name> kernel config name [$CONFIG]" 1208621048ded576220927651915e2d6942096f31bcYoung-Ho Cha echo " --savedefconfig run savedefconfig" 1212905b20226f06f50140804fe130764e98f2bd975Young-Ho Cha echo " --ccache=<path> use compiler cache [${CCACHE:-not set}]" 122b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner echo " --gcc-version=<version> use specific GCC version [$GCC_VERSION]" 123ebba0e7bc8fe2cddaf2c7fd13c04a00353793726David 'Digit' Turner echo " --verbose show build commands" 124fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner echo " -j<number> launch <number> parallel build jobs [$JOBS]" 1255c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo "" 1265c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo "NOTE: --armv7 is equivalent to --config=goldfish_armv7. It is" 1275c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo " ignored if --config=<name> is used." 1285c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo "" 1295c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner exit 0 1305c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerfi 1315c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner 132b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turnerif [ ! -f include/linux/vermagic.h ]; then 133b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner echo "ERROR: You must be in the top-level kernel source directory to run this script." 134b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner exit 1 135b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turnerfi 136b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner 137b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner# Extract kernel version, we'll need to put this in the final binaries names 138b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner# to ensure the emulator can trivially know it without probing the binary with 139b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner# 'file' or other unreliable heuristics. 140b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' TurnerKERNEL_MAJOR=$(awk '$1 == "VERSION" { print $3; }' Makefile) 141b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' TurnerKERNEL_MINOR=$(awk '$1 == "PATCHLEVEL" { print $3; }' Makefile) 142b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' TurnerKERNEL_PATCH=$(awk '$1 == "SUBLEVEL" { print $3; }' Makefile) 143b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' TurnerKERNEL_VERSION="$KERNEL_MAJOR.$KERNEL_MINOR.$KERNEL_PATCH" 144b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turnerecho "Found kernel version: $KERNEL_VERSION" 145b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner 1465c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerif [ -n "$OPTION_ARCH" ]; then 147fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner ARCH=$OPTION_ARCH 1485c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerfi 1495c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner 150b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turnerif [ -n "$OPTION_GCC_VERSION" ]; then 151b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner GCC_VERSION=$OPTION_GCC_VERSION 152fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turnerelse 153b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner if [ "$ARCH" = "x86" ]; then 154b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner # Work-around a nasty bug. 155b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner # Hence 132637 is 2.6.29. 156b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner if [ "$KERNEL_VERSION" = "2.6.29" ]; then 157b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner GCC_VERSION=4.6 158b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner echo "WARNING: android-goldfish-$KERNEL_VERSION doesn't build --arch=$ARCH with GCC 4.7" 159b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner fi 160fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner fi 1618bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner if [ "$ARCH" = "arm64" ]; then 1628bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner # There is no GCC 4.7 toolchain to build AARCH64 binaries. 1638bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner GCC_VERSION=4.8 1648bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner fi 165b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner echo "Autoconfig: --gcc-version=$GCC_VERSION" 1665c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerfi 1675c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner 168b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turnerif [ -n "$OPTION_CONFIG" ]; then 169b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner CONFIG=$OPTION_CONFIG 170b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turnerelse 171b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner case $ARCH in 172b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner arm) 173b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner CONFIG=goldfish_armv7 174b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner if [ "$OPTION_ARMV5" = "yes" ]; then 175b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner CONFIG=goldfish 176b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner fi 177b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner ;; 178b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner x86) 179b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner # Warning: this is ambiguous, should be 'goldfish' before 3.10, 180b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner # and 'i386_emu" after it. 181b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner if [ -f "arch/x86/configs/i386_emu_defconfig" ]; then 182b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner CONFIG=i386_emu 183b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner else 184b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner CONFIG=goldfish 185b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner fi 186b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner ;; 187b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner x86_64) 188b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner CONFIG=x86_64_emu 189b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner ;; 190b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner mips) 191b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner CONFIG=goldfish 192b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner ;; 1938bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner arm64) 1948bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner # TODO(digit): Provide better config. 1958bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner CONFIG=defconfig 1968bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner ;; 197b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner *) 198b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner echo "ERROR: Invalid arch '$ARCH', try one of $VALID_ARCHS" 199b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner exit 1 200b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner esac 201b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner echo "Auto-config: --config=$CONFIG" 2025c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerfi 2035c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner 2045c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner# Check output directory. 2055c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerif [ -n "$OPTION_OUT" ] ; then 2065c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner if [ ! -d "$OPTION_OUT" ] ; then 2075c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo "Output directory '$OPTION_OUT' does not exist ! Aborting." 2085c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner exit 1 2095c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner fi 2105c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner OUTPUT=$OPTION_OUT 2115c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerelse 2125c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner mkdir -p $OUTPUT 2135c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerfi 2145c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner 2155c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerif [ -n "$OPTION_CROSS" ] ; then 2165c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner CROSSPREFIX="$OPTION_CROSS" 2175c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerelse 2185c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner case $ARCH in 2195c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner arm) 2209ada5ea3626964561ed983c64cf04bcdf44e6806Andrew Hsieh CROSSPREFIX=arm-linux-androideabi- 2215c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner ;; 2225c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner x86) 2230621eeb599686e1d7dea3bf39ae8057bec574e0dH.J. Lu CROSSPREFIX=i686-linux-android- 2245c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner ;; 225b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner x86_64) 226b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner CROSSPREFIX=x86_64-linux-android- 227b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner ;; 22888f828e91ff4f13fb3d4f873fc0eedd6ef49a156Bhanu Chetlapalli mips) 22988f828e91ff4f13fb3d4f873fc0eedd6ef49a156Bhanu Chetlapalli CROSSPREFIX=mipsel-linux-android- 23088f828e91ff4f13fb3d4f873fc0eedd6ef49a156Bhanu Chetlapalli ;; 2318bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner arm64) 2328bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner CROSSPREFIX=aarch64-linux-android- 2338bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner ;; 2345c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner *) 2355c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo "ERROR: Unsupported architecture!" 2365c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner exit 1 2375c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner ;; 2385c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner esac 239b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner CROSSTOOLCHAIN=${CROSSPREFIX}$GCC_VERSION 240fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner echo "Auto-config: --cross=$CROSSPREFIX" 2415c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerfi 2425c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner 2436f0425a8f6d386d7ca10e69ad90cbd5d5c5228a9Andrew HsiehZIMAGE=zImage 2446f0425a8f6d386d7ca10e69ad90cbd5d5c5228a9Andrew Hsieh 2456f0425a8f6d386d7ca10e69ad90cbd5d5c5228a9Andrew Hsiehcase $ARCH in 246b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner x86|x86_64) 2476f0425a8f6d386d7ca10e69ad90cbd5d5c5228a9Andrew Hsieh ZIMAGE=bzImage 2486f0425a8f6d386d7ca10e69ad90cbd5d5c5228a9Andrew Hsieh ;; 2498bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner arm64) 2508bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner ZIMAGE=Image.gz 2518bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner ;; 25288f828e91ff4f13fb3d4f873fc0eedd6ef49a156Bhanu Chetlapalli mips) 25388f828e91ff4f13fb3d4f873fc0eedd6ef49a156Bhanu Chetlapalli ZIMAGE= 25488f828e91ff4f13fb3d4f873fc0eedd6ef49a156Bhanu Chetlapalli ;; 2556f0425a8f6d386d7ca10e69ad90cbd5d5c5228a9Andrew Hsiehesac 2566f0425a8f6d386d7ca10e69ad90cbd5d5c5228a9Andrew Hsieh 257fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner# If the cross-compiler is not in the path, try to find it automatically 258fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' TurnerCROSS_COMPILER="${CROSSPREFIX}gcc" 2595c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' TurnerCROSS_COMPILER_VERSION=$($CROSS_COMPILER --version 2>/dev/null) 2605c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerif [ $? != 0 ] ; then 261fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner BUILD_TOP=$ANDROID_BUILD_TOP 262fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner if [ -z "$BUILD_TOP" ]; then 263fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner # Assume this script is under external/qemu/distrib/ in the 264fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner # Android source tree. 265fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner BUILD_TOP=$(dirname $0)/../../.. 2669ada5ea3626964561ed983c64cf04bcdf44e6806Andrew Hsieh if [ ! -d "$BUILD_TOP/prebuilts" ]; then 267fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner BUILD_TOP= 268fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner else 269fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner BUILD_TOP=$(cd $BUILD_TOP && pwd) 270fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner fi 271fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner fi 272b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner case $ARCH in 273b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner x86_64) 274b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner # x86_46 binaries are under prebuilts/gcc/<host>/x86 !! 275b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner PREBUILT_ARCH=x86 276b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner ;; 2778bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner arm64) 2788bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner PREBUILT_ARCH=aarch64 2798bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner ;; 280b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner *) 281b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner PREBUILT_ARCH=$ARCH 282b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner ;; 283b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner esac 284b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner CROSSPREFIX=$BUILD_TOP/prebuilts/gcc/$HOST_TAG/$PREBUILT_ARCH/$CROSSTOOLCHAIN/bin/$CROSSPREFIX 285b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner echo "Checking for ${CROSSPREFIX}gcc" 286fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner if [ "$BUILD_TOP" -a -f ${CROSSPREFIX}gcc ]; then 287fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner echo "Auto-config: --cross=$CROSSPREFIX" 288fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner else 289fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner echo "It looks like $CROSS_COMPILER is not in your path ! Aborting." 290fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner exit 1 291fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner fi 292fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turnerfi 293fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner 2942905b20226f06f50140804fe130764e98f2bd975Young-Ho Chaif [ "$CCACHE" ] ; then 2952905b20226f06f50140804fe130764e98f2bd975Young-Ho Cha echo "Using ccache program: $CCACHE" 2962905b20226f06f50140804fe130764e98f2bd975Young-Ho Cha CROSSPREFIX="$CCACHE $CROSSPREFIX" 2972905b20226f06f50140804fe130764e98f2bd975Young-Ho Chafi 2982905b20226f06f50140804fe130764e98f2bd975Young-Ho Cha 299fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turnerexport CROSS_COMPILE="$CROSSPREFIX" ARCH SUBARCH=$ARCH 300fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner 301fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turnerif [ "$OPTION_JOBS" ]; then 302fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner JOBS=$OPTION_JOBS 303fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turnerelse 304fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner echo "Auto-config: -j$JOBS" 3055c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerfi 3065c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner 307bc9cbbe2a02d84d57854c211449f6491a6140eabDavid 'Digit' Turner 308bc9cbbe2a02d84d57854c211449f6491a6140eabDavid 'Digit' Turner# Special magic redirection with our magic toolbox script 3099ada5ea3626964561ed983c64cf04bcdf44e6806Andrew Hsieh# This is needed to add extra compiler flags to compiler. 3109ada5ea3626964561ed983c64cf04bcdf44e6806Andrew Hsieh# See kernel-toolchain/android-kernel-toolchain-* for details 311bc9cbbe2a02d84d57854c211449f6491a6140eabDavid 'Digit' Turner# 3129ada5ea3626964561ed983c64cf04bcdf44e6806Andrew Hsiehexport REAL_CROSS_COMPILE="$CROSS_COMPILE" 3139ada5ea3626964561ed983c64cf04bcdf44e6806Andrew HsiehCROSS_COMPILE=$(dirname "$0")/kernel-toolchain/android-kernel-toolchain- 314bc9cbbe2a02d84d57854c211449f6491a6140eabDavid 'Digit' Turner 315ebba0e7bc8fe2cddaf2c7fd13c04a00353793726David 'Digit' TurnerMAKE_FLAGS= 316ebba0e7bc8fe2cddaf2c7fd13c04a00353793726David 'Digit' Turnerif [ "$OPTION_VERBOSE" ]; then 317ebba0e7bc8fe2cddaf2c7fd13c04a00353793726David 'Digit' Turner MAKE_FLAGS="$MAKE_FLAGS V=1" 318ebba0e7bc8fe2cddaf2c7fd13c04a00353793726David 'Digit' Turnerfi 319ebba0e7bc8fe2cddaf2c7fd13c04a00353793726David 'Digit' Turner 3208bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turnercase $CONFIG in 3218bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner defconfig) 3228bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner MAKE_DEFCONFIG=$CONFIG 3238bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner ;; 3248bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner *) 3258bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner MAKE_DEFCONFIG=${CONFIG}_defconfig 3268bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner ;; 3278bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turneresac 3288bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turner 329fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner# Do the build 330fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner# 3315c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerrm -f include/asm && 3328bb296a63c3f5e1d34be18216565e26e51c8b072David 'Digit' Turnermake $MAKE_DEFCONFIG && # configure the kernel 333ebba0e7bc8fe2cddaf2c7fd13c04a00353793726David 'Digit' Turnermake -j$JOBS $MAKE_FLAGS # build it 3345c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner 3355c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerif [ $? != 0 ] ; then 3365c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner echo "Could not build the kernel. Aborting !" 3375c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner exit 1 3385c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerfi 3395c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner 3408621048ded576220927651915e2d6942096f31bcYoung-Ho Chaif [ "$OPTION_SAVEDEFCONFIG" = "yes" ]; then 3418621048ded576220927651915e2d6942096f31bcYoung-Ho Cha make savedefconfig 3428621048ded576220927651915e2d6942096f31bcYoung-Ho Cha mv -f defconfig arch/$ARCH/configs/${CONFIG}_defconfig 3438621048ded576220927651915e2d6942096f31bcYoung-Ho Chafi 3448621048ded576220927651915e2d6942096f31bcYoung-Ho Cha 345fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner# Note: The exact names of the output files are important for the Android build, 346fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner# do not change the definitions lightly. 347b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' TurnerKERNEL_PREFIX=kernel-$KERNEL_VERSION 348b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner 349fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turnercase $CONFIG in 350fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner vbox*) 351b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner KERNEL_SUFFIX=vbox 352fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner ;; 353fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner goldfish) 354b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner if [ "$ARCH" = "arm" ]; then 355b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner KERNEL_SUFFIX=qemu-armv5 356b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner else 357b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner KERNEL_SUFFIX=qemu-$ARCH 358b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner fi 359fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner ;; 360fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner goldfish_armv7) 361b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner KERNEL_SUFFIX=qemu-armv7 362fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner ;; 363fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turner *) 364b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' Turner KERNEL_SUFFIX=qemu-$ARCH 365fe6c89d7d8684c112db7da6bbea12284c4896f3aDavid 'Digit' Turneresac 366b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' TurnerOUTPUT_KERNEL=$KERNEL_PREFIX-$KERNEL_SUFFIX 367b6bd3ac4d6576e6280469be01685747ffa255874David 'Digit' TurnerOUTPUT_VMLINUX=vmlinux-${OUTPUT_KERNEL##kernel-} 3685c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner 3695c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnercp -f vmlinux $OUTPUT/$OUTPUT_VMLINUX 37088f828e91ff4f13fb3d4f873fc0eedd6ef49a156Bhanu Chetlapalliif [ ! -z $ZIMAGE ]; then 37188f828e91ff4f13fb3d4f873fc0eedd6ef49a156Bhanu Chetlapalli cp -f arch/$ARCH/boot/$ZIMAGE $OUTPUT/$OUTPUT_KERNEL 37288f828e91ff4f13fb3d4f873fc0eedd6ef49a156Bhanu Chetlapallielse 3739bc2c5eba30c83bf3a1ae78f99a79eb763fd267bBhanu Chetlapalli cp -f vmlinux $OUTPUT/$OUTPUT_KERNEL 37488f828e91ff4f13fb3d4f873fc0eedd6ef49a156Bhanu Chetlapallifi 3759bc2c5eba30c83bf3a1ae78f99a79eb763fd267bBhanu Chetlapalliecho "Kernel $CONFIG prebuilt images ($OUTPUT_KERNEL and $OUTPUT_VMLINUX) copied to $OUTPUT successfully !" 3765c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turner 3775c25d3d60c64efb11709b625714ca1dac7c043f4David 'Digit' Turnerexit 0 378