diff options
-rwxr-xr-x | buildkernel.sh | 2 | ||||
-rw-r--r-- | kernel_definitions.mk | 133 |
2 files changed, 95 insertions, 40 deletions
diff --git a/buildkernel.sh b/buildkernel.sh index 26a6a42..f5e8e0a 100755 --- a/buildkernel.sh +++ b/buildkernel.sh @@ -383,7 +383,7 @@ if [ ! -z ${USE_PREBUILT_KERNEL} ] && [ -d ${KERNEL_BINS} ]; then fi #use kernel source for building -if [ ! -z ${HEADERS_INSTALL} ]; then +if [ "${HEADERS_INSTALL}" -ne "0" ]; then make_defconfig headers_install else diff --git a/kernel_definitions.mk b/kernel_definitions.mk index cdbbddc..b903552 100644 --- a/kernel_definitions.mk +++ b/kernel_definitions.mk @@ -148,20 +148,60 @@ TARGET_PREBUILT_KERNEL := $(TARGET_PREBUILT_INT_KERNEL) endif endif +# If the configuration is QGKI, build the GKI kernel as well +# The build system overrides INSTALLED_KERNEL_TARGET if BOARD_KERNEL_BINARIES is defined +ifeq ($(GKI_KERNEL),1) + ifeq "$(KERNEL_DEFCONFIG)" "vendor/$(TARGET_BOARD_PLATFORM)-qgki_defconfig" + $(info Additional GKI images will be built) + BOARD_KERNEL_BINARIES := kernel kernel-gki + INSTALLED_KERNEL_TARGET := $(foreach k,$(BOARD_KERNEL_BINARIES), $(PRODUCT_OUT)/$(k)) + + # Create new definitions for building an additional GKI kernel on the side + GKI_INSTALLED_KERNEL_TARGET := $(PRODUCT_OUT)/kernel-gki + GKI_KERNEL_DEFCONFIG := vendor/$(TARGET_BOARD_PLATFORM)-gki_defconfig + GKI_KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/kernel-gki/$(TARGET_KERNEL) + GKI_KERNEL_MODULES_OUT := $(PRODUCT_OUT)/$(KERNEL_MODULES_INSTALL)/lib/modules/gki + GKI_KERNEL_HEADERS_INSTALL := $(GKI_KERNEL_OUT)/usr + GKI_TARGET_PREBUILT_INT_KERNEL := $(subst kernel,kernel-gki,$(TARGET_PREBUILT_INT_KERNEL)) + GKI_TARGET_PREBUILT_KERNEL := $(GKI_TARGET_PREBUILT_INT_KERNEL) + GKI_TARGET_MODULES_DIR := $(TARGET_KERNEL_VERSION)-gki + + BOARD_KERNEL_MODULE_DIRS := $(GKI_TARGET_MODULES_DIR) + BOARD_KERNEL-GKI_BOOTIMAGE_PARTITION_SIZE := 0x06000000 + endif +endif + # Archieve the DLKMs that goes into vendor.img and vendor-ramdisk. # Also, make them dependent on the kernel compilation. VENDOR_KERNEL_MODULES_ARCHIVE := vendor_modules.zip BOARD_VENDOR_KERNEL_MODULES_ARCHIVE := $(KERNEL_MODULES_OUT)/$(VENDOR_KERNEL_MODULES_ARCHIVE) $(BOARD_VENDOR_KERNEL_MODULES_ARCHIVE): $(TARGET_PREBUILT_KERNEL) +ifneq ($(GKI_INSTALLED_KERNEL_TARGET),) +BOARD_VENDOR_KERNEL_MODULES_ARCHIVE_$(GKI_TARGET_MODULES_DIR) := $(GKI_KERNEL_MODULES_OUT)/$(VENDOR_KERNEL_MODULES_ARCHIVE) +$(BOARD_VENDOR_KERNEL_MODULES_ARCHIVE_$(GKI_TARGET_MODULES_DIR)): $(GKI_TARGET_PREBUILT_KERNEL) +endif + +BOARD_VENDOR_KERNEL_MODULES_$(GKI_TARGET_MODULES_DIR) = \ + $(foreach mod, $(BOARD_VENDOR_KERNEL_MODULES), \ + $(subst $(KERNEL_MODULES_OUT), $(GKI_KERNEL_MODULES_OUT), $(mod))) + $(warning VENDOR_RAMDISK_KERNEL_MODLUES = $(VENDOR_RAMDISK_KERNEL_MODLUES)) ifneq ($(VENDOR_RAMDISK_KERNEL_MODULES),) VENDOR_RAMDISK_KERNEL_MODULES_ARCHIVE := vendor_ramdisk_modules.zip + +ifeq "$(KERNEL_DEFCONFIG)" "vendor/$(TARGET_BOARD_PLATFORM)-gki_defconfig" BOARD_VENDOR_RAMDISK_KERNEL_MODULES_ARCHIVE := $(KERNEL_MODULES_OUT)/$(VENDOR_RAMDISK_KERNEL_MODULES_ARCHIVE) $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_ARCHIVE): $(TARGET_PREBUILT_KERNEL) endif +ifneq ($(GKI_INSTALLED_KERNEL_TARGET),) +BOARD_VENDOR_RAMDISK_KERNEL_MODULES_ARCHIVE_$(GKI_TARGET_MODULES_DIR) := $(GKI_KERNEL_MODULES_OUT)/$(VENDOR_RAMDISK_KERNEL_MODULES_ARCHIVE) +$(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_ARCHIVE_$(GKI_TARGET_MODULES_DIR)): $(GKI_TARGET_PREBUILT_KERNEL) +endif +endif + # Add RTIC DTB to dtb.img if RTIC MPGen is enabled. # Note: unfortunately we can't define RTIC DTS + DTB rule here as the # following variable/ tools (needed for DTS generation) @@ -174,19 +214,40 @@ RTIC_DTB := $(KERNEL_SYMLINK)/rtic_mp.dtb endif MAKE_PATH := $(SOURCE_ROOT)/prebuilts/build-tools/linux-x86/bin/ -# Android Kernel make rules -$(KERNEL_HEADERS_INSTALL): $(KERNEL_OUT) $(KERNEL_GENERATE_DEFCONFIG) $(DTC) $(UFDT_APPLY_OVERLAY) +# Helper functions + +ifeq ($(GKI_KERNEL),1) +# Generate the defconfig file from fragments +# $(1): The defconfig to generate. For example, vendor/lahaina-qgki_defconfig +define generate-defconfig + set -x; \ + ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(real_cc) KERN_OUT=$(KERNEL_OUT) $(TARGET_KERNEL_MAKE_ENV) MAKE_PATH=$(MAKE_PATH) $(TARGET_KERNEL_SOURCE)/scripts/gki/generate_defconfig.sh $(1); \ + set +x +endef +else +define generate-defconfig +endef +endif + +# Build the kernel +# $(1): KERNEL_DEFCONFIG to build for +# $(2): KERNEL_OUT directory +# $(3): KERNEL_MODULES_OUT directory +# $(4): KERNEL_HEADERS_INSTALL directory +# $(5): HEADERS_INSTALL; If 1, the call would just generate the headers and quit +# $(6): TARGET_PREBUILT_INT_KERNEL: The location to the kernel's binary format (Image, zImage, and so on) +define build-kernel KERNEL_DIR=$(TARGET_KERNEL_SOURCE) \ - DEFCONFIG=$(KERNEL_DEFCONFIG) \ - OUT_DIR=$(KERNEL_OUT) \ + DEFCONFIG=$(1) \ + OUT_DIR=$(2) \ MAKE_PATH=$(MAKE_PATH)\ ARCH=$(KERNEL_ARCH) \ CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) \ - KERNEL_MODULES_OUT=$(KERNEL_MODULES_OUT) \ - KERNEL_HEADERS_INSTALL=$(KERNEL_HEADERS_INSTALL) \ - HEADERS_INSTALL=1 \ - TARGET_PREBUILT_INT_KERNEL=$(TARGET_PREBUILT_INT_KERNEL) \ + KERNEL_MODULES_OUT=$(3) \ + KERNEL_HEADERS_INSTALL=$(4) \ + HEADERS_INSTALL=$(5) \ + TARGET_PREBUILT_INT_KERNEL=$(6) \ TARGET_INCLUDES=$(TARGET_KERNEL_MAKE_CFLAGS) \ TARGET_LINCLUDES=$(TARGET_KERNEL_MAKE_LDFLAGS) \ VENDOR_KERNEL_MODULES_ARCHIVE=$(VENDOR_KERNEL_MODULES_ARCHIVE) \ @@ -196,6 +257,13 @@ $(KERNEL_HEADERS_INSTALL): $(KERNEL_OUT) $(KERNEL_GENERATE_DEFCONFIG) $(DTC) $(U device/qcom/kernelscripts/buildkernel.sh \ $(real_cc) \ $(TARGET_KERNEL_MAKE_ENV) +endef + +# Android Kernel make rules + +$(KERNEL_HEADERS_INSTALL): $(KERNEL_OUT) $(DTC) $(UFDT_APPLY_OVERLAY) + $(call generate-defconfig,$(KERNEL_DEFCONFIG)); \ + $(call build-kernel,$(KERNEL_DEFCONFIG),$(KERNEL_OUT),$(KERNEL_MODULES_OUT),$(KERNEL_HEADERS_INSTALL),1,$(TARGET_PREBUILT_INT_KERNEL)) $(KERNEL_OUT): mkdir -p $(KERNEL_OUT) @@ -204,37 +272,24 @@ $(KERNEL_USR): $(KERNEL_HEADERS_INSTALL) rm -rf $(KERNEL_SYMLINK) ln -s kernel/$(TARGET_KERNEL) $(KERNEL_SYMLINK) -$(TARGET_PREBUILT_KERNEL): $(KERNEL_OUT) $(KERNEL_GENERATE_DEFCONFIG) $(DTC) $(KERNEL_USR) - KERNEL_DIR=$(TARGET_KERNEL_SOURCE) \ - DEFCONFIG=$(KERNEL_DEFCONFIG) \ - OUT_DIR=$(KERNEL_OUT) \ - MAKE_PATH=$(MAKE_PATH)\ - ARCH=$(KERNEL_ARCH) \ - CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) \ - KERNEL_MODULES_OUT=$(KERNEL_MODULES_OUT) \ - KERNEL_HEADERS_INSTALL=$(KERNEL_HEADERS_INSTALL) \ - TARGET_PREBUILT_INT_KERNEL=$(TARGET_PREBUILT_INT_KERNEL) \ - TARGET_INCLUDES=$(TARGET_KERNEL_MAKE_CFLAGS) \ - TARGET_LINCLUDES=$(TARGET_KERNEL_MAKE_LDFLAGS) \ - VENDOR_KERNEL_MODULES_ARCHIVE=$(VENDOR_KERNEL_MODULES_ARCHIVE) \ - VENDOR_RAMDISK_KERNEL_MODULES_ARCHIVE=$(VENDOR_RAMDISK_KERNEL_MODULES_ARCHIVE) \ - VENDOR_RAMDISK_KERNEL_MODULES="$(VENDOR_RAMDISK_KERNEL_MODULES)" \ - TARGET_PRODUCT=$(TARGET_BOARD_PLATFORM) \ - device/qcom/kernelscripts/buildkernel.sh \ - $(real_cc) \ - $(TARGET_KERNEL_MAKE_ENV) - -ifeq ($(GKI_KERNEL),1) -$(KERNEL_GENERATE_DEFCONFIG): - set -x - ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(real_cc) KERN_OUT=$(KERNEL_OUT) $(TARGET_KERNEL_MAKE_ENV) MAKE_PATH=$(MAKE_PATH) $(TARGET_KERNEL_SOURCE)/scripts/gki/generate_defconfig.sh $(KERNEL_DEFCONFIG) - set +x -else -$(KERNEL_GENERATE_DEFCONFIG): -endif - -$(INSTALLED_KERNEL_TARGET): $(TARGET_PREBUILT_KERNEL) | $(ACP) - $(transform-prebuilt-to-target) +$(TARGET_PREBUILT_KERNEL): $(KERNEL_OUT) $(DTC) $(KERNEL_USR) + echo "Building the requested kernel.."; \ + $(call generate-defconfig,$(KERNEL_DEFCONFIG)); \ + $(call build-kernel,$(KERNEL_DEFCONFIG),$(KERNEL_OUT),$(KERNEL_MODULES_OUT),$(KERNEL_HEADERS_INSTALL),0,$(TARGET_PREBUILT_INT_KERNEL)) + +# Make GKI_TARGET_PREBUILT_KERNEL dependent on TARGET_PREBUILT_KERNEL just so +# that the builds are serialzed. This is just to avoid hogging CPU resoruces +# and to avoid any potential race-conditions. +$(GKI_TARGET_PREBUILT_KERNEL): $(DTC) $(TARGET_PREBUILT_KERNEL) + echo "Building GKI kernel.."; \ + $(call generate-defconfig,$(GKI_KERNEL_DEFCONFIG)); \ + $(call build-kernel,$(GKI_KERNEL_DEFCONFIG),$(GKI_KERNEL_OUT),$(GKI_KERNEL_MODULES_OUT),$(GKI_KERNEL_HEADERS_INSTALL),0,$(GKI_TARGET_PREBUILT_INT_KERNEL)) + +$(INSTALLED_KERNEL_TARGET): $(TARGET_PREBUILT_KERNEL) $(GKI_TARGET_PREBUILT_KERNEL) + cp $(TARGET_PREBUILT_KERNEL) $(PRODUCT_OUT)/kernel + if [ ! -z "$(GKI_TARGET_PREBUILT_KERNEL)" ]; then \ + cp $(GKI_TARGET_PREBUILT_KERNEL) $(PRODUCT_OUT)/kernel-gki; \ + fi # RTIC DTS to DTB (if MPGen enabled; # and make sure we don't break the build if rtic_mp.dts missing) |