Merge changes Ie4fecccb,I62e3f633,I12b8652f,I5080aef7,If069f0be, ... into android-14

* changes:
  roomservice: 14
  kernel: fix incorrect identation
  vendor: export TARGET_KERNEL_SOURCE
  soong: Follow the correct JSON syntax
  Kernel: remove check for prebuilt kernel
  fixup! kernel: Support copying modules to boot ramdisk
  kernel: Support kernel modules via kbuild
  kernel: Support copying modules to boot ramdisk
  kernel: Default to no gcc on kernel 6.x
  kernel: Make INTERNAL_VENDOR_RAMDISK_TARGET depend on kernel
  kernel: Ensure that module load lists are properly formed
  kernel: Halt build process if an external module fails to compile
  kernel: Replace BOARD_SYSTEM_KERNEL_MODULES with SYSTEM_KERNEL_MODULES
  config: Update clang version to clang-r487747c
  kernel: Rename mkdtboimg.py
  kernel: Use correct variable name for vendor_kernel_boot modules
  kernel: Use lz4 from Google prebuilts
  kernel: Use pahole from Google prebuilts
  kernel: Allow to limit the used .dtb files for the final DTB image
  kernel: Include DTBOs from OEM/ODM folder in base DTB
  kernel: Handle GKI modules
  kernel: Support copying modules to recovery
  kernel: Support Qualcomm merge_dtbs script
  kernel: Don't try to do math on empty kernel version
  kernel: Restore TARGET_KERNEL_VERSION
  kernel: Go full LLVM build on 5.10+ kernels
  kernel: Check HIP support of clang before disabling it
  kernel: Force disable LLVM HIP
  kernel: Force disable LLVM CUDA
  kernel: Allow devices to opt-in for full LLVM build
  kernel: Support copying modules to vendor_kernel_boot
  kernel: Remove darwin support
  kernel: Remove TARGET_KERNEL_MODULES error
  kernel: Only add GCC to PATH when using GNU binutils
  kernel: Override LD_LIBRARY_PATH only on <5.10
  kernel: Fix clang version override
  kernel: Add support for custom dtbimage generation rules
  kernel: Support building dtbimage with mkdtboimg.py config
  lineage: kernel: Use getconf instead of nproc
  kernel: Changes for 5.10 build without GCC
  kernel: Slightly reorder config
  kernel: Use consistent spacing
  kernel: Fix vdso32 building for 4.19+ kernels
  kernel: add `pahole` dependency
  kernel: Allow passing empty DTB to mkbootimg via board-flag
  kernel: Use LLVM binutils by default
  kernel: Drop -fuse-ld=lld from CFLAGS
  kernel: Changes for LLVM binutils
  config: Update clang version to clang-r450784d
  kernel: Always build dtb targets before dtbo.img
  kernel: Add support for vendor_boot image header version 4
  kernel.mk: Allow building external kernel modules
  kernel: Allow overriding dtb target
  kernel: Allow setting dtbo target path prefix
  kernel: Allow overriding dtbo target name
  config: Use LLVM binutils for 5.10 as well
  lineage: config: Use $(abspath .) instead of $(shell pwd)
  kernel: Don't print grep error messages when checking version
  kernel: Move TARGET_KERNEL_ADDITIONAL_FLAGS to kernel task
  kernel: Switch to AOSP DTC instead of using scripts/dtc
  Revert "kernel: Remove unneeded MKDTIMG dependency"
  kernel: Remove unneeded MKDTIMG dependency
  kernel: Ensure dtb(o) always get rebuilt
  kernel: Avoid unnecessary savedefconfig
  kernel: Clean up kernel copy recipes
  lineage: build: Wipe DTB/O OBJs before build
  kernel: Document TARGET_KERNEL_RECOVERY_CONFIG usage
  kernel: Fix building recovery images
  kernel: Fix kernel rebuilding
  build: tasks: kernel: Rework kernel fragments handling
  Add support for separate kernels for boot and recovery [1/2]
  kernel: Pass absolute path for KCONFIG_ALLCONFIG
  build: Fix kernelsavedefconfig target
  lineage: config: Don't pass CFLAGS_MODULE="-fno-pic" if using LLVM
  kernel: Use LLVM's substitutes for GNU binutils if possible
  kernel: Add clean headers script to workaround conflicts with bionic
