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