diff options
author | Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> | 2021-09-25 19:28:06 +0200 |
---|---|---|
committer | Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> | 2021-09-27 17:02:32 +0200 |
commit | 5552ac3ded323829265aafb1bfb9392c18bf6ca6 (patch) | |
tree | ae950c778d8386c85da8da4c5333f51e989bbe4d | |
parent | 3ef1d3fe7a67fc2590c93cb8112344ef0aabf990 (diff) | |
download | vendor_lineage-5552ac3ded323829265aafb1bfb9392c18bf6ca6.tar.gz vendor_lineage-5552ac3ded323829265aafb1bfb9392c18bf6ca6.tar.bz2 vendor_lineage-5552ac3ded323829265aafb1bfb9392c18bf6ca6.zip |
Add task for building a recovery kernel
The build/tasks/recovery_kernel.mk file comes from the
build/tasks/kernel.mk file with several changes on top:
- All the internal definitions should have some "RECOVERY_"
or "recovery-" prefix to not conflict with the
build/tasks/kernel.mk definitions.
- Many of the externally exported variables like
the ones defined in config/BoardConfigSoong.mk were
reused as-is as in many cases there isn't any valid use
case yet for having different settings for the recovery
kernel. For instance we don't necessary need a different
make or xz to building the recovery kernel, so we just
used KERNEL_MAKE_CMD and KERNEL_XZ instead of having
recovery specific ones like RECOVERY_KERNEL_MAKE_CMD
and RECOVERY_KERNEL_XZ.
For building a recovery kernel, the
BOARD_RECOVERY_KERNEL_IMAGE_NAME,
TARGET_RECOVERY_KERNEL_CLANG_COMPILE,
TARGET_RECOVERY_KERNEL_CONFIG and
TARGET_RECOVERY_KERNEL_SOURCE need to be defined.
For instance, we have the following in BoardConfigCommon.mk
in device/samsung/midas-common:
#############################
# Software: Recovery kernel #
#############################
BOARD_RECOVERY_KERNEL_IMAGE_NAME := zImage-dtb
TARGET_RECOVERY_KERNEL_CLANG_COMPILE := true
TARGET_RECOVERY_KERNEL_CONFIG := replicant_recovery_defconfig
TARGET_RECOVERY_KERNEL_SOURCE := kernel/replicant/linux
For now it also reuses the BOARD_DTB_IMAGE_NAME setting from the
boot kernel to know which dtb to compile.
Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
-rw-r--r-- | build/tasks/recovery_kernel.mk | 236 |
1 files changed, 236 insertions, 0 deletions
diff --git a/build/tasks/recovery_kernel.mk b/build/tasks/recovery_kernel.mk new file mode 100644 index 00000000..3a45f3c4 --- /dev/null +++ b/build/tasks/recovery_kernel.mk @@ -0,0 +1,236 @@ +# Copyright (C) 2012 The CyanogenMod Project +# (C) 2017 The LineageOS Project +# (C) 2021 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org> +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + + +# Android makefile to build kernel as a part of Android Build +# +# Configuration +# ============= +# +# These config vars are usually set in BoardConfig.mk: +# +# TARGET_RECOVERY_KERNEL_CONFIG = Recovery kernel defconfig +# TARGET_RECOVERY_KERNEL_VARIANT_CONFIG = Recovery kernel variant defconfig, optional +# TARGET_RECOVERY_KERNEL_SELINUX_CONFIG = Recovery kernel SELinux defconfig, optional +# TARGET_RECOVERY_KERNEL_ADDITIONAL_CONFIG = Recovery kernel additional defconfig, optional +# +# TARGET_RECOVERY_KERNEL_CLANG_COMPILE = Compile kernel with clang, defaults to false +# +# TARGET_RECOVERY_KERNEL_CLANG_VERSION = Clang prebuilts version, optional, defaults to clang-stable +# +# TARGET_RECOVERY_KERNEL_CLANG_PATH = Clang prebuilts path, optional +# +# BOARD_RECOVERY_KERNEL_IMAGE_NAME = Built recovery image name +# for ARM use: zImage +# for ARM64 use: Image.gz +# for uncompressed use: Image +# If using an appended DT, append '-dtb' +# to the end of the image name. +# For example, for ARM devices, +# use zImage-dtb instead of zImage. +# +# 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. +# +# RECOVERY_KERNEL_CLANG_TRIPLE = Target triple for clang (e.g. aarch64-linux-gnu-) +# defaults to arm-linux-gnu- for arm +# aarch64-linux-gnu- for arm64 +# x86_64-linux-gnu- for x86 +ifneq ($(TARGET_NO_RECOVERY_KERNEL),true) + +## Externally influenced variables +RECOVERY_KERNEL_SRC := $(TARGET_RECOVERY_KERNEL_SOURCE) +# kernel configuration - mandatory +RECOVERY_KERNEL_DEFCONFIG := $(TARGET_RECOVERY_KERNEL_CONFIG) +RECOVERY_VARIANT_DEFCONFIG := $(TARGET_RECOVERY_KERNEL_VARIANT_CONFIG) +RECOVERY_SELINUX_DEFCONFIG := $(TARGET_RECOVERY_KERNEL_SELINUX_CONFIG) + +## Internal variables +RECOVERY_DTBS_OUT := $(PRODUCT_OUT)/recovery_dtbs +RECOVERY_KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/RECOVERY_KERNEL_OBJ +RECOVERY_KERNEL_CONFIG := $(RECOVERY_KERNEL_OUT)/.config +RECOVERY_KERNEL_RELEASE := $(RECOVERY_KERNEL_OUT)/include/config/kernel.release + +ifeq ($(KERNEL_ARCH),x86_64) +RECOVERY_KERNEL_DEFCONFIG_ARCH := x86 +else +RECOVERY_KERNEL_DEFCONFIG_ARCH := $(KERNEL_ARCH) +endif +RECOVERY_KERNEL_DEFCONFIG_DIR := $(RECOVERY_KERNEL_SRC)/arch/$(RECOVERY_KERNEL_DEFCONFIG_ARCH)/configs +RECOVERY_KERNEL_DEFCONFIG_SRC := $(RECOVERY_KERNEL_DEFCONFIG_DIR)/$(RECOVERY_KERNEL_DEFCONFIG) + +ifeq ($(BOARD_RECOVERY_KERNEL_IMAGE_NAME),) +$(error BOARD_RECOVERY_KERNEL_IMAGE_NAME not defined.) +endif +TARGET_PREBUILT_INT_RECOVERY_KERNEL := $(RECOVERY_KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/$(BOARD_RECOVERY_KERNEL_IMAGE_NAME) + +NEEDS_RECOVERY_KERNEL_COPY := true +ifeq ($(TARGET_RECOVERY_KERNEL_CONFIG),) + $(warning **********************************************************) + $(warning * Kernel source found, but no configuration was defined *) + $(warning * Please add the TARGET_KERNEL_CONFIG variable to your *) + $(warning * BoardConfig.mk file *) + $(warning **********************************************************) + # $(error "NO RECOVERY KERNEL CONFIG") +else + #$(info Kernel source found, building it) + FULL_RECOVERY_KERNEL_BUILD := true + RECOVERY_KERNEL_BIN := $(TARGET_PREBUILT_INT_RECOVERY_KERNEL) +endif + +ifeq ($(FULL_RECOVERY_KERNEL_BUILD),true) + +PATH_OVERRIDE := +ifeq ($(TARGET_RECOVERY_KERNEL_CLANG_COMPILE),true) + ifneq ($(RECOVERY_TARGET_KERNEL_CLANG_VERSION),) + RECOVERY_KERNEL_CLANG_VERSION := clang-$(TARGET_RECOVERY_KERNEL_CLANG_VERSION) + else + # Use the default version of clang if TARGET_RECOVERY_KERNEL_CLANG_VERSION hasn't been set by the device config + RECOVERY_KERNEL_CLANG_VERSION := $(LLVM_PREBUILTS_VERSION) + endif + TARGET_RECOVERY_KERNEL_CLANG_PATH ?= $(BUILD_TOP)/prebuilts/clang/host/$(HOST_OS)-x86/$(RECOVERY_KERNEL_CLANG_VERSION) + ifeq ($(KERNEL_ARCH),arm64) + RECOVERY_KERNEL_CLANG_TRIPLE ?= CLANG_TRIPLE=aarch64-linux-gnu- + else ifeq ($(KERNEL_ARCH),arm) + RECOVERY_KERNEL_CLANG_TRIPLE ?= CLANG_TRIPLE=arm-linux-gnu- + else ifeq ($(KERNEL_ARCH),x86) + RECOVERY_KERNEL_CLANG_TRIPLE ?= CLANG_TRIPLE=x86_64-linux-gnu- + endif + PATH_OVERRIDE += PATH=$(TARGET_RECOVERY_KERNEL_CLANG_PATH)/bin:$$PATH LD_LIBRARY_PATH=$(TARGET_RECOVERY_KERNEL_CLANG_PATH)/lib64:$$LD_LIBRARY_PATH + ifeq ($(KERNEL_CC),) + KERNEL_CC := CC="$(CCACHE_BIN) clang" + endif + ifeq ($(KERNEL_LD),) + KERNEL_LD := + endif +endif + +PATH_OVERRIDE += PATH=$(KERNEL_TOOLCHAIN_PATH_gcc)/bin:$$PATH + +# System tools are no longer allowed on 10+ +PATH_OVERRIDE += $(TOOLS_PATH_OVERRIDE) + +# 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-recovery-kernel-target +$(PATH_OVERRIDE) $(KERNEL_MAKE_CMD) $(KERNEL_MAKE_FLAGS) -C $(RECOVERY_KERNEL_SRC) O=$(KERNEL_BUILD_OUT_PREFIX)$(1) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(RECOVERY_KERNEL_CLANG_TRIPLE) $(KERNEL_CC) $(KERNEL_LD) XZ=$(KERNEL_XZ) $(2) +endef + +# Make a recovery kernel target +# $(1): The recovery kernel target to build (eg. defconfig, modules, modules_install) +define make-recovery-kernel-target +$(call internal-make-recovery-kernel-target,$(RECOVERY_KERNEL_OUT),$(1)) +endef + +# Make a DTBO target +# $(1): The DTBO target to build (eg. dtbo.img, defconfig) +define make-recovery-dtbo-target +$(call internal-make-recovery-kernel-target,$(PRODUCT_OUT)/dtbo,$(1)) +endef + +# Make a DTB targets +# $(1): The DTB target to build (eg. dtbs, defconfig) +define make-recovery-dtb-target +$(call internal-make-recovery-kernel-target,$(RECOVERY_DTBS_OUT),$(1)) +endef + +$(RECOVERY_KERNEL_OUT): + mkdir -p $(RECOVERY_KERNEL_OUT) + +$(RECOVERY_KERNEL_CONFIG): $(RECOVERY_KERNEL_DEFCONFIG_SRC) $(RECOVERY_KERNEL_ADDITIONAL_CONFIG_OUT) + @echo "Building Kernel Config" + $(call make-recovery-kernel-target,VARIANT_DEFCONFIG=$(RECOVERY_VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(RECOVERY_SELINUX_DEFCONFIG) $(RECOVERY_KERNEL_DEFCONFIG)) + $(hide) if [ ! -z "$(RECOVERY_KERNEL_CONFIG_OVERRIDE)" ]; then \ + echo "Overriding recovery kernel config with '$(RECOVERY_KERNEL_CONFIG_OVERRIDE)'"; \ + echo $(RECOVERY_KERNEL_CONFIG_OVERRIDE) >> $(RECOVERY_KERNEL_OUT)/.config; \ + $(call make-recovery-kernel-target,oldconfig); \ + fi + # Create defconfig build artifact + $(call make-recovery-kernel-target,savedefconfig) + +$(TARGET_PREBUILT_INT_RECOVERY_KERNEL): $(RECOVERY_KERNEL_CONFIG) $(DEPMOD) + @echo "Building recovery Kernel" +ifneq ($(BOARD_DTB_IMAGE_NAME),) + $(call make-recovery-kernel-target,zImage) + $(call make-recovery-kernel-target,$(BOARD_DTB_IMAGE_NAME)) + cat $(RECOVERY_KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/zImage \ + $(RECOVERY_KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/dts/$(BOARD_DTB_IMAGE_NAME) \ + > $(RECOVERY_KERNEL_BIN) +else + $(call make-recovery-kernel-target,$(BOARD_RECOVERY_KERNEL_IMAGE_NAME)) + $(hide) if grep -q '^CONFIG_OF=y' $(RECOVERY_KERNEL_CONFIG); then \ + echo "Building recovery DTBs"; \ + $(call make-recovery-kernel-target,dtbs); \ + fi +endif + +.PHONY: recovery_kerneltags +recovery_kerneltags: $(RECOVERY_KERNEL_CONFIG) + $(call make-recovery-kernel-target,tags) + +.PHONY: recovery_kernelsavedefconfig + +recovery_kernelsavedefconfig: $(RECOVERY_KERNEL_OUT) + $(call make-recovery-kernel-target,$(KERNEL_RECOVERY_DEFCONFIG)) + env KCONFIG_NOTIMESTAMP=true \ + $(call make-recovery-kernel-target,savedefconfig) + cp $(RECOVERY_KERNEL_OUT)/defconfig $(RECOVERY_KERNEL_DEFCONFIG_SRC) + +ifeq ($(TARGET_NEEDS_RECOVERY_DTBOIMAGE),true) +$(BOARD_PREBUILT_RECOVERY_DTBOIMAGE): + echo -e ${CL_GRN}"Building recovery DTBO.img"${CL_RST} + $(call make-recovery-dtbo-target,$(RECOVERY_KERNEL_DEFCONFIG)) + $(call make-recovery-dtbo-target,dtbo.img) +endif # TARGET_NEEDS_RECOVERY_DTBOIMAGE + +endif # FULL_RECOVERY_KERNEL_BUILD + +## Install it + +ifeq ($(NEEDS_RECOVERY_KERNEL_COPY),true) +file := $(INSTALLED_RECOVERY_KERNEL_TARGET) +ALL_PREBUILT += $(file) +$(file) : $(RECOVERY_KERNEL_BIN) | $(ACP) + $(transform-prebuilt-to-target) + +ALL_PREBUILT += $(INSTALLED_RECOVERY_KERNEL_TARGET) +endif + +INSTALLED_RECOVERY_DTBOIMAGE_TARGET := $(PRODUCT_OUT)/recovery_dtbo.img +ALL_PREBUILT += $(INSTALLED_RECOVERY_DTBOIMAGE_TARGET) + +.PHONY: recovery_kernel +recovery_kernel: $(INSTALLED_RECOVERY_KERNEL_TARGET) + +.PHONY: recovery_dtboimage +recovery_dtboimage: $(INSTALLED_RECOVERY_DTBOIMAGE_TARGET) + +ifeq ($(BOARD_INCLUDE_RECOVERY_DTB_IN_BOOTIMG),true) +ifeq ($(BOARD_PREBUILT_RECOVERY_DTBIMAGE_DIR),) +$(INSTALLED_RECOVERY_DTBIMAGE_TARGET): + echo -e ${CL_GRN}"Building recovery DTBs"${CL_RST} + $(call make-recovery-dtb-target,$(KERNEL_RECOVERY_DEFCONFIG)) + $(call make-recovery-dtb-target,dtbs) + cat $(shell find $(RECOVERY_DTBS_OUT)/arch/$(KERNEL_ARCH)/boot/dts/** -type f -name "*.dtb" | sort) > $@ +endif +.PHONY: recovery_dtbimage +recovery_dtbimage: $(INSTALLED_RECOVERY_DTBIMAGE_TARGET) +endif # BOARD_INCLUDE_DTB_IN_BOOTIMG + +endif # TARGET_NO_RECOVERY_KERNEL |