| #!/bin/sh |
| # |
| # A small script used to rebuild the BlissOS kernel image |
| # Shamelessly stol.. "inspired by" prebuilts/qemu-kernel/build-kernel.sh |
| # |
| |
| CMD=$1 |
| |
| if [ -z "$ANDROID_BUILD_TOP" ]; then |
| echo "ERROR: You must have run lunch in the top level android source directory to run this script." |
| exit 1 |
| fi |
| |
| # TODO(dubielm): We have to decide if we want per family or per product builds |
| # and then we should be able to use TARGET_PRODUCT directly. |
| BUILD_FAMILY_NAME=$(basename $ANDROID_PRODUCT_OUT) |
| |
| OUTPUT=$ANDROID_BUILD_TOP/device/google/desktop/${BUILD_FAMILY_NAME}-kernels/6.6 |
| |
| # TODO: b/379702641 - Once we are firmly building brya kernels via Kleaf, |
| # upgrade this warning to a harder stop requiring user confirmation. |
| if [ $BUILD_FAMILY_NAME = "brya" ]; then |
| echo "WARNING: Brya devices are migrating to Kleaf-based kernel prebuilts." |
| echo "This script is still OK to use for now, but be warned that this script" |
| echo "will soon be deprecated for Brya." |
| echo "Instructions for building via Kleaf will be available at that time." |
| |
| # Update brya path to include legacy_kernel suffix. |
| OUTPUT=$OUTPUT/legacy_kernel |
| fi |
| |
| # Determine the host architecture, and which default prebuilt tag we need. |
| # For the toolchain auto-detection. |
| # |
| HOST_OS=`uname -s` |
| case "$HOST_OS" in |
| Linux) |
| # note that building 32-bit binaries on x86_64 is handled later |
| HOST_OS=linux |
| HOST_TAG=linux-x86 |
| BUILD_NUM_CPUS=$(grep -c processor /proc/cpuinfo) |
| ;; |
| *) |
| echo "ERROR: Unsupported OS: $HOST_OS" |
| exit 1 |
| esac |
| |
| if [ ! -f include/linux/vermagic.h ]; then |
| echo "ERROR: You must be in the top-level kernel source directory to run this script." |
| exit 1 |
| fi |
| |
| # Extract kernel version, we'll need to put this in the final binaries names |
| # to ensure the emulator can trivially know it without probing the binary with |
| # 'file' or other unreliable heuristics. |
| KERNEL_MAJOR=$(awk '$1 == "VERSION" { print $3; }' Makefile) |
| KERNEL_MINOR=$(awk '$1 == "PATCHLEVEL" { print $3; }' Makefile) |
| KERNEL_PATCH=$(awk '$1 == "SUBLEVEL" { print $3; }' Makefile) |
| KERNEL_VERSION="$KERNEL_MAJOR.$KERNEL_MINOR.$KERNEL_PATCH" |
| echo "Found kernel version: $KERNEL_VERSION" |
| |
| # Ensure output dir exists, create if necessary |
| mkdir -p $OUTPUT |
| |
| ZIMAGE=zImage |
| |
| ARCH=$($ANDROID_BUILD_TOP/build/soong/soong_ui.bash --dumpvar-mode TARGET_ARCH) |
| case $ARCH in |
| x86|x86_64) |
| ZIMAGE=bzImage |
| CONFIG=android-x86_64 |
| ;; |
| arm64) |
| ZIMAGE=Image |
| CONFIG=android-arm64 |
| ;; |
| mips) |
| ZIMAGE= |
| ;; |
| mips64) |
| ZIMAGE= |
| ;; |
| esac |
| |
| export LLVM=1 |
| PATH=$ANDROID_BUILD_TOP/prebuilts/clang/host/$HOST_TAG/clang-r530567/bin/:$PATH |
| export ARCH |
| |
| case $CONFIG in |
| defconfig) |
| MAKE_DEFCONFIG=$CONFIG |
| ;; |
| *) |
| MAKE_DEFCONFIG=${CONFIG}_defconfig |
| ;; |
| esac |
| |
| # Temp dir to hold the installed modules, auto-removed on exit |
| TMP_MODULES="$(mktemp -d)" |
| trap 'rm -rf -- "$TMP_MODULES"' EXIT |
| |
| if [[ "$CMD" == "menuconfig" ]] || [[ "$CMD" == "savedefconfig" ]]; then |
| make -j $BUILD_NUM_CPUS $CMD |
| exit |
| fi |
| |
| if [ "$ARCH" == "arm64" ] ; then |
| # Remove all previous DTBs. This resolves the situation where the DTS |
| # is removed in the new kernel. Without removing all artifacts, the FIT |
| # image crated later would contain the old DTB taken from previous |
| # build. |
| DEVICETREES=$(find ./arch/arm64/boot/dts -name \*$BUILD_FAMILY_NAME\*.dtb) |
| DEVICETREE_ARTIFACTS=$(find ./arch/arm64/boot/dts -name \*$BUILD_FAMILY_NAME\*.dtb.\*) |
| rm -rf $DEVICETREES $DEVICETREE_ARTIFACTS |
| # XXX: Under arm64 arch, in a later step we replace kernel image with a FIT |
| # image, which extends the kernel with devices trees. Running the script |
| # twice results in nested FIT FIT image, which does not boot. Hence, we |
| # remove it before building. |
| rm -rf arch/$ARCH/boot/$ZIMAGE |
| fi |
| # Do the build |
| # |
| rm -f include/asm && |
| make -j $BUILD_NUM_CPUS $MAKE_DEFCONFIG && # configure the kernel |
| make -j $BUILD_NUM_CPUS && # build the kernel |
| make -j $BUILD_NUM_CPUS modules_install INSTALL_MOD_PATH=$TMP_MODULES # install kernel modules |
| |
| if [ $? != 0 ] ; then |
| echo "Could not build the kernel. Aborting !" |
| exit 1 |
| fi |
| |
| if [ "$ARCH" == "arm64" ] ; then |
| # replace kernel image with a FIT image which contains the kernel image, plus relevant |
| # devicetrees for this build family. |
| # TODO(svenva@) generate-its-script.sh is really old and generates a legacy FIT. |
| # upgrade to modern FIT format which is much more compact. |
| DEVICETREES=$(find ./arch/arm64/boot/dts -name \*$BUILD_FAMILY_NAME\*.dtb) |
| ./chromeos/scripts/generate-its-script.sh -a arm64 -c lz4 -d $(pwd) arch/$ARCH/boot/$ZIMAGE \ |
| $DEVICETREES | dtc -I dts -O dtb -p 1024 > arch/$ARCH/boot/$ZIMAGE.fit |
| mv arch/$ARCH/boot/$ZIMAGE.fit arch/$ARCH/boot/$ZIMAGE |
| fi |
| |
| # Copy over the built artifacts |
| # Clean module destination dir before copying, to prevent stale |
| # modules from getting left behind. |
| # |
| cp -f arch/$ARCH/boot/$ZIMAGE $OUTPUT/ && |
| rm -f "${OUTPUT}/vendor_dlkm/"* && |
| find $TMP_MODULES/lib/modules/$(cat include/config/kernel.release)/kernel/ \ |
| -type f -print0 | xargs -0 -I {} cp {} "$OUTPUT/vendor_dlkm/" |
| |
| if [ $? != 0 ] ; then |
| echo "Could not copy the kernel artifacts. Aborting !" |
| exit 1 |
| fi |
| |
| echo "Kernel $CONFIG prebuilt images ($ZIMAGE and modules) copied to $OUTPUT successfully !" |
| |
| |
| exit 0 |