aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2021-09-25 19:28:06 +0200
committerDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2021-09-27 17:02:32 +0200
commit5552ac3ded323829265aafb1bfb9392c18bf6ca6 (patch)
treeae950c778d8386c85da8da4c5333f51e989bbe4d
parent3ef1d3fe7a67fc2590c93cb8112344ef0aabf990 (diff)
downloadvendor_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.mk236
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