This commit is contained in:
Nebrassy
2024-09-07 13:46:49 +00:00
committed by Gerrit Code Review
7 changed files with 928 additions and 219 deletions
+1 -1
View File
@@ -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: [
+334 -145
View File
@@ -1,5 +1,5 @@
# Copyright (C) 2012 The CyanogenMod Project
# (C) 2017-2021 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.
@@ -21,17 +21,16 @@
#
# These config vars are usually set in BoardConfig.mk:
#
# TARGET_KERNEL_CONFIG = Kernel defconfig
# 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.
# 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
# TARGET_KERNEL_ADDITIONAL_CONFIG = Additional defconfig, optional
#
# 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
@@ -41,14 +40,16 @@
# For example, for ARM devices,
# use zImage-dtb instead of zImage.
#
# BOARD_DTBO_CFG = Path to a mkdtboimg.py config file
# BOARD_DTB_CFG = Path to a mkdtboimg config file for dtb.img
#
# BOARD_DTBO_CFG = Path to a mkdtboimg 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
# 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
@@ -62,8 +63,8 @@
# 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.
ifneq ($(TARGET_NO_KERNEL),true)
ifneq ($(TARGET_NO_KERNEL_OVERRIDE),true)
@@ -72,16 +73,27 @@ 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)
# dtb generation - optional
TARGET_MERGE_DTBS_WILDCARD ?= *
## 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
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
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)
@@ -90,18 +102,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)
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),)
@@ -110,6 +117,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
@@ -150,104 +159,121 @@ 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
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)
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)
ifneq ($(KERNEL_NO_GCC), true)
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
PATH_OVERRIDE += LD_LIBRARY_PATH=$(TARGET_KERNEL_CLANG_PATH)/lib64:$$LD_LIBRARY_PATH
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-
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
ifeq ($(KERNEL_LD),)
KERNEL_LD :=
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
ifneq ($(TARGET_KERNEL_MODULES),)
$(error TARGET_KERNEL_MODULES is no longer supported!)
ifneq ($(KERNEL_NO_GCC), true)
PATH_OVERRIDE += PATH=$(KERNEL_TOOLCHAIN_PATH_gcc):$$PATH
endif
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
ifeq (true,$(filter true, $(TARGET_NEEDS_DTBOIMAGE) $(BOARD_KERNEL_SEPARATED_DTBO)))
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)
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
# $(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) $(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)
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
endef
# Make a kernel target
@@ -256,6 +282,12 @@ 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
@@ -273,44 +305,97 @@ 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; \
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
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
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)))
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)
$(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 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)
$(INSTALLED_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)
$(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): $(KERNEL_OUT) $(ALL_KERNEL_DEFCONFIG_SRCS)
@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_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))"
@@ -324,20 +409,51 @@ $(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 $(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 \
$(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 $(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 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))) || 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),/)) || exit "$$?"; \
,\
($(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 \
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,$(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),$(KERNEL_VENDOR_RAMDISK_KERNEL_MODULES_LOAD),/)) || exit "$$?"; \
) \
$(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-twrp,$$recovery_modules,$(KERNEL_RECOVERY_MODULES_OUT),/,$(KERNEL_RECOVERY_DEPMOD_STAGING_DIR),$(BOARD_RECOVERY_RAMDISK_KERNEL_MODULES_LOAD),/)) || exit "$$?"; \
) \
fi
@@ -348,10 +464,9 @@ kerneltags: $(KERNEL_CONFIG)
.PHONY: kernelsavedefconfig alldefconfig
kernelsavedefconfig: $(KERNEL_OUT)
$(call make-kernel-target,$(KERNEL_DEFCONFIG))
env KCONFIG_NOTIMESTAMP=true \
$(call make-kernel-target,savedefconfig)
cp $(KERNEL_OUT)/defconfig $(KERNEL_DEFCONFIG_SRC)
$(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)
env KCONFIG_NOTIMESTAMP=true \
@@ -362,35 +477,87 @@ 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)
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)
ifeq ($(BOARD_KERNEL_SEPARATED_DTBO),true)
$(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,dtbs)
$(call make-dtbo-target,$(TARGET_KERNEL_DTB))
ifeq ($(BOARD_KERNEL_SEPARATED_DTBO),true)
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)
$(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
ifeq ($(BOARD_INCLUDE_DTB_IN_BOOTIMG),true)
ifneq ($(BOARD_CUSTOM_DTBIMG_MK),)
include $(BOARD_CUSTOM_DTBIMG_MK)
else
ifeq ($(BOARD_PREBUILT_DTBIMAGE_DIR),)
$(INSTALLED_DTBIMAGE_TARGET): $(DTC)
$(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$(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 $@
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,dtbs)
$(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/*/*.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 "${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
endif # BOARD_DTB_CFG
$(hide) touch -c $(DTB_OUT)
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
@@ -402,21 +569,43 @@ 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): $(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)
@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)
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)
endif
endif
ALL_PREBUILT += $(INSTALLED_KERNEL_TARGET)
$(INSTALLED_KERNEL_TARGET): $(KERNEL_BIN)
$(transform-prebuilt-to-target)
endif
ifeq ($(RECOVERY_KERNEL_COPY),true)
$(INSTALLED_RECOVERY_KERNEL_TARGET): $(RECOVERY_BIN)
$(transform-prebuilt-to-target)
endif
.PHONY: recovery-kernel
recovery-kernel: $(INSTALLED_RECOVERY_KERNEL)
.PHONY: kernel
kernel: $(INSTALLED_KERNEL_TARGET)
+436
View File
@@ -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 = <A>, <B>
board-id = <c>, <d>
pmic-id = <0, 1>
Other has plat, board, pmic are:
msm-id = <A>, <B>
board-id = <c>
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: {} <base dtb folder> <techpack dtb folder> <output folder>"
.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()
+1 -1
View File
@@ -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
+147 -71
View File
@@ -1,4 +1,4 @@
# Copyright (C) 2018-2020 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.
@@ -31,6 +31,27 @@
# 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_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
# 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
#
# 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
@@ -40,7 +61,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)
@@ -51,40 +72,37 @@ 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
CLANG_PREBUILTS := $(BUILD_TOP)/prebuilts/clang/host/$(HOST_PREBUILT_TAG)/clang-r416183b1
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-
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))
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))
# 5.10+ can fully compile without GCC by default
ifneq ($(KERNEL_VERSION),)
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
endif
endif
ifeq ($(KERNEL_TOOLCHAIN),)
KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN_PREFIX)
else
KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN)/$(KERNEL_TOOLCHAIN_PREFIX)
ifeq ($(TARGET_KERNEL_NO_GCC), true)
KERNEL_NO_GCC := true
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))
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-r487747c
endif
TARGET_KERNEL_CLANG_PATH ?= $(BUILD_TOP)/prebuilts/clang/host/$(HOST_PREBUILT_TAG)/$(KERNEL_CLANG_VERSION)
ifneq ($(USE_CCACHE),)
ifneq ($(CCACHE_EXEC),)
@@ -93,65 +111,120 @@ ifneq ($(USE_CCACHE),)
endif
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)"
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 ($(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 ($(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"
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
# 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 \
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
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
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
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))
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
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
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
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=$(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=$(TARGET_KERNEL_CLANG_PATH)/bin/ld.lld
KERNEL_MAKE_FLAGS += AR=$(TARGET_KERNEL_CLANG_PATH)/bin/llvm-ar
endif
endif
else
TOOLS_PATH_OVERRIDE += PATH=$(BUILD_TOP)/prebuilts/tools-lineage/$(HOST_PREBUILT_TAG)/bin:$$PATH
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:$(TARGET_KERNEL_CLANG_PATH)/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)))
BOARD_PREBUILT_DTBOIMAGE ?= $(TARGET_OUT_INTERMEDIATES)/DTBO_OBJ/arch/$(KERNEL_ARCH)/boot/dtbo.img
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
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
# 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
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
@@ -159,10 +232,13 @@ 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')
KERNEL_BUILD_OUT_PREFIX :=
ifeq ($(OUT_DIR_PREFIX),out)
KERNEL_BUILD_OUT_PREFIX := $(BUILD_TOP)/
KERNEL_BUILD_OUT_PREFIX := $(BUILD_TOP)/
endif
+2 -1
View File
@@ -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 \
@@ -43,7 +44,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))))
+7
View File
@@ -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"