@ -35,6 +35,12 @@
# aarch64-linux-androidkernel- for arm64
# x86_64-linux-androidkernel- for x86
#
# TARGET_KERNEL_CLANG_COMPILE = Compile kernel with clang, defaults to false
#
# TARGET_KERNEL_CLANG_VERSION = Clang prebuilts version, optional, defaults to clang-stable
#
# TARGET_KERNEL_CLANG_PATH = Clang prebuilts path, optional
#
# BOARD_KERNEL_IMAGE_NAME = Built image name
# for ARM use: zImage
# for ARM64 use: Image.gz
@ -50,6 +56,15 @@
# KERNEL_TOOLCHAIN = Path to toolchain, if unset, assumes
# TARGET_KERNEL_CROSS_COMPILE_PREFIX
# is in PATH
#
# KERNEL_CC = The C Compiler used. This is automatically set based
# on whether the clang version is set, optional.
#
# KERNEL_CLANG_TRIPLE = Target triple for clang (e.g. aarch64-linux-gnu-)
# defaults to arm-linux-gnu- for arm
# aarch64-linux-gnu- for arm64
# x86_64-linux-gnu- for x86
#
# USE_CCACHE = Enable ccache (global Android flag)
#
# NEED_KERNEL_MODULE_ROOT = Optional, if true, install kernel
@ -225,6 +240,24 @@ KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN)/$(KERNEL_TOOLCHAIN_PREFIX)
e n d i f
e n d i f
i f e q ( $( TARGET_KERNEL_CLANG_COMPILE ) , t r u e )
ifneq ( $( TARGET_KERNEL_CLANG_VERSION) ,)
# Find the clang-* directory containing the specified version
KERNEL_CLANG_VERSION := $( shell find $( ANDROID_BUILD_TOP) /prebuilts/clang/host/$( HOST_OS) -x86/ -name AndroidVersion.txt -exec grep -l $( TARGET_KERNEL_CLANG_VERSION) "{}" \; | sed -e 's|/AndroidVersion.txt$$||g;s|^.*/||g' )
else
# Only set the latest version of clang if TARGET_KERNEL_CLANG_VERSION hasn't been set by the device config
KERNEL_CLANG_VERSION := $( shell ls -d $( ANDROID_BUILD_TOP) /prebuilts/clang/host/$( HOST_OS) -x86/clang-* | xargs -n 1 basename | tail -1)
endif
TARGET_KERNEL_CLANG_PATH ?= $( ANDROID_BUILD_TOP) /prebuilts/clang/host/$( HOST_OS) -x86/$( KERNEL_CLANG_VERSION) /bin
ifeq ( $( KERNEL_ARCH) ,arm64)
KERNEL_CLANG_TRIPLE ?= CLANG_TRIPLE = aarch64-linux-gnu-
else ifeq ( $( KERNEL_ARCH) ,arm)
KERNEL_CLANG_TRIPLE ?= CLANG_TRIPLE = arm-linux-gnu-
else ifeq ( $( KERNEL_ARCH) ,x86)
KERNEL_CLANG_TRIPLE ?= CLANG_TRIPLE = x86_64-linux-gnu-
endif
e n d i f
i f n e q ( $( USE_CCACHE ) , )
# Detect if the system already has ccache installed to use instead of the prebuilt
ccache := $( shell which ccache)
@ -236,7 +269,12 @@ ifneq ($(USE_CCACHE),)
endif
e n d i f
KERNEL_CROSS_COMPILE := CROSS_COMPILE = " $( ccache) $( KERNEL_TOOLCHAIN_PATH) "
i f e q ( $( TARGET_KERNEL_CLANG_COMPILE ) , t r u e )
KERNEL_CROSS_COMPILE := CROSS_COMPILE = " $( KERNEL_TOOLCHAIN_PATH) "
KERNEL_CC ?= CC = " $( ccache) $( TARGET_KERNEL_CLANG_PATH) /clang "
e l s e
KERNEL_CROSS_COMPILE := CROSS_COMPILE = " $( ccache) $( KERNEL_TOOLCHAIN_PATH) "
e n d i f
ccache =
i f e q ( $( HOST_OS ) , d a r w i n )
@ -263,35 +301,35 @@ $(KERNEL_ADDITIONAL_CONFIG_OUT): force_additional_config
$(KERNEL_CONFIG) : $( KERNEL_OUT_STAMP ) $( KERNEL_DEFCONFIG_SRC ) $( KERNEL_ADDITIONAL_CONFIG_OUT )
@echo "Building Kernel Config"
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG = $( VARIANT_DEFCONFIG) SELINUX_DEFCONFIG = $( SELINUX_DEFCONFIG) $( KERNEL_DEFCONFIG)
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) VARIANT_DEFCONFIG = $( VARIANT_DEFCONFIG) SELINUX_DEFCONFIG = $( SELINUX_DEFCONFIG) $( KERNEL_DEFCONFIG)
$( hide) if [ ! -z " $( KERNEL_CONFIG_OVERRIDE) " ] ; then \
echo " Overriding kernel config with ' $( KERNEL_CONFIG_OVERRIDE) ' " ; \
echo $( KERNEL_CONFIG_OVERRIDE) >> $( KERNEL_OUT) /.config; \
$( MAKE) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) oldconfig; fi
$( MAKE) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) oldconfig; fi
# Create defconfig build artifact
$( hide) $( MAKE) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) savedefconfig
$( hide) $( MAKE) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) savedefconfig
$( hide) if [ ! -z " $( KERNEL_ADDITIONAL_CONFIG) " ] ; then \
echo " Using additional config ' $( KERNEL_ADDITIONAL_CONFIG) ' " ; \
$( KERNEL_SRC) /scripts/kconfig/merge_config.sh -m -O $( KERNEL_OUT) $( KERNEL_OUT) /.config $( KERNEL_SRC) /arch/$( KERNEL_ARCH) /configs/$( KERNEL_ADDITIONAL_CONFIG) ; \
$( MAKE) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) KCONFIG_ALLCONFIG = $( KERNEL_OUT) /.config alldefconfig; fi
$( MAKE) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) KCONFIG_ALLCONFIG = $( KERNEL_OUT) /.config alldefconfig; fi
TARGET_KERNEL_BINARIES : $( KERNEL_OUT_STAMP ) $( KERNEL_CONFIG ) $( KERNEL_HEADERS_INSTALL_STAMP )
@echo "Building Kernel"
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( BOARD_KERNEL_IMAGE_NAME)
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) $( BOARD_KERNEL_IMAGE_NAME)
$( hide) if grep -q '^CONFIG_OF=y' $( KERNEL_CONFIG) ; then \
echo "Building DTBs" ; \
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) dtbs; \
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) dtbs; \
fi
$( hide) if grep -q '^CONFIG_MODULES=y' $( KERNEL_CONFIG) ; then \
echo "Building Kernel Modules" ; \
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) modules; \
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) modules; \
fi
.PHONY : INSTALLED_KERNEL_MODULES
INSTALLED_KERNEL_MODULES :
$( hide) if grep -q '^CONFIG_MODULES=y' $( KERNEL_CONFIG) ; then \
echo "Installing Kernel Modules" ; \
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) INSTALL_MOD_PATH = ../../$( KERNEL_MODULES_INSTALL) modules_install && \
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) INSTALL_MOD_PATH = ../../$( KERNEL_MODULES_INSTALL) modules_install && \
mofile = $$ ( find $( KERNEL_MODULES_OUT) -type f -name modules.order) && \
mpath = $$ ( dirname $$ mofile) && \
for f in $$ ( find $$ mpath/kernel -type f -name '*.ko' ) ; do \
@ -313,47 +351,47 @@ $(KERNEL_HEADERS_INSTALL_STAMP): $(KERNEL_OUT_STAMP) $(KERNEL_CONFIG)
@echo "Building Kernel Headers"
$( hide) if [ ! -z " $( KERNEL_HEADER_DEFCONFIG) " ] ; then \
rm -f ../$( KERNEL_CONFIG) ; \
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_HEADER_ARCH) $( KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG = $( VARIANT_DEFCONFIG) SELINUX_DEFCONFIG = $( SELINUX_DEFCONFIG) $( KERNEL_HEADER_DEFCONFIG) ; \
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_HEADER_ARCH) $( KERNEL_CROSS_COMPILE) headers_install; fi
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_HEADER_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) VARIANT_DEFCONFIG = $( VARIANT_DEFCONFIG) SELINUX_DEFCONFIG = $( SELINUX_DEFCONFIG) $( KERNEL_HEADER_DEFCONFIG) ; \
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_HEADER_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) headers_install; fi
$( hide) if [ " $( KERNEL_HEADER_DEFCONFIG) " != " $( KERNEL_DEFCONFIG) " ] ; then \
echo "Used a different defconfig for header generation" ; \
rm -f ../$( KERNEL_CONFIG) ; \
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG = $( VARIANT_DEFCONFIG) SELINUX_DEFCONFIG = $( SELINUX_DEFCONFIG) $( KERNEL_DEFCONFIG) ; fi
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) VARIANT_DEFCONFIG = $( VARIANT_DEFCONFIG) SELINUX_DEFCONFIG = $( SELINUX_DEFCONFIG) $( KERNEL_DEFCONFIG) ; fi
$( hide) if [ ! -z " $( KERNEL_CONFIG_OVERRIDE) " ] ; then \
echo " Overriding kernel config with ' $( KERNEL_CONFIG_OVERRIDE) ' " ; \
echo $( KERNEL_CONFIG_OVERRIDE) >> $( KERNEL_OUT) /.config; \
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) oldconfig; fi
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) oldconfig; fi
$( hide) if [ ! -z " $( KERNEL_ADDITIONAL_CONFIG) " ] ; then \
echo " Using additional config ' $( KERNEL_ADDITIONAL_CONFIG) ' " ; \
$( KERNEL_SRC) /scripts/kconfig/merge_config.sh -m -O $( KERNEL_OUT) $( KERNEL_OUT) /.config $( KERNEL_SRC) /arch/$( KERNEL_ARCH) /configs/$( KERNEL_ADDITIONAL_CONFIG) ; \
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) KCONFIG_ALLCONFIG = $( KERNEL_OUT) /.config alldefconfig; fi
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) KCONFIG_ALLCONFIG = $( KERNEL_OUT) /.config alldefconfig; fi
$( hide) touch $@
# provide this rule because there are dependencies on this throughout the repo
$(KERNEL_HEADERS_INSTALL) : $( KERNEL_HEADERS_INSTALL_STAMP )
kerneltags : $( KERNEL_OUT_STAMP ) $( KERNEL_CONFIG )
$( MAKE) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) tags
$( MAKE) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) tags
kernelconfig : KERNELCONFIG_MODE := menuconfig
kernelxconfig : KERNELCONFIG_MODE := xconfig
kernelxconfig kernelconfig : $( KERNEL_OUT_STAMP )
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_DEFCONFIG)
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) $( KERNEL_ DEFCONFIG)
env KCONFIG_NOTIMESTAMP = true \
$( MAKE) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNELCONFIG_MODE)
$( MAKE) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) $( KERNEL CONFIG_MODE)
env KCONFIG_NOTIMESTAMP = true \
$( MAKE) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) savedefconfig
$( MAKE) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) savedefconfig
cp $( KERNEL_OUT) /defconfig $( KERNEL_DEFCONFIG_SRC)
kernelsavedefconfig : $( KERNEL_OUT_STAMP )
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_DEFCONFIG)
$( MAKE) $( MAKE_FLAGS) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) $( KERNEL_ DEFCONFIG)
env KCONFIG_NOTIMESTAMP = true \
$( MAKE) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) savedefconfig
$( MAKE) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) savedefconfig
cp $( KERNEL_OUT) /defconfig $( KERNEL_DEFCONFIG_SRC)
alldefconfig : $( KERNEL_OUT_STAMP )
env KCONFIG_NOTIMESTAMP = true \
$( MAKE) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) alldefconfig
$( MAKE) -C $( KERNEL_SRC) O = $( KERNEL_OUT) ARCH = $( KERNEL_ARCH) $( KERNEL_CROSS_COMPILE) $( KERNEL_CLANG_TRIPLE) $( KERNEL_CC) alldefconfig
e n d i f # FULL_KERNEL_BUILD