kernel: Support building from kernel platform

This expects a few build variables to be set:

* TARGET_KERNEL_PLATFORM_TARGET: The base target name. For example,
  'tegra' will indicate that the dist target is tegra_dist, abi is
  tegra_abi, etc.
* TARGET_KERNEL_VERSION: Used to determine the kernel checkout path. For
  example, a value of 6.6 will expect the kernel platform repo to be
  checked out to $BUILD_TOP/../kernel-6.6.
* TARGET_KERNEL_SOURCE: Relative to the top of the kernel platform
  checkout, the path to the kernel build rules. For example,
  vendor/nvidia/tegra.
* BOARD_KERNEL_IMAGE_NAME: The kernel image to use. For example, Image.

Using the examples above, this will run bazel in the kernel-6.6
directory on the target //vendor/nvidia/tegra:tegra_dist, then source
the output from $OUT/tegra/dist, with the prebuilt kernel image being
Image.

Change-Id: If96e96dffa2c0bfd9bd824bb3d8064eb861c9d00
This commit is contained in:
Aaron Kling
2025-07-15 20:32:33 -05:00
committed by Jan Altensen
parent e9f9f3902d
commit 7cd90ecd34
4 changed files with 68 additions and 5 deletions

View File

@@ -21,7 +21,16 @@ lineage_generator {
name: "generated_kernel_includes",
// The headers make command
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/lineage/tools/clean_headers.sh $(KERNEL_BUILD_OUT_PREFIX)$(genDir)",
cmd: "if [ -n \"$(TARGET_KERNEL_PLATFORM_TARGET)\" ]; then " +
" pushd $(KERNEL_PATH); " +
" ./tools/bazel --output_user_root=$(KERNEL_BUILD_OUT_PREFIX)$(genDir)/bazel-out run --experimental_convenience_symlinks=ignore --cpu=$(KERNEL_ARCH) //$(TARGET_KERNEL_SOURCE):$(TARGET_KERNEL_PLATFORM_TARGET)_uapi_headers_dist -- --destdir=$(KERNEL_BUILD_OUT_PREFIX)$(genDir); " +
" popd; " +
" gzip -d $(KERNEL_BUILD_OUT_PREFIX)$(genDir)/kernel-uapi-headers.tar.gz; " +
" tar -xf $(KERNEL_BUILD_OUT_PREFIX)$(genDir)/kernel-uapi-headers.tar -C $(KERNEL_BUILD_OUT_PREFIX)$(genDir); " +
"else " +
" $(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; " +
"fi; " +
"vendor/lineage/tools/clean_headers.sh $(KERNEL_BUILD_OUT_PREFIX)$(genDir)",
// Directories that can be imported by a cc_* module generated_headers property
export_include_dirs: [

View File

@@ -84,6 +84,9 @@
# TARGET_DTB_LIST_WILDCARD = Optional, limits the .dtb files used to generate the
# final DTB image when NOT using QCOM's merge_dtbs
# script. Allows multiple patterns.
#
# TARGET_KERNEL_PLATFORM_TARGET = Optional, enables building an external kernel
# platform tree, this specifies the base target name
ifneq ($(TARGET_NO_KERNEL),true)
ifneq ($(TARGET_NO_KERNEL_OVERRIDE),true)
@@ -102,6 +105,7 @@ TARGET_MERGE_DTBS_WILDCARD ?= *
TARGET_DTB_LIST_WILDCARD ?= *
# recovery modules.load fallback - optional
BOARD_RECOVERY_KERNEL_MODULES_LOAD ?= $(BOARD_RECOVERY_RAMDISK_KERNEL_MODULES_LOAD)
TARGET_KERNEL_MIXED_MODE ?= true
## Internal variables
DTC := $(HOST_OUT_EXECUTABLES)/dtc
@@ -153,7 +157,22 @@ ifeq "$(wildcard $(KERNEL_SRC) )" ""
$(eval HAS_PREBUILT_KERNEL := true)))
endif
ifneq ($(HAS_PREBUILT_KERNEL),)
ifneq ($(TARGET_KERNEL_PLATFORM_TARGET),)
ifeq "$(wildcard $(abspath $(BUILD_TOP)/../kernel-$(TARGET_KERNEL_VERSION))/$(KERNEL_SRC) )" ""
$(warning ***************************************************************)
$(warning * *)
$(warning * No kernel platform source found. *)
$(warning * Please make sure your device is properly configured to *)
$(warning * download the kernel repository to $(KERNEL_SRC))
$(warning * *)
$(warning ***************************************************************)
$(error "NO KERNEL")
endif
NEEDS_KERNEL_COPY := true
FULL_KERNEL_BUILD := false
TARGET_PREBUILT_INT_KERNEL := $(KERNEL_OUT)/$(BOARD_KERNEL_IMAGE_NAME)
KERNEL_BIN := $(TARGET_PREBUILT_INT_KERNEL)
else ifneq ($(HAS_PREBUILT_KERNEL),)
ifeq ($(TARGET_PREBUILT_KERNEL_HEADERS),)
$(warning ***************************************************************)
$(warning * Using prebuilt kernel binary instead of source *)
@@ -337,6 +356,10 @@ define make-dtb-target
$(call internal-make-kernel-target,$(DTB_OUT),$(1))
endef
endif # FULL_KERNEL_BUILD
ifneq ($(filter $(FULL_KERNEL_BUILD),true)$(TARGET_KERNEL_PLATFORM_TARGET),)
# $(1): modules list
# $(2): output dir
# $(3): mount point
@@ -390,9 +413,9 @@ define build-image-kernel-modules-lineage
fi;
endef
endif # FULL_KERNEL_BUILD
endif # FULL_KERNEL_BUILD or TARGET_KERNEL_PLATFORM_TARGET
ifeq ($(FULL_KERNEL_BUILD),true)
ifneq ($(filter $(FULL_KERNEL_BUILD),true)$(TARGET_KERNEL_PLATFORM_TARGET),)
ifeq ($(NEED_KERNEL_MODULE_ROOT),true)
KERNEL_MODULES_OUT := $(TARGET_ROOT_OUT)
@@ -431,7 +454,7 @@ SYSTEM_KERNEL_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediat
SYSTEM_KERNEL_MODULE_MOUNTPOINT := system_dlkm
SYSTEM_KERNEL_MODULES_PARTITION_FILE_LIST := $(system_dlkmimage_intermediates)/file_list.txt
$(INSTALLED_SYSTEM_DLKMIMAGE_TARGET): $(TARGET_PREBUILT_INT_KERNEL)
else ifneq ($(SYSTEM_KERNEL_MODULES),)
else ifneq ($(SYSTEM_KERNEL_MODULES)$(filter $(TARGET_KERNEL_MIXED_MODE),true),)
SYSTEM_KERNEL_MODULES_OUT := $(TARGET_OUT)
SYSTEM_KERNEL_DEPMOD_STAGING_DIR := $(KERNEL_BUILD_OUT_PREFIX)$(call intermediates-dir-for,PACKAGING,depmod_system)
SYSTEM_KERNEL_MODULE_MOUNTPOINT := system
@@ -470,6 +493,10 @@ KERNEL_RECOVERY_MODULES_OUT := $(TARGET_RECOVERY_ROOT_OUT)
$(recovery_uncompressed_ramdisk): $(TARGET_PREBUILT_INT_KERNEL)
endif
endif # TARGET_KERNEL_PLATFORM_TARGET or FULL_KERNEL_BUILD
ifeq ($(FULL_KERNEL_BUILD),true)
$(KERNEL_OUT):
mkdir -p $(KERNEL_OUT)
@@ -684,6 +711,27 @@ endef
endif # FULL_KERNEL_BUILD
ifneq ($(TARGET_KERNEL_PLATFORM_TARGET),)
KERNEL_PATH := $(abspath $(BUILD_TOP)/../kernel-$(TARGET_KERNEL_VERSION))
$(TARGET_PREBUILT_INT_KERNEL): $(DEPMOD) $(KERNEL_MODULES_PARTITION_FILE_LIST) $(SYSTEM_KERNEL_MODULES_PARTITION_FILE_LIST)
@echo "Building $(BOARD_KERNEL_IMAGE_NAME)"
@mkdir -p $(KERNEL_OUT)
@rm -rf $(KERNEL_PATH)/out
$(hide) cd $(KERNEL_PATH) && ./tools/bazel --output_user_root=$(abspath $(KERNEL_OUT)/bazel-out) run --experimental_convenience_symlinks=ignore --cpu=$(KERNEL_ARCH) //$(KERNEL_SRC):$(TARGET_KERNEL_PLATFORM_TARGET)_dist -- --destdir=$(KERNEL_OUT)
$(if $(BOOT_KERNEL_MODULES),\
$(call build-image-kernel-modules-lineage,$(addprefix $(KERNEL_OUT)/,$(BOOT_KERNEL_MODULES)),$(KERNEL_VENDOR_RAMDISK_MODULES_OUT),,$(KERNEL_VENDOR_RAMDISK_DEPMOD_STAGING_DIR),$(KERNEL_VENDOR_RAMDISK_KERNEL_MODULES_LOAD),,,)\
)
$(if $(RECOVERY_KERNEL_MODULES),\
$(call build-image-kernel-modules-lineage,$(addprefix $(KERNEL_OUT)/,$(RECOVERY_KERNEL_MODULES)),$(KERNEL_RECOVERY_MODULES_OUT),,$(KERNEL_RECOVERY_DEPMOD_STAGING_DIR),$(BOARD_RECOVERY_KERNEL_MODULES_LOAD),,,)\
)
$(if $(filter $(TARGET_KERNEL_MIXED_MODE),true),\
system_dlkm_modules=$$(awk -F'/' '{ print "$(KERNEL_OUT)/"$$NF }' $(KERNEL_OUT)/system_dlkm.modules.load); \
($(call build-image-kernel-modules-lineage,$$system_dlkm_modules,$(SYSTEM_KERNEL_MODULES_OUT),$(SYSTEM_KERNEL_MODULE_MOUNTPOINT)/,$(SYSTEM_KERNEL_DEPMOD_STAGING_DIR),,,$(SYSTEM_KERNEL_MODULES_PARTITION_FILE_LIST),))\
)
vendor_modules=$$(comm -23 <(find $(KERNEL_OUT) -maxdepth 1 -type f -name '*.ko' | awk -F'/' '{ print $$NF }' | sort) <(awk -F'/' '{ print $$NF }' $(KERNEL_OUT)/system_dlkm.modules.load | sort) | sed 's|^|$(KERNEL_OUT)/|'); \
($(call build-image-kernel-modules-lineage,$$vendor_modules,$(KERNEL_MODULES_OUT),$(KERNEL_MODULE_MOUNTPOINT)/,$(KERNEL_DEPMOD_STAGING_DIR),$(BOARD_VENDOR_KERNEL_MODULES_LOAD),,$(KERNEL_MODULES_PARTITION_FILE_LIST),$(SYSTEM_KERNEL_DEPMOD_STAGING_DIR)/lib/modules/0.0/$(SYSTEM_KERNEL_MODULE_MOUNTPOINT)))
endif
ifeq ($(NEEDS_KERNEL_COPY),true)
$(INSTALLED_KERNEL_TARGET): $(KERNEL_BIN)
$(transform-prebuilt-to-target)

View File

@@ -271,3 +271,7 @@ KERNEL_BUILD_OUT_PREFIX :=
ifeq ($(OUT_DIR_PREFIX),out)
KERNEL_BUILD_OUT_PREFIX := $(BUILD_TOP)/
endif
ifneq ($(TARGET_KERNEL_PLATFORM_TARGET),)
KERNEL_PATH := $(abspath $(BUILD_TOP)/../kernel-$(TARGET_KERNEL_VERSION))
endif

View File

@@ -7,9 +7,11 @@ EXPORT_TO_SOONG := \
KERNEL_CROSS_COMPILE \
KERNEL_MAKE_CMD \
KERNEL_MAKE_FLAGS \
KERNEL_PATH \
PATH_OVERRIDE_SOONG \
TARGET_KERNEL_CONFIG \
TARGET_KERNEL_SOURCE \
TARGET_KERNEL_PLATFORM_TARGET \
TARGET_PREBUILT_KERNEL_HEADERS
# Setup SOONG_CONFIG_* vars to export the vars listed above.