| 1 | #Android makefile to build kernel as a part of Android Build |
| 2 | |
| 3 | ifeq ($(KERNEL_DEFCONFIG),) |
| 4 | $(error KERNEL_DEFCONFIG must be set as environment variable) |
| 5 | endif |
| 6 | |
| 7 | ifeq ($(INSTALLED_KERNEL_TARGET),) |
| 8 | KERNEL_OBJECTS := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ |
| 9 | INSTALLED_KERNEL_TARGET := $(PRODUCT_OUT)/kernel |
| 10 | INSTALLED_DTBOIMAGE_TARGET := $(PRODUCT_OUT)/dtbo.img |
| 11 | BOARD_PREBUILT_DTBOIMAGE := $(PRODUCT_OUT)/prebuilt_dtbo.img |
| 12 | INSTALLED_DTB_TARGET := $(PRODUCT_OUT)/dtb.img |
| 13 | BOARD_MKBOOTIMG_ARGS += \ |
| 14 | --second $(INSTALLED_DTB_TARGET) \ |
| 15 | --second_offset 0 |
| 16 | endif |
| 17 | |
| 18 | TARGET_KERNEL_ARCH := $(strip $(TARGET_KERNEL_ARCH)) |
| 19 | ifeq ($(TARGET_KERNEL_ARCH),) |
| 20 | KERNEL_ARCH := arm64 |
| 21 | else |
| 22 | KERNEL_ARCH := $(TARGET_KERNEL_ARCH) |
| 23 | endif |
| 24 | |
| 25 | TARGET_KERNEL_MAKE_ENV := $(strip $(TARGET_KERNEL_MAKE_ENV)) |
| 26 | ifeq ($(TARGET_KERNEL_MAKE_ENV),) |
| 27 | KERNEL_MAKE_ENV := |
| 28 | else |
| 29 | KERNEL_MAKE_ENV := $(TARGET_KERNEL_MAKE_ENV) |
| 30 | endif |
| 31 | |
| 32 | ifeq ($(CROSS_COMPILE),) |
| 33 | KERNEL_CROSS_COMPILE := aarch64-linux-android- |
| 34 | else |
| 35 | KERNEL_CROSS_COMPILE := $(CROSS_COMPILE) |
| 36 | endif |
| 37 | |
| 38 | SOONG_GLOBAL_CONFIG := build/soong/cc/config/global.go |
| 39 | CLANG_VERSION := clang-4691093 |
| 40 | CLANG_PATH := prebuilts/clang/host/linux-x86 |
| 41 | CC :=$(PWD)/$(CLANG_PATH)/$(CLANG_VERSION)/bin/clang |
| 42 | |
| 43 | KERNEL_LTO_ON = True |
| 44 | ifneq ($(KERNEL_LTO_ON),) |
| 45 | LLVM_AR :=$(PWD)/$(CLANG_PATH)/$(CLANG_VERSION)/bin/llvm-ar |
| 46 | LLVM_DIS :=$(PWD)/$(CLANG_PATH)/$(CLANG_VERSION)/bin/llvm-dis |
| 47 | LTO_LLVM_LIB_BASE = $(PWD)/$(CLANG_PATH)/$(CLANG_VERSION)/lib64/ |
| 48 | LLVM_OPTIONS := LLVM_AR=$(LLVM_AR) LLVM_DIS=$(LLVM_DIS) LTO_LLVM_LIB_BASE=$(LTO_LLVM_LIB_BASE) |
| 49 | else |
| 50 | LLVM_OPTIONS := |
| 51 | endif |
| 52 | |
| 53 | ifeq ($(CLANG_TRIPLE),) |
| 54 | CLANG_TRIPLE := aarch64-linux-gnu- |
| 55 | else |
| 56 | CLANG_TRIPLE := $(CLANG_TRIPLE) |
| 57 | endif |
| 58 | |
| 59 | BUILD_ROOT_LOC := ../../ |
| 60 | KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/kernel/$(TARGET_SOC) |
| 61 | KERNEL_OUT := $(KERNEL_OBJECTS) |
| 62 | ifeq ($(TARGET_PREBUILT_KERNEL),) |
| 63 | |
| 64 | KERNEL_CONFIG := $(KERNEL_OBJECTS)/.config |
| 65 | KERNEL_BOOT := $(KERNEL_OBJECTS)/arch/$(KERNEL_ARCH)/boot |
| 66 | KERNEL_BIN := $(KERNEL_BOOT)/Image |
| 67 | KERNEL_DTB_DIR := $(KERNEL_BOOT)/dts/exynos |
| 68 | KERNEL_DTB := $(KERNEL_DTB_DIR)/exynos9610.dtb |
| 69 | MKDTIMG := $(HOST_OUT_EXECUTABLES)/mkdtimg |
| 70 | |
| 71 | TARGET_KERNEL_SOURCE := kernel/$(TARGET_SOC) |
| 72 | KERNEL_DTB_SOURCE_DIR := $(TARGET_KERNEL_SOURCE)/arch/$(KERNEL_ARCH)/boot/dts/exynos |
| 73 | KERNEL_DTBO_CFG := $(KERNEL_DTB_SOURCE_DIR)/exynos9610_dtboimg.cfg |
| 74 | KERNEL_MERGE_CONFIG := $(TARGET_KERNEL_SOURCE)/scripts/kconfig/merge_config.sh |
| 75 | KERNEL_CONFIG_BASE := $(TARGET_KERNEL_SOURCE)/arch/$(KERNEL_ARCH)/configs |
| 76 | KERNEL_DEFCONFIG_PATH := $(KERNEL_CONFIG_BASE)/$(KERNEL_DEFCONFIG) |
| 77 | |
| 78 | ifeq ($(TARGET_PRODUCT),kane_factory) |
| 79 | ERD9609_DEFCONFIG := erd9610_defconfig |
| 80 | ERD9609_DEFCONFIG_PATH := $(KERNEL_CONFIG_BASE)/$(ERD9609_DEFCONFIG) |
| 81 | ROBUSTA2_FACTORY_DEFCONFIG := robusta2_factory_defconfig |
| 82 | ROBUSTA2_FACTORY_DEFCONFIG_PATH := $(KERNEL_CONFIG_BASE)/$(ROBUSTA2_FACTORY_DEFCONFIG) |
| 83 | ERD9609_ROBUSTA2_FACTORY_DEFCONFIG := erd9610_robusta2_factory_defconfig |
| 84 | ERD9609_ROBUSTA2_FACTORY_DEFCONFIG_PATH := $(KERNEL_CONFIG_BASE)/$(ERD9609_ROBUSTA2_FACTORY_DEFCONFIG) |
| 85 | endif |
| 86 | |
| 87 | ifeq ($(KERNEL_DEFCONFIG),) |
| 88 | $(error Kernel configuration not defined, cannot build kernel) |
| 89 | else |
| 90 | |
| 91 | ifeq ($(TARGET_BUILD_VARIANT),eng) |
| 92 | MAKE_CONFIG_CMD := $(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(PWD)/$(KERNEL_OBJECTS) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) $(KERNEL_DEFCONFIG) |
| 93 | else |
| 94 | ifeq ($(TARGET_BUILD_VARIANT),userdebug) |
| 95 | KERNEL_USER_CFG := $(KERNEL_CONFIG_BASE)/$(TARGET_SOC)_userdebug.cfg |
| 96 | else |
| 97 | KERNEL_USER_CFG := $(KERNEL_CONFIG_BASE)/$(TARGET_SOC)_user.cfg |
| 98 | endif |
| 99 | MAKE_CONFIG_CMD := ARCH=$(KERNEL_ARCH) $(KERNEL_MERGE_CONFIG) -m -O $(TARGET_KERNEL_SOURCE) $(KERNEL_DEFCONFIG_PATH) $(KERNEL_USER_CFG); |
| 100 | MAKE_CONFIG_CMD += $(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(PWD)/$(KERNEL_OBJECTS) ARCH=$(KERNEL_ARCH) KCONFIG_ALLCONFIG=.config alldefconfig; |
| 101 | MAKE_CONFIG_CMD += $(MAKE) -C $(TARGET_KERNEL_SOURCE) distclean |
| 102 | endif |
| 103 | |
| 104 | ifeq ($(N_KERNEL_BUILD_THREAD),) |
| 105 | N_KERNEL_BUILD_THREAD := 8 |
| 106 | endif |
| 107 | |
| 108 | include $(TARGET_KERNEL_SOURCE)/defconfig.mk |
| 109 | |
| 110 | |
| 111 | TARGET_PREBUILT_KERNEL := $(KERNEL_BIN) |
| 112 | |
| 113 | # Make the kernel config |
| 114 | # $1 output dir |
| 115 | # $2 kernel config filepath |
| 116 | # $3 defconfig |
| 117 | # $4 kernel source |
| 118 | # $5 kernel make env |
| 119 | # $6 kernel architecture |
| 120 | # $7 cross compile sub-command |
| 121 | # $8 make command |
| 122 | define do-kernel-config |
| 123 | ( cp $(3) $(2) && $(8) -C $(4) O=$(1) $(5) ARCH=$(6) CROSS_COMPILE=$(7) defoldconfig ) || ( rm -f $(2) && false ) |
| 124 | endef |
| 125 | |
| 126 | |
| 127 | $(KERNEL_OUT): |
| 128 | mkdir -p $(KERNEL_OUT) |
| 129 | |
| 130 | .PHONY: kernel |
| 131 | kernel: $(KERNEL_BIN) |
| 132 | |
| 133 | .PHONY: kernel-distclean |
| 134 | kernel-distclean: |
| 135 | $(MAKE) -C $(TARGET_KERNEL_SOURCE) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) distclean |
| 136 | |
| 137 | $(KERNEL_CONFIG): $(TARGET_DEFCONFIG) |
| 138 | $(hide) echo "make $(KERNEL_CONFIG)" |
| 139 | $(call do-kernel-config,$(BUILD_ROOT_LOC)$(KERNEL_OUT),$@,$(TARGET_DEFCONFIG),$(TARGET_KERNEL_SOURCE),$(KERNEL_MAKE_ENV),$(KERNEL_ARCH),$(KERNEL_CROSS_COMPILE),$(MAKE)) |
| 140 | |
| 141 | $(KERNEL_BIN): $(KERNEL_OUT) $(KERNEL_CONFIG) |
| 142 | $(hide) echo "Building kernel..." |
| 143 | $(MAKE) -C $(TARGET_KERNEL_SOURCE) O=$(PWD)/$(KERNEL_OBJECTS) ARCH=$(KERNEL_ARCH) CROSS_COMPILE=$(KERNEL_CROSS_COMPILE) CLANG_TRIPLE=$(CLANG_TRIPLE) CC=$(CC) $(LLVM_OPTIONS) -j$(N_KERNEL_BUILD_THREAD) |
| 144 | |
| 145 | $(INSTALLED_KERNEL_TARGET): $(INSTALLED_DTBOIMAGE_TARGET) |
| 146 | cp $(KERNEL_BIN) $(INSTALLED_KERNEL_TARGET) |
| 147 | cp $(KERNEL_DTB) $(INSTALLED_DTB_TARGET) |
| 148 | |
| 149 | $(BOARD_PREBUILT_DTBOIMAGE): $(MKDTIMG) $(KERNEL_DTBO_CFG) $(KERNEL_BIN) |
| 150 | $(hide) echo "Building DTBOIMAGE..." |
| 151 | $(MKDTIMG) cfg_create $@ $(KERNEL_DTBO_CFG) -d $(KERNEL_OBJECTS) |
| 152 | |
| 153 | endif #TARGET_PREBUILT_KERNEL |
| 154 | endif #KERNEL_DEFCONFIG |