From 6d374e48c16b7ea1cca38204e5e7c4486e3e823a Mon Sep 17 00:00:00 2001 From: LuK1337 Date: Thu, 7 Mar 2024 10:31:13 +0100 Subject: [PATCH 01/76] kernel: Add clean headers script to workaround conflicts with bionic After the "Avoid multiple definitions of sigaction." change in bionic, we ought to modify our kernel headers to make sure that sigaction struct is not present in uapi headers. Change-Id: I15645480e013e79cbcafaac99253368b646b6b11 --- build/soong/Android.bp | 2 +- tools/clean_headers.sh | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100755 tools/clean_headers.sh diff --git a/build/soong/Android.bp b/build/soong/Android.bp index 36f0427..6021975 100644 --- a/build/soong/Android.bp +++ b/build/soong/Android.bp @@ -21,7 +21,7 @@ twrp_generator { name: "generated_kernel_includes", // The headers make command - cmd: "$(PATH_OVERRIDE_SOONG) $(KERNEL_MAKE_CMD) $(KERNEL_MAKE_FLAGS) -C $(TARGET_KERNEL_HEADERS_SOURCE) O=$(KERNEL_BUILD_OUT_PREFIX)$(genDir) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) headers_install", + cmd: "$(PATH_OVERRIDE_SOONG) $(KERNEL_MAKE_CMD) $(KERNEL_MAKE_FLAGS) -C $(TARGET_KERNEL_SOURCE) O=$(KERNEL_BUILD_OUT_PREFIX)$(genDir) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) headers_install && vendor/twrp/tools/clean_headers.sh $(KERNEL_BUILD_OUT_PREFIX)$(genDir)", // Directories that can be imported by a cc_* module generated_headers property export_include_dirs: [ diff --git a/tools/clean_headers.sh b/tools/clean_headers.sh new file mode 100755 index 0000000..627f646 --- /dev/null +++ b/tools/clean_headers.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -eu + +export ANDROID_BUILD_TOP="$PWD" + +./bionic/libc/kernel/tools/clean_header.py -u \ + "$1/usr/include/asm-generic/signal.h" From 623015e96b5da5f59d5c02f682309e3150ddb7ec Mon Sep 17 00:00:00 2001 From: Alexander Koskovich Date: Wed, 15 Jun 2022 08:46:57 -0700 Subject: [PATCH 02/76] kernel: Use LLVM's substitutes for GNU binutils if possible Co-authored-by: LuK1337 Change-Id: I06884fb774b6548aad68942f1ce659384521c62a --- config/BoardConfigKernel.mk | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 7042ccc..d0df6c9 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2020 The LineageOS Project +# Copyright (C) 2018-2022 The LineageOS Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -31,6 +31,9 @@ # x86_64-linux-android- for x86 # # TARGET_KERNEL_CLANG_COMPILE = Compile kernel with clang, defaults to true +# TARGET_KERNEL_VERSION = Reported kernel version in top level kernel +# makefile. Can be overriden in device trees +# in the event of prebuilt kernel. # # KERNEL_TOOLCHAIN_PREFIX = Overrides TARGET_KERNEL_CROSS_COMPILE_PREFIX, # Set this var in shell to override @@ -56,6 +59,10 @@ else KERNEL_ARCH := $(TARGET_KERNEL_ARCH) endif +KERNEL_VERSION := $(shell grep "^VERSION = " $(TARGET_KERNEL_SOURCE)/Makefile | awk '{ print $$3 }') +KERNEL_PATCHLEVEL := $(shell grep "^PATCHLEVEL = " $(TARGET_KERNEL_SOURCE)/Makefile | awk '{ print $$3 }') +TARGET_KERNEL_VERSION ?= $(shell echo $(KERNEL_VERSION)"."$(KERNEL_PATCHLEVEL)) + CLANG_PREBUILTS := $(BUILD_TOP)/prebuilts/clang/host/$(HOST_PREBUILT_TAG)/clang-r416183b1 GCC_PREBUILTS := $(BUILD_TOP)/prebuilts/gcc/$(HOST_PREBUILT_TAG) # arm64 toolchain @@ -153,6 +160,13 @@ KERNEL_MAKE_CMD := $(BUILD_TOP)/prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/m KERNEL_MAKE_FLAGS += HOSTCC=$(CLANG_PREBUILTS)/bin/clang KERNEL_MAKE_FLAGS += HOSTCXX=$(CLANG_PREBUILTS)/bin/clang++ +# Use LLVM's substitutes for GNU binutils if compatible kernel version. +ifneq ($(TARGET_KERNEL_CLANG_COMPILE), false) +ifneq (,$(filter 5.4, $(TARGET_KERNEL_VERSION))) + KERNEL_MAKE_FLAGS += LLVM=1 LLVM_IAS=1 +endif +endif + # Since Linux 4.16, flex and bison are required KERNEL_MAKE_FLAGS += LEX=$(BUILD_TOP)/prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/flex KERNEL_MAKE_FLAGS += YACC=$(BUILD_TOP)/prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/bison From e46c8a35dad1f505785469e0867b776a8d85f5d4 Mon Sep 17 00:00:00 2001 From: Alexander Koskovich Date: Wed, 15 Jun 2022 23:58:31 -0700 Subject: [PATCH 03/76] lineage: config: Don't pass CFLAGS_MODULE="-fno-pic" if using LLVM * Seemingly not an issue for kernels compiled with LLVM, tested with kernel versions 4.4 -> 5.4. Change-Id: I00adee2e10e99a540099b5e1a6a1ab9be0b99050 --- config/BoardConfigKernel.mk | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index d0df6c9..51edaa2 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -117,14 +117,16 @@ KERNEL_MAKE_FLAGS := # Add back threads, ninja cuts this to $(nproc)/2 KERNEL_MAKE_FLAGS += -j$(shell prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin/nproc --all) -ifeq ($(KERNEL_ARCH),arm) - # Avoid "Unknown symbol _GLOBAL_OFFSET_TABLE_" errors - KERNEL_MAKE_FLAGS += CFLAGS_MODULE="-fno-pic" -endif +ifeq ($(TARGET_KERNEL_CLANG_COMPILE),false) + ifeq ($(KERNEL_ARCH),arm) + # Avoid "Unknown symbol _GLOBAL_OFFSET_TABLE_" errors + KERNEL_MAKE_FLAGS += CFLAGS_MODULE="-fno-pic" + endif -ifeq ($(KERNEL_ARCH),arm64) - # Avoid "unsupported RELA relocation: 311" errors (R_AARCH64_ADR_GOT_PAGE) - KERNEL_MAKE_FLAGS += CFLAGS_MODULE="-fno-pic" + ifeq ($(KERNEL_ARCH),arm64) + # Avoid "unsupported RELA relocation: 311" errors (R_AARCH64_ADR_GOT_PAGE) + KERNEL_MAKE_FLAGS += CFLAGS_MODULE="-fno-pic" + endif endif ifeq ($(HOST_OS),darwin) From ca1004e8600a93fd6fb7cc673cae42057c42536f Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Thu, 17 Feb 2022 18:49:04 +0200 Subject: [PATCH 04/76] build: Fix kernelsavedefconfig target Change-Id: Ie3d9a187693f2435f2555658c833de666848e48e --- build/tasks/kernel.mk | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 779df53..bdac8ef 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -348,9 +348,7 @@ kerneltags: $(KERNEL_CONFIG) .PHONY: kernelsavedefconfig alldefconfig kernelsavedefconfig: $(KERNEL_OUT) - $(call make-kernel-target,$(KERNEL_DEFCONFIG)) - env KCONFIG_NOTIMESTAMP=true \ - $(call make-kernel-target,savedefconfig) + $(call make-kernel-config,$(KERNEL_OUT),$(KERNEL_DEFCONFIG)) cp $(KERNEL_OUT)/defconfig $(KERNEL_DEFCONFIG_SRC) alldefconfig: $(KERNEL_OUT) From da4c725f81c6a062566e987654824fb948a49438 Mon Sep 17 00:00:00 2001 From: LuK1337 Date: Thu, 10 Jun 2021 20:50:15 +0200 Subject: [PATCH 05/76] kernel: Pass absolute path for KCONFIG_ALLCONFIG It fails to read relative one, at least on QCOM 4.19 kernel base. Change-Id: Iacbcadfabfcebb80a7f5934825123fdfa913c63c --- build/tasks/kernel.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index bdac8ef..3289271 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -309,7 +309,7 @@ $(KERNEL_CONFIG): $(KERNEL_DEFCONFIG_SRC) $(KERNEL_ADDITIONAL_CONFIG_OUT) $(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); \ - $(call make-kernel-target,KCONFIG_ALLCONFIG=$(KERNEL_OUT)/.config alldefconfig); \ + $(call make-kernel-target,KCONFIG_ALLCONFIG=$(KERNEL_BUILD_OUT_PREFIX)$(KERNEL_OUT)/.config alldefconfig); \ fi $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) From 903f53577206eff30d5a67f1513a8c96a6d5ad43 Mon Sep 17 00:00:00 2001 From: marcost2 Date: Tue, 6 Jul 2021 12:55:59 -0300 Subject: [PATCH 06/76] Add support for separate kernels for boot and recovery [1/2] * Either as prebuilts, or with separate defconfigs Change-Id: Iad877a5fbef095e3e5d792aebb240c230a829552 --- build/tasks/kernel.mk | 169 +++++++++++++++++++++++++++++++----------- 1 file changed, 127 insertions(+), 42 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 3289271..676a685 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -72,16 +72,20 @@ ifneq ($(TARGET_NO_KERNEL_OVERRIDE),true) KERNEL_SRC := $(TARGET_KERNEL_SOURCE) # kernel configuration - mandatory KERNEL_DEFCONFIG := $(TARGET_KERNEL_CONFIG) +RECOVERY_DEFCONFIG := $(TARGET_KERNEL_RECOVERY_CONFIG) VARIANT_DEFCONFIG := $(TARGET_KERNEL_VARIANT_CONFIG) SELINUX_DEFCONFIG := $(TARGET_KERNEL_SELINUX_CONFIG) ## Internal variables DTC := $(HOST_OUT_EXECUTABLES)/dtc KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ +RECOVERY_KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/RECOVERY_KERNEL_OBJ DTBO_OUT := $(TARGET_OUT_INTERMEDIATES)/DTBO_OBJ DTB_OUT := $(TARGET_OUT_INTERMEDIATES)/DTB_OBJ KERNEL_CONFIG := $(KERNEL_OUT)/.config KERNEL_RELEASE := $(KERNEL_OUT)/include/config/kernel.release +RECOVERY_KERNEL_CONFIG := $(RECOVERY_KERNEL_OUT)/.config +RECOVERY_KERNEL_RELEASE := $(RECOVERY_KERNEL_OUT)/include/config/kernel.release ifeq ($(KERNEL_ARCH),x86_64) @@ -91,6 +95,7 @@ KERNEL_DEFCONFIG_ARCH := $(KERNEL_ARCH) endif KERNEL_DEFCONFIG_DIR := $(KERNEL_SRC)/arch/$(KERNEL_DEFCONFIG_ARCH)/configs KERNEL_DEFCONFIG_SRC := $(KERNEL_DEFCONFIG_DIR)/$(KERNEL_DEFCONFIG) +RECOVERY_KERNEL_DEFCONFIG_SRC := $(KERNEL_DEFCONFIG_DIR)/$(RECOVERY_DEFCONFIG) ifneq ($(TARGET_KERNEL_ADDITIONAL_CONFIG),) KERNEL_ADDITIONAL_CONFIG := $(TARGET_KERNEL_ADDITIONAL_CONFIG) @@ -110,6 +115,8 @@ ifeq ($(TARGET_PREBUILT_KERNEL),) endif TARGET_PREBUILT_INT_KERNEL := $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/$(BOARD_KERNEL_IMAGE_NAME) +TARGET_PREBUILT_INT_RECOVERY_KERNEL := $(RECOVERY_KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/$(BOARD_KERNEL_IMAGE_NAME) + ifeq "$(wildcard $(KERNEL_SRC) )" "" ifneq ($(TARGET_PREBUILT_KERNEL),) HAS_PREBUILT_KERNEL := true @@ -174,38 +181,45 @@ else endif endif -ifeq ($(FULL_KERNEL_BUILD),true) - -ifeq ($(NEED_KERNEL_MODULE_ROOT),true) -KERNEL_MODULES_OUT := $(TARGET_ROOT_OUT) -KERNEL_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_recovery) -KERNEL_MODULE_MOUNTPOINT := -else ifeq ($(NEED_KERNEL_MODULE_SYSTEM),true) -KERNEL_MODULES_OUT := $(TARGET_OUT) -KERNEL_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_system) -KERNEL_MODULE_MOUNTPOINT := system -$(INSTALLED_SYSTEMIMAGE_TARGET): $(TARGET_PREBUILT_INT_KERNEL) -else ifeq ($(NEED_KERNEL_MODULE_RECOVERY),true) -KERNEL_MODULES_OUT := $(TARGET_RECOVERY_ROOT_OUT)/vendor -KERNEL_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_recovery) -KERNEL_MODULE_MOUNTPOINT := -$(INSTALLED_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) -else ifeq ($(NEED_KERNEL_MODULE_VENDOR_OVERLAY),true) -KERNEL_MODULES_OUT := $(TARGET_OUT_PRODUCT)/vendor_overlay/$(PRODUCT_TARGET_VNDK_VERSION) -KERNEL_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_product) -KERNEL_MODULE_MOUNTPOINT := vendor -$(INSTALLED_PRODUCTIMAGE_TARGET): $(TARGET_PREBUILT_INT_KERNEL) +ifneq ($(TARGET_KERNEL_RECOVERY_CONFIG),) + ifeq "$(wildcard $(KERNEL_SRC) )" "" + ifeq ($(TARGET_PREBUILT_RECOVERY_KERNEL),) + $(warning ***************************************************************) + $(warning * *) + $(warning * No recovery kernel source found, and no fallback prebuilt *) + $(warning * defined. Please make sure your device is properly *) + $(warning * configured to download the kernel repository to $(KERNEL_SRC)) + $(warning * or remove TARGET_KERNEL_RECOVERY_CONFIG from BoardConfig.mk *) + $(warning * *) + $(warning * Or, define the TARGET_PREBUILT_RECOVERY_KERNEL *) + $(warning * variable with the path to the prebuilt recovery kernel image*) + $(warning * in your BoardConfig.mk file *) + $(warning * *) + $(warning ***************************************************************) + $(error "NO RECOVERY KERNEL SOURCE") + endif + endif + ifneq ($(BOARD_USES_RECOVERY_AS_BOOT),) + $(warning ********************************************************) + $(warning * TARGET_KERNEL_RECOVERY_CONFIG set but device uses *) + $(warning * RECOVERY_AS_BOOT, which uses boot kernel as recovery *) + $(warning * kernel, as such it's not possible to use different *) + $(warning * configs *) + $(warning ********************************************************) + $(error "INVALID CONFIGURATION") + else + FULL_RECOVERY_KERNEL_BUILD := true + RECOVERY_KERNEL_COPY := true + RECOVERY_BIN := $(TARGET_PREBUILT_INT_RECOVERY_KERNEL) + endif else -KERNEL_MODULES_OUT := $(TARGET_OUT_VENDOR) -KERNEL_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_vendor) -KERNEL_MODULE_MOUNTPOINT := vendor -$(INSTALLED_VENDORIMAGE_TARGET): $(TARGET_PREBUILT_INT_KERNEL) + ifneq ($(TARGET_PREBUILT_RECOVERY_KERNEL),) + RECOVERY_BIN := $(TARGET_PREBUILT_RECOVERY_KERNEL) + RECOVERY_KERNEL_COPY := true + endif endif -MODULES_INTERMEDIATES := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,kernel_modules) - -KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_vendor_ramdisk) -$(INTERNAL_VENDOR_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) +ifeq ($(or $(FULL_RECOVERY_KERNEL_BUILD), $(FULL_KERNEL_BUILD)),true) # Add host bin out dir to path PATH_OVERRIDE := PATH=$(KERNEL_BUILD_OUT_PREFIX)$(HOST_OUT_EXECUTABLES):$$PATH ifneq ($(TARGET_KERNEL_CLANG_COMPILE),false) @@ -250,12 +264,37 @@ define internal-make-kernel-target $(PATH_OVERRIDE) $(KERNEL_MAKE_CMD) $(KERNEL_MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_BUILD_OUT_PREFIX)$(1) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(KERNEL_CLANG_TRIPLE) $(KERNEL_CC) $(KERNEL_LD) $(2) endef +# Generate kernel .config from a given defconfig +# $(1): Output path (The value passed to O=) +# $(2): The defconfig to process (just the filename, no need for full path to file) +define make-kernel-config + $(call internal-make-kernel-target,$(1),VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(2)) + $(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \ + echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \ + echo $(KERNEL_CONFIG_OVERRIDE) >> $(1)/.config; \ + $(call make-kernel-target,oldconfig); \ + fi + # Create defconfig build artifact + $(call internal-make-kernel-target,$(1),savedefconfig) + $(hide) if [ ! -z "$(KERNEL_ADDITIONAL_CONFIG)" ]; then \ + echo "Using additional config '$(KERNEL_ADDITIONAL_CONFIG)'"; \ + $(KERNEL_SRC)/scripts/kconfig/merge_config.sh -m -O $(1) $(1)/.config $(KERNEL_SRC)/arch/$(KERNEL_ARCH)/configs/$(KERNEL_ADDITIONAL_CONFIG); \ + $(call make-kernel-target,KCONFIG_ALLCONFIG=$(KERNEL_BUILD_OUT_PREFIX)$(1)/.config alldefconfig); \ + fi +endef + # Make a kernel target # $(1): The kernel target to build (eg. defconfig, modules, modules_install) define make-kernel-target $(call internal-make-kernel-target,$(KERNEL_OUT),$(1)) endef +# Make a recovery kernel target +# $(1): The kernel target to build (eg. defconfig, modules, modules_install) +define make-recovery-kernel-target +$(call internal-make-kernel-target,$(RECOVERY_KERNEL_OUT),$(1)) +endef + # Make a DTBO target # $(1): The DTBO target to build (eg. dtbo.img, defconfig) define make-dtbo-target @@ -290,6 +329,35 @@ define build-image-kernel-modules-twrp done endef +endif # FULL_RECOVERY_KERNEL_BUILD or FULL_KERNEL_BUILD + +ifeq ($(FULL_KERNEL_BUILD),true) + +ifeq ($(NEED_KERNEL_MODULE_ROOT),true) +KERNEL_MODULES_OUT := $(TARGET_ROOT_OUT) +KERNEL_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_recovery) +KERNEL_MODULE_MOUNTPOINT := +else ifeq ($(NEED_KERNEL_MODULE_SYSTEM),true) +KERNEL_MODULES_OUT := $(TARGET_OUT) +KERNEL_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_system) +KERNEL_MODULE_MOUNTPOINT := system +$(INSTALLED_SYSTEMIMAGE_TARGET): $(TARGET_PREBUILT_INT_KERNEL) +else ifeq ($(NEED_KERNEL_MODULE_VENDOR_OVERLAY),true) +KERNEL_MODULES_OUT := $(TARGET_OUT_PRODUCT)/vendor_overlay/$(PRODUCT_TARGET_VNDK_VERSION) +KERNEL_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_product) +KERNEL_MODULE_MOUNTPOINT := vendor +$(INSTALLED_PRODUCTIMAGE_TARGET): $(TARGET_PREBUILT_INT_KERNEL) +else +KERNEL_MODULES_OUT := $(TARGET_OUT_VENDOR) +KERNEL_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_vendor) +KERNEL_MODULE_MOUNTPOINT := vendor +$(INSTALLED_VENDORIMAGE_TARGET): $(TARGET_PREBUILT_INT_KERNEL) +endif +MODULES_INTERMEDIATES := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,kernel_modules) + +KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_vendor_ramdisk) +$(INTERNAL_VENDOR_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) + $(KERNEL_OUT): mkdir -p $(KERNEL_OUT) @@ -298,19 +366,7 @@ $(KERNEL_ADDITIONAL_CONFIG_OUT): $(KERNEL_OUT) $(KERNEL_CONFIG): $(KERNEL_DEFCONFIG_SRC) $(KERNEL_ADDITIONAL_CONFIG_OUT) @echo "Building Kernel Config" - $(call make-kernel-target,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; \ - $(call make-kernel-target,oldconfig); \ - fi - # Create defconfig build artifact - $(call make-kernel-target,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); \ - $(call make-kernel-target,KCONFIG_ALLCONFIG=$(KERNEL_BUILD_OUT_PREFIX)$(KERNEL_OUT)/.config alldefconfig); \ - fi + $(call make-kernel-config,$(KERNEL_OUT),$(KERNEL_DEFCONFIG)) $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) @echo "Building Kernel Image ($(BOARD_KERNEL_IMAGE_NAME))" @@ -400,6 +456,23 @@ define twrp-depmod $(DEPMOD) -b $(TARGET_RECOVERY_ROOT_OUT)/vendor 1.1 endef endif + +ifeq ($(FULL_RECOVERY_KERNEL_BUILD),true) + +$(RECOVERY_KERNEL_OUT): + mkdir -p $(RECOVERY_KERNEL_OUT) + +$(RECOVERY_KERNEL_CONFIG): $(RECOVERY_KERNEL_DEFCONFIG_SRC) + @echo "Building Recovery Kernel Config" + $(call make-kernel-config,$(RECOVERY_KERNEL_OUT),$(RECOVERY_DEFCONFIG)) + +$(TARGET_PREBUILT_INT_RECOVERY_KERNEL): $(RECOVERY_KERNEL_CONFIG) $(DEPMOD) $(DTC) + @echo "Building Recovery Kernel Image ($(BOARD_KERNEL_IMAGE_NAME))" + $(call make-recovery-kernel-target,$(BOARD_KERNEL_IMAGE_NAME)) + + +endif + ## Install it ifeq ($(NEEDS_KERNEL_COPY),true) @@ -415,6 +488,18 @@ endif ALL_PREBUILT += $(INSTALLED_KERNEL_TARGET) endif +ifeq ($(RECOVERY_KERNEL_COPY),true) +file := $(INSTALLED_RECOVERY_KERNEL) +ALL_PREBUILT += $(file) +$(file) : $(RECOVERY_BIN) | $(ACP) + $(transform-prebuilt-to-target) + +ALL_PREBUILT += $(INSTALLED_RECOVERY_KERNEL) +endif + +.PHONY: recovery-kernel +recovery-kernel: $(INSTALLED_RECOVERY_KERNEL) + .PHONY: kernel kernel: $(INSTALLED_KERNEL_TARGET) From d7dd18649a9a6682bf05a813c0eab329e768b90a Mon Sep 17 00:00:00 2001 From: Sebastiano Barezzi Date: Wed, 16 Mar 2022 17:42:13 +0100 Subject: [PATCH 07/76] build: tasks: kernel: Rework kernel fragments handling * Since some time you can specify multiple configs when you prepare .config and they'll get merged to main one * To use it inline: TARGET_KERNEL_CONFIG := main_defconfig fragment1.config fragment2.config ... * TARGET_KERNEL_ADDITIONAL_CONFIG has been nuked since it's superseed by this new logic * kernelsavedefconfig will only use the base defconfig Change-Id: I479c762a9235ed0ef6fcdc79b53e084d5e2d78a6 --- build/tasks/kernel.mk | 41 +++++++++++++---------------------------- 1 file changed, 13 insertions(+), 28 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 676a685..26e9b92 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -21,10 +21,11 @@ # # These config vars are usually set in BoardConfig.mk: # -# TARGET_KERNEL_CONFIG = Kernel defconfig +# TARGET_KERNEL_CONFIG = List of kernel defconfigs, first one being the base one, +# while all the others are fragments that will be merged. +# to main one in .config. # TARGET_KERNEL_VARIANT_CONFIG = Variant defconfig, optional # TARGET_KERNEL_SELINUX_CONFIG = SELinux defconfig, optional -# TARGET_KERNEL_ADDITIONAL_CONFIG = Additional defconfig, optional # # TARGET_KERNEL_CLANG_COMPILE = Compile kernel with clang, defaults to true # @@ -94,19 +95,13 @@ else KERNEL_DEFCONFIG_ARCH := $(KERNEL_ARCH) endif KERNEL_DEFCONFIG_DIR := $(KERNEL_SRC)/arch/$(KERNEL_DEFCONFIG_ARCH)/configs -KERNEL_DEFCONFIG_SRC := $(KERNEL_DEFCONFIG_DIR)/$(KERNEL_DEFCONFIG) -RECOVERY_KERNEL_DEFCONFIG_SRC := $(KERNEL_DEFCONFIG_DIR)/$(RECOVERY_DEFCONFIG) +ALL_KERNEL_DEFCONFIG_SRCS := $(foreach config,$(KERNEL_DEFCONFIG),$(KERNEL_DEFCONFIG_DIR)/$(config)) +ALL_RECOVERY_KERNEL_DEFCONFIG_SRCS := $(foreach config,$(RECOVERY_DEFCONFIG),$(KERNEL_DEFCONFIG_DIR)/$(config)) -ifneq ($(TARGET_KERNEL_ADDITIONAL_CONFIG),) -KERNEL_ADDITIONAL_CONFIG := $(TARGET_KERNEL_ADDITIONAL_CONFIG) -KERNEL_ADDITIONAL_CONFIG_SRC := $(KERNEL_DEFCONFIG_DIR)/$(KERNEL_ADDITIONAL_CONFIG) - ifeq ("$(wildcard $(KERNEL_ADDITIONAL_CONFIG_SRC))","") - $(warning TARGET_KERNEL_ADDITIONAL_CONFIG '$(TARGET_KERNEL_ADDITIONAL_CONFIG)' doesn't exist) - KERNEL_ADDITIONAL_CONFIG_SRC := /dev/null - endif -else - KERNEL_ADDITIONAL_CONFIG_SRC := /dev/null -endif +BASE_KERNEL_DEFCONFIG := $(word 1, $(KERNEL_DEFCONFIG)) +BASE_KERNEL_DEFCONFIG_SRC := $(word 1, $(ALL_KERNEL_DEFCONFIG_SRCS)) +BASE_RECOVERY_KERNEL_DEFCONFIG := $(word 1, $(RECOVERY_DEFCONFIG)) +BASE_RECOVERY_KERNEL_DEFCONFIG_SRC := $(word 1, $(ALL_RECOVERY_KERNEL_DEFCONFIG_SRCS)) ifeq ($(TARGET_PREBUILT_KERNEL),) ifeq ($(BOARD_KERNEL_IMAGE_NAME),) @@ -255,8 +250,6 @@ PATH_OVERRIDE += PATH=$(KERNEL_TOOLCHAIN_PATH_gcc):$$PATH # System tools are no longer allowed on 10+ PATH_OVERRIDE += $(TOOLS_PATH_OVERRIDE) -KERNEL_ADDITIONAL_CONFIG_OUT := $(KERNEL_OUT)/.additional_config - # Internal implementation of make-kernel-target # $(1): output path (The value passed to O=) # $(2): target to build (eg. defconfig, modules, dtbo.img) @@ -276,11 +269,6 @@ define make-kernel-config fi # Create defconfig build artifact $(call internal-make-kernel-target,$(1),savedefconfig) - $(hide) if [ ! -z "$(KERNEL_ADDITIONAL_CONFIG)" ]; then \ - echo "Using additional config '$(KERNEL_ADDITIONAL_CONFIG)'"; \ - $(KERNEL_SRC)/scripts/kconfig/merge_config.sh -m -O $(1) $(1)/.config $(KERNEL_SRC)/arch/$(KERNEL_ARCH)/configs/$(KERNEL_ADDITIONAL_CONFIG); \ - $(call make-kernel-target,KCONFIG_ALLCONFIG=$(KERNEL_BUILD_OUT_PREFIX)$(1)/.config alldefconfig); \ - fi endef # Make a kernel target @@ -361,10 +349,7 @@ $(INTERNAL_VENDOR_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) $(KERNEL_OUT): mkdir -p $(KERNEL_OUT) -$(KERNEL_ADDITIONAL_CONFIG_OUT): $(KERNEL_OUT) - $(hide) cmp -s $(KERNEL_ADDITIONAL_CONFIG_SRC) $@ || cp $(KERNEL_ADDITIONAL_CONFIG_SRC) $@; - -$(KERNEL_CONFIG): $(KERNEL_DEFCONFIG_SRC) $(KERNEL_ADDITIONAL_CONFIG_OUT) +$(KERNEL_CONFIG): $(ALL_KERNEL_DEFCONFIG_SRCS) @echo "Building Kernel Config" $(call make-kernel-config,$(KERNEL_OUT),$(KERNEL_DEFCONFIG)) @@ -404,8 +389,8 @@ kerneltags: $(KERNEL_CONFIG) .PHONY: kernelsavedefconfig alldefconfig kernelsavedefconfig: $(KERNEL_OUT) - $(call make-kernel-config,$(KERNEL_OUT),$(KERNEL_DEFCONFIG)) - cp $(KERNEL_OUT)/defconfig $(KERNEL_DEFCONFIG_SRC) + $(call make-kernel-config,$(KERNEL_OUT),$(BASE_KERNEL_DEFCONFIG)) + cp $(KERNEL_OUT)/defconfig $(BASE_KERNEL_DEFCONFIG_SRC) alldefconfig: $(KERNEL_OUT) env KCONFIG_NOTIMESTAMP=true \ @@ -462,7 +447,7 @@ ifeq ($(FULL_RECOVERY_KERNEL_BUILD),true) $(RECOVERY_KERNEL_OUT): mkdir -p $(RECOVERY_KERNEL_OUT) -$(RECOVERY_KERNEL_CONFIG): $(RECOVERY_KERNEL_DEFCONFIG_SRC) +$(RECOVERY_KERNEL_CONFIG): $(ALL_RECOVERY_DEFCONFIG_SRCS) @echo "Building Recovery Kernel Config" $(call make-kernel-config,$(RECOVERY_KERNEL_OUT),$(RECOVERY_DEFCONFIG)) From c9cdb563ffe05356e77075328de6e5c1326d26ef Mon Sep 17 00:00:00 2001 From: Bruno Martins Date: Fri, 8 Apr 2022 19:37:17 +0100 Subject: [PATCH 08/76] kernel: Fix kernel rebuilding Commit 8ac7d31 introduced this issue. Test: run `m installclean && m bootimage` and observe that kernel image is built. Change-Id: I41eb7cd2e5108bae8f4c40c0f9a300a8a3cc95a7 --- build/tasks/kernel.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 26e9b92..c38108f 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -1,5 +1,5 @@ # Copyright (C) 2012 The CyanogenMod Project -# (C) 2017-2021 The LineageOS Project +# (C) 2017-2022 The LineageOS Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -349,7 +349,7 @@ $(INTERNAL_VENDOR_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) $(KERNEL_OUT): mkdir -p $(KERNEL_OUT) -$(KERNEL_CONFIG): $(ALL_KERNEL_DEFCONFIG_SRCS) +$(KERNEL_CONFIG): $(KERNEL_OUT) $(ALL_KERNEL_DEFCONFIG_SRCS) @echo "Building Kernel Config" $(call make-kernel-config,$(KERNEL_OUT),$(KERNEL_DEFCONFIG)) From 6e990acb915958046b509df9443bebc4c8bd28df Mon Sep 17 00:00:00 2001 From: Bruno Martins Date: Fri, 8 Apr 2022 20:49:25 +0100 Subject: [PATCH 09/76] kernel: Fix building recovery images Commit 8ac7d31 introduced this issue. Test: run `m recoveryimage` and verify that recovery image is now built. Change-Id: Iffdd8112db2ba1baff28db7ee4c340dbb5ebd917 --- build/tasks/kernel.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index c38108f..262abab 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -447,7 +447,7 @@ ifeq ($(FULL_RECOVERY_KERNEL_BUILD),true) $(RECOVERY_KERNEL_OUT): mkdir -p $(RECOVERY_KERNEL_OUT) -$(RECOVERY_KERNEL_CONFIG): $(ALL_RECOVERY_DEFCONFIG_SRCS) +$(RECOVERY_KERNEL_CONFIG): $(ALL_RECOVERY_KERNEL_DEFCONFIG_SRCS) @echo "Building Recovery Kernel Config" $(call make-kernel-config,$(RECOVERY_KERNEL_OUT),$(RECOVERY_DEFCONFIG)) From 4436121e3e9fc434aabdf82c55a67366f99e23fe Mon Sep 17 00:00:00 2001 From: Bruno Martins Date: Fri, 8 Apr 2022 21:17:01 +0100 Subject: [PATCH 10/76] kernel: Document TARGET_KERNEL_RECOVERY_CONFIG usage Change-Id: Idefd38dae5e8beac7d7de797f3f792fea25dacef --- build/tasks/kernel.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 262abab..ea91d3a 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -22,8 +22,9 @@ # These config vars are usually set in BoardConfig.mk: # # TARGET_KERNEL_CONFIG = List of kernel defconfigs, first one being the base one, -# while all the others are fragments that will be merged. +# while all the others are fragments that will be merged # to main one in .config. +# TARGET_KERNEL_RECOVERY_CONFIG = Same as above, but applicable to recovery kernel instead. # TARGET_KERNEL_VARIANT_CONFIG = Variant defconfig, optional # TARGET_KERNEL_SELINUX_CONFIG = SELinux defconfig, optional # From c0130e0358d2da1e0bdb0c422cfa8a9f7f0169d5 Mon Sep 17 00:00:00 2001 From: Alexander Koskovich Date: Wed, 11 May 2022 16:02:12 -0700 Subject: [PATCH 11/76] lineage: build: Wipe DTB/O OBJs before build * They can linger and cause problems, e.g. mismatching kernel and DTBs. Change-Id: I4adafe140093ff675fc3f55e3233a754d44d5656 --- build/tasks/kernel.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index ea91d3a..099a04b 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -407,6 +407,7 @@ $(BOARD_PREBUILT_DTBOIMAGE): $(DTC) $(MKDTIMG) $(MKDTBOIMG) ifeq ($(BOARD_KERNEL_SEPARATED_DTBO),true) $(BOARD_PREBUILT_DTBOIMAGE): @echo "Building dtbo.img" + rm -rf $(DTBO_OUT) $(call make-dtbo-target,$(KERNEL_DEFCONFIG)) $(call make-dtbo-target,dtbs) ifdef BOARD_DTBO_CFG @@ -427,6 +428,7 @@ ifeq ($(BOARD_INCLUDE_DTB_IN_BOOTIMG),true) ifeq ($(BOARD_PREBUILT_DTBIMAGE_DIR),) $(INSTALLED_DTBIMAGE_TARGET): $(DTC) @echo "Building dtb.img" + rm -rf $(DTB_OUT) $(call make-dtb-target,$(KERNEL_DEFCONFIG)) $(call make-dtb-target,dtbs) cat $(shell find $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtb" | sort) > $@ From afbd0df8d3832bda3f770d6e968c32ec1b7914e7 Mon Sep 17 00:00:00 2001 From: dianlujitao Date: Sun, 12 Jun 2022 16:42:37 +0800 Subject: [PATCH 12/76] kernel: Clean up kernel copy recipes ACP and ALL_PREBUILT are dropped years ago and thus have become no-ops. Change-Id: Ic317cb4a4fa406cce0dc86555fb8da34d21fb2bf --- build/tasks/kernel.mk | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 099a04b..4b30723 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -464,25 +464,18 @@ endif ## Install it ifeq ($(NEEDS_KERNEL_COPY),true) -file := $(INSTALLED_KERNEL_TARGET) -ALL_PREBUILT += $(file) -$(file) : $(KERNEL_BIN) | $(ACP) | $(DEPMOD) - $(transform-prebuilt-to-target) ifneq ($(TW_LOAD_VENDOR_MODULES),) ifdef TARGET_PREBUILT_KERNEL - $(call twrp-depmod) + $(call twrp-depmod) endif endif -ALL_PREBUILT += $(INSTALLED_KERNEL_TARGET) +$(INSTALLED_KERNEL_TARGET): $(KERNEL_BIN) + $(transform-prebuilt-to-target) endif ifeq ($(RECOVERY_KERNEL_COPY),true) -file := $(INSTALLED_RECOVERY_KERNEL) -ALL_PREBUILT += $(file) -$(file) : $(RECOVERY_BIN) | $(ACP) +$(INSTALLED_RECOVERY_KERNEL_TARGET): $(RECOVERY_BIN) $(transform-prebuilt-to-target) - -ALL_PREBUILT += $(INSTALLED_RECOVERY_KERNEL) endif .PHONY: recovery-kernel From b3ec81fe9f6d80aaf46f9a804f664193f98da3aa Mon Sep 17 00:00:00 2001 From: dianlujitao Date: Sun, 12 Jun 2022 17:07:30 +0800 Subject: [PATCH 13/76] kernel: Avoid unnecessary savedefconfig Change-Id: I5400e549a6574208d67c5d107ca56eee402fa7f2 --- build/tasks/kernel.mk | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 4b30723..ad8060c 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -268,8 +268,6 @@ define make-kernel-config echo $(KERNEL_CONFIG_OVERRIDE) >> $(1)/.config; \ $(call make-kernel-target,oldconfig); \ fi - # Create defconfig build artifact - $(call internal-make-kernel-target,$(1),savedefconfig) endef # Make a kernel target @@ -391,6 +389,7 @@ kerneltags: $(KERNEL_CONFIG) kernelsavedefconfig: $(KERNEL_OUT) $(call make-kernel-config,$(KERNEL_OUT),$(BASE_KERNEL_DEFCONFIG)) + $(call make-kernel-target,savedefconfig) cp $(KERNEL_OUT)/defconfig $(BASE_KERNEL_DEFCONFIG_SRC) alldefconfig: $(KERNEL_OUT) From db348597ca4dddec8e4b927a78da22817c630b21 Mon Sep 17 00:00:00 2001 From: dianlujitao Date: Sun, 12 Jun 2022 18:50:34 +0800 Subject: [PATCH 14/76] kernel: Ensure dtb(o) always get rebuilt * AOSP build system is not aware of dtb(o) source update, and thus won't rebuild the images, results in outdated artifact. * Convert DTB(O)_OUT to make targets and make the images depend on them to address the issue. This makes AOSP build system be aware of their timestamp changes and re-execute recipes depending on them. Finally, it's up to kernel's build system to decide actions to take. Test: m dtb(o)image and observe dtb(o).img get rebuilt Change-Id: I197e7d2d3e013ded0e555fc22bb6a1200d40df9c --- build/tasks/kernel.mk | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index ad8060c..f804bb1 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -402,35 +402,41 @@ include $(BOARD_CUSTOM_DTBOIMG_MK) else MKDTIMG := $(HOST_OUT_EXECUTABLES)/mkdtimg$(HOST_EXECUTABLE_SUFFIX) MKDTBOIMG := $(HOST_OUT_EXECUTABLES)/mkdtboimg.py$(HOST_EXECUTABLE_SUFFIX) -$(BOARD_PREBUILT_DTBOIMAGE): $(DTC) $(MKDTIMG) $(MKDTBOIMG) -ifeq ($(BOARD_KERNEL_SEPARATED_DTBO),true) + +$(DTBO_OUT): + mkdir -p $(DTBO_OUT) + +$(BOARD_PREBUILT_DTBOIMAGE): $(DTC) $(MKDTIMG) $(MKDTBOIMG) $(DTBO_OUT) $(BOARD_PREBUILT_DTBOIMAGE): @echo "Building dtbo.img" - rm -rf $(DTBO_OUT) + $(hide) find $(DTBO_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtbo" | xargs rm -f $(call make-dtbo-target,$(KERNEL_DEFCONFIG)) +ifeq ($(BOARD_KERNEL_SEPARATED_DTBO),true) $(call make-dtbo-target,dtbs) ifdef BOARD_DTBO_CFG $(MKDTBOIMG) cfg_create $@ $(BOARD_DTBO_CFG) -d $(DTBO_OUT)/arch/$(KERNEL_ARCH)/boot/dts else $(MKDTBOIMG) create $@ --page_size=$(BOARD_KERNEL_PAGESIZE) $(shell find $(DTBO_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtbo" | sort) -endif +endif # BOARD_DTBO_CFG else -$(BOARD_PREBUILT_DTBOIMAGE): - @echo "Building dtbo.img" - $(call make-dtbo-target,$(KERNEL_DEFCONFIG)) $(call make-dtbo-target,dtbo.img) endif # BOARD_KERNEL_SEPARATED_DTBO + $(hide) touch -c $(DTBO_OUT) endif # BOARD_CUSTOM_DTBOIMG_MK endif # TARGET_NEEDS_DTBOIMAGE/BOARD_KERNEL_SEPARATED_DTBO ifeq ($(BOARD_INCLUDE_DTB_IN_BOOTIMG),true) ifeq ($(BOARD_PREBUILT_DTBIMAGE_DIR),) -$(INSTALLED_DTBIMAGE_TARGET): $(DTC) +$(DTB_OUT): + mkdir -p $(DTB_OUT) + +$(INSTALLED_DTBIMAGE_TARGET): $(DTC) $(DTB_OUT) @echo "Building dtb.img" - rm -rf $(DTB_OUT) + $(hide) find $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtb" | xargs rm -f $(call make-dtb-target,$(KERNEL_DEFCONFIG)) $(call make-dtb-target,dtbs) cat $(shell find $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtb" | sort) > $@ + $(hide) touch -c $(DTB_OUT) endif # !BOARD_PREBUILT_DTBIMAGE_DIR endif # BOARD_INCLUDE_DTB_IN_BOOTIMG From 246aae819dc794580bac3d610a38e21148e966de Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Thu, 16 Jun 2022 07:10:08 +0300 Subject: [PATCH 15/76] kernel: Remove unneeded MKDTIMG dependency Change-Id: Icc1923e922adb50b02252883aa6814101837adfc --- build/tasks/kernel.mk | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index f804bb1..9d80e0c 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -400,13 +400,12 @@ ifeq (true,$(filter true, $(TARGET_NEEDS_DTBOIMAGE) $(BOARD_KERNEL_SEPARATED_DTB ifneq ($(BOARD_CUSTOM_DTBOIMG_MK),) include $(BOARD_CUSTOM_DTBOIMG_MK) else -MKDTIMG := $(HOST_OUT_EXECUTABLES)/mkdtimg$(HOST_EXECUTABLE_SUFFIX) MKDTBOIMG := $(HOST_OUT_EXECUTABLES)/mkdtboimg.py$(HOST_EXECUTABLE_SUFFIX) $(DTBO_OUT): mkdir -p $(DTBO_OUT) -$(BOARD_PREBUILT_DTBOIMAGE): $(DTC) $(MKDTIMG) $(MKDTBOIMG) $(DTBO_OUT) +$(BOARD_PREBUILT_DTBOIMAGE): $(DTC) $(MKDTBOIMG) $(DTBO_OUT) $(BOARD_PREBUILT_DTBOIMAGE): @echo "Building dtbo.img" $(hide) find $(DTBO_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtbo" | xargs rm -f From ef5ddc92200f65ad7a1dba41e1afe3dcc5ee612a Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Mon, 20 Jun 2022 09:04:48 +0200 Subject: [PATCH 16/76] Revert "kernel: Remove unneeded MKDTIMG dependency" This reverts commit caa3bddf00129c06f35923e43d5e770645da6b99. Reason for revert: Breaks pixel dtbo.img build, since kernel depends on mkdtimg. Add it back so it gets compiled and kernel can pick it up. Change-Id: I2b9fd0b2b35e0cf2f908516b10f65399780d5c30 --- build/tasks/kernel.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 9d80e0c..f804bb1 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -400,12 +400,13 @@ ifeq (true,$(filter true, $(TARGET_NEEDS_DTBOIMAGE) $(BOARD_KERNEL_SEPARATED_DTB ifneq ($(BOARD_CUSTOM_DTBOIMG_MK),) include $(BOARD_CUSTOM_DTBOIMG_MK) else +MKDTIMG := $(HOST_OUT_EXECUTABLES)/mkdtimg$(HOST_EXECUTABLE_SUFFIX) MKDTBOIMG := $(HOST_OUT_EXECUTABLES)/mkdtboimg.py$(HOST_EXECUTABLE_SUFFIX) $(DTBO_OUT): mkdir -p $(DTBO_OUT) -$(BOARD_PREBUILT_DTBOIMAGE): $(DTC) $(MKDTBOIMG) $(DTBO_OUT) +$(BOARD_PREBUILT_DTBOIMAGE): $(DTC) $(MKDTIMG) $(MKDTBOIMG) $(DTBO_OUT) $(BOARD_PREBUILT_DTBOIMAGE): @echo "Building dtbo.img" $(hide) find $(DTBO_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtbo" | xargs rm -f From b31c846f51f4d36799f5b6d61b9b6ea3ac4fd375 Mon Sep 17 00:00:00 2001 From: Alexander Koskovich Date: Wed, 15 Jun 2022 22:50:47 -0700 Subject: [PATCH 17/76] kernel: Switch to AOSP DTC instead of using scripts/dtc Change-Id: I8faf295dfb84ab7481b80d5b7d2add8ed8ddf6d9 --- build/tasks/kernel.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index f804bb1..eff458c 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -251,6 +251,10 @@ PATH_OVERRIDE += PATH=$(KERNEL_TOOLCHAIN_PATH_gcc):$$PATH # System tools are no longer allowed on 10+ PATH_OVERRIDE += $(TOOLS_PATH_OVERRIDE) +ifeq (true,$(filter true, $(TARGET_NEEDS_DTBOIMAGE) $(BOARD_KERNEL_SEPARATED_DTBO))) + KERNEL_MAKE_FLAGS += DTC_EXT=$(KERNEL_BUILD_OUT_PREFIX)$(DTC) +endif + # Internal implementation of make-kernel-target # $(1): output path (The value passed to O=) # $(2): target to build (eg. defconfig, modules, dtbo.img) From fdf7a64db01789ed2a682b75df6dbead9d3572ec Mon Sep 17 00:00:00 2001 From: Alexander Koskovich Date: Thu, 16 Jun 2022 13:14:14 -0700 Subject: [PATCH 18/76] kernel: Move TARGET_KERNEL_ADDITIONAL_FLAGS to kernel task * Currently, because DTC_EXT make flag is in the kernel task the only way to override it is to have TARGET_KERNEL_ADDITIONAL_FLAGS come after. Change-Id: If62ed979581dc07eafd4628ce2b2d799388d3704 --- build/tasks/kernel.mk | 5 +++++ config/BoardConfigKernel.mk | 4 ---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index eff458c..73fa84c 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -21,6 +21,7 @@ # # These config vars are usually set in BoardConfig.mk: # +# TARGET_KERNEL_ADDITIONAL_FLAGS = Additional make flags, optional # TARGET_KERNEL_CONFIG = List of kernel defconfigs, first one being the base one, # while all the others are fragments that will be merged # to main one in .config. @@ -255,6 +256,10 @@ ifeq (true,$(filter true, $(TARGET_NEEDS_DTBOIMAGE) $(BOARD_KERNEL_SEPARATED_DTB KERNEL_MAKE_FLAGS += DTC_EXT=$(KERNEL_BUILD_OUT_PREFIX)$(DTC) endif +ifneq ($(TARGET_KERNEL_ADDITIONAL_FLAGS),) + KERNEL_MAKE_FLAGS += $(TARGET_KERNEL_ADDITIONAL_FLAGS) +endif + # Internal implementation of make-kernel-target # $(1): output path (The value passed to O=) # $(2): target to build (eg. defconfig, modules, dtbo.img) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 51edaa2..528ae33 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -135,10 +135,6 @@ else KERNEL_MAKE_FLAGS += CPATH="/usr/include:/usr/include/x86_64-linux-gnu" HOSTCFLAGS="-fuse-ld=lld" HOSTLDFLAGS="-L/usr/lib/x86_64-linux-gnu -L/usr/lib64 -fuse-ld=lld" endif -ifneq ($(TARGET_KERNEL_ADDITIONAL_FLAGS),) - KERNEL_MAKE_FLAGS += $(TARGET_KERNEL_ADDITIONAL_FLAGS) -endif - TOOLS_PATH_OVERRIDE := \ LD_LIBRARY_PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/lib:$$LD_LIBRARY_PATH \ PERL5LIB=$(BUILD_TOP)/prebuilts/tools-lineage/common/perl-base From d00f738806124e1d6248e16ed5e2c5f39bbf2bef Mon Sep 17 00:00:00 2001 From: Chirayu Desai Date: Fri, 8 Jul 2022 03:33:22 +0530 Subject: [PATCH 19/76] kernel: Don't print grep error messages when checking version Avoids: $ lunch lineage_sdk_phone_x86 grep: build/make/target/board/emulator_x86/Makefile: No such file or directory (x4) Change-Id: Ie803d5ca93e6e7ae94625e7ee3ab0bf337e0515d --- config/BoardConfigKernel.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 528ae33..21bbc71 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -59,8 +59,8 @@ else KERNEL_ARCH := $(TARGET_KERNEL_ARCH) endif -KERNEL_VERSION := $(shell grep "^VERSION = " $(TARGET_KERNEL_SOURCE)/Makefile | awk '{ print $$3 }') -KERNEL_PATCHLEVEL := $(shell grep "^PATCHLEVEL = " $(TARGET_KERNEL_SOURCE)/Makefile | awk '{ print $$3 }') +KERNEL_VERSION := $(shell grep -s "^VERSION = " $(TARGET_KERNEL_SOURCE)/Makefile | awk '{ print $$3 }') +KERNEL_PATCHLEVEL := $(shell grep -s "^PATCHLEVEL = " $(TARGET_KERNEL_SOURCE)/Makefile | awk '{ print $$3 }') TARGET_KERNEL_VERSION ?= $(shell echo $(KERNEL_VERSION)"."$(KERNEL_PATCHLEVEL)) CLANG_PREBUILTS := $(BUILD_TOP)/prebuilts/clang/host/$(HOST_PREBUILT_TAG)/clang-r416183b1 From 4e7956cca368f93764bfc94c26d56f02c5fedc2e Mon Sep 17 00:00:00 2001 From: Jason Wojcik Date: Tue, 23 Mar 2021 10:46:09 -0700 Subject: [PATCH 20/76] lineage: config: Use $(abspath .) instead of $(shell pwd) Change-Id: I7fec28b7cb507918b1b55dd368a74c927a8fc1d2 --- config/BoardConfigKernel.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 21bbc71..62a2cdd 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -43,7 +43,7 @@ # is in PATH # USE_CCACHE = Enable ccache (global Android flag) -BUILD_TOP := $(shell pwd) +BUILD_TOP := $(abspath .) TARGET_AUTO_KDIR := $(shell echo $(TARGET_DEVICE_DIR) | sed -e 's/^device/kernel/g') TARGET_KERNEL_SOURCE ?= $(TARGET_AUTO_KDIR) From 97bacc9928ded5d269a5198d0aee45b23be3a9f4 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Wed, 10 Aug 2022 06:03:02 +0300 Subject: [PATCH 21/76] config: Use LLVM binutils for 5.10 as well Change-Id: I14afa17d710778403cd7fecf842c952c569c0c35 --- config/BoardConfigKernel.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 62a2cdd..4274ffc 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -160,7 +160,7 @@ KERNEL_MAKE_FLAGS += HOSTCXX=$(CLANG_PREBUILTS)/bin/clang++ # Use LLVM's substitutes for GNU binutils if compatible kernel version. ifneq ($(TARGET_KERNEL_CLANG_COMPILE), false) -ifneq (,$(filter 5.4, $(TARGET_KERNEL_VERSION))) +ifneq (,$(filter 5.4 5.10, $(TARGET_KERNEL_VERSION))) KERNEL_MAKE_FLAGS += LLVM=1 LLVM_IAS=1 endif endif From be10f65fc40b3574c4f9d3df863c22cf6e63fa45 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Wed, 10 Aug 2022 05:18:59 +0300 Subject: [PATCH 22/76] kernel: Allow overriding dtbo target name gs101 kernel uses google/dtbo.img target for dtbo.img Change-Id: Ib03f35c0035f56d303771de9399bcce3d02c0775 --- build/tasks/kernel.mk | 2 +- config/BoardConfigKernel.mk | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 73fa84c..b96519c 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -428,7 +428,7 @@ else $(MKDTBOIMG) create $@ --page_size=$(BOARD_KERNEL_PAGESIZE) $(shell find $(DTBO_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtbo" | sort) endif # BOARD_DTBO_CFG else - $(call make-dtbo-target,dtbo.img) + $(call make-dtbo-target,$(TARGET_KERNEL_DTBO)) endif # BOARD_KERNEL_SEPARATED_DTBO $(hide) touch -c $(DTBO_OUT) endif # BOARD_CUSTOM_DTBOIMG_MK diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 4274ffc..5de48b1 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -35,6 +35,9 @@ # makefile. Can be overriden in device trees # in the event of prebuilt kernel. # +# TARGET_KERNEL_DTBO = Name of the kernel Makefile target that +# generates dtbo.img. Defaults to dtbo.img +# # KERNEL_TOOLCHAIN_PREFIX = Overrides TARGET_KERNEL_CROSS_COMPILE_PREFIX, # Set this var in shell to override # toolchain specified in BoardConfig.mk @@ -148,7 +151,8 @@ endif # Set DTBO image locations so the build system knows to build them ifeq (true,$(filter true, $(TARGET_NEEDS_DTBOIMAGE) $(BOARD_KERNEL_SEPARATED_DTBO))) -BOARD_PREBUILT_DTBOIMAGE ?= $(TARGET_OUT_INTERMEDIATES)/DTBO_OBJ/arch/$(KERNEL_ARCH)/boot/dtbo.img +TARGET_KERNEL_DTBO ?= dtbo.img +BOARD_PREBUILT_DTBOIMAGE ?= $(TARGET_OUT_INTERMEDIATES)/DTBO_OBJ/arch/$(KERNEL_ARCH)/boot/$(TARGET_KERNEL_DTBO) endif # Set use the full path to the make command From 1e0d2d457e084c2b4f30c8bd7a8fc8e0ebb22480 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Wed, 10 Aug 2022 06:44:40 +0300 Subject: [PATCH 23/76] kernel: Allow setting dtbo target path prefix gs101 uses DTBO_OBJ/arch/arm64/boot/dts/google/dtbo.img vs DTBO_OBJ/arch/arm/boot/dtbo.img on previous devices. Change-Id: I945d31cb093fae97385cf84c273088ee7a4edf0b --- config/BoardConfigKernel.mk | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 5de48b1..0e24f05 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -35,6 +35,8 @@ # makefile. Can be overriden in device trees # in the event of prebuilt kernel. # +# TARGET_KERNEL_DTBO_PREFIX = Override path prefix of TARGET_KERNEL_DTBO. +# Defaults to empty # TARGET_KERNEL_DTBO = Name of the kernel Makefile target that # generates dtbo.img. Defaults to dtbo.img # @@ -151,8 +153,9 @@ endif # Set DTBO image locations so the build system knows to build them ifeq (true,$(filter true, $(TARGET_NEEDS_DTBOIMAGE) $(BOARD_KERNEL_SEPARATED_DTBO))) +TARGET_KERNEL_DTBO_PREFIX ?= TARGET_KERNEL_DTBO ?= dtbo.img -BOARD_PREBUILT_DTBOIMAGE ?= $(TARGET_OUT_INTERMEDIATES)/DTBO_OBJ/arch/$(KERNEL_ARCH)/boot/$(TARGET_KERNEL_DTBO) +BOARD_PREBUILT_DTBOIMAGE ?= $(TARGET_OUT_INTERMEDIATES)/DTBO_OBJ/arch/$(KERNEL_ARCH)/boot/$(TARGET_KERNEL_DTBO_PREFIX)$(TARGET_KERNEL_DTBO) endif # Set use the full path to the make command From 80bd054cf24d652f74c431dc5e7757e080e38fde Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Wed, 10 Aug 2022 05:29:55 +0300 Subject: [PATCH 24/76] kernel: Allow overriding dtb target On some devices we might want to build just the *.dtb files that we actually need instead of the every dtb that exists. Change-Id: Id7a152499d4ee1dd08f79d34cc34bfe959313515 --- build/tasks/kernel.mk | 2 +- config/BoardConfigKernel.mk | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index b96519c..47b97a7 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -443,7 +443,7 @@ $(INSTALLED_DTBIMAGE_TARGET): $(DTC) $(DTB_OUT) @echo "Building dtb.img" $(hide) find $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtb" | xargs rm -f $(call make-dtb-target,$(KERNEL_DEFCONFIG)) - $(call make-dtb-target,dtbs) + $(call make-dtb-target,$(TARGET_KERNEL_DTB)) cat $(shell find $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtb" | sort) > $@ $(hide) touch -c $(DTB_OUT) endif # !BOARD_PREBUILT_DTBIMAGE_DIR diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 0e24f05..cd51e86 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -39,6 +39,8 @@ # Defaults to empty # TARGET_KERNEL_DTBO = Name of the kernel Makefile target that # generates dtbo.img. Defaults to dtbo.img +# TARGET_KERNEL_DTB = Name of the kernel Makefile target that +# generates the *.dtb targets. Defaults to dtbs # # KERNEL_TOOLCHAIN_PREFIX = Overrides TARGET_KERNEL_CROSS_COMPILE_PREFIX, # Set this var in shell to override @@ -158,6 +160,9 @@ TARGET_KERNEL_DTBO ?= dtbo.img BOARD_PREBUILT_DTBOIMAGE ?= $(TARGET_OUT_INTERMEDIATES)/DTBO_OBJ/arch/$(KERNEL_ARCH)/boot/$(TARGET_KERNEL_DTBO_PREFIX)$(TARGET_KERNEL_DTBO) endif +# Set the default dtb target +TARGET_KERNEL_DTB ?= dtbs + # Set use the full path to the make command KERNEL_MAKE_CMD := $(BUILD_TOP)/prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/make From f5a42b67f9bb59c014b2894677bee98b7d8a60d1 Mon Sep 17 00:00:00 2001 From: Neel Chauhan Date: Thu, 21 Jul 2022 09:30:48 -0700 Subject: [PATCH 25/76] kernel.mk: Allow building external kernel modules Here, we introduce the TARGET_EXTERNAL_KERNEL_MODULES variable for the list of external modules. Change-Id: I1f8b7a48e66bb0c9efbc396692e5a7159f0b835c --- build/tasks/kernel.mk | 16 ++++++++++++++++ config/BoardConfigKernel.mk | 9 +++++++++ 2 files changed, 25 insertions(+) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 47b97a7..811c747 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -267,6 +267,14 @@ define internal-make-kernel-target $(PATH_OVERRIDE) $(KERNEL_MAKE_CMD) $(KERNEL_MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_BUILD_OUT_PREFIX)$(1) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(KERNEL_CLANG_TRIPLE) $(KERNEL_CC) $(KERNEL_LD) $(2) endef +# Make an external module target +# $(1): module name +# $(2): module root path +# $(3): target to build (eg. modules_install) +define make-external-module-target +$(PATH_OVERRIDE) $(KERNEL_MAKE_CMD) $(KERNEL_MAKE_FLAGS) -C $(TARGET_KERNEL_EXT_MODULE_ROOT)/$(1) M=$(2)/$(1) KERNEL_SRC=$(BUILD_TOP)/$(KERNEL_SRC) OUT_DIR=$(KERNEL_BUILD_OUT_PREFIX)$(KERNEL_OUT) O=$(KERNEL_BUILD_OUT_PREFIX)$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(KERNEL_CLANG_TRIPLE) $(KERNEL_CC) $(KERNEL_LD) $(3) +endef + # Generate kernel .config from a given defconfig # $(1): Output path (The value passed to O=) # $(2): The defconfig to process (just the filename, no need for full path to file) @@ -373,6 +381,14 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) $(call make-kernel-target,modules) || exit "$$?"; \ echo "Installing Kernel Modules"; \ $(call make-kernel-target,INSTALL_MOD_PATH=$(MODULES_INTERMEDIATES) INSTALL_MOD_STRIP=1 modules_install); \ + $(if $(TARGET_KERNEL_EXT_MODULES),\ + echo "Building and Installing External Kernel Modules"; \ + rpath=$$(python3 -c 'import os,sys;print(os.path.relpath(*(sys.argv[1:])))' $(TARGET_KERNEL_EXT_MODULE_ROOT) $(KERNEL_SRC)); \ + $(foreach p, $(TARGET_KERNEL_EXT_MODULES),\ + $$pwd; \ + $(call make-external-module-target,$(p),$$rpath,); \ + $(call make-external-module-target,$(p),$$rpath,INSTALL_MOD_PATH=$(MODULES_INTERMEDIATES) INSTALL_MOD_STRIP=1 KERNEL_UAPI_HEADERS_DIR=$(KERNEL_OUT) modules_install)); \ + ) \ kernel_release=$$(cat $(KERNEL_RELEASE)) \ kernel_modules_dir=$(MODULES_INTERMEDIATES)/lib/modules/$$kernel_release \ $(foreach s, $(TARGET_MODULE_ALIASES),\ diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index cd51e86..4429b59 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -42,6 +42,11 @@ # TARGET_KERNEL_DTB = Name of the kernel Makefile target that # generates the *.dtb targets. Defaults to dtbs # +# TARGET_KERNEL_EXT_MODULE_ROOT = Optional, the external modules root directory +# Defaults to empty +# TARGET_KERNEL_EXT_MODULES = Optional, the external modules we are +# building. Defaults to empty +# # KERNEL_TOOLCHAIN_PREFIX = Overrides TARGET_KERNEL_CROSS_COMPILE_PREFIX, # Set this var in shell to override # toolchain specified in BoardConfig.mk @@ -163,6 +168,10 @@ endif # Set the default dtb target TARGET_KERNEL_DTB ?= dtbs +# Set no external modules by default +TARGET_KERNEL_EXT_MODULE_ROOT ?= +TARGET_KERNEL_EXT_MODULES ?= + # Set use the full path to the make command KERNEL_MAKE_CMD := $(BUILD_TOP)/prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/make From 350e6effbb1d6fe8518dc2fb09893938990619f0 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sat, 13 Aug 2022 02:56:34 +0300 Subject: [PATCH 26/76] kernel: Add support for vendor_boot image header version 4 vendor_boot v4 supports packaging multiple "fragmented" vendor ramdisks. A secondary can be used to store the kernel modules instead of storing them in the "normal" vendor_ramdisk. Test: Create a vendor_boot with source built kernel/modules, gs101 still boots. Change-Id: Ic295ccf201c2593e08b9559ae28f80c70a7eb341 --- build/tasks/kernel.mk | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 811c747..226a93f 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -359,8 +359,15 @@ $(INSTALLED_VENDORIMAGE_TARGET): $(TARGET_PREBUILT_INT_KERNEL) endif MODULES_INTERMEDIATES := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,kernel_modules) +ifneq (,$(filter dlkm,$(BOARD_VENDOR_RAMDISK_FRAGMENTS))) +KERNEL_VENDOR_RAMDISK_MODULES_OUT := $(VENDOR_RAMDISK_FRAGMENT.dlkm.STAGING_DIR) +KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_vendor_ramdisk_fragment-stage-dlkm) +$(INTERNAL_VENDOR_RAMDISK_FRAGMENT_TARGETS): $(TARGET_PREBUILT_INT_KERNEL) +else +KERNEL_VENDOR_RAMDISK_MODULES_OUT := $(TARGET_VENDOR_RAMDISK_OUT) KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_vendor_ramdisk) $(INTERNAL_VENDOR_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) +endif $(KERNEL_OUT): mkdir -p $(KERNEL_OUT) @@ -402,7 +409,7 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from BOOT_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \ done); \ [ $$? -ne 0 ] && exit 1; \ - ($(call build-image-kernel-modules-twrp,$$vendor_boot_modules,$(TARGET_VENDOR_RAMDISK_OUT),/,$(KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD))); \ + ($(call build-image-kernel-modules-twrp,$$vendor_boot_modules,$(KERNEL_VENDOR_RAMDISK_MODULES_OUT),/,$(KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD))); \ ) \ fi From 68f2960a705ad5d4016049f58010765650b47120 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sat, 13 Aug 2022 15:14:17 +0300 Subject: [PATCH 27/76] kernel: Always build dtb targets before dtbo.img Fixes: error: unable to open output file 'arch/arm64/boot/dts/google/devices/bluejay/google-base/.gs101-b0.dtb.dts.tmp': 'No such file or directory' Change-Id: I457062e46062fb3553421d196b432de7d06a49ad --- build/tasks/kernel.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 226a93f..4013417 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -443,8 +443,8 @@ $(BOARD_PREBUILT_DTBOIMAGE): @echo "Building dtbo.img" $(hide) find $(DTBO_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtbo" | xargs rm -f $(call make-dtbo-target,$(KERNEL_DEFCONFIG)) + $(call make-dtbo-target,$(TARGET_KERNEL_DTB)) ifeq ($(BOARD_KERNEL_SEPARATED_DTBO),true) - $(call make-dtbo-target,dtbs) ifdef BOARD_DTBO_CFG $(MKDTBOIMG) cfg_create $@ $(BOARD_DTBO_CFG) -d $(DTBO_OUT)/arch/$(KERNEL_ARCH)/boot/dts else From f9be69fba7991395ec7883abc87f8640c41b72fc Mon Sep 17 00:00:00 2001 From: Arian Date: Wed, 17 Aug 2022 18:14:15 +0200 Subject: [PATCH 28/76] config: Update clang version to clang-r450784d This is the default clang version on android-13.0.0_r1 Change-Id: Iaecec88ce0a462403d0a3cf705ce794c230e6bd9 --- config/BoardConfigKernel.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 4429b59..67203ed 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -75,7 +75,7 @@ KERNEL_VERSION := $(shell grep -s "^VERSION = " $(TARGET_KERNEL_SOURCE)/Makefile KERNEL_PATCHLEVEL := $(shell grep -s "^PATCHLEVEL = " $(TARGET_KERNEL_SOURCE)/Makefile | awk '{ print $$3 }') TARGET_KERNEL_VERSION ?= $(shell echo $(KERNEL_VERSION)"."$(KERNEL_PATCHLEVEL)) -CLANG_PREBUILTS := $(BUILD_TOP)/prebuilts/clang/host/$(HOST_PREBUILT_TAG)/clang-r416183b1 +CLANG_PREBUILTS := $(BUILD_TOP)/prebuilts/clang/host/$(HOST_PREBUILT_TAG)/clang-r450784d GCC_PREBUILTS := $(BUILD_TOP)/prebuilts/gcc/$(HOST_PREBUILT_TAG) # arm64 toolchain KERNEL_TOOLCHAIN_arm64 := $(GCC_PREBUILTS)/aarch64/aarch64-linux-android-4.9/bin From b31b260fe4595fbc71d85eef2c48efb38824ebe7 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sun, 28 Aug 2022 16:44:19 +0300 Subject: [PATCH 29/76] kernel: Changes for LLVM binutils * Remove KERNEL_LD from kernel.mk, we simply set LD in BoardConfigKernel * Add llvm-ar in path allowlist (used by LTO) Change-Id: I76addb6f9d8d413edb1832dba23082ffb6d5ebc3 --- build/tasks/kernel.mk | 9 ++------- config/BoardConfigKernel.mk | 2 ++ 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 4013417..0985297 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -50,8 +50,6 @@ # # KERNEL_CC = The C Compiler used. This is automatically set based # on whether the clang version is set, optional. -# KERNEL_LD = The Linker used. This is automatically set based -# on whether the clang/gcc version is set, optional. # # KERNEL_CLANG_TRIPLE = Target triple for clang (e.g. aarch64-linux-gnu-) # defaults to arm-linux-gnu- for arm @@ -238,9 +236,6 @@ ifneq ($(TARGET_KERNEL_CLANG_COMPILE),false) ifeq ($(KERNEL_CC),) KERNEL_CC := CC="$(CCACHE_BIN) clang" endif - ifeq ($(KERNEL_LD),) - KERNEL_LD := - endif endif ifneq ($(TARGET_KERNEL_MODULES),) @@ -264,7 +259,7 @@ endif # $(1): output path (The value passed to O=) # $(2): target to build (eg. defconfig, modules, dtbo.img) define internal-make-kernel-target -$(PATH_OVERRIDE) $(KERNEL_MAKE_CMD) $(KERNEL_MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_BUILD_OUT_PREFIX)$(1) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(KERNEL_CLANG_TRIPLE) $(KERNEL_CC) $(KERNEL_LD) $(2) +$(PATH_OVERRIDE) $(KERNEL_MAKE_CMD) $(KERNEL_MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_BUILD_OUT_PREFIX)$(1) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(KERNEL_CLANG_TRIPLE) $(KERNEL_CC) $(2) endef # Make an external module target @@ -272,7 +267,7 @@ endef # $(2): module root path # $(3): target to build (eg. modules_install) define make-external-module-target -$(PATH_OVERRIDE) $(KERNEL_MAKE_CMD) $(KERNEL_MAKE_FLAGS) -C $(TARGET_KERNEL_EXT_MODULE_ROOT)/$(1) M=$(2)/$(1) KERNEL_SRC=$(BUILD_TOP)/$(KERNEL_SRC) OUT_DIR=$(KERNEL_BUILD_OUT_PREFIX)$(KERNEL_OUT) O=$(KERNEL_BUILD_OUT_PREFIX)$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(KERNEL_CLANG_TRIPLE) $(KERNEL_CC) $(KERNEL_LD) $(3) +$(PATH_OVERRIDE) $(KERNEL_MAKE_CMD) $(KERNEL_MAKE_FLAGS) -C $(TARGET_KERNEL_EXT_MODULE_ROOT)/$(1) M=$(2)/$(1) KERNEL_SRC=$(BUILD_TOP)/$(KERNEL_SRC) OUT_DIR=$(KERNEL_BUILD_OUT_PREFIX)$(KERNEL_OUT) O=$(KERNEL_BUILD_OUT_PREFIX)$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(KERNEL_CLANG_TRIPLE) $(KERNEL_CC) $(3) endef # Generate kernel .config from a given defconfig diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 67203ed..974ac38 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -183,6 +183,8 @@ KERNEL_MAKE_FLAGS += HOSTCXX=$(CLANG_PREBUILTS)/bin/clang++ ifneq ($(TARGET_KERNEL_CLANG_COMPILE), false) ifneq (,$(filter 5.4 5.10, $(TARGET_KERNEL_VERSION))) KERNEL_MAKE_FLAGS += LLVM=1 LLVM_IAS=1 + KERNEL_MAKE_FLAGS += LD=$(CLANG_PREBUILTS)/bin/ld.lld + KERNEL_MAKE_FLAGS += AR=$(CLANG_PREBUILTS)/bin/llvm-ar endif endif From c3d36d8a0dc18bbe08cb0f8f28712fde7c19c758 Mon Sep 17 00:00:00 2001 From: Alexander Koskovich Date: Wed, 15 Jun 2022 23:40:11 -0700 Subject: [PATCH 30/76] kernel: Drop -fuse-ld=lld from CFLAGS clang-14: error: argument unused during compilation: '-fuse-ld=lld' [-Werror,-Wunused-command-line-argument] Change-Id: Ic863e8707e4c57c7d03183b6cb6d3cd38e919bcb --- config/BoardConfigKernel.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 974ac38..1275f73 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -142,9 +142,9 @@ ifeq ($(TARGET_KERNEL_CLANG_COMPILE),false) endif ifeq ($(HOST_OS),darwin) - KERNEL_MAKE_FLAGS += HOSTCFLAGS="-I$(BUILD_TOP)/external/elfutils/libelf -I/usr/local/opt/openssl/include -fuse-ld=lld" HOSTLDFLAGS="-L/usr/local/opt/openssl/lib -fuse-ld=lld" + KERNEL_MAKE_FLAGS += HOSTCFLAGS="-I$(BUILD_TOP)/external/elfutils/libelf -I/usr/local/opt/openssl/include" HOSTLDFLAGS="-L/usr/local/opt/openssl/lib -fuse-ld=lld" else - KERNEL_MAKE_FLAGS += CPATH="/usr/include:/usr/include/x86_64-linux-gnu" HOSTCFLAGS="-fuse-ld=lld" HOSTLDFLAGS="-L/usr/lib/x86_64-linux-gnu -L/usr/lib64 -fuse-ld=lld" + KERNEL_MAKE_FLAGS += CPATH="/usr/include:/usr/include/x86_64-linux-gnu" HOSTLDFLAGS="-L/usr/lib/x86_64-linux-gnu -L/usr/lib64 -fuse-ld=lld" endif TOOLS_PATH_OVERRIDE := \ From a0edf779b226bce1ce9b86b572de41d42b1ab745 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Thu, 8 Sep 2022 04:19:32 +0300 Subject: [PATCH 31/76] kernel: Use LLVM binutils by default * GCC has been completely removed in AOSP but we keep it for compatibility reasons with older kernels until they are adapted to remove all the dependencies to GCC. * Most updated 4.19+ kernels should be able to use LLVM binutils out of the box. 4.14 is possible with a few patches and 4.9 with even more patches. * Make this the default and allow devices opting out by using TARGET_KERNEL_LLVM_BINUTILS := false Change-Id: I569cf290b41aaf2dc16ff9cc4cc6dc461f0d504e --- config/BoardConfigKernel.mk | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 1275f73..1a0f63f 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -31,6 +31,7 @@ # x86_64-linux-android- for x86 # # TARGET_KERNEL_CLANG_COMPILE = Compile kernel with clang, defaults to true +# TARGET_KERNEL_LLVM_BINUTILS = Use LLVM binutils, defaults to true # TARGET_KERNEL_VERSION = Reported kernel version in top level kernel # makefile. Can be overriden in device trees # in the event of prebuilt kernel. @@ -179,9 +180,9 @@ KERNEL_MAKE_CMD := $(BUILD_TOP)/prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/m KERNEL_MAKE_FLAGS += HOSTCC=$(CLANG_PREBUILTS)/bin/clang KERNEL_MAKE_FLAGS += HOSTCXX=$(CLANG_PREBUILTS)/bin/clang++ -# Use LLVM's substitutes for GNU binutils if compatible kernel version. +# Use LLVM's substitutes for GNU binutils ifneq ($(TARGET_KERNEL_CLANG_COMPILE), false) -ifneq (,$(filter 5.4 5.10, $(TARGET_KERNEL_VERSION))) +ifneq ($(TARGET_KERNEL_LLVM_BINUTILS), false) KERNEL_MAKE_FLAGS += LLVM=1 LLVM_IAS=1 KERNEL_MAKE_FLAGS += LD=$(CLANG_PREBUILTS)/bin/ld.lld KERNEL_MAKE_FLAGS += AR=$(CLANG_PREBUILTS)/bin/llvm-ar From 8c1974470707f60e34d7579cdbf2b6b48cfe0c63 Mon Sep 17 00:00:00 2001 From: Luca Stefani Date: Mon, 12 Sep 2022 17:55:12 -0400 Subject: [PATCH 32/76] kernel: Allow passing empty DTB to mkbootimg via board-flag * Boot Image header v2 demands a DTB be passed by default. * We don't /need/ one at all, as we have and use a dedicated DTB partition. * Signing hates trying to find dtb.img anywhere for some magical reason, so cheat and introduce a flag to include a blank one. Change-Id: I889ce3815476a55829870b30de1b9210283a79ae (cherry picked from commit fa16b42ddd1eb341f201b8d810c717ea12afe1cb) --- build/tasks/kernel.mk | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 0985297..fbd2641 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -458,12 +458,18 @@ $(DTB_OUT): mkdir -p $(DTB_OUT) $(INSTALLED_DTBIMAGE_TARGET): $(DTC) $(DTB_OUT) +ifeq ($(TARGET_WANTS_EMPTY_DTB),true) + @rm -f $@ + echo "empty" > $@ +else @echo "Building dtb.img" $(hide) find $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtb" | xargs rm -f $(call make-dtb-target,$(KERNEL_DEFCONFIG)) $(call make-dtb-target,$(TARGET_KERNEL_DTB)) cat $(shell find $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtb" | sort) > $@ $(hide) touch -c $(DTB_OUT) +endif # !TARGET_WANTS_EMPTY_DTB + endif # !BOARD_PREBUILT_DTBIMAGE_DIR endif # BOARD_INCLUDE_DTB_IN_BOOTIMG From 188c7199abefea2fc597589194ff02530460f259 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Fri, 9 Sep 2022 13:36:19 +0300 Subject: [PATCH 33/76] kernel: add `pahole` dependency This is needed for 5.10+ T kernel build. Change-Id: I0729af39cad5509ea3bc8629fdf1176156be6c08 --- build/tasks/kernel.mk | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index fbd2641..71342e8 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -79,6 +79,7 @@ SELINUX_DEFCONFIG := $(TARGET_KERNEL_SELINUX_CONFIG) ## Internal variables DTC := $(HOST_OUT_EXECUTABLES)/dtc +PAHOLE := $(HOST_OUT_EXECUTABLES)/pahole KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ RECOVERY_KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/RECOVERY_KERNEL_OBJ DTBO_OUT := $(TARGET_OUT_INTERMEDIATES)/DTBO_OBJ @@ -371,7 +372,7 @@ $(KERNEL_CONFIG): $(KERNEL_OUT) $(ALL_KERNEL_DEFCONFIG_SRCS) @echo "Building Kernel Config" $(call make-kernel-config,$(KERNEL_OUT),$(KERNEL_DEFCONFIG)) -$(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) +$(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) $(PAHOLE) @echo "Building Kernel Image ($(BOARD_KERNEL_IMAGE_NAME))" $(call make-kernel-target,$(BOARD_KERNEL_IMAGE_NAME)) $(hide) if grep -q '^CONFIG_OF=y' $(KERNEL_CONFIG); then \ @@ -492,7 +493,7 @@ $(RECOVERY_KERNEL_CONFIG): $(ALL_RECOVERY_KERNEL_DEFCONFIG_SRCS) @echo "Building Recovery Kernel Config" $(call make-kernel-config,$(RECOVERY_KERNEL_OUT),$(RECOVERY_DEFCONFIG)) -$(TARGET_PREBUILT_INT_RECOVERY_KERNEL): $(RECOVERY_KERNEL_CONFIG) $(DEPMOD) $(DTC) +$(TARGET_PREBUILT_INT_RECOVERY_KERNEL): $(RECOVERY_KERNEL_CONFIG) $(DEPMOD) $(DTC) $(PAHOLE) @echo "Building Recovery Kernel Image ($(BOARD_KERNEL_IMAGE_NAME))" $(call make-recovery-kernel-target,$(BOARD_KERNEL_IMAGE_NAME)) From 064a2f68b586b47af2cd7e5f043cddcfedcf90e3 Mon Sep 17 00:00:00 2001 From: LibXZR Date: Wed, 4 Aug 2021 11:31:47 +0800 Subject: [PATCH 34/76] kernel: Fix vdso32 building for 4.19+ kernels This flag has been renamed in 4.19 kernels https://android.googlesource.com/kernel/common/+/refs/heads/android-4.19-stable/arch/arm64/kernel/vdso32/Makefile#13 Change-Id: I92db29aa124da7c9fc63454d9443373bdc2e16e7 --- config/BoardConfigKernel.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 1a0f63f..c7f721a 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -122,6 +122,7 @@ endif # Needed for CONFIG_COMPAT_VDSO, safe to set for all arm64 builds ifeq ($(KERNEL_ARCH),arm64) KERNEL_CROSS_COMPILE += CROSS_COMPILE_ARM32="$(KERNEL_TOOLCHAIN_arm)/$(KERNEL_TOOLCHAIN_PREFIX_arm)" + KERNEL_CROSS_COMPILE += CROSS_COMPILE_COMPAT="$(KERNEL_TOOLCHAIN_arm)/$(KERNEL_TOOLCHAIN_PREFIX_arm)" endif # Clear this first to prevent accidental poisoning from env From 5763ae8b1e3492577d402ac343873663035f11a7 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sat, 1 Oct 2022 00:33:17 +0300 Subject: [PATCH 35/76] kernel: Use consistent spacing Change-Id: Ia01336f14599ec8d767d88ad3b76f7bb97153848 --- config/BoardConfigKernel.mk | 62 ++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index c7f721a..db9b374 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -67,9 +67,9 @@ endif TARGET_KERNEL_ARCH := $(strip $(TARGET_KERNEL_ARCH)) ifeq ($(TARGET_KERNEL_ARCH),) -KERNEL_ARCH := $(TARGET_ARCH) + KERNEL_ARCH := $(TARGET_ARCH) else -KERNEL_ARCH := $(TARGET_KERNEL_ARCH) + KERNEL_ARCH := $(TARGET_KERNEL_ARCH) endif KERNEL_VERSION := $(shell grep -s "^VERSION = " $(TARGET_KERNEL_SOURCE)/Makefile | awk '{ print $$3 }') @@ -90,16 +90,16 @@ KERNEL_TOOLCHAIN_PREFIX_x86 := x86_64-linux-android- TARGET_KERNEL_CROSS_COMPILE_PREFIX := $(strip $(TARGET_KERNEL_CROSS_COMPILE_PREFIX)) ifneq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),) -KERNEL_TOOLCHAIN_PREFIX ?= $(TARGET_KERNEL_CROSS_COMPILE_PREFIX) + KERNEL_TOOLCHAIN_PREFIX ?= $(TARGET_KERNEL_CROSS_COMPILE_PREFIX) else -KERNEL_TOOLCHAIN ?= $(KERNEL_TOOLCHAIN_$(KERNEL_ARCH)) -KERNEL_TOOLCHAIN_PREFIX ?= $(KERNEL_TOOLCHAIN_PREFIX_$(KERNEL_ARCH)) + KERNEL_TOOLCHAIN ?= $(KERNEL_TOOLCHAIN_$(KERNEL_ARCH)) + KERNEL_TOOLCHAIN_PREFIX ?= $(KERNEL_TOOLCHAIN_PREFIX_$(KERNEL_ARCH)) endif ifeq ($(KERNEL_TOOLCHAIN),) -KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN_PREFIX) + KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN_PREFIX) else -KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN)/$(KERNEL_TOOLCHAIN_PREFIX) + KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN)/$(KERNEL_TOOLCHAIN_PREFIX) endif # We need to add GCC toolchain to the path no matter what @@ -121,8 +121,8 @@ endif # Needed for CONFIG_COMPAT_VDSO, safe to set for all arm64 builds ifeq ($(KERNEL_ARCH),arm64) - KERNEL_CROSS_COMPILE += CROSS_COMPILE_ARM32="$(KERNEL_TOOLCHAIN_arm)/$(KERNEL_TOOLCHAIN_PREFIX_arm)" - KERNEL_CROSS_COMPILE += CROSS_COMPILE_COMPAT="$(KERNEL_TOOLCHAIN_arm)/$(KERNEL_TOOLCHAIN_PREFIX_arm)" + KERNEL_CROSS_COMPILE += CROSS_COMPILE_ARM32="$(KERNEL_TOOLCHAIN_arm)/$(KERNEL_TOOLCHAIN_PREFIX_arm)" + KERNEL_CROSS_COMPILE += CROSS_COMPILE_COMPAT="$(KERNEL_TOOLCHAIN_arm)/$(KERNEL_TOOLCHAIN_PREFIX_arm)" endif # Clear this first to prevent accidental poisoning from env @@ -132,21 +132,21 @@ KERNEL_MAKE_FLAGS := KERNEL_MAKE_FLAGS += -j$(shell prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin/nproc --all) ifeq ($(TARGET_KERNEL_CLANG_COMPILE),false) - ifeq ($(KERNEL_ARCH),arm) - # Avoid "Unknown symbol _GLOBAL_OFFSET_TABLE_" errors - KERNEL_MAKE_FLAGS += CFLAGS_MODULE="-fno-pic" - endif + ifeq ($(KERNEL_ARCH),arm) + # Avoid "Unknown symbol _GLOBAL_OFFSET_TABLE_" errors + KERNEL_MAKE_FLAGS += CFLAGS_MODULE="-fno-pic" + endif - ifeq ($(KERNEL_ARCH),arm64) - # Avoid "unsupported RELA relocation: 311" errors (R_AARCH64_ADR_GOT_PAGE) - KERNEL_MAKE_FLAGS += CFLAGS_MODULE="-fno-pic" - endif + ifeq ($(KERNEL_ARCH),arm64) + # Avoid "unsupported RELA relocation: 311" errors (R_AARCH64_ADR_GOT_PAGE) + KERNEL_MAKE_FLAGS += CFLAGS_MODULE="-fno-pic" + endif endif ifeq ($(HOST_OS),darwin) - KERNEL_MAKE_FLAGS += HOSTCFLAGS="-I$(BUILD_TOP)/external/elfutils/libelf -I/usr/local/opt/openssl/include" HOSTLDFLAGS="-L/usr/local/opt/openssl/lib -fuse-ld=lld" + KERNEL_MAKE_FLAGS += HOSTCFLAGS="-I$(BUILD_TOP)/external/elfutils/libelf -I/usr/local/opt/openssl/include" HOSTLDFLAGS="-L/usr/local/opt/openssl/lib -fuse-ld=lld" else - KERNEL_MAKE_FLAGS += CPATH="/usr/include:/usr/include/x86_64-linux-gnu" HOSTLDFLAGS="-L/usr/lib/x86_64-linux-gnu -L/usr/lib64 -fuse-ld=lld" + KERNEL_MAKE_FLAGS += CPATH="/usr/include:/usr/include/x86_64-linux-gnu" HOSTLDFLAGS="-L/usr/lib/x86_64-linux-gnu -L/usr/lib64 -fuse-ld=lld" endif TOOLS_PATH_OVERRIDE := \ @@ -154,17 +154,17 @@ TOOLS_PATH_OVERRIDE := \ PERL5LIB=$(BUILD_TOP)/prebuilts/tools-lineage/common/perl-base ifeq ($(KERNEL_ARCH),arm64) - # Add 32-bit GCC to PATH so that arm-linux-androidkernel-as is available for CONFIG_COMPAT_VDSO - TOOLS_PATH_OVERRIDE += PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin:$(KERNEL_TOOLCHAIN_arm):$$PATH + # Add 32-bit GCC to PATH so that arm-linux-androidkernel-as is available for CONFIG_COMPAT_VDSO + TOOLS_PATH_OVERRIDE += PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin:$(KERNEL_TOOLCHAIN_arm):$$PATH else - TOOLS_PATH_OVERRIDE += PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin:$$PATH + TOOLS_PATH_OVERRIDE += PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin:$$PATH endif # Set DTBO image locations so the build system knows to build them ifeq (true,$(filter true, $(TARGET_NEEDS_DTBOIMAGE) $(BOARD_KERNEL_SEPARATED_DTBO))) -TARGET_KERNEL_DTBO_PREFIX ?= -TARGET_KERNEL_DTBO ?= dtbo.img -BOARD_PREBUILT_DTBOIMAGE ?= $(TARGET_OUT_INTERMEDIATES)/DTBO_OBJ/arch/$(KERNEL_ARCH)/boot/$(TARGET_KERNEL_DTBO_PREFIX)$(TARGET_KERNEL_DTBO) + TARGET_KERNEL_DTBO_PREFIX ?= + TARGET_KERNEL_DTBO ?= dtbo.img + BOARD_PREBUILT_DTBOIMAGE ?= $(TARGET_OUT_INTERMEDIATES)/DTBO_OBJ/arch/$(KERNEL_ARCH)/boot/$(TARGET_KERNEL_DTBO_PREFIX)$(TARGET_KERNEL_DTBO) endif # Set the default dtb target @@ -183,11 +183,11 @@ KERNEL_MAKE_FLAGS += HOSTCXX=$(CLANG_PREBUILTS)/bin/clang++ # Use LLVM's substitutes for GNU binutils ifneq ($(TARGET_KERNEL_CLANG_COMPILE), false) -ifneq ($(TARGET_KERNEL_LLVM_BINUTILS), false) - KERNEL_MAKE_FLAGS += LLVM=1 LLVM_IAS=1 - KERNEL_MAKE_FLAGS += LD=$(CLANG_PREBUILTS)/bin/ld.lld - KERNEL_MAKE_FLAGS += AR=$(CLANG_PREBUILTS)/bin/llvm-ar -endif + ifneq ($(TARGET_KERNEL_LLVM_BINUTILS), false) + KERNEL_MAKE_FLAGS += LLVM=1 LLVM_IAS=1 + KERNEL_MAKE_FLAGS += LD=$(CLANG_PREBUILTS)/bin/ld.lld + KERNEL_MAKE_FLAGS += AR=$(CLANG_PREBUILTS)/bin/llvm-ar + endif endif # Since Linux 4.16, flex and bison are required @@ -201,5 +201,5 @@ TOOLS_PATH_OVERRIDE += BISON_PKGDATADIR=$(BUILD_TOP)/prebuilts/build-tools/commo OUT_DIR_PREFIX := $(shell echo $(OUT_DIR) | sed -e 's|/target/.*$$||g') KERNEL_BUILD_OUT_PREFIX := ifeq ($(OUT_DIR_PREFIX),out) -KERNEL_BUILD_OUT_PREFIX := $(BUILD_TOP)/ + KERNEL_BUILD_OUT_PREFIX := $(BUILD_TOP)/ endif From 54e57bf5e9c76935d88bdf5a6a1426337faa857e Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sat, 1 Oct 2022 00:38:14 +0300 Subject: [PATCH 36/76] kernel: Slightly reorder config Prepare for 5.10 kernel build changes Change-Id: I79ecf0655f9adc894091c4f26de337ebe03e3ca2 --- config/BoardConfigKernel.mk | 51 ++++++++++++++++++++----------------- 1 file changed, 28 insertions(+), 23 deletions(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index db9b374..9564b92 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -77,6 +77,24 @@ KERNEL_PATCHLEVEL := $(shell grep -s "^PATCHLEVEL = " $(TARGET_KERNEL_SOURCE)/Ma TARGET_KERNEL_VERSION ?= $(shell echo $(KERNEL_VERSION)"."$(KERNEL_PATCHLEVEL)) CLANG_PREBUILTS := $(BUILD_TOP)/prebuilts/clang/host/$(HOST_PREBUILT_TAG)/clang-r450784d + +ifneq ($(USE_CCACHE),) + ifneq ($(CCACHE_EXEC),) + # Android 10+ deprecates use of a build ccache. Only system installed ones are now allowed + CCACHE_BIN := $(CCACHE_EXEC) + endif +endif + +# Clear this first to prevent accidental poisoning from env +KERNEL_MAKE_FLAGS := + +# Add back threads, ninja cuts this to $(nproc)/2 +KERNEL_MAKE_FLAGS += -j$(shell prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin/nproc --all) + +TOOLS_PATH_OVERRIDE := \ + LD_LIBRARY_PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/lib:$$LD_LIBRARY_PATH \ + PERL5LIB=$(BUILD_TOP)/prebuilts/tools-lineage/common/perl-base + GCC_PREBUILTS := $(BUILD_TOP)/prebuilts/gcc/$(HOST_PREBUILT_TAG) # arm64 toolchain KERNEL_TOOLCHAIN_arm64 := $(GCC_PREBUILTS)/aarch64/aarch64-linux-android-4.9/bin @@ -106,13 +124,6 @@ endif # for tools like `as` KERNEL_TOOLCHAIN_PATH_gcc := $(KERNEL_TOOLCHAIN_$(KERNEL_ARCH)) -ifneq ($(USE_CCACHE),) - ifneq ($(CCACHE_EXEC),) - # Android 10+ deprecates use of a build ccache. Only system installed ones are now allowed - CCACHE_BIN := $(CCACHE_EXEC) - endif -endif - ifneq ($(TARGET_KERNEL_CLANG_COMPILE),false) KERNEL_CROSS_COMPILE := CROSS_COMPILE="$(KERNEL_TOOLCHAIN_PATH)" else @@ -125,12 +136,6 @@ ifeq ($(KERNEL_ARCH),arm64) KERNEL_CROSS_COMPILE += CROSS_COMPILE_COMPAT="$(KERNEL_TOOLCHAIN_arm)/$(KERNEL_TOOLCHAIN_PREFIX_arm)" endif -# Clear this first to prevent accidental poisoning from env -KERNEL_MAKE_FLAGS := - -# Add back threads, ninja cuts this to $(nproc)/2 -KERNEL_MAKE_FLAGS += -j$(shell prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin/nproc --all) - ifeq ($(TARGET_KERNEL_CLANG_COMPILE),false) ifeq ($(KERNEL_ARCH),arm) # Avoid "Unknown symbol _GLOBAL_OFFSET_TABLE_" errors @@ -149,10 +154,6 @@ else KERNEL_MAKE_FLAGS += CPATH="/usr/include:/usr/include/x86_64-linux-gnu" HOSTLDFLAGS="-L/usr/lib/x86_64-linux-gnu -L/usr/lib64 -fuse-ld=lld" endif -TOOLS_PATH_OVERRIDE := \ - LD_LIBRARY_PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/lib:$$LD_LIBRARY_PATH \ - PERL5LIB=$(BUILD_TOP)/prebuilts/tools-lineage/common/perl-base - ifeq ($(KERNEL_ARCH),arm64) # Add 32-bit GCC to PATH so that arm-linux-androidkernel-as is available for CONFIG_COMPAT_VDSO TOOLS_PATH_OVERRIDE += PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin:$(KERNEL_TOOLCHAIN_arm):$$PATH @@ -160,6 +161,16 @@ else TOOLS_PATH_OVERRIDE += PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin:$$PATH endif +# Set the full path to the clang command and LLVM binutils +KERNEL_MAKE_FLAGS += HOSTCC=$(CLANG_PREBUILTS)/bin/clang +KERNEL_MAKE_FLAGS += HOSTCXX=$(CLANG_PREBUILTS)/bin/clang++ +ifneq ($(TARGET_KERNEL_CLANG_COMPILE), false) + ifneq ($(TARGET_KERNEL_LLVM_BINUTILS), false) + KERNEL_MAKE_FLAGS += LD=$(CLANG_PREBUILTS)/bin/ld.lld + KERNEL_MAKE_FLAGS += AR=$(CLANG_PREBUILTS)/bin/llvm-ar + endif +endif + # Set DTBO image locations so the build system knows to build them ifeq (true,$(filter true, $(TARGET_NEEDS_DTBOIMAGE) $(BOARD_KERNEL_SEPARATED_DTBO))) TARGET_KERNEL_DTBO_PREFIX ?= @@ -177,16 +188,10 @@ TARGET_KERNEL_EXT_MODULES ?= # Set use the full path to the make command KERNEL_MAKE_CMD := $(BUILD_TOP)/prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/make -# Set the full path to the clang command -KERNEL_MAKE_FLAGS += HOSTCC=$(CLANG_PREBUILTS)/bin/clang -KERNEL_MAKE_FLAGS += HOSTCXX=$(CLANG_PREBUILTS)/bin/clang++ - # Use LLVM's substitutes for GNU binutils ifneq ($(TARGET_KERNEL_CLANG_COMPILE), false) ifneq ($(TARGET_KERNEL_LLVM_BINUTILS), false) KERNEL_MAKE_FLAGS += LLVM=1 LLVM_IAS=1 - KERNEL_MAKE_FLAGS += LD=$(CLANG_PREBUILTS)/bin/ld.lld - KERNEL_MAKE_FLAGS += AR=$(CLANG_PREBUILTS)/bin/llvm-ar endif endif From a1e8ccc1ba0aa75015b1bcb7a60bd802822174e0 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Sat, 10 Sep 2022 23:19:55 +0300 Subject: [PATCH 37/76] kernel: Changes for 5.10 build without GCC Change-Id: Id6e09467937e60e6b00a30a246ba0a4a8d71687b --- build/tasks/kernel.mk | 19 ++++-- config/BoardConfigKernel.mk | 132 +++++++++++++++++++----------------- 2 files changed, 82 insertions(+), 69 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 71342e8..ffb3ee7 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -226,12 +226,14 @@ ifneq ($(TARGET_KERNEL_CLANG_COMPILE),false) KERNEL_CLANG_VERSION := $(LLVM_PREBUILTS_VERSION) endif TARGET_KERNEL_CLANG_PATH ?= $(BUILD_TOP)/prebuilts/clang/host/$(HOST_PREBUILT_TAG)/$(KERNEL_CLANG_VERSION) - 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- + ifeq (,$(filter 5.10, $(TARGET_KERNEL_VERSION))) + 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 endif PATH_OVERRIDE += PATH=$(TARGET_KERNEL_CLANG_PATH)/bin:$$PATH LD_LIBRARY_PATH=$(TARGET_KERNEL_CLANG_PATH)/lib64:$$LD_LIBRARY_PATH ifeq ($(KERNEL_CC),) @@ -243,7 +245,10 @@ ifneq ($(TARGET_KERNEL_MODULES),) $(error TARGET_KERNEL_MODULES is no longer supported!) endif -PATH_OVERRIDE += PATH=$(KERNEL_TOOLCHAIN_PATH_gcc):$$PATH +# 5.10+ can fully compile without gcc +ifeq (,$(filter 5.10, $(TARGET_KERNEL_VERSION))) + PATH_OVERRIDE += PATH=$(KERNEL_TOOLCHAIN_PATH_gcc):$$PATH +endif # System tools are no longer allowed on 10+ PATH_OVERRIDE += $(TOOLS_PATH_OVERRIDE) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 9564b92..75fc874 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -95,80 +95,88 @@ TOOLS_PATH_OVERRIDE := \ LD_LIBRARY_PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/lib:$$LD_LIBRARY_PATH \ PERL5LIB=$(BUILD_TOP)/prebuilts/tools-lineage/common/perl-base -GCC_PREBUILTS := $(BUILD_TOP)/prebuilts/gcc/$(HOST_PREBUILT_TAG) -# arm64 toolchain -KERNEL_TOOLCHAIN_arm64 := $(GCC_PREBUILTS)/aarch64/aarch64-linux-android-4.9/bin -KERNEL_TOOLCHAIN_PREFIX_arm64 := aarch64-linux-android- -# arm toolchain -KERNEL_TOOLCHAIN_arm := $(GCC_PREBUILTS)/arm/arm-linux-androideabi-4.9/bin -KERNEL_TOOLCHAIN_PREFIX_arm := arm-linux-androidkernel- -# x86 toolchain -KERNEL_TOOLCHAIN_x86 := $(GCC_PREBUILTS)/x86/x86_64-linux-android-4.9/bin -KERNEL_TOOLCHAIN_PREFIX_x86 := x86_64-linux-android- +# 5.10+ can fully compile without gcc +ifeq (,$(filter 5.10, $(TARGET_KERNEL_VERSION))) + GCC_PREBUILTS := $(BUILD_TOP)/prebuilts/gcc/$(HOST_PREBUILT_TAG) + # arm64 toolchain + KERNEL_TOOLCHAIN_arm64 := $(GCC_PREBUILTS)/aarch64/aarch64-linux-android-4.9/bin + KERNEL_TOOLCHAIN_PREFIX_arm64 := aarch64-linux-android- + # arm toolchain + KERNEL_TOOLCHAIN_arm := $(GCC_PREBUILTS)/arm/arm-linux-androideabi-4.9/bin + KERNEL_TOOLCHAIN_PREFIX_arm := arm-linux-androidkernel- + # x86 toolchain + KERNEL_TOOLCHAIN_x86 := $(GCC_PREBUILTS)/x86/x86_64-linux-android-4.9/bin + KERNEL_TOOLCHAIN_PREFIX_x86 := x86_64-linux-android- -TARGET_KERNEL_CROSS_COMPILE_PREFIX := $(strip $(TARGET_KERNEL_CROSS_COMPILE_PREFIX)) -ifneq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),) - KERNEL_TOOLCHAIN_PREFIX ?= $(TARGET_KERNEL_CROSS_COMPILE_PREFIX) -else - KERNEL_TOOLCHAIN ?= $(KERNEL_TOOLCHAIN_$(KERNEL_ARCH)) - KERNEL_TOOLCHAIN_PREFIX ?= $(KERNEL_TOOLCHAIN_PREFIX_$(KERNEL_ARCH)) -endif + TARGET_KERNEL_CROSS_COMPILE_PREFIX := $(strip $(TARGET_KERNEL_CROSS_COMPILE_PREFIX)) + ifneq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),) + KERNEL_TOOLCHAIN_PREFIX ?= $(TARGET_KERNEL_CROSS_COMPILE_PREFIX) + else + KERNEL_TOOLCHAIN ?= $(KERNEL_TOOLCHAIN_$(KERNEL_ARCH)) + KERNEL_TOOLCHAIN_PREFIX ?= $(KERNEL_TOOLCHAIN_PREFIX_$(KERNEL_ARCH)) + endif -ifeq ($(KERNEL_TOOLCHAIN),) - KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN_PREFIX) -else - KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN)/$(KERNEL_TOOLCHAIN_PREFIX) -endif + ifeq ($(KERNEL_TOOLCHAIN),) + KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN_PREFIX) + else + KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN)/$(KERNEL_TOOLCHAIN_PREFIX) + endif -# We need to add GCC toolchain to the path no matter what -# for tools like `as` -KERNEL_TOOLCHAIN_PATH_gcc := $(KERNEL_TOOLCHAIN_$(KERNEL_ARCH)) + # We need to add GCC toolchain to the path no matter what + # for tools like `as` + KERNEL_TOOLCHAIN_PATH_gcc := $(KERNEL_TOOLCHAIN_$(KERNEL_ARCH)) -ifneq ($(TARGET_KERNEL_CLANG_COMPILE),false) - KERNEL_CROSS_COMPILE := CROSS_COMPILE="$(KERNEL_TOOLCHAIN_PATH)" -else - KERNEL_CROSS_COMPILE := CROSS_COMPILE="$(CCACHE_BIN) $(KERNEL_TOOLCHAIN_PATH)" -endif + ifneq ($(TARGET_KERNEL_CLANG_COMPILE),false) + KERNEL_CROSS_COMPILE := CROSS_COMPILE="$(KERNEL_TOOLCHAIN_PATH)" + else + KERNEL_CROSS_COMPILE := CROSS_COMPILE="$(CCACHE_BIN) $(KERNEL_TOOLCHAIN_PATH)" + endif -# Needed for CONFIG_COMPAT_VDSO, safe to set for all arm64 builds -ifeq ($(KERNEL_ARCH),arm64) - KERNEL_CROSS_COMPILE += CROSS_COMPILE_ARM32="$(KERNEL_TOOLCHAIN_arm)/$(KERNEL_TOOLCHAIN_PREFIX_arm)" - KERNEL_CROSS_COMPILE += CROSS_COMPILE_COMPAT="$(KERNEL_TOOLCHAIN_arm)/$(KERNEL_TOOLCHAIN_PREFIX_arm)" -endif + # Needed for CONFIG_COMPAT_VDSO, safe to set for all arm64 builds + ifeq ($(KERNEL_ARCH),arm64) + KERNEL_CROSS_COMPILE += CROSS_COMPILE_ARM32="$(KERNEL_TOOLCHAIN_arm)/$(KERNEL_TOOLCHAIN_PREFIX_arm)" + KERNEL_CROSS_COMPILE += CROSS_COMPILE_COMPAT="$(KERNEL_TOOLCHAIN_arm)/$(KERNEL_TOOLCHAIN_PREFIX_arm)" + endif -ifeq ($(TARGET_KERNEL_CLANG_COMPILE),false) - ifeq ($(KERNEL_ARCH),arm) - # Avoid "Unknown symbol _GLOBAL_OFFSET_TABLE_" errors - KERNEL_MAKE_FLAGS += CFLAGS_MODULE="-fno-pic" + ifeq ($(TARGET_KERNEL_CLANG_COMPILE),false) + ifeq ($(KERNEL_ARCH),arm) + # Avoid "Unknown symbol _GLOBAL_OFFSET_TABLE_" errors + KERNEL_MAKE_FLAGS += CFLAGS_MODULE="-fno-pic" + endif + + ifeq ($(KERNEL_ARCH),arm64) + # Avoid "unsupported RELA relocation: 311" errors (R_AARCH64_ADR_GOT_PAGE) + KERNEL_MAKE_FLAGS += CFLAGS_MODULE="-fno-pic" + endif + endif + + ifeq ($(HOST_OS),darwin) + KERNEL_MAKE_FLAGS += HOSTCFLAGS="-I$(BUILD_TOP)/external/elfutils/libelf -I/usr/local/opt/openssl/include" HOSTLDFLAGS="-L/usr/local/opt/openssl/lib -fuse-ld=lld" + else + KERNEL_MAKE_FLAGS += CPATH="/usr/include:/usr/include/x86_64-linux-gnu" HOSTLDFLAGS="-L/usr/lib/x86_64-linux-gnu -L/usr/lib64 -fuse-ld=lld" endif ifeq ($(KERNEL_ARCH),arm64) - # Avoid "unsupported RELA relocation: 311" errors (R_AARCH64_ADR_GOT_PAGE) - KERNEL_MAKE_FLAGS += CFLAGS_MODULE="-fno-pic" + # Add 32-bit GCC to PATH so that arm-linux-androidkernel-as is available for CONFIG_COMPAT_VDSO + TOOLS_PATH_OVERRIDE += PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin:$(KERNEL_TOOLCHAIN_arm):$$PATH + else + TOOLS_PATH_OVERRIDE += PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin:$$PATH endif -endif -ifeq ($(HOST_OS),darwin) - KERNEL_MAKE_FLAGS += HOSTCFLAGS="-I$(BUILD_TOP)/external/elfutils/libelf -I/usr/local/opt/openssl/include" HOSTLDFLAGS="-L/usr/local/opt/openssl/lib -fuse-ld=lld" -else - KERNEL_MAKE_FLAGS += CPATH="/usr/include:/usr/include/x86_64-linux-gnu" HOSTLDFLAGS="-L/usr/lib/x86_64-linux-gnu -L/usr/lib64 -fuse-ld=lld" -endif - -ifeq ($(KERNEL_ARCH),arm64) - # Add 32-bit GCC to PATH so that arm-linux-androidkernel-as is available for CONFIG_COMPAT_VDSO - TOOLS_PATH_OVERRIDE += PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin:$(KERNEL_TOOLCHAIN_arm):$$PATH -else - TOOLS_PATH_OVERRIDE += PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin:$$PATH -endif - -# Set the full path to the clang command and LLVM binutils -KERNEL_MAKE_FLAGS += HOSTCC=$(CLANG_PREBUILTS)/bin/clang -KERNEL_MAKE_FLAGS += HOSTCXX=$(CLANG_PREBUILTS)/bin/clang++ -ifneq ($(TARGET_KERNEL_CLANG_COMPILE), false) - ifneq ($(TARGET_KERNEL_LLVM_BINUTILS), false) - KERNEL_MAKE_FLAGS += LD=$(CLANG_PREBUILTS)/bin/ld.lld - KERNEL_MAKE_FLAGS += AR=$(CLANG_PREBUILTS)/bin/llvm-ar + # Set the full path to the clang command and LLVM binutils + KERNEL_MAKE_FLAGS += HOSTCC=$(CLANG_PREBUILTS)/bin/clang + KERNEL_MAKE_FLAGS += HOSTCXX=$(CLANG_PREBUILTS)/bin/clang++ + ifneq ($(TARGET_KERNEL_CLANG_COMPILE), false) + ifneq ($(TARGET_KERNEL_LLVM_BINUTILS), false) + KERNEL_MAKE_FLAGS += LD=$(CLANG_PREBUILTS)/bin/ld.lld + KERNEL_MAKE_FLAGS += AR=$(CLANG_PREBUILTS)/bin/llvm-ar + endif endif +else + KERNEL_MAKE_FLAGS += HOSTCFLAGS="--sysroot=$(BUILD_TOP)/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/sysroot -I$(BUILD_TOP)/prebuilts/kernel-build-tools/linux-x86/include" + KERNEL_MAKE_FLAGS += HOSTLDFLAGS="--sysroot=$(BUILD_TOP)/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/sysroot -Wl,-rpath,$(BUILD_TOP)/prebuilts/kernel-build-tools/linux-x86/lib64 -L $(BUILD_TOP)/prebuilts/kernel-build-tools/linux-x86/lib64 -fuse-ld=lld --rtlib=compiler-rt" + + TOOLS_PATH_OVERRIDE += PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin:$(CLANG_PREBUILTS)/bin:$$PATH endif # Set DTBO image locations so the build system knows to build them From 932a6a52282a75807ff48f900585e42051fa708e Mon Sep 17 00:00:00 2001 From: Alexander Koskovich Date: Thu, 4 Aug 2022 13:00:07 -0700 Subject: [PATCH 38/76] lineage: kernel: Use getconf instead of nproc Change-Id: Id8215f290a88ddf3a6bc1764d9ef9a09f6aa810d --- config/BoardConfigKernel.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 75fc874..fcd7b5b 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -88,8 +88,8 @@ endif # Clear this first to prevent accidental poisoning from env KERNEL_MAKE_FLAGS := -# Add back threads, ninja cuts this to $(nproc)/2 -KERNEL_MAKE_FLAGS += -j$(shell prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin/nproc --all) +# Add back threads, ninja cuts this to $(getconf _NPROCESSORS_ONLN)/2 +KERNEL_MAKE_FLAGS += -j$(shell getconf _NPROCESSORS_ONLN) TOOLS_PATH_OVERRIDE := \ LD_LIBRARY_PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/lib:$$LD_LIBRARY_PATH \ From 8229c4a7d206b96385030c92cb85f6a4f8931d1d Mon Sep 17 00:00:00 2001 From: Tim Zimmermann Date: Thu, 14 Jul 2022 21:25:36 +0200 Subject: [PATCH 39/76] kernel: Support building dtbimage with mkdtboimg.py config Change-Id: Ic0efbf0308e334c1cfe0df0493caa71afe27a621 --- build/tasks/kernel.mk | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index ffb3ee7..adc67ce 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -44,6 +44,8 @@ # For example, for ARM devices, # use zImage-dtb instead of zImage. # +# BOARD_DTB_CFG = Path to a mkdtboimg.py config file for dtb.img +# # BOARD_DTBO_CFG = Path to a mkdtboimg.py config file # # BOARD_CUSTOM_DTBOIMG_MK = Path to a custom dtboimage makefile @@ -463,6 +465,10 @@ ifeq ($(BOARD_PREBUILT_DTBIMAGE_DIR),) $(DTB_OUT): mkdir -p $(DTB_OUT) +ifdef BOARD_DTB_CFG +MKDTBOIMG := $(HOST_OUT_EXECUTABLES)/mkdtboimg.py$(HOST_EXECUTABLE_SUFFIX) +$(INSTALLED_DTBIMAGE_TARGET): $(MKDTBOIMG) +endif $(INSTALLED_DTBIMAGE_TARGET): $(DTC) $(DTB_OUT) ifeq ($(TARGET_WANTS_EMPTY_DTB),true) @rm -f $@ @@ -472,7 +478,11 @@ else $(hide) find $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtb" | xargs rm -f $(call make-dtb-target,$(KERNEL_DEFCONFIG)) $(call make-dtb-target,$(TARGET_KERNEL_DTB)) +ifdef BOARD_DTB_CFG + $(MKDTBOIMG) cfg_create $@ $(BOARD_DTB_CFG) -d $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts +else cat $(shell find $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtb" | sort) > $@ +endif # BOARD_DTB_CFG $(hide) touch -c $(DTB_OUT) endif # !TARGET_WANTS_EMPTY_DTB From 5ec047b7acd1f58d16cf6f698899bfff47eb13f0 Mon Sep 17 00:00:00 2001 From: Aaron Kling Date: Mon, 17 Oct 2022 00:17:13 -0500 Subject: [PATCH 40/76] kernel: Add support for custom dtbimage generation rules Change-Id: I79d67f9f40ef3f0970d0e29393d00600b57e337b --- build/tasks/kernel.mk | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index adc67ce..e3db7d0 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -48,6 +48,8 @@ # # BOARD_DTBO_CFG = Path to a mkdtboimg.py config file # +# BOARD_CUSTOM_DTBIMG_MK = Path to a custom dtbimage makefile +# # BOARD_CUSTOM_DTBOIMG_MK = Path to a custom dtboimage makefile # # KERNEL_CC = The C Compiler used. This is automatically set based @@ -461,6 +463,9 @@ endif # BOARD_CUSTOM_DTBOIMG_MK endif # TARGET_NEEDS_DTBOIMAGE/BOARD_KERNEL_SEPARATED_DTBO ifeq ($(BOARD_INCLUDE_DTB_IN_BOOTIMG),true) +ifneq ($(BOARD_CUSTOM_DTBIMG_MK),) +include $(BOARD_CUSTOM_DTBIMG_MK) +else ifeq ($(BOARD_PREBUILT_DTBIMAGE_DIR),) $(DTB_OUT): mkdir -p $(DTB_OUT) @@ -487,6 +492,7 @@ endif # BOARD_DTB_CFG endif # !TARGET_WANTS_EMPTY_DTB endif # !BOARD_PREBUILT_DTBIMAGE_DIR +endif # BOARD_CUSTOM_DTBIMG_MK endif # BOARD_INCLUDE_DTB_IN_BOOTIMG endif # FULL_KERNEL_BUILD From 098b7802d56787c2a19b7d6b0d4a0034e39c9833 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Tue, 1 Nov 2022 14:41:42 +0200 Subject: [PATCH 41/76] kernel: Fix clang version override Change-Id: I18fceeeeab5426f55a73d0cb8d72abd5f40c67ec --- build/tasks/kernel.mk | 11 ----------- config/BoardConfigKernel.mk | 21 +++++++++++++++------ 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index e3db7d0..93bd8c1 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -31,10 +31,6 @@ # # TARGET_KERNEL_CLANG_COMPILE = Compile kernel with clang, defaults to true # -# 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 @@ -223,13 +219,6 @@ ifeq ($(or $(FULL_RECOVERY_KERNEL_BUILD), $(FULL_KERNEL_BUILD)),true) # Add host bin out dir to path PATH_OVERRIDE := PATH=$(KERNEL_BUILD_OUT_PREFIX)$(HOST_OUT_EXECUTABLES):$$PATH ifneq ($(TARGET_KERNEL_CLANG_COMPILE),false) - ifneq ($(TARGET_KERNEL_CLANG_VERSION),) - KERNEL_CLANG_VERSION := clang-$(TARGET_KERNEL_CLANG_VERSION) - else - # Use the default version of clang if TARGET_KERNEL_CLANG_VERSION hasn't been set by the device config - KERNEL_CLANG_VERSION := $(LLVM_PREBUILTS_VERSION) - endif - TARGET_KERNEL_CLANG_PATH ?= $(BUILD_TOP)/prebuilts/clang/host/$(HOST_PREBUILT_TAG)/$(KERNEL_CLANG_VERSION) ifeq (,$(filter 5.10, $(TARGET_KERNEL_VERSION))) ifeq ($(KERNEL_ARCH),arm64) KERNEL_CLANG_TRIPLE ?= CLANG_TRIPLE=aarch64-linux-gnu- diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index fcd7b5b..35286bf 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -31,6 +31,9 @@ # x86_64-linux-android- for x86 # # TARGET_KERNEL_CLANG_COMPILE = Compile kernel with clang, defaults to true +# TARGET_KERNEL_CLANG_VERSION = Clang prebuilts version, optional, defaults to clang-stable +# TARGET_KERNEL_CLANG_PATH = Clang prebuilts path, optional +# # TARGET_KERNEL_LLVM_BINUTILS = Use LLVM binutils, defaults to true # TARGET_KERNEL_VERSION = Reported kernel version in top level kernel # makefile. Can be overriden in device trees @@ -76,7 +79,13 @@ KERNEL_VERSION := $(shell grep -s "^VERSION = " $(TARGET_KERNEL_SOURCE)/Makefile KERNEL_PATCHLEVEL := $(shell grep -s "^PATCHLEVEL = " $(TARGET_KERNEL_SOURCE)/Makefile | awk '{ print $$3 }') TARGET_KERNEL_VERSION ?= $(shell echo $(KERNEL_VERSION)"."$(KERNEL_PATCHLEVEL)) -CLANG_PREBUILTS := $(BUILD_TOP)/prebuilts/clang/host/$(HOST_PREBUILT_TAG)/clang-r450784d +ifneq ($(TARGET_KERNEL_CLANG_VERSION),) + KERNEL_CLANG_VERSION := clang-$(TARGET_KERNEL_CLANG_VERSION) +else + # Use the default version of clang if TARGET_KERNEL_CLANG_VERSION hasn't been set by the device config + KERNEL_CLANG_VERSION := clang-r450784d +endif +TARGET_KERNEL_CLANG_PATH ?= $(BUILD_TOP)/prebuilts/clang/host/$(HOST_PREBUILT_TAG)/$(KERNEL_CLANG_VERSION) ifneq ($(USE_CCACHE),) ifneq ($(CCACHE_EXEC),) @@ -164,19 +173,19 @@ ifeq (,$(filter 5.10, $(TARGET_KERNEL_VERSION))) endif # Set the full path to the clang command and LLVM binutils - KERNEL_MAKE_FLAGS += HOSTCC=$(CLANG_PREBUILTS)/bin/clang - KERNEL_MAKE_FLAGS += HOSTCXX=$(CLANG_PREBUILTS)/bin/clang++ + KERNEL_MAKE_FLAGS += HOSTCC=$(TARGET_KERNEL_CLANG_PATH)/bin/clang + KERNEL_MAKE_FLAGS += HOSTCXX=$(TARGET_KERNEL_CLANG_PATH)/bin/clang++ ifneq ($(TARGET_KERNEL_CLANG_COMPILE), false) ifneq ($(TARGET_KERNEL_LLVM_BINUTILS), false) - KERNEL_MAKE_FLAGS += LD=$(CLANG_PREBUILTS)/bin/ld.lld - KERNEL_MAKE_FLAGS += AR=$(CLANG_PREBUILTS)/bin/llvm-ar + KERNEL_MAKE_FLAGS += LD=$(TARGET_KERNEL_CLANG_PATH)/bin/ld.lld + KERNEL_MAKE_FLAGS += AR=$(TARGET_KERNEL_CLANG_PATH)/bin/llvm-ar endif endif else KERNEL_MAKE_FLAGS += HOSTCFLAGS="--sysroot=$(BUILD_TOP)/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/sysroot -I$(BUILD_TOP)/prebuilts/kernel-build-tools/linux-x86/include" KERNEL_MAKE_FLAGS += HOSTLDFLAGS="--sysroot=$(BUILD_TOP)/prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.17-4.8/sysroot -Wl,-rpath,$(BUILD_TOP)/prebuilts/kernel-build-tools/linux-x86/lib64 -L $(BUILD_TOP)/prebuilts/kernel-build-tools/linux-x86/lib64 -fuse-ld=lld --rtlib=compiler-rt" - TOOLS_PATH_OVERRIDE += PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin:$(CLANG_PREBUILTS)/bin:$$PATH + TOOLS_PATH_OVERRIDE += PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin:$(TARGET_KERNEL_CLANG_PATH)/bin:$$PATH endif # Set DTBO image locations so the build system knows to build them From 5a5867bf3f55cf0e8550f5bb30522c0c3a0b9612 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Tue, 1 Nov 2022 14:48:50 +0200 Subject: [PATCH 42/76] kernel: Override LD_LIBRARY_PATH only on <5.10 5.10 doesn't need LD_LIBRARY_PATH set Change-Id: I5f6e732610f947d50b47e238d6a42365396b18ad --- build/tasks/kernel.mk | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 93bd8c1..a0f4a86 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -227,8 +227,9 @@ ifneq ($(TARGET_KERNEL_CLANG_COMPILE),false) else ifeq ($(KERNEL_ARCH),x86) KERNEL_CLANG_TRIPLE ?= CLANG_TRIPLE=x86_64-linux-gnu- endif + PATH_OVERRIDE += LD_LIBRARY_PATH=$(TARGET_KERNEL_CLANG_PATH)/lib64:$$LD_LIBRARY_PATH endif - PATH_OVERRIDE += PATH=$(TARGET_KERNEL_CLANG_PATH)/bin:$$PATH LD_LIBRARY_PATH=$(TARGET_KERNEL_CLANG_PATH)/lib64:$$LD_LIBRARY_PATH + PATH_OVERRIDE += PATH=$(TARGET_KERNEL_CLANG_PATH)/bin:$$PATH ifeq ($(KERNEL_CC),) KERNEL_CC := CC="$(CCACHE_BIN) clang" endif From 35252a67675ca7456dab16ec339a1649fca41717 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Tue, 1 Nov 2022 14:57:41 +0200 Subject: [PATCH 43/76] kernel: Only add GCC to PATH when using GNU binutils Change-Id: Ia842ed409145a81a92077dde5d6e9749a057f047 --- build/tasks/kernel.mk | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index a0f4a86..f0b1db4 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -239,9 +239,11 @@ ifneq ($(TARGET_KERNEL_MODULES),) $(error TARGET_KERNEL_MODULES is no longer supported!) endif -# 5.10+ can fully compile without gcc -ifeq (,$(filter 5.10, $(TARGET_KERNEL_VERSION))) - PATH_OVERRIDE += PATH=$(KERNEL_TOOLCHAIN_PATH_gcc):$$PATH +ifeq ($(TARGET_KERNEL_LLVM_BINUTILS), false) + # 5.10+ can fully compile without gcc + ifeq (,$(filter 5.10, $(TARGET_KERNEL_VERSION))) + PATH_OVERRIDE += PATH=$(KERNEL_TOOLCHAIN_PATH_gcc):$$PATH + endif endif # System tools are no longer allowed on 10+ From 1ee0622d54a9ca29974ffbee69e35ed76e41d3db Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Tue, 1 Nov 2022 15:01:22 +0200 Subject: [PATCH 44/76] kernel: Remove TARGET_KERNEL_MODULES error This has been an error for 3 years now, plus it has not been functional for even more years. Change-Id: I8b12e8d08847ba119d2904f90766105367025d9c --- build/tasks/kernel.mk | 4 ---- 1 file changed, 4 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index f0b1db4..283f7cb 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -235,10 +235,6 @@ ifneq ($(TARGET_KERNEL_CLANG_COMPILE),false) endif endif -ifneq ($(TARGET_KERNEL_MODULES),) - $(error TARGET_KERNEL_MODULES is no longer supported!) -endif - ifeq ($(TARGET_KERNEL_LLVM_BINUTILS), false) # 5.10+ can fully compile without gcc ifeq (,$(filter 5.10, $(TARGET_KERNEL_VERSION))) From c81f10f431241390ebb2e8c4e0bc56288c552527 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Tue, 1 Nov 2022 14:54:44 +0200 Subject: [PATCH 45/76] kernel: Remove darwin support Darwin kernel build is not supported for >=5.10 and non-standard clang versions. Another side effect is that it causes LD_LIBRARY_PATH to get overwritten, which breaks certain configurations. Let's just get rid of it since AOSP darwin build is no longer supported. Change-Id: I9ac642996b90937bd9c52138fb06bf1eff901c8b --- config/BoardConfigKernel.mk | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 35286bf..9dcfef8 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -101,7 +101,6 @@ KERNEL_MAKE_FLAGS := KERNEL_MAKE_FLAGS += -j$(shell getconf _NPROCESSORS_ONLN) TOOLS_PATH_OVERRIDE := \ - LD_LIBRARY_PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/lib:$$LD_LIBRARY_PATH \ PERL5LIB=$(BUILD_TOP)/prebuilts/tools-lineage/common/perl-base # 5.10+ can fully compile without gcc @@ -159,11 +158,7 @@ ifeq (,$(filter 5.10, $(TARGET_KERNEL_VERSION))) endif endif - ifeq ($(HOST_OS),darwin) - KERNEL_MAKE_FLAGS += HOSTCFLAGS="-I$(BUILD_TOP)/external/elfutils/libelf -I/usr/local/opt/openssl/include" HOSTLDFLAGS="-L/usr/local/opt/openssl/lib -fuse-ld=lld" - else - KERNEL_MAKE_FLAGS += CPATH="/usr/include:/usr/include/x86_64-linux-gnu" HOSTLDFLAGS="-L/usr/lib/x86_64-linux-gnu -L/usr/lib64 -fuse-ld=lld" - endif + KERNEL_MAKE_FLAGS += CPATH="/usr/include:/usr/include/x86_64-linux-gnu" HOSTLDFLAGS="-L/usr/lib/x86_64-linux-gnu -L/usr/lib64 -fuse-ld=lld" ifeq ($(KERNEL_ARCH),arm64) # Add 32-bit GCC to PATH so that arm-linux-androidkernel-as is available for CONFIG_COMPAT_VDSO From 927851302432a4f86ad95016723c5848b2950deb Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Fri, 4 Nov 2022 02:12:03 +0200 Subject: [PATCH 46/76] kernel: Support copying modules to vendor_kernel_boot Test: Build gs201 with source built kernel/modules, boot. Change-Id: Ie66400ddd44cfd249e1b4710f4d1c4efa32389a4 --- build/tasks/kernel.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 283f7cb..95bcf39 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -356,6 +356,10 @@ ifneq (,$(filter dlkm,$(BOARD_VENDOR_RAMDISK_FRAGMENTS))) KERNEL_VENDOR_RAMDISK_MODULES_OUT := $(VENDOR_RAMDISK_FRAGMENT.dlkm.STAGING_DIR) KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_vendor_ramdisk_fragment-stage-dlkm) $(INTERNAL_VENDOR_RAMDISK_FRAGMENT_TARGETS): $(TARGET_PREBUILT_INT_KERNEL) +else ifeq ($(PRODUCT_BUILD_VENDOR_KERNEL_BOOT_IMAGE),true) +KERNEL_VENDOR_RAMDISK_MODULES_OUT := $(TARGET_VENDOR_KERNEL_RAMDISK_OUT) +KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_vendor_kernel_ramdisk) +$(INTERNAL_VENDOR_KERNEL_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) else KERNEL_VENDOR_RAMDISK_MODULES_OUT := $(TARGET_VENDOR_RAMDISK_OUT) KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_vendor_ramdisk) From 2f387ee962d67c59815800e1e9037c739229f4de Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Mon, 14 Nov 2022 13:09:00 +0200 Subject: [PATCH 47/76] kernel: Allow devices to opt-in for full LLVM build android11-5.4 kernel can fully compile with LLVM with a few cherrypicks from android12-5.4 and android12-5.10 Change-Id: Ib71935d284ad78f1c23d039c15bfc5e0314a19eb --- build/tasks/kernel.mk | 9 +++------ config/BoardConfigKernel.mk | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 95bcf39..7d5a355 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -219,7 +219,7 @@ ifeq ($(or $(FULL_RECOVERY_KERNEL_BUILD), $(FULL_KERNEL_BUILD)),true) # Add host bin out dir to path PATH_OVERRIDE := PATH=$(KERNEL_BUILD_OUT_PREFIX)$(HOST_OUT_EXECUTABLES):$$PATH ifneq ($(TARGET_KERNEL_CLANG_COMPILE),false) - ifeq (,$(filter 5.10, $(TARGET_KERNEL_VERSION))) + ifneq ($(KERNEL_NO_GCC), true) ifeq ($(KERNEL_ARCH),arm64) KERNEL_CLANG_TRIPLE ?= CLANG_TRIPLE=aarch64-linux-gnu- else ifeq ($(KERNEL_ARCH),arm) @@ -235,11 +235,8 @@ ifneq ($(TARGET_KERNEL_CLANG_COMPILE),false) endif endif -ifeq ($(TARGET_KERNEL_LLVM_BINUTILS), false) - # 5.10+ can fully compile without gcc - ifeq (,$(filter 5.10, $(TARGET_KERNEL_VERSION))) - PATH_OVERRIDE += PATH=$(KERNEL_TOOLCHAIN_PATH_gcc):$$PATH - endif +ifneq ($(KERNEL_NO_GCC), true) + PATH_OVERRIDE += PATH=$(KERNEL_TOOLCHAIN_PATH_gcc):$$PATH endif # System tools are no longer allowed on 10+ diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 9dcfef8..449a223 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -35,6 +35,8 @@ # TARGET_KERNEL_CLANG_PATH = Clang prebuilts path, optional # # TARGET_KERNEL_LLVM_BINUTILS = Use LLVM binutils, defaults to true +# TARGET_KERNEL_NO_GCC = Fully compile the kernel without GCC. +# Defaults to false # TARGET_KERNEL_VERSION = Reported kernel version in top level kernel # makefile. Can be overriden in device trees # in the event of prebuilt kernel. @@ -79,6 +81,15 @@ KERNEL_VERSION := $(shell grep -s "^VERSION = " $(TARGET_KERNEL_SOURCE)/Makefile KERNEL_PATCHLEVEL := $(shell grep -s "^PATCHLEVEL = " $(TARGET_KERNEL_SOURCE)/Makefile | awk '{ print $$3 }') TARGET_KERNEL_VERSION ?= $(shell echo $(KERNEL_VERSION)"."$(KERNEL_PATCHLEVEL)) +# 5.10+ can fully compile without GCC by default +ifneq (,$(filter 5.10, $(TARGET_KERNEL_VERSION))) + TARGET_KERNEL_NO_GCC ?= true +endif + +ifeq ($(TARGET_KERNEL_NO_GCC), true) + KERNEL_NO_GCC := true +endif + ifneq ($(TARGET_KERNEL_CLANG_VERSION),) KERNEL_CLANG_VERSION := clang-$(TARGET_KERNEL_CLANG_VERSION) else @@ -103,8 +114,7 @@ KERNEL_MAKE_FLAGS += -j$(shell getconf _NPROCESSORS_ONLN) TOOLS_PATH_OVERRIDE := \ PERL5LIB=$(BUILD_TOP)/prebuilts/tools-lineage/common/perl-base -# 5.10+ can fully compile without gcc -ifeq (,$(filter 5.10, $(TARGET_KERNEL_VERSION))) +ifneq ($(KERNEL_NO_GCC), true) GCC_PREBUILTS := $(BUILD_TOP)/prebuilts/gcc/$(HOST_PREBUILT_TAG) # arm64 toolchain KERNEL_TOOLCHAIN_arm64 := $(GCC_PREBUILTS)/aarch64/aarch64-linux-android-4.9/bin From 3617887ee71adbc9c9b78226473b45c939bd3035 Mon Sep 17 00:00:00 2001 From: Alessandro Astone Date: Sat, 31 Dec 2022 22:08:16 +0100 Subject: [PATCH 48/76] kernel: Force disable LLVM CUDA The kernel tries to define the LINUX_COMPILER macro from the output of `$(CC) -v | grep ' version '`, but in clang that might produce more than one line containing ' version ' when CUDA is installed: ``` Android (8490178, based on r450784d) clang version 14.0.6 Found CUDA installation: /usr/local/cuda, version 11.0 ``` That causes the macro to expand into multiple lines, upsetting the compiler that cannot find the ending double quote. In upstream linux this is fixed from v5.8 Change-Id: Icde4253e989df1cbbefc0ce98f437d16822fc93b --- build/tasks/kernel.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 7d5a355..9edf4c6 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -231,7 +231,7 @@ ifneq ($(TARGET_KERNEL_CLANG_COMPILE),false) endif PATH_OVERRIDE += PATH=$(TARGET_KERNEL_CLANG_PATH)/bin:$$PATH ifeq ($(KERNEL_CC),) - KERNEL_CC := CC="$(CCACHE_BIN) clang" + KERNEL_CC := CC="$(CCACHE_BIN) clang --cuda-path=/dev/null" endif endif From 0f629c878ff512730b248b0c220652535cdcfc64 Mon Sep 17 00:00:00 2001 From: dianlujitao Date: Wed, 1 Mar 2023 23:06:18 +0800 Subject: [PATCH 49/76] kernel: Force disable LLVM HIP Gets rid of the following from clang -v: ``` Found HIP installation: /opt/rocm, version 5.4.22804 ``` Change-Id: Ic58b3fb2dd67d345372bec7f5d2cf023ed2fb34d --- build/tasks/kernel.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 9edf4c6..fe7abf6 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -231,7 +231,7 @@ ifneq ($(TARGET_KERNEL_CLANG_COMPILE),false) endif PATH_OVERRIDE += PATH=$(TARGET_KERNEL_CLANG_PATH)/bin:$$PATH ifeq ($(KERNEL_CC),) - KERNEL_CC := CC="$(CCACHE_BIN) clang --cuda-path=/dev/null" + KERNEL_CC := CC="$(CCACHE_BIN) clang --cuda-path=/dev/null --hip-path=/dev/null" endif endif From d7f6af28a38d4cc34e7876f340d072c4e6cc36a3 Mon Sep 17 00:00:00 2001 From: dianlujitao Date: Thu, 2 Mar 2023 20:29:25 +0800 Subject: [PATCH 50/76] kernel: Check HIP support of clang before disabling it Old clang releases don't support --hip-path, so passing this flag will break the build. Change-Id: If36defb0e74893581849700fb67e6aa4617908a8 --- build/tasks/kernel.mk | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index fe7abf6..84195ff 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -231,7 +231,11 @@ ifneq ($(TARGET_KERNEL_CLANG_COMPILE),false) endif PATH_OVERRIDE += PATH=$(TARGET_KERNEL_CLANG_PATH)/bin:$$PATH ifeq ($(KERNEL_CC),) - KERNEL_CC := CC="$(CCACHE_BIN) clang --cuda-path=/dev/null --hip-path=/dev/null" + CLANG_EXTRA_FLAGS := --cuda-path=/dev/null + ifeq ($(shell $(TARGET_KERNEL_CLANG_PATH)/bin/clang -v --hip-path=/dev/null >/dev/null 2>&1; echo $$?),0) + CLANG_EXTRA_FLAGS += --hip-path=/dev/null + endif + KERNEL_CC := CC="$(CCACHE_BIN) clang $(CLANG_EXTRA_FLAGS)" endif endif From 7645a8cf8dd8d9f8b5bec6e455729afd9de2cbb3 Mon Sep 17 00:00:00 2001 From: Bruno Martins Date: Thu, 11 May 2023 21:53:03 +0100 Subject: [PATCH 51/76] kernel: Go full LLVM build on 5.10+ kernels Make the conditions accurately reflect the comment: "5.10+ can fully compile without GCC by default". Change-Id: Ia9070871c23a710ba5b461ad522db241183e34d1 --- config/BoardConfigKernel.mk | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 449a223..d841ab3 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2022 The LineageOS Project +# Copyright (C) 2018-2023 The LineageOS Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -37,9 +37,6 @@ # TARGET_KERNEL_LLVM_BINUTILS = Use LLVM binutils, defaults to true # TARGET_KERNEL_NO_GCC = Fully compile the kernel without GCC. # Defaults to false -# TARGET_KERNEL_VERSION = Reported kernel version in top level kernel -# makefile. Can be overriden in device trees -# in the event of prebuilt kernel. # # TARGET_KERNEL_DTBO_PREFIX = Override path prefix of TARGET_KERNEL_DTBO. # Defaults to empty @@ -79,11 +76,12 @@ endif KERNEL_VERSION := $(shell grep -s "^VERSION = " $(TARGET_KERNEL_SOURCE)/Makefile | awk '{ print $$3 }') KERNEL_PATCHLEVEL := $(shell grep -s "^PATCHLEVEL = " $(TARGET_KERNEL_SOURCE)/Makefile | awk '{ print $$3 }') -TARGET_KERNEL_VERSION ?= $(shell echo $(KERNEL_VERSION)"."$(KERNEL_PATCHLEVEL)) # 5.10+ can fully compile without GCC by default -ifneq (,$(filter 5.10, $(TARGET_KERNEL_VERSION))) - TARGET_KERNEL_NO_GCC ?= true +ifeq ($(shell expr $(KERNEL_VERSION) \>= 5), 1) + ifeq ($(shell expr $(KERNEL_PATCHLEVEL) \>= 10), 1) + TARGET_KERNEL_NO_GCC ?= true + endif endif ifeq ($(TARGET_KERNEL_NO_GCC), true) From 166dc20c27cc8b1cc9c9c147af95906f1c18c426 Mon Sep 17 00:00:00 2001 From: Michael Bestas Date: Fri, 26 May 2023 21:33:48 +0300 Subject: [PATCH 52/76] kernel: Restore TARGET_KERNEL_VERSION This is used in a bunch of QCOM HALs Change-Id: I5bb76c47ad33e9fb1b81d1d23f78b2dbf390473a --- config/BoardConfigKernel.mk | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index d841ab3..2a0b4a6 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -37,6 +37,9 @@ # TARGET_KERNEL_LLVM_BINUTILS = Use LLVM binutils, defaults to true # TARGET_KERNEL_NO_GCC = Fully compile the kernel without GCC. # Defaults to false +# TARGET_KERNEL_VERSION = Reported kernel version in top level kernel +# makefile. Can be overriden in device trees +# in the event of prebuilt kernel. # # TARGET_KERNEL_DTBO_PREFIX = Override path prefix of TARGET_KERNEL_DTBO. # Defaults to empty @@ -76,6 +79,7 @@ endif KERNEL_VERSION := $(shell grep -s "^VERSION = " $(TARGET_KERNEL_SOURCE)/Makefile | awk '{ print $$3 }') KERNEL_PATCHLEVEL := $(shell grep -s "^PATCHLEVEL = " $(TARGET_KERNEL_SOURCE)/Makefile | awk '{ print $$3 }') +TARGET_KERNEL_VERSION ?= $(shell echo $(KERNEL_VERSION)"."$(KERNEL_PATCHLEVEL)) # 5.10+ can fully compile without GCC by default ifeq ($(shell expr $(KERNEL_VERSION) \>= 5), 1) From e1b044621ae728c8f56f6fdc98e20c7a632266d4 Mon Sep 17 00:00:00 2001 From: LuK1337 Date: Tue, 1 Aug 2023 19:59:14 +0200 Subject: [PATCH 53/76] kernel: Don't try to do math on empty kernel version MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes the following error message when compiling target w/o kernel src: expr: syntax error: unexpected argument ‘5’ Test: lunch lineage_sdk_phone_x86_64-eng Change-Id: Ib3ec41d9dc2b59ddc9ee3c0c8e3813c4defcfc3e --- config/BoardConfigKernel.mk | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 2a0b4a6..c73517b 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -82,9 +82,11 @@ KERNEL_PATCHLEVEL := $(shell grep -s "^PATCHLEVEL = " $(TARGET_KERNEL_SOURCE)/Ma TARGET_KERNEL_VERSION ?= $(shell echo $(KERNEL_VERSION)"."$(KERNEL_PATCHLEVEL)) # 5.10+ can fully compile without GCC by default -ifeq ($(shell expr $(KERNEL_VERSION) \>= 5), 1) - ifeq ($(shell expr $(KERNEL_PATCHLEVEL) \>= 10), 1) - TARGET_KERNEL_NO_GCC ?= true +ifneq ($(KERNEL_VERSION),) + ifeq ($(shell expr $(KERNEL_VERSION) \>= 5), 1) + ifeq ($(shell expr $(KERNEL_PATCHLEVEL) \>= 10), 1) + TARGET_KERNEL_NO_GCC ?= true + endif endif endif From 1eb6d88c0ba08c655abe14c299f7a8f5028de0da Mon Sep 17 00:00:00 2001 From: Aaron Kling Date: Sun, 20 Aug 2023 15:32:58 -0500 Subject: [PATCH 54/76] kernel: Support Qualcomm merge_dtbs script Script from clo kernel/build at kernel.lnx.5.10.r1-rel Change-Id: Ia90975c895644b86d9f861ddd5a18b7cf6ce1470 --- build/tasks/kernel.mk | 34 ++- build/tools/merge_dtbs.py | 436 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 468 insertions(+), 2 deletions(-) create mode 100755 build/tools/merge_dtbs.py diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 84195ff..9e98963 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -1,5 +1,5 @@ # Copyright (C) 2012 The CyanogenMod Project -# (C) 2017-2022 The LineageOS Project +# (C) 2017-2023 The LineageOS Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -84,6 +84,10 @@ KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ RECOVERY_KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/RECOVERY_KERNEL_OBJ DTBO_OUT := $(TARGET_OUT_INTERMEDIATES)/DTBO_OBJ DTB_OUT := $(TARGET_OUT_INTERMEDIATES)/DTB_OBJ +ifeq ($(BOARD_USES_QCOM_MERGE_DTBS_SCRIPT),true) +DTBS_BASE := $(DTB_OUT)/base +DTBS_OUT := $(DTB_OUT)/out +endif KERNEL_CONFIG := $(KERNEL_OUT)/.config KERNEL_RELEASE := $(KERNEL_OUT)/include/config/kernel.release RECOVERY_KERNEL_CONFIG := $(RECOVERY_KERNEL_OUT)/.config @@ -436,9 +440,17 @@ MKDTBOIMG := $(HOST_OUT_EXECUTABLES)/mkdtboimg.py$(HOST_EXECUTABLE_SUFFIX) $(DTBO_OUT): mkdir -p $(DTBO_OUT) -$(BOARD_PREBUILT_DTBOIMAGE): $(DTC) $(MKDTIMG) $(MKDTBOIMG) $(DTBO_OUT) +ifeq ($(BOARD_USES_QCOM_MERGE_DTBS_SCRIPT),true) +$(BOARD_PREBUILT_DTBOIMAGE): $(INSTALLED_DTBIMAGE_TARGET) +else +$(BOARD_PREBUILT_DTBOIMAGE): $(DTBO_OUT) +endif +$(BOARD_PREBUILT_DTBOIMAGE): $(DTC) $(MKDTIMG) $(MKDTBOIMG) $(BOARD_PREBUILT_DTBOIMAGE): @echo "Building dtbo.img" +ifeq ($(BOARD_USES_QCOM_MERGE_DTBS_SCRIPT),true) + $(MKDTBOIMG) create $@ --page_size=$(BOARD_KERNEL_PAGESIZE) $(shell find $(DTBS_OUT) -type f -name "*.dtbo" | sort) +else $(hide) find $(DTBO_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtbo" | xargs rm -f $(call make-dtbo-target,$(KERNEL_DEFCONFIG)) $(call make-dtbo-target,$(TARGET_KERNEL_DTB)) @@ -452,6 +464,7 @@ else $(call make-dtbo-target,$(TARGET_KERNEL_DTBO)) endif # BOARD_KERNEL_SEPARATED_DTBO $(hide) touch -c $(DTBO_OUT) +endif # BOARD_USES_QCOM_MERGE_DTBS_SCRIPT endif # BOARD_CUSTOM_DTBOIMG_MK endif # TARGET_NEEDS_DTBOIMAGE/BOARD_KERNEL_SEPARATED_DTBO @@ -462,11 +475,20 @@ else ifeq ($(BOARD_PREBUILT_DTBIMAGE_DIR),) $(DTB_OUT): mkdir -p $(DTB_OUT) +ifeq ($(BOARD_USES_QCOM_MERGE_DTBS_SCRIPT),true) +$(DTBS_BASE): + mkdir -p $(DTBS_BASE) +$(DTBS_OUT): + mkdir -p $(DTBS_OUT) +endif ifdef BOARD_DTB_CFG MKDTBOIMG := $(HOST_OUT_EXECUTABLES)/mkdtboimg.py$(HOST_EXECUTABLE_SUFFIX) $(INSTALLED_DTBIMAGE_TARGET): $(MKDTBOIMG) endif +ifeq ($(BOARD_USES_QCOM_MERGE_DTBS_SCRIPT),true) +$(INSTALLED_DTBIMAGE_TARGET): $(HOST_OUT_EXECUTABLES)/fdtget $(HOST_OUT_EXECUTABLES)/fdtput $(HOST_OUT_EXECUTABLES)/fdtoverlay $(HOST_OUT_EXECUTABLES)/fdtoverlaymerge $(HOST_OUT_EXECUTABLES)/ufdt_apply_overlay $(DTBS_BASE) $(DTBS_OUT) +endif $(INSTALLED_DTBIMAGE_TARGET): $(DTC) $(DTB_OUT) ifeq ($(TARGET_WANTS_EMPTY_DTB),true) @rm -f $@ @@ -478,8 +500,16 @@ else $(call make-dtb-target,$(TARGET_KERNEL_DTB)) ifdef BOARD_DTB_CFG $(MKDTBOIMG) cfg_create $@ $(BOARD_DTB_CFG) -d $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts +else +ifeq ($(BOARD_USES_QCOM_MERGE_DTBS_SCRIPT),true) + $(hide) find $(DTBS_BASE) -type f -name "*.dtb*" | xargs rm -f + $(hide) find $(DTBS_OUT) -type f -name "*.dtb*" | xargs rm -f + mv $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts/vendor/qcom/*.dtb $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts/vendor/qcom/*.dtbo $(DTBS_BASE)/ + PATH=$(abspath $(HOST_OUT_EXECUTABLES)):$${PATH} python3 $(BUILD_TOP)/vendor/twrp/build/tools/merge_dtbs.py $(DTBS_BASE) $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts/vendor/qcom $(DTBS_OUT) + cat $(shell find $(DTB_OUT)/out -type f -name "*.dtb" | sort) > $@ else cat $(shell find $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtb" | sort) > $@ +endif # BOARD_USES_QCOM_MERGE_DTBS_SCRIPT endif # BOARD_DTB_CFG $(hide) touch -c $(DTB_OUT) endif # !TARGET_WANTS_EMPTY_DTB diff --git a/build/tools/merge_dtbs.py b/build/tools/merge_dtbs.py new file mode 100755 index 0000000..898be4c --- /dev/null +++ b/build/tools/merge_dtbs.py @@ -0,0 +1,436 @@ +#! /usr/bin/env python3 + +# Copyright (c) 2020-2021, The Linux Foundation. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# * Neither the name of The Linux Foundation nor the names of its +# contributors may be used to endorse or promote products derived +# from this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED +# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT +# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS +# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE +# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN +# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +import copy +import os +import sys +import subprocess +import shutil +from itertools import product, combinations_with_replacement, chain + +def split_array(array, cells): + """ + Helper function for parsing fdtget output + """ + if array is None: + return None + assert (len(array) % cells) == 0 + return frozenset(tuple(array[i*cells:(i*cells)+cells]) for i in range(len(array) // cells)) + +class DeviceTreeInfo(object): + def __init__(self, plat, board, pmic): + self.plat_id = plat + self.board_id = board + self.pmic_id = pmic + + def __str__(self): + s = "" + if self.plat_id is not None: + s += " msm-id = <{}>;".format(" ".join(map(str, self.plat_id))) + if self.board_id is not None: + s += " board-id = <{}>;".format(" ".join(map(str, self.board_id))) + if self.pmic_id is not None: + s += " pmic-id = <{}>;".format(" ".join(map(str, self.pmic_id))) + return s.strip() + + def __repr__(self): + return "<{} {}>".format(self.__class__.__name__, str(self)) + + def has_any_properties(self): + return self.plat_id is not None or self.board_id is not None or self.pmic_id is not None + + def __sub__(self, other): + """ + This devicetree has plat, board, and pmic id described like this: + msm-id = , + board-id = , + pmic-id = <0, 1> + + Other has plat, board, pmic are: + msm-id = , + board-id = + pmic-id = <0> + + (self - other) will split self into a set of devicetrees with different identifers + and meets the following requirements: + - One of the devicetrees matches the IDs supported by other + - The devices which self matches are still supported (through 1 or more extra devicetrees) + by creating new devicetrees with different plat/board/pmic IDs + """ + assert self.plat_id is None or isinstance(self.plat_id, (set, frozenset)) + assert self.board_id is None or isinstance(self.board_id, (set, frozenset)) + assert self.pmic_id is None or isinstance(self.pmic_id, (set, frozenset)) + assert other in self + + new_plat = other.plat_id is not None and self.plat_id != other.plat_id + new_board = other.board_id is not None and self.board_id != other.board_id + new_pmic = other.pmic_id is not None and self.pmic_id != other.pmic_id + + res = set() + # Create the devicetree that matches other exactly + s = copy.deepcopy(self) + if new_plat: + s.plat_id = other.plat_id + if new_board: + s.board_id = other.board_id + if new_pmic: + s.pmic_id = other.pmic_id + res.add(s) + + # now create the other possibilities by removing any combination of + # other's plat, board, and/or pmic. Set logic (unique elemnts) handles + # duplicate devicetrees IDs spit out by this loop + for combo in combinations_with_replacement([True, False], 3): + if not any((c and n) for (c, n) in zip(combo, (new_plat, new_board, new_pmic))): + continue + s = copy.deepcopy(self) + if combo[0] and new_plat: + s.plat_id -= other.plat_id + if combo[1] and new_board: + s.board_id -= other.board_id + if combo[2] and new_pmic: + s.pmic_id -= other.pmic_id + res.add(s) + return res + + def __hash__(self): + # Hash should only consider msm-id/board-id/pmic-id + return hash((self.plat_id, self.board_id, self.pmic_id)) + + def __and__(self, other): + s = copy.deepcopy(self) + for prop in ['plat_id', 'board_id', 'pmic_id']: + if getattr(self, prop) is None or getattr(other, prop) is None: + setattr(s, prop, None) + else: + setattr(s, prop, getattr(self, prop) & getattr(other, prop)) + return s + + def _do_equivalent(self, other, property): + other_prop = getattr(other, property) + self_prop = getattr(self, property) + if other_prop is None: + return True + return self_prop == other_prop + + def __eq__(self, other): + """ + Checks whether other plat_id, board_id, pmic_id matches either identically + or because the property is none + """ + if not isinstance(other, DeviceTreeInfo): + return False + if not other.has_any_properties(): + return False + return all(map(lambda p: self._do_equivalent(other, p), ['plat_id', 'board_id', 'pmic_id'])) + + + def _do_gt(self, other, property): + other_prop = getattr(other, property) + self_prop = getattr(self, property) + # if either property doesn't exist, it could merge in ABL + if self_prop is None or other_prop is None: + return True + # convert to iterable for convenience of below check + if isinstance(other_prop, tuple): + # if this property is all 0s, ABL coud match with anything on other + other_prop = [other_prop] + assert hasattr(other_prop, '__iter__') + if len(other_prop) == 1 and all(p == 0 for p in next(iter(other_prop))): + return True + # Test if this property intersects with other property + if hasattr(self_prop, '__contains__') and not isinstance(self_prop, tuple): + return any(p in self_prop for p in other_prop) + else: + return self_prop in other_prop + + def __gt__(self, other): + """ + Test if other is a more specific devicetree for self + + This is used to test whether other devicetree applies to self by ABL matching rules + """ + if not isinstance(other, DeviceTreeInfo): + return False + if not other.has_any_properties(): + return False + return all(map(lambda p: self._do_gt(other, p), ['plat_id', 'board_id', 'pmic_id'])) + + + def _do_contains(self, other, property): + other_prop = getattr(other, property) + self_prop = getattr(self, property) + # if other property doesn't exist, it can apply here + if other_prop is None: + return True + # if self and other are sets, use "issubset". Handle special case where other set is + # empty, in which case they aren't compatible because other_prop should be None + if isinstance(self_prop, (set, frozenset)) and isinstance(other_prop, (set, frozenset)): + return len(other_prop) > 0 and other_prop.issubset(self_prop) + # unpack to one item for convience of below check + if hasattr(other_prop, '__len__') and not isinstance(other_prop, tuple): + if len(other_prop) == 1: + other_prop = next(iter(other_prop)) + # if this is a single value (tuple), not a list of them, other needs to match exactly + if isinstance(self_prop, tuple): + return self_prop == other_prop + # otherwise, use contains if possible (e.g. list or set of tuples) + if hasattr(self_prop, '__contains__'): + return other_prop in self_prop + return False + + def __contains__(self, other): + """ + Test if other devicetree covers this devicetree. That is, the devices other devicetree + matches is a subset of the devices this devicetree matches + """ + if not isinstance(other, DeviceTreeInfo): + return False + if not other.has_any_properties(): + return False + return all(map(lambda p: self._do_contains(other, p), ['plat_id', 'board_id', 'pmic_id'])) + +class DeviceTree(DeviceTreeInfo): + def __init__(self, filename): + self.filename = filename + msm_id = split_array(self.get_prop('/', 'qcom,msm-id', check_output=False), 2) + board_id = split_array(self.get_prop('/', 'qcom,board-id', check_output=False), 2) + # default pmic-id-size is 4 + pmic_id_size = self.get_prop('/', 'qcom,pmic-id-size', check_output=False) or 4 + pmic_id = split_array(self.get_prop('/', 'qcom,pmic-id', check_output=False), pmic_id_size) + super().__init__(msm_id, board_id, pmic_id) + + if not self.has_any_properties(): + print('WARNING! {} has no properties and may match with any other devicetree'.format(self.filename)) + + def get_prop(self, node, property, prop_type='i', check_output=True): + r = subprocess.run(["fdtget", "-t", prop_type, self.filename, node, property], + check=check_output, stdout=subprocess.PIPE, + stderr=None if check_output else subprocess.DEVNULL) + if r.returncode != 0: + return None + out = r.stdout.decode("utf-8").strip() + + out_array = None + if prop_type[-1] == 'i' or prop_type[-1] == 'u': + out_array = [int(e) for e in out.split(' ')] + if prop_type[-1] == 'x': + out_array = [int(e, 16) for e in out.split(' ')] + if out_array is not None: + if len(out_array) == 0: + return None + if len(out_array) == 1: + return out_array[0] + return out_array + + return out + + def __str__(self): + return "{} [{}]".format(super().__str__(), self.filename) + +class InnerMergedDeviceTree(DeviceTreeInfo): + """ + InnerMergedDeviceTree is an actual representation of a merged devicetree. + It has a platform, board, and pmic ID, the "base" devicetree, and some set of add-on + devicetrees + """ + def __init__(self, filename, plat_id, board_id, pmic_id, techpacks=None): + self.base = filename + self.techpacks = techpacks or [] + super().__init__(plat_id, board_id, pmic_id) + + def try_add(self, techpack): + if not isinstance(techpack, DeviceTree): + raise TypeError("{} is not a DeviceTree object".format(repr(techpack))) + intersection = techpack & self + if intersection in self: + self.techpacks.append(intersection) + return True + return False + + def save(self, name=None, out_dir='.'): + if name is None: + name = self.get_name() + + out_file = os.path.join(out_dir, name) + ext = os.path.splitext(os.path.basename(self.base))[1] + + # This check might fail in future if we get into an edge case + # when splitting the base devicetree into multiple merged DTs + assert not os.path.exists(out_file) + + if len(self.techpacks) == 0: + cmd = ['cp', self.base, out_file] + else: + if ext == '.dtb': + cmd = ['fdtoverlay'] + else: + cmd = ['fdtoverlaymerge'] + cmd.extend(['-i', self.base]) + cmd.extend([tp.filename for tp in self.techpacks]) + cmd.extend(['-o', out_file]) + + print(' {}'.format(' '.join(cmd))) + subprocess.run(cmd, check=True) + + if self.plat_id: + plat_iter = self.plat_id if isinstance(self.plat_id, tuple) else chain.from_iterable(self.plat_id) + cmd = ['fdtput', '-t', 'i', out_file, '/', 'qcom,msm-id'] + list(map(str, plat_iter)) + print(' {}'.format(' '.join(cmd))) + subprocess.run(cmd, check=True) + + if self.board_id: + board_iter = self.board_id if isinstance(self.board_id, tuple) else chain.from_iterable(self.board_id) + cmd = ['fdtput', '-t', 'i', out_file, '/', 'qcom,board-id'] + list(map(str, board_iter)) + print(' {}'.format(' '.join(cmd))) + subprocess.run(cmd, check=True) + + if self.pmic_id: + pmic_iter = self.pmic_id if isinstance(self.pmic_id, tuple) else chain.from_iterable(self.pmic_id) + cmd = ['fdtput', '-t', 'i', out_file, '/', 'qcom,pmic-id'] + list(map(str, pmic_iter)) + print(' {}'.format(' '.join(cmd))) + subprocess.run(cmd, check=True) + + return DeviceTree(out_file) + + def get_name(self): + ext = os.path.splitext(os.path.basename(self.base))[1] + base_parts = self.filename_to_parts(self.base) + return '-'.join(chain.from_iterable([base_parts] + [self.filename_to_parts(tp.filename, ignored_parts=base_parts) for tp in self.techpacks])) + ext + + @staticmethod + def filename_to_parts(name, ignored_parts=[]): + # Extract just the basename, with no suffix + filename = os.path.splitext(os.path.basename(name))[0] + parts = filename.split('-') + return [part for part in parts if part not in ignored_parts] + + def __str__(self): + return "{} [{} + {{{}}}]".format(super().__str__(), self.base, " ".join(t.filename for t in self.techpacks)) + +class MergedDeviceTree(object): + def __init__(self, other): + self.merged_devicetrees = {InnerMergedDeviceTree(other.filename, other.plat_id, other.board_id, other.pmic_id)} + + def try_add(self, techpack): + did_add = False + for mdt in self.merged_devicetrees.copy(): + # techpack and kernel devicetree need only to overlap in order to merge, + # and not match exactly. Think: venn diagram. + # Need 2 things: The devicetree part that applies to + # both kernel and techpack intersection = (techpack & mdt) + # and the part that applies only to kernel difference = (mdt - intersection) + # Note that because devicetrees are "multi-dimensional", doing (mdt - intersection) + # may result in *multiple* devicetrees + + # techpack may apply to a superset of devices the mdt applies to + # reduce the techpack to just the things mdt has: + intersection = techpack & mdt + if intersection not in mdt: + continue + # mdt may apply to a superset of devices the techpack DT applies to + # (mdt - intersection) splits mdt into appropriate number of devicetrees + # such that we can apply techpack onto one of the resulting DTs in the + # difference + difference = mdt - intersection + if len(difference) > 1: + print('Splitting {}'.format(mdt)) + print(' because {}'.format(techpack)) + self.merged_devicetrees.remove(mdt) + self.merged_devicetrees.update(difference) + + for mdt in self.merged_devicetrees: + if mdt.try_add(techpack): + did_add = True + return did_add + + + def save(self, out_dir): + assert len(self.merged_devicetrees) > 0 + if len(self.merged_devicetrees) == 1: + name = os.path.basename(next(iter(self.merged_devicetrees)).base) + else: + name = None + for mdt in self.merged_devicetrees: + print() + yield mdt.save(name, out_dir) + +def parse_dt_files(dt_folder): + for root, dirs, files in os.walk(dt_folder): + for filename in files: + if os.path.splitext(filename)[1] not in ['.dtb', '.dtbo']: + continue + filepath = os.path.join(root, filename) + yield DeviceTree(filepath) + +def main(): + if len(sys.argv) != 4: + print("Usage: {} " + .format(sys.argv[0])) + sys.exit(1) + + # 1. Parse the devicetrees -- extract the device info (msm-id, board-id, pmic-id) + bases = parse_dt_files(sys.argv[1]) + techpacks = parse_dt_files(sys.argv[2]) + + # 2.1: Create an intermediate representation of the merged devicetrees, starting with the base + merged_devicetrees = list(map(lambda dt: MergedDeviceTree(dt), bases)) + # 2.2: Try to add techpack devicetree to each base DT + for techpack in techpacks: + did_add = False + for dt in merged_devicetrees: + if dt.try_add(techpack): + did_add = True + if not did_add: + print('WARNING! Could not apply {} to any devicetrees'.format(techpack)) + + print() + print('==================================') + created = [] + # 3. Save the deviectrees to real files + for dt in merged_devicetrees: + created.extend(dt.save(sys.argv[3])) + + print() + print('==================================') + # 4. Try to apply merged DTBOs onto merged DTBs, when appropriate + # This checks that DTBOs and DTBs generated by merge_dtbs.py can be merged by bootloader + # at runtime. + for base, dtbo in product(created, created): + if os.path.splitext(base.filename)[1] != '.dtb' or os.path.splitext(dtbo.filename)[1] != '.dtbo': + continue + # See DeviceTreeInfo.__gt__; this checks whether dtbo is more specific than the base + if dtbo > base: + cmd = ['ufdt_apply_overlay', base.filename, dtbo.filename, '/dev/null'] + print(' '.join(cmd)) + subprocess.run(cmd, check=True) + + +if __name__ == "__main__": + main() From f4ffe3018f153e822fbfc072da67d13c08b13305 Mon Sep 17 00:00:00 2001 From: Aaron Kling Date: Thu, 10 Aug 2023 16:20:52 -0500 Subject: [PATCH 55/76] kernel: Support copying modules to recovery Change-Id: Iac275cfbea368d47f9cc8e756649ab094d9c57c5 --- build/tasks/kernel.mk | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 9e98963..9b8bc99 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -371,6 +371,12 @@ KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call int $(INTERNAL_VENDOR_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) endif +ifneq ($(RECOVERY_KERNEL_MODULES),) +KERNEL_RECOVERY_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_recovery) +KERNEL_RECOVERY_MODULES_OUT := $(TARGET_RECOVERY_ROOT_OUT) +$(recovery_uncompressed_ramdisk): $(TARGET_PREBUILT_INT_KERNEL) +endif + $(KERNEL_OUT): mkdir -p $(KERNEL_OUT) @@ -413,6 +419,14 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) $(PAHOLE) [ $$? -ne 0 ] && exit 1; \ ($(call build-image-kernel-modules-twrp,$$vendor_boot_modules,$(KERNEL_VENDOR_RAMDISK_MODULES_OUT),/,$(KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD))); \ ) \ + $(if $(RECOVERY_KERNEL_MODULES),\ + recovery_modules=$$(for m in $(RECOVERY_KERNEL_MODULES); do \ + p=$$(find $$kernel_modules_dir -type f -name $$m); \ + if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from RECOVERY_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \ + done); \ + [ $$? -ne 0 ] && exit 1; \ + ($(call build-image-kernel-modules-lineage,$$recovery_modules,$(KERNEL_RECOVERY_MODULES_OUT),/,$(KERNEL_RECOVERY_DEPMOD_STAGING_DIR),$(BOARD_RECOVERY_RAMDISK_KERNEL_MODULES_LOAD))); \ + ) \ fi .PHONY: kerneltags From 34e56e636fc458af68c021c56b05825ae04ad538 Mon Sep 17 00:00:00 2001 From: Bruno Martins Date: Sat, 9 Sep 2023 15:56:40 +0100 Subject: [PATCH 56/76] kernel: Handle GKI modules All devices lauching with Android 13 (and above) must include a system_dlkm partition, where GKI modules should reside. Android 13 build system only supports providing prebuilt modules, by pointing BOARD_SYSTEM_DLKM_SRC to the modules source folder. Google will introduce BOARD_SYSTEM_KERNEL_MODULES for Android 14, so take a step forward and use that macro to exclude the listed modules from the usual vendor DLKM partition and place them into the GKI module partition. Note that the GKI modules are placed into lib/modules/androidX-Y.Z, as defined by Google and observed in system_dlkm_modprobe script. Change-Id: I2b1644479788cb5c9568cac738202b1d55fc28d7 --- build/tasks/kernel.mk | 49 +++++++++++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 9b8bc99..c2c89d9 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -92,6 +92,7 @@ KERNEL_CONFIG := $(KERNEL_OUT)/.config KERNEL_RELEASE := $(KERNEL_OUT)/include/config/kernel.release RECOVERY_KERNEL_CONFIG := $(RECOVERY_KERNEL_OUT)/.config RECOVERY_KERNEL_RELEASE := $(RECOVERY_KERNEL_OUT)/include/config/kernel.release +GKI_SUFFIX := $(shell echo android$(PLATFORM_VERSION)-$(TARGET_KERNEL_VERSION)) ifeq ($(KERNEL_ARCH),x86_64) @@ -314,20 +315,21 @@ endef # $(3): mount point # $(4): staging dir # $(5): module load list +# $(6): suffix for output dir, needed for GKI modules usecase, empty otherwise # Depmod requires a well-formed kernel version so 0.0 is used as a placeholder. define build-image-kernel-modules-twrp - mkdir -p $(2)/lib/modules - cp $(1) $(2)/lib/modules/ + mkdir -p $(2)/lib/modules$(6) + cp $(1) $(2)/lib/modules$(6) rm -rf $(4) - mkdir -p $(4)/lib/modules/0.0/$(3)lib/modules - cp $(1) $(4)/lib/modules/0.0/$(3)lib/modules + mkdir -p $(4)/lib/modules/0.0/$(3)lib/modules$(6) + cp $(1) $(4)/lib/modules/0.0/$(3)lib/modules$(6) $(DEPMOD) -b $(4) 0.0 - sed -e 's/\(.*modules.*\):/\/\1:/g' -e 's/ \([^ ]*modules[^ ]*\)/ \/\1/g' $(4)/lib/modules/0.0/modules.dep > $(2)/lib/modules/modules.dep - cp $(4)/lib/modules/0.0/modules.softdep $(2)/lib/modules - cp $(4)/lib/modules/0.0/modules.alias $(2)/lib/modules - rm -f $(2)/lib/modules/modules.load + sed -e 's/\(.*modules.*\):/\/\1:/g' -e 's/ \([^ ]*modules[^ ]*\)/ \/\1/g' $(4)/lib/modules/0.0/modules.dep > $(2)/lib/modules$(6)/modules.dep + cp $(4)/lib/modules/0.0/modules.softdep $(2)/lib/modules$(6) + cp $(4)/lib/modules/0.0/modules.alias $(2)/lib/modules$(6) + rm -f $(2)/lib/modules$(6)/modules.load for MODULE in $(5); do \ - basename $$MODULE >> $(2)/lib/modules/modules.load; \ + basename $$MODULE >> $(2)/lib/modules$(6)/modules.load; \ done endef @@ -355,6 +357,12 @@ KERNEL_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir- KERNEL_MODULE_MOUNTPOINT := vendor $(INSTALLED_VENDORIMAGE_TARGET): $(TARGET_PREBUILT_INT_KERNEL) endif +ifeq ($(BOARD_USES_SYSTEM_DLKMIMAGE),true) +SYSTEM_KERNEL_MODULES_OUT := $(TARGET_OUT_SYSTEM_DLKM) +SYSTEM_KERNEL_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_system_dlkm) +SYSTEM_KERNEL_MODULE_MOUNTPOINT := system_dlkm +$(INSTALLED_SYSTEM_DLKMIMAGE_TARGET): $(TARGET_PREBUILT_INT_KERNEL) +endif MODULES_INTERMEDIATES := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,kernel_modules) ifneq (,$(filter dlkm,$(BOARD_VENDOR_RAMDISK_FRAGMENTS))) @@ -409,15 +417,30 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) $(PAHOLE) $(foreach s, $(TARGET_MODULE_ALIASES),\ $(eval p := $(subst :,$(space),$(s))) \ ; mv $$(find $$kernel_modules_dir -name $(word 1,$(p))) $$kernel_modules_dir/$(word 2,$(p))); \ - modules=$$(find $$kernel_modules_dir -type f -name '*.ko'); \ - ($(call build-image-kernel-modules-twrp,$$modules,$(KERNEL_MODULES_OUT),$(KERNEL_MODULE_MOUNTPOINT)/,$(KERNEL_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_KERNEL_MODULES_LOAD))); \ + all_modules=$$(find $$kernel_modules_dir -type f -name '*.ko'); \ + filtered_modules=""; \ + $(if $(BOARD_SYSTEM_KERNEL_MODULES),\ + gki_modules=$$(for m in $(BOARD_SYSTEM_KERNEL_MODULES); do \ + p=$$(find $$kernel_modules_dir -type f -name $$m); \ + if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from BOARD_SYSTEM_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \ + done); \ + [ $$? -ne 0 ] && exit 1; \ + ($(call build-image-kernel-modules-twrp,$$gki_modules,$(SYSTEM_KERNEL_MODULES_OUT),$(SYSTEM_KERNEL_MODULE_MOUNTPOINT)/,$(SYSTEM_KERNEL_DEPMOD_STAGING_DIR),$(BOARD_SYSTEM_KERNEL_MODULES_LOAD),/$(GKI_SUFFIX))); \ + filtered_modules=$$(for n in $$all_modules; do \ + module_name=$$(basename $$n); \ + if [[ ! "$(BOARD_SYSTEM_KERNEL_MODULES)" =~ "$$module_name" ]]; then echo $$n; fi; \ + done); \ + ($(call build-image-kernel-modules-twrp,$$filtered_modules,$(KERNEL_MODULES_OUT),$(KERNEL_MODULE_MOUNTPOINT)/,$(KERNEL_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_KERNEL_MODULES_LOAD),/)); \ + ,\ + ($(call build-image-kernel-modules-twrp,$$all_modules,$(KERNEL_MODULES_OUT),$(KERNEL_MODULE_MOUNTPOINT)/,$(KERNEL_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_KERNEL_MODULES_LOAD),/)); \ + ) \ $(if $(BOOT_KERNEL_MODULES),\ vendor_boot_modules=$$(for m in $(BOOT_KERNEL_MODULES); do \ p=$$(find $$kernel_modules_dir -type f -name $$m); \ if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from BOOT_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \ done); \ [ $$? -ne 0 ] && exit 1; \ - ($(call build-image-kernel-modules-twrp,$$vendor_boot_modules,$(KERNEL_VENDOR_RAMDISK_MODULES_OUT),/,$(KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD))); \ + ($(call build-image-kernel-modules-twrp,$$vendor_boot_modules,$(KERNEL_VENDOR_RAMDISK_MODULES_OUT),/,$(KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD),/)); \ ) \ $(if $(RECOVERY_KERNEL_MODULES),\ recovery_modules=$$(for m in $(RECOVERY_KERNEL_MODULES); do \ @@ -425,7 +448,7 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) $(PAHOLE) if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from RECOVERY_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \ done); \ [ $$? -ne 0 ] && exit 1; \ - ($(call build-image-kernel-modules-lineage,$$recovery_modules,$(KERNEL_RECOVERY_MODULES_OUT),/,$(KERNEL_RECOVERY_DEPMOD_STAGING_DIR),$(BOARD_RECOVERY_RAMDISK_KERNEL_MODULES_LOAD))); \ + ($(call build-image-kernel-modules-lineage,$$recovery_modules,$(KERNEL_RECOVERY_MODULES_OUT),/,$(KERNEL_RECOVERY_DEPMOD_STAGING_DIR),$(BOARD_RECOVERY_RAMDISK_KERNEL_MODULES_LOAD),/)); \ ) \ fi From 4367c8424d66961b2645ca0dbed256027687fc5c Mon Sep 17 00:00:00 2001 From: Bruno Martins Date: Thu, 14 Sep 2023 18:21:31 +0100 Subject: [PATCH 57/76] kernel: Include DTBOs from OEM/ODM folder in base DTB It can be the case where OEM/ODM decided to put the main DTBOs outside vendor/qcom (e.g. vendor/oplus). Support such usecase by generically allowing all .dtbo files found in all first-level subdirs to be moved to base DTB folder. Change-Id: I154d401b560535d1fa8cd7ed4965dd34a4cf75f2 --- build/tasks/kernel.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index c2c89d9..76d001f 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -541,7 +541,7 @@ else ifeq ($(BOARD_USES_QCOM_MERGE_DTBS_SCRIPT),true) $(hide) find $(DTBS_BASE) -type f -name "*.dtb*" | xargs rm -f $(hide) find $(DTBS_OUT) -type f -name "*.dtb*" | xargs rm -f - mv $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts/vendor/qcom/*.dtb $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts/vendor/qcom/*.dtbo $(DTBS_BASE)/ + mv $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts/vendor/qcom/*.dtb $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts/vendor/*/*.dtbo $(DTBS_BASE)/ PATH=$(abspath $(HOST_OUT_EXECUTABLES)):$${PATH} python3 $(BUILD_TOP)/vendor/twrp/build/tools/merge_dtbs.py $(DTBS_BASE) $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts/vendor/qcom $(DTBS_OUT) cat $(shell find $(DTB_OUT)/out -type f -name "*.dtb" | sort) > $@ else From 3ca585f460ecd12e636d4ac1f9d9b904cdd75a93 Mon Sep 17 00:00:00 2001 From: SGCMarkus Date: Fri, 15 Sep 2023 19:08:00 +0200 Subject: [PATCH 58/76] kernel: Allow to limit the used .dtb files for the final DTB image On some devices too many .dtb files are generated. Instead of taking all of them, allow to only take selected .dtb files for the final DTB image. Example: Motorola Edge 40 Pro (rtwo, sm8550) generates the following: obj/DTB_OBJ/out/kaka-rumi.dtb obj/DTB_OBJ/out/kalama-rtwo-base-kalama-rtwo-evb1-overlay.dtb obj/DTB_OBJ/out/kalama-rtwo-base-kalama-rtwo-evt1-overlay.dtb obj/DTB_OBJ/out/kalama-rtwo-base-kalama-rtwo-na-vzw-evt2-overlay.dtb obj/DTB_OBJ/out/kalama-rtwo-base-kalama-rtwo-prc-dvt1b-overlay.dtb obj/DTB_OBJ/out/kalama-rtwo-base-kalama-rtwo-prc-pvt-overlay.dtb obj/DTB_OBJ/out/kalama-rtwo-base-kalama-rtwo-row-dvt1b-overlay.dtb obj/DTB_OBJ/out/kalama-rtwo-base.dtb obj/DTB_OBJ/out/kalama-v2-rtwo-base-kalama-rtwo-evb1-overlay.dtb obj/DTB_OBJ/out/kalama-v2-rtwo-base-kalama-rtwo-evt1-overlay.dtb obj/DTB_OBJ/out/kalama-v2-rtwo-base-kalama-rtwo-na-vzw-evt2-overlay.dtb obj/DTB_OBJ/out/kalama-v2-rtwo-base-kalama-rtwo-prc-dvt1b-overlay.dtb obj/DTB_OBJ/out/kalama-v2-rtwo-base-kalama-rtwo-prc-pvt-overlay.dtb obj/DTB_OBJ/out/kalama-v2-rtwo-base-kalama-rtwo-row-dvt1b-overlay.dtb obj/DTB_OBJ/out/kalama-v2-rtwo-base.dtb with only kalama-rtwo-base.dtb and kalama-v2-rtwo-base.dtb needed. Disabling compilation of the other kalama.dtb isn't possible, as this would also disable the compilation of the needed .dtbo files. Because they are earlier in alphabetical order, and the matching board ids, the bootloader ends up selecting those, instead of the correct ones. This results in USB (and possible other things) to not work. Change-Id: I486b6ec538a3e4906b5b8aa5ecb355b480b60de7 --- build/tasks/kernel.mk | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 76d001f..8731145 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -65,6 +65,9 @@ # # TARGET_FORCE_PREBUILT_KERNEL = Optional, use TARGET_PREBUILT_KERNEL even if # kernel sources are present +# +# TARGET_MERGE_DTBS_WILDCARD = Optional, limits the .dtb files used to generate the +# final DTB image when using QCOM's merge_dtbs script. ifneq ($(TARGET_NO_KERNEL),true) ifneq ($(TARGET_NO_KERNEL_OVERRIDE),true) @@ -76,6 +79,8 @@ KERNEL_DEFCONFIG := $(TARGET_KERNEL_CONFIG) RECOVERY_DEFCONFIG := $(TARGET_KERNEL_RECOVERY_CONFIG) VARIANT_DEFCONFIG := $(TARGET_KERNEL_VARIANT_CONFIG) SELINUX_DEFCONFIG := $(TARGET_KERNEL_SELINUX_CONFIG) +# dtb generation - optional +TARGET_MERGE_DTBS_WILDCARD ?= * ## Internal variables DTC := $(HOST_OUT_EXECUTABLES)/dtc @@ -543,7 +548,7 @@ ifeq ($(BOARD_USES_QCOM_MERGE_DTBS_SCRIPT),true) $(hide) find $(DTBS_OUT) -type f -name "*.dtb*" | xargs rm -f mv $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts/vendor/qcom/*.dtb $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts/vendor/*/*.dtbo $(DTBS_BASE)/ PATH=$(abspath $(HOST_OUT_EXECUTABLES)):$${PATH} python3 $(BUILD_TOP)/vendor/twrp/build/tools/merge_dtbs.py $(DTBS_BASE) $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts/vendor/qcom $(DTBS_OUT) - cat $(shell find $(DTB_OUT)/out -type f -name "*.dtb" | sort) > $@ + cat $(shell find $(DTB_OUT)/out -type f -name "${TARGET_MERGE_DTBS_WILDCARD}.dtb" | sort) > $@ else cat $(shell find $(DTB_OUT)/arch/$(KERNEL_ARCH)/boot/dts -type f -name "*.dtb" | sort) > $@ endif # BOARD_USES_QCOM_MERGE_DTBS_SCRIPT From e19a2dacb96c5ff77cf107e7ed007d99855b0189 Mon Sep 17 00:00:00 2001 From: Bruno Martins Date: Tue, 19 Sep 2023 15:59:00 +0100 Subject: [PATCH 59/76] kernel: Use pahole from Google prebuilts This fixes the following warnings: 13:04:54 Disallowed PATH tool "pahole" used: []string{"pahole", "--version"} 13:04:54 See https://android.googlesource.com/platform/build/+/master/Changes.md#PATH_Tools for more information. "pahole" is not allowed to be used. See https://android.googlesource.com/platform/build/+/master/Changes.md#PATH_Tools for more information. /home/bgcngm/android/lineage/kernel/oneplus/sm8550/scripts/pahole-flags.sh: 12: [: Illegal number: /home/bgcngm/android/lineage/kernel/oneplus/sm8550/scripts/pahole-flags.sh: 16: [: Illegal number: /home/bgcngm/android/lineage/kernel/oneplus/sm8550/scripts/pahole-flags.sh: 20: [: Illegal number: Change-Id: Ice2a3753301a7b7782037fd35544e2831b258650 --- build/tasks/kernel.mk | 5 ++--- config/BoardConfigKernel.mk | 3 +++ 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 8731145..b741b76 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -84,7 +84,6 @@ TARGET_MERGE_DTBS_WILDCARD ?= * ## Internal variables DTC := $(HOST_OUT_EXECUTABLES)/dtc -PAHOLE := $(HOST_OUT_EXECUTABLES)/pahole KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ RECOVERY_KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/RECOVERY_KERNEL_OBJ DTBO_OUT := $(TARGET_OUT_INTERMEDIATES)/DTBO_OBJ @@ -397,7 +396,7 @@ $(KERNEL_CONFIG): $(KERNEL_OUT) $(ALL_KERNEL_DEFCONFIG_SRCS) @echo "Building Kernel Config" $(call make-kernel-config,$(KERNEL_OUT),$(KERNEL_DEFCONFIG)) -$(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) $(PAHOLE) +$(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) @echo "Building Kernel Image ($(BOARD_KERNEL_IMAGE_NAME))" $(call make-kernel-target,$(BOARD_KERNEL_IMAGE_NAME)) $(hide) if grep -q '^CONFIG_OF=y' $(KERNEL_CONFIG); then \ @@ -579,7 +578,7 @@ $(RECOVERY_KERNEL_CONFIG): $(ALL_RECOVERY_KERNEL_DEFCONFIG_SRCS) @echo "Building Recovery Kernel Config" $(call make-kernel-config,$(RECOVERY_KERNEL_OUT),$(RECOVERY_DEFCONFIG)) -$(TARGET_PREBUILT_INT_RECOVERY_KERNEL): $(RECOVERY_KERNEL_CONFIG) $(DEPMOD) $(DTC) $(PAHOLE) +$(TARGET_PREBUILT_INT_RECOVERY_KERNEL): $(RECOVERY_KERNEL_CONFIG) $(DEPMOD) $(DTC) @echo "Building Recovery Kernel Image ($(BOARD_KERNEL_IMAGE_NAME))" $(call make-recovery-kernel-target,$(BOARD_KERNEL_IMAGE_NAME)) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index c73517b..9f63598 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -227,6 +227,9 @@ KERNEL_MAKE_FLAGS += YACC=$(BUILD_TOP)/prebuilts/build-tools/$(HOST_PREBUILT_TAG KERNEL_MAKE_FLAGS += M4=$(BUILD_TOP)/prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/m4 TOOLS_PATH_OVERRIDE += BISON_PKGDATADIR=$(BUILD_TOP)/prebuilts/build-tools/common/bison +# Since Linux 5.10, pahole is required +KERNEL_MAKE_FLAGS += PAHOLE=$(BUILD_TOP)/prebuilts/kernel-build-tools/linux-x86/bin/pahole + # Set the out dir for the kernel's O= arg # This needs to be an absolute path, so only set this if the standard out dir isn't used OUT_DIR_PREFIX := $(shell echo $(OUT_DIR) | sed -e 's|/target/.*$$||g') From f05a3b293cd8706dc6600c8e430ab43c48aca5a3 Mon Sep 17 00:00:00 2001 From: LuK1337 Date: Fri, 6 Oct 2023 09:42:53 +0200 Subject: [PATCH 60/76] kernel: Use lz4 from Google prebuilts Fixes: "lz4" is not allowed to be used. Test: breakfast tangorpro && m bootimage Change-Id: I62cfe131f457117cb3745b91f5e43c085e87b611 --- config/BoardConfigKernel.mk | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 9f63598..dbd3190 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -221,6 +221,9 @@ ifneq ($(TARGET_KERNEL_CLANG_COMPILE), false) endif endif +# Pass prebuilt LZ4 path +KERNEL_MAKE_FLAGS += LZ4=$(BUILD_TOP)/prebuilts/kernel-build-tools/linux-x86/bin/lz4 + # Since Linux 4.16, flex and bison are required KERNEL_MAKE_FLAGS += LEX=$(BUILD_TOP)/prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/flex KERNEL_MAKE_FLAGS += YACC=$(BUILD_TOP)/prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/bison From b6e8d33006a7a25ac9f7c00d7782e094124f086b Mon Sep 17 00:00:00 2001 From: Tim Zimmermann Date: Wed, 6 Sep 2023 13:09:51 +0200 Subject: [PATCH 61/76] kernel: Use correct variable name for vendor_kernel_boot modules * This was missed in bdfc913935c2a8c38ed999a4c84bb96492e0e5fe * Aligns the variable name for vendor_kernel_boot modules with AOSP Change-Id: I8d59f7b5d62e29a0484ca36fadcb74acab4f1859 --- build/tasks/kernel.mk | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index b741b76..3c7f633 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -370,14 +370,17 @@ endif MODULES_INTERMEDIATES := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,kernel_modules) ifneq (,$(filter dlkm,$(BOARD_VENDOR_RAMDISK_FRAGMENTS))) +KERNEL_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD) KERNEL_VENDOR_RAMDISK_MODULES_OUT := $(VENDOR_RAMDISK_FRAGMENT.dlkm.STAGING_DIR) KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_vendor_ramdisk_fragment-stage-dlkm) $(INTERNAL_VENDOR_RAMDISK_FRAGMENT_TARGETS): $(TARGET_PREBUILT_INT_KERNEL) else ifeq ($(PRODUCT_BUILD_VENDOR_KERNEL_BOOT_IMAGE),true) +KERNEL_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := $(BOARD_VENDOR_KERNEL_RAMDISK_KERNEL_MODULES_LOAD) KERNEL_VENDOR_RAMDISK_MODULES_OUT := $(TARGET_VENDOR_KERNEL_RAMDISK_OUT) KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_vendor_kernel_ramdisk) $(INTERNAL_VENDOR_KERNEL_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) else +KERNEL_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD) KERNEL_VENDOR_RAMDISK_MODULES_OUT := $(TARGET_VENDOR_RAMDISK_OUT) KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_vendor_ramdisk) $(INTERNAL_VENDOR_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) @@ -444,7 +447,7 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from BOOT_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \ done); \ [ $$? -ne 0 ] && exit 1; \ - ($(call build-image-kernel-modules-twrp,$$vendor_boot_modules,$(KERNEL_VENDOR_RAMDISK_MODULES_OUT),/,$(KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD),/)); \ + ($(call build-image-kernel-modules-twrp,$$vendor_boot_modules,$(KERNEL_VENDOR_RAMDISK_MODULES_OUT),/,$(KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR),$(KERNEL_VENDOR_RAMDISK_KERNEL_MODULES_LOAD),/)); \ ) \ $(if $(RECOVERY_KERNEL_MODULES),\ recovery_modules=$$(for m in $(RECOVERY_KERNEL_MODULES); do \ From 9d9c64cb7ef36ea92a257938fb7bc31eaf742b9e Mon Sep 17 00:00:00 2001 From: basamaryan Date: Thu, 5 Oct 2023 14:17:47 +0200 Subject: [PATCH 62/76] kernel: Rename mkdtboimg.py * Changed in https://android-review.googlesource.com/q/topic:%22colefaust_rename_mkdtboimg%22 Change-Id: Idd2ade7035c79207321ecbc70d6a4ddf9f4ed600 --- build/tasks/kernel.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 3c7f633..86805df 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -40,9 +40,9 @@ # For example, for ARM devices, # use zImage-dtb instead of zImage. # -# BOARD_DTB_CFG = Path to a mkdtboimg.py config file for dtb.img +# BOARD_DTB_CFG = Path to a mkdtboimg config file for dtb.img # -# BOARD_DTBO_CFG = Path to a mkdtboimg.py config file +# BOARD_DTBO_CFG = Path to a mkdtboimg config file # # BOARD_CUSTOM_DTBIMG_MK = Path to a custom dtbimage makefile # @@ -479,7 +479,7 @@ ifneq ($(BOARD_CUSTOM_DTBOIMG_MK),) include $(BOARD_CUSTOM_DTBOIMG_MK) else MKDTIMG := $(HOST_OUT_EXECUTABLES)/mkdtimg$(HOST_EXECUTABLE_SUFFIX) -MKDTBOIMG := $(HOST_OUT_EXECUTABLES)/mkdtboimg.py$(HOST_EXECUTABLE_SUFFIX) +MKDTBOIMG := $(HOST_OUT_EXECUTABLES)/mkdtboimg$(HOST_EXECUTABLE_SUFFIX) $(DTBO_OUT): mkdir -p $(DTBO_OUT) @@ -527,7 +527,7 @@ $(DTBS_OUT): endif ifdef BOARD_DTB_CFG -MKDTBOIMG := $(HOST_OUT_EXECUTABLES)/mkdtboimg.py$(HOST_EXECUTABLE_SUFFIX) +MKDTBOIMG := $(HOST_OUT_EXECUTABLES)/mkdtboimg$(HOST_EXECUTABLE_SUFFIX) $(INSTALLED_DTBIMAGE_TARGET): $(MKDTBOIMG) endif ifeq ($(BOARD_USES_QCOM_MERGE_DTBS_SCRIPT),true) From eb3e2bbbd4feb9601f1a10de6824c8c056d8f1ad Mon Sep 17 00:00:00 2001 From: basamaryan Date: Wed, 4 Oct 2023 16:59:19 +0200 Subject: [PATCH 63/76] config: Update clang version to clang-r487747c * This is the default clang version for Android U release Change-Id: I6a44012250470eeeb2e0f6993eb4e98308eec390 --- config/BoardConfigKernel.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index dbd3190..1ae589b 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -98,7 +98,7 @@ ifneq ($(TARGET_KERNEL_CLANG_VERSION),) KERNEL_CLANG_VERSION := clang-$(TARGET_KERNEL_CLANG_VERSION) else # Use the default version of clang if TARGET_KERNEL_CLANG_VERSION hasn't been set by the device config - KERNEL_CLANG_VERSION := clang-r450784d + KERNEL_CLANG_VERSION := clang-r487747c endif TARGET_KERNEL_CLANG_PATH ?= $(BUILD_TOP)/prebuilts/clang/host/$(HOST_PREBUILT_TAG)/$(KERNEL_CLANG_VERSION) From 926e5784a66835467b93d881f7d8725e6660f124 Mon Sep 17 00:00:00 2001 From: Bruno Martins Date: Sat, 28 Oct 2023 11:43:33 +0100 Subject: [PATCH 64/76] kernel: Replace BOARD_SYSTEM_KERNEL_MODULES with SYSTEM_KERNEL_MODULES Commit 47931c1 introduced GKI modules handling with the assumption that using BOARD_SYSTEM_KERNEL_MODULES would still work in Android 14, but turns out that it conflicts with build/make/core rules. Change-Id: I9167940c08b8420be254c52698f1faa2e3e7f793 --- build/tasks/kernel.mk | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 86805df..ef437ec 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -426,16 +426,16 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) ; mv $$(find $$kernel_modules_dir -name $(word 1,$(p))) $$kernel_modules_dir/$(word 2,$(p))); \ all_modules=$$(find $$kernel_modules_dir -type f -name '*.ko'); \ filtered_modules=""; \ - $(if $(BOARD_SYSTEM_KERNEL_MODULES),\ - gki_modules=$$(for m in $(BOARD_SYSTEM_KERNEL_MODULES); do \ + $(if $(SYSTEM_KERNEL_MODULES),\ + gki_modules=$$(for m in $(SYSTEM_KERNEL_MODULES); do \ p=$$(find $$kernel_modules_dir -type f -name $$m); \ - if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from BOARD_SYSTEM_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \ + if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from SYSTEM_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \ done); \ [ $$? -ne 0 ] && exit 1; \ ($(call build-image-kernel-modules-twrp,$$gki_modules,$(SYSTEM_KERNEL_MODULES_OUT),$(SYSTEM_KERNEL_MODULE_MOUNTPOINT)/,$(SYSTEM_KERNEL_DEPMOD_STAGING_DIR),$(BOARD_SYSTEM_KERNEL_MODULES_LOAD),/$(GKI_SUFFIX))); \ filtered_modules=$$(for n in $$all_modules; do \ module_name=$$(basename $$n); \ - if [[ ! "$(BOARD_SYSTEM_KERNEL_MODULES)" =~ "$$module_name" ]]; then echo $$n; fi; \ + if [[ ! "$(SYSTEM_KERNEL_MODULES)" =~ "$$module_name" ]]; then echo $$n; fi; \ done); \ ($(call build-image-kernel-modules-twrp,$$filtered_modules,$(KERNEL_MODULES_OUT),$(KERNEL_MODULE_MOUNTPOINT)/,$(KERNEL_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_KERNEL_MODULES_LOAD),/)); \ ,\ From e34df46854ede208b251d2d388f20de4efe2a701 Mon Sep 17 00:00:00 2001 From: pppig236 Date: Mon, 16 Oct 2023 09:49:18 -0400 Subject: [PATCH 65/76] kernel: Halt build process if an external module fails to compile Before: mka bootimage qcacld failed to compile, but boot.img is generated After: mka bootimage qcacld failed to compile and no boot.img is generated Commit fadfdbf introduced the idea of building external modules, but it didn't account for the scenario where compilation could fail while the boot.img is still being built. Fix this by properly stopping the build process as soon as the external module fails to compile. Change-Id: Ifed28825f8e4b78d304fe62a47908e208edfb886 --- build/tasks/kernel.mk | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index ef437ec..eb7a880 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -416,8 +416,8 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) rpath=$$(python3 -c 'import os,sys;print(os.path.relpath(*(sys.argv[1:])))' $(TARGET_KERNEL_EXT_MODULE_ROOT) $(KERNEL_SRC)); \ $(foreach p, $(TARGET_KERNEL_EXT_MODULES),\ $$pwd; \ - $(call make-external-module-target,$(p),$$rpath,); \ - $(call make-external-module-target,$(p),$$rpath,INSTALL_MOD_PATH=$(MODULES_INTERMEDIATES) INSTALL_MOD_STRIP=1 KERNEL_UAPI_HEADERS_DIR=$(KERNEL_OUT) modules_install)); \ + $(call make-external-module-target,$(p),$$rpath,) || exit "$$?"; \ + $(call make-external-module-target,$(p),$$rpath,INSTALL_MOD_PATH=$(MODULES_INTERMEDIATES) INSTALL_MOD_STRIP=1 KERNEL_UAPI_HEADERS_DIR=$(KERNEL_OUT) modules_install)) || exit "$$?"; \ ) \ kernel_release=$$(cat $(KERNEL_RELEASE)) \ kernel_modules_dir=$(MODULES_INTERMEDIATES)/lib/modules/$$kernel_release \ From 1c8e0642f68d771798ba13b65bb9d68ae0bbc7ca Mon Sep 17 00:00:00 2001 From: Bruno Martins Date: Thu, 7 Dec 2023 16:21:40 +0000 Subject: [PATCH 66/76] kernel: Ensure that module load lists are properly formed Do not allow module load lists to contain unexistent kernel modules and bail out if that's the case, informing that the list must be corrected. The lists can be formed including the full module path and with or without the file extension, like shown below: kernel/drivers/watchdog/softdog.ko kernel/net/wireless/cfg80211.ko kernel/net/mac80211/mac80211.ko or simply: softdog.ko cfg80211.ko mac80211.ko or ultimately: softdog cfg80211 mac80211 Either way, the newly generated modules.load file will now only contain the module name without the extension, which is inline with modules.alias and modules.blocklist. Change-Id: I969274f7edf249c98ca241e37b6e41a921d36908 --- build/tasks/kernel.mk | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index eb7a880..b1f9c64 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -333,7 +333,12 @@ define build-image-kernel-modules-twrp cp $(4)/lib/modules/0.0/modules.alias $(2)/lib/modules$(6) rm -f $(2)/lib/modules$(6)/modules.load for MODULE in $(5); do \ - basename $$MODULE >> $(2)/lib/modules$(6)/modules.load; \ + NAME=$$(basename $$MODULE .ko); \ + if [ -n "$$(find $(2)/lib/modules$(6) -type f -name $$NAME'.ko')" ]; then \ + echo "$$NAME" >> $(2)/lib/modules$(6)/modules.load; \ + else \ + echo "ERROR: $$NAME.ko was not found in the kernel modules intermediates dir, module load list must be corrected" 1>&2 && exit 1; \ + fi; \ done endef @@ -432,14 +437,14 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from SYSTEM_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \ done); \ [ $$? -ne 0 ] && exit 1; \ - ($(call build-image-kernel-modules-twrp,$$gki_modules,$(SYSTEM_KERNEL_MODULES_OUT),$(SYSTEM_KERNEL_MODULE_MOUNTPOINT)/,$(SYSTEM_KERNEL_DEPMOD_STAGING_DIR),$(BOARD_SYSTEM_KERNEL_MODULES_LOAD),/$(GKI_SUFFIX))); \ + ($(call build-image-kernel-modules-twrp,$$gki_modules,$(SYSTEM_KERNEL_MODULES_OUT),$(SYSTEM_KERNEL_MODULE_MOUNTPOINT)/,$(SYSTEM_KERNEL_DEPMOD_STAGING_DIR),$(BOARD_SYSTEM_KERNEL_MODULES_LOAD),/$(GKI_SUFFIX))) || exit "$$?"; \ filtered_modules=$$(for n in $$all_modules; do \ module_name=$$(basename $$n); \ if [[ ! "$(SYSTEM_KERNEL_MODULES)" =~ "$$module_name" ]]; then echo $$n; fi; \ done); \ - ($(call build-image-kernel-modules-twrp,$$filtered_modules,$(KERNEL_MODULES_OUT),$(KERNEL_MODULE_MOUNTPOINT)/,$(KERNEL_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_KERNEL_MODULES_LOAD),/)); \ + ($(call build-image-kernel-modules-twrp,$$filtered_modules,$(KERNEL_MODULES_OUT),$(KERNEL_MODULE_MOUNTPOINT)/,$(KERNEL_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_KERNEL_MODULES_LOAD),/)) || exit "$$?"; \ ,\ - ($(call build-image-kernel-modules-twrp,$$all_modules,$(KERNEL_MODULES_OUT),$(KERNEL_MODULE_MOUNTPOINT)/,$(KERNEL_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_KERNEL_MODULES_LOAD),/)); \ + ($(call build-image-kernel-modules-twrp,$$all_modules,$(KERNEL_MODULES_OUT),$(KERNEL_MODULE_MOUNTPOINT)/,$(KERNEL_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_KERNEL_MODULES_LOAD),/)) || exit "$$?"; \ ) \ $(if $(BOOT_KERNEL_MODULES),\ vendor_boot_modules=$$(for m in $(BOOT_KERNEL_MODULES); do \ @@ -447,7 +452,7 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from BOOT_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \ done); \ [ $$? -ne 0 ] && exit 1; \ - ($(call build-image-kernel-modules-twrp,$$vendor_boot_modules,$(KERNEL_VENDOR_RAMDISK_MODULES_OUT),/,$(KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR),$(KERNEL_VENDOR_RAMDISK_KERNEL_MODULES_LOAD),/)); \ + ($(call build-image-kernel-modules-twrp,$$vendor_boot_modules,$(KERNEL_VENDOR_RAMDISK_MODULES_OUT),/,$(KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR),$(KERNEL_VENDOR_RAMDISK_KERNEL_MODULES_LOAD),/)) || exit "$$?"; \ ) \ $(if $(RECOVERY_KERNEL_MODULES),\ recovery_modules=$$(for m in $(RECOVERY_KERNEL_MODULES); do \ @@ -455,7 +460,7 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) if [ -n "$$p" ]; then echo $$p; else echo "ERROR: $$m from RECOVERY_KERNEL_MODULES was not found" 1>&2 && exit 1; fi; \ done); \ [ $$? -ne 0 ] && exit 1; \ - ($(call build-image-kernel-modules-lineage,$$recovery_modules,$(KERNEL_RECOVERY_MODULES_OUT),/,$(KERNEL_RECOVERY_DEPMOD_STAGING_DIR),$(BOARD_RECOVERY_RAMDISK_KERNEL_MODULES_LOAD),/)); \ + ($(call build-image-kernel-modules-twrp,$$recovery_modules,$(KERNEL_RECOVERY_MODULES_OUT),/,$(KERNEL_RECOVERY_DEPMOD_STAGING_DIR),$(BOARD_RECOVERY_RAMDISK_KERNEL_MODULES_LOAD),/)) || exit "$$?"; \ ) \ fi From cbdd62966ee6c2154e95db0c7c77e9937bdb7247 Mon Sep 17 00:00:00 2001 From: LuK1337 Date: Sat, 11 Nov 2023 23:54:12 +0100 Subject: [PATCH 67/76] kernel: Make INTERNAL_VENDOR_RAMDISK_TARGET depend on kernel This lets us package kernel modules into recovery ramdisk inside vendor_boot. Change-Id: I274bc95ce8682e2f13a595174ab279c129866f6a --- build/tasks/kernel.mk | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index b1f9c64..bc68f4c 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -379,11 +379,13 @@ KERNEL_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := $(BOARD_VENDOR_RAMDISK_KERNEL_MODUL KERNEL_VENDOR_RAMDISK_MODULES_OUT := $(VENDOR_RAMDISK_FRAGMENT.dlkm.STAGING_DIR) KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_vendor_ramdisk_fragment-stage-dlkm) $(INTERNAL_VENDOR_RAMDISK_FRAGMENT_TARGETS): $(TARGET_PREBUILT_INT_KERNEL) +$(INTERNAL_VENDOR_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) else ifeq ($(PRODUCT_BUILD_VENDOR_KERNEL_BOOT_IMAGE),true) KERNEL_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := $(BOARD_VENDOR_KERNEL_RAMDISK_KERNEL_MODULES_LOAD) KERNEL_VENDOR_RAMDISK_MODULES_OUT := $(TARGET_VENDOR_KERNEL_RAMDISK_OUT) KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_vendor_kernel_ramdisk) $(INTERNAL_VENDOR_KERNEL_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) +$(INTERNAL_VENDOR_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) else KERNEL_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD) KERNEL_VENDOR_RAMDISK_MODULES_OUT := $(TARGET_VENDOR_RAMDISK_OUT) From 585c983a4c6bd97fcdffe8f91d0447f5f40fb998 Mon Sep 17 00:00:00 2001 From: Aaron Kling Date: Tue, 2 Jan 2024 21:13:18 -0600 Subject: [PATCH 68/76] kernel: Default to no gcc on kernel 6.x Current logic defaults to no gcc if kernel major version is greater than or equal to 5 and kernel minor version is greater than or equal to 10. Meaning kernel version 6.1 does not qualify because 1 is less than 10. So additionally check if kernel major version is greater than or equal to 6 and ignore minor version for that case. Change-Id: Id72cb9e100c6fed014d696f4a3a88f6cafcd3932 --- config/BoardConfigKernel.mk | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/config/BoardConfigKernel.mk b/config/BoardConfigKernel.mk index 1ae589b..6a02545 100644 --- a/config/BoardConfigKernel.mk +++ b/config/BoardConfigKernel.mk @@ -1,4 +1,4 @@ -# Copyright (C) 2018-2023 The LineageOS Project +# Copyright (C) 2018-2024 The LineageOS Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -83,7 +83,9 @@ TARGET_KERNEL_VERSION ?= $(shell echo $(KERNEL_VERSION)"."$(KERNEL_PATCHLEVEL)) # 5.10+ can fully compile without GCC by default ifneq ($(KERNEL_VERSION),) - ifeq ($(shell expr $(KERNEL_VERSION) \>= 5), 1) + ifeq ($(shell expr $(KERNEL_VERSION) \>= 6), 1) + TARGET_KERNEL_NO_GCC ?= true + else ifeq ($(shell expr $(KERNEL_VERSION) \>= 5), 1) ifeq ($(shell expr $(KERNEL_PATCHLEVEL) \>= 10), 1) TARGET_KERNEL_NO_GCC ?= true endif From 760cdcf20acc28206af0dcef30613e75fbe14a16 Mon Sep 17 00:00:00 2001 From: Aaron Kling Date: Tue, 2 Jan 2024 21:16:38 -0600 Subject: [PATCH 69/76] kernel: Support copying modules to boot ramdisk Android supports loading modules from the boot ramdisk in the case of vendor ramdisk not existing. Change-Id: Ide1255b2c37ee262c8a4181d5eb0e380d0488edc --- build/tasks/kernel.mk | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index bc68f4c..453a0dd 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -386,11 +386,16 @@ KERNEL_VENDOR_RAMDISK_MODULES_OUT := $(TARGET_VENDOR_KERNEL_RAMDISK_OUT) KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_vendor_kernel_ramdisk) $(INTERNAL_VENDOR_KERNEL_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) $(INTERNAL_VENDOR_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) -else +else ifeq ($(BUILDING_VENDOR_BOOT_IMAGE),true) KERNEL_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD) KERNEL_VENDOR_RAMDISK_MODULES_OUT := $(TARGET_VENDOR_RAMDISK_OUT) KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_vendor_ramdisk) $(INTERNAL_VENDOR_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) +else +KERNEL_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD) +KERNEL_VENDOR_RAMDISK_MODULES_OUT := $(TARGET_RAMDISK_OUT) +KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_ramdisk) +$(INTERNAL_VENDOR_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) endif ifneq ($(RECOVERY_KERNEL_MODULES),) From a73e4ba0fb4fc00b02662439c3223989d2d019b9 Mon Sep 17 00:00:00 2001 From: Aaron Kling Date: Wed, 20 Dec 2023 14:44:45 -0600 Subject: [PATCH 70/76] kernel: Support kernel modules via kbuild TARGET_EXTERNAL_KERNEL_MODULES variable is used for the list of modules, same as the existing functionality, but is invoked if ':kbuild' is appended to a module name Existing external module build calls make in the module directory, which is a standalone module build. The module makefile may chain to kbuild, but that depends on the module. This addition invokes the kernel build system, passing the module directory via the M= param, which is the kernel standard for building out of tree modules. Change-Id: I38a582952f79f7155cdbf8a5975cf23074bbdab0 --- build/tasks/kernel.mk | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 453a0dd..ec589e8 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -278,6 +278,14 @@ define make-external-module-target $(PATH_OVERRIDE) $(KERNEL_MAKE_CMD) $(KERNEL_MAKE_FLAGS) -C $(TARGET_KERNEL_EXT_MODULE_ROOT)/$(1) M=$(2)/$(1) KERNEL_SRC=$(BUILD_TOP)/$(KERNEL_SRC) OUT_DIR=$(KERNEL_BUILD_OUT_PREFIX)$(KERNEL_OUT) O=$(KERNEL_BUILD_OUT_PREFIX)$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(KERNEL_CLANG_TRIPLE) $(KERNEL_CC) $(3) endef +# Make an external module target using kbuild +# $(1): module name +# $(2): module root path relative to kernel source +# $(2): target to build (eg. modules_install) +define make-kbuild-module-target +$(PATH_OVERRIDE) $(KERNEL_MAKE_CMD) $(KERNEL_MAKE_FLAGS) -C $(BUILD_TOP)/$(KERNEL_SRC) M=$(2)/$(1) O=$(KERNEL_BUILD_OUT_PREFIX)$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(KERNEL_CLANG_TRIPLE) $(KERNEL_CC) $(3) +endef + # Generate kernel .config from a given defconfig # $(1): Output path (The value passed to O=) # $(2): The defconfig to process (just the filename, no need for full path to file) @@ -428,8 +436,8 @@ $(TARGET_PREBUILT_INT_KERNEL): $(KERNEL_CONFIG) $(DEPMOD) $(DTC) rpath=$$(python3 -c 'import os,sys;print(os.path.relpath(*(sys.argv[1:])))' $(TARGET_KERNEL_EXT_MODULE_ROOT) $(KERNEL_SRC)); \ $(foreach p, $(TARGET_KERNEL_EXT_MODULES),\ $$pwd; \ - $(call make-external-module-target,$(p),$$rpath,) || exit "$$?"; \ - $(call make-external-module-target,$(p),$$rpath,INSTALL_MOD_PATH=$(MODULES_INTERMEDIATES) INSTALL_MOD_STRIP=1 KERNEL_UAPI_HEADERS_DIR=$(KERNEL_OUT) modules_install)) || exit "$$?"; \ + $(call $(if $(filter $(word 2,$(subst :, ,$(p))),kbuild),make-kbuild-module-target,make-external-module-target),$(word 1,$(subst :, ,$(p))),$$rpath,) || exit "$$?"; \ + $(call $(if $(filter $(word 2,$(subst :, ,$(p))),kbuild),make-kbuild-module-target,make-external-module-target),$(word 1,$(subst :, ,$(p))),$$rpath,INSTALL_MOD_PATH=$(MODULES_INTERMEDIATES) INSTALL_MOD_STRIP=1 KERNEL_UAPI_HEADERS_DIR=$(KERNEL_OUT) modules_install)) || exit "$$?"; \ ) \ kernel_release=$$(cat $(KERNEL_RELEASE)) \ kernel_modules_dir=$(MODULES_INTERMEDIATES)/lib/modules/$$kernel_release \ From d186c173ef83e03ad4be7a6dbb74e9047c6c7dca Mon Sep 17 00:00:00 2001 From: Aaron Kling Date: Tue, 12 Mar 2024 19:15:29 -0500 Subject: [PATCH 71/76] fixup! kernel: Support copying modules to boot ramdisk Original commit incorrectly added kernel as a dep to the vendor ramdisk for this path, when instead the dep should be added to the boot ramdisk. Change-Id: I25a42d403fe2ddb0538b08c2dd8f761eae960810 --- build/tasks/kernel.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index ec589e8..68246de 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -403,7 +403,7 @@ else KERNEL_VENDOR_RAMDISK_KERNEL_MODULES_LOAD := $(BOARD_VENDOR_RAMDISK_KERNEL_MODULES_LOAD) KERNEL_VENDOR_RAMDISK_MODULES_OUT := $(TARGET_RAMDISK_OUT) KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_ramdisk) -$(INTERNAL_VENDOR_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) +$(INSTALLED_RAMDISK_TARGET): $(TARGET_PREBUILT_INT_KERNEL) endif ifneq ($(RECOVERY_KERNEL_MODULES),) From 8428c3035791cede1e616f6b72bfcb14f2f94f9b Mon Sep 17 00:00:00 2001 From: nebrassy Date: Sat, 4 May 2024 02:19:16 +0200 Subject: [PATCH 72/76] Kernel: remove check for prebuilt kernel Change-Id: If069f0be131b1d7a469d54414a4f020e8a1169af --- build/tasks/kernel.mk | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 68246de..5e52cda 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -63,9 +63,6 @@ # NEED_KERNEL_MODULE_VENDOR_OVERLAY = Optional, if true, install kernel # modules in vendor_overlay instead of vendor # -# TARGET_FORCE_PREBUILT_KERNEL = Optional, use TARGET_PREBUILT_KERNEL even if -# kernel sources are present -# # TARGET_MERGE_DTBS_WILDCARD = Optional, limits the .dtb files used to generate the # final DTB image when using QCOM's merge_dtbs script. @@ -162,27 +159,8 @@ else $(warning **********************************************************) $(error "NO KERNEL CONFIG") else - ifneq ($(TARGET_FORCE_PREBUILT_KERNEL),) - ifneq ($(filter RELEASE NIGHTLY SNAPSHOT EXPERIMENTAL,$(LINEAGE_BUILDTYPE)),) - $(error "PREBUILT KERNEL IS NOT ALLOWED ON OFFICIAL BUILDS!") - else - $(warning **********************************************************) - $(warning * Kernel source found and configuration was defined, *) - $(warning * but prebuilt kernel is being forced. *) - $(warning * While this is likely intentional, *) - $(warning * it is NOT SUPPORTED WHATSOEVER. *) - $(warning * Generated kernel headers may not align with *) - $(warning * the ABI of kernel you're including. *) - $(warning * Please unset TARGET_FORCE_PREBUILT_KERNEL *) - $(warning * to build the kernel from source. *) - $(warning **********************************************************) - FULL_KERNEL_BUILD := false - KERNEL_BIN := $(TARGET_PREBUILT_KERNEL) - endif - else - FULL_KERNEL_BUILD := true - KERNEL_BIN := $(TARGET_PREBUILT_INT_KERNEL) - endif + FULL_KERNEL_BUILD := true + KERNEL_BIN := $(TARGET_PREBUILT_INT_KERNEL) endif endif From 6227261ad482abf168b25a5b8a1603de554b364f Mon Sep 17 00:00:00 2001 From: maxwen Date: Sat, 7 Oct 2023 18:51:12 +0200 Subject: [PATCH 73/76] soong: Follow the correct JSON syntax wrong: CROSS_COMPILE=\\"/data4... correct: CROSS_COMPILE=\"/data4... Change-Id: I5080aef7feb2ec7429cb9ba1f4baccefa61a3cd3 --- config/BoardConfigSoong.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/BoardConfigSoong.mk b/config/BoardConfigSoong.mk index 0b8c06b..272a9f8 100644 --- a/config/BoardConfigSoong.mk +++ b/config/BoardConfigSoong.mk @@ -43,7 +43,7 @@ SOONG_CONFIG_twrpVarsPlugin := define addVar SOONG_CONFIG_twrpVarsPlugin += $(1) - SOONG_CONFIG_twrpVarsPlugin_$(1) := $$(subst ",\",$$($1)) + SOONG_CONFIG_twrpVarsPlugin_$(1) := $($1) endef $(foreach v,$(EXPORT_TO_SOONG),$(eval $(call addVar,$(v)))) From 3894b9474331165e09dd3f88fd42394629890c5f Mon Sep 17 00:00:00 2001 From: nebrassy Date: Sat, 4 May 2024 12:28:49 +0200 Subject: [PATCH 74/76] vendor: export TARGET_KERNEL_SOURCE Change-Id: I12b8652fe658733198eb5b7097f0c46f12ddcfa1 --- config/BoardConfigSoong.mk | 1 + 1 file changed, 1 insertion(+) diff --git a/config/BoardConfigSoong.mk b/config/BoardConfigSoong.mk index 272a9f8..dbaa987 100644 --- a/config/BoardConfigSoong.mk +++ b/config/BoardConfigSoong.mk @@ -9,6 +9,7 @@ EXPORT_TO_SOONG := \ KERNEL_MAKE_FLAGS \ PATH_OVERRIDE_SOONG \ TARGET_KERNEL_CONFIG \ + TARGET_KERNEL_SOURCE \ TARGET_KERNEL_HEADERS_SOURCE \ TW_THEME \ TW_CUSTOM_THEME \ From ee118d6ebf89c603ef50b10d740b3ffec9b5fe10 Mon Sep 17 00:00:00 2001 From: nebrassy Date: Sat, 4 May 2024 12:48:20 +0200 Subject: [PATCH 75/76] kernel: fix incorrect identation Change-Id: I62e3f6332c220759322a553f0a63481e3a9fa43c --- build/tasks/kernel.mk | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tasks/kernel.mk b/build/tasks/kernel.mk index 5e52cda..9d0ea05 100644 --- a/build/tasks/kernel.mk +++ b/build/tasks/kernel.mk @@ -591,7 +591,7 @@ endif ifeq ($(NEEDS_KERNEL_COPY),true) ifneq ($(TW_LOAD_VENDOR_MODULES),) ifdef TARGET_PREBUILT_KERNEL - $(call twrp-depmod) + $(call twrp-depmod) endif endif $(INSTALLED_KERNEL_TARGET): $(KERNEL_BIN) From 9a2d74f0ea087914e8073342c9f0c6a2a5aa766d Mon Sep 17 00:00:00 2001 From: nebrassy Date: Sat, 31 Aug 2024 21:18:14 +0200 Subject: [PATCH 76/76] roomservice: 14 Change-Id: Ie4fecccb0db307f0965d2838995549f7c8cd9905 --- build/tools/roomservice.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/tools/roomservice.py b/build/tools/roomservice.py index 8983888..5d01d63 100755 --- a/build/tools/roomservice.py +++ b/build/tools/roomservice.py @@ -43,7 +43,7 @@ except ImportError: DEBUG = False custom_local_manifest = ".repo/local_manifests/roomservice.xml" -custom_default_revision = os.getenv('ROOMSERVICE_DEFAULT_BRANCH', 'android-12.1') +custom_default_revision = os.getenv('ROOMSERVICE_DEFAULT_BRANCH', 'android-14') custom_dependencies = "twrp.dependencies" org_manifest = "TeamWin" # leave empty if org is provided in manifest org_display = "TeamWin" # needed for displaying