1# 2# Copyright (c) 2019, Google, Inc. All rights reserved 3# 4# Licensed under the Apache License, Version 2.0 (the "License"); 5# you may not use this file except in compliance with the License. 6# You may obtain a copy of the License at 7# 8# http://www.apache.org/licenses/LICENSE-2.0 9# 10# Unless required by applicable law or agreed to in writing, software 11# distributed under the License is distributed on an "AS IS" BASIS, 12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13# See the License for the specific language governing permissions and 14# limitations under the License. 15# 16 17# Inputs: 18# LINUX_ARCH contains the architecture to build for (Global) 19# Outputs: 20# LINUX_BUILD_DIR contains the path to the built linux kernel sources 21# LINUX_IMAGE path of the final linux image target 22 23# This Makefile will build the Linux kernel with our configuration. 24 25LINUX_VERSION := 6.6 26 27LINUX_BUILD_DIR := $(abspath $(BUILDDIR)/linux-build) 28ifndef LINUX_ARCH 29 $(error LINUX_ARCH must be specified) 30endif 31 32LINUX_PREBUILTS_IMAGE := kernel/prebuilts/${LINUX_VERSION}/${LINUX_ARCH}/kernel-${LINUX_VERSION} 33 34LINUX_IMAGE := $(LINUX_BUILD_DIR)/arch/$(LINUX_ARCH)/boot/Image 35LINUX_RAMDISK_IMAGE := 36 37ifeq (,$(wildcard $(LINUX_PREBUILTS_IMAGE))) 38ifeq ($(LINUX_ARCH),arm) 39LINUX_CLANG_TRIPLE := $(LINUX_ARCH)-linux-gnueabi- 40else 41LINUX_CLANG_TRIPLE := $(LINUX_ARCH)-linux-gnu- 42endif 43 44LINUX_SRC := $(call FIND_EXTERNAL,linux) 45LINUX_CONFIG_DIR = $(LINUX_SRC)/arch/$(LINUX_ARCH)/configs 46LINUX_TMP_DEFCONFIG := $(LINUX_CONFIG_DIR)/tmp_defconfig 47 48# Check if the Linux sources have the Trusty drivers in-tree 49LINUX_TRUSTY_INTREE := $(wildcard $(LINUX_SRC)/drivers/trusty) 50 51# Preserve compatibility with architectures without GKI 52ifeq (,$(wildcard $(LINUX_CONFIG_DIR)/gki_defconfig)) 53LINUX_DEFCONFIG_FRAGMENTS := \ 54 $(LINUX_CONFIG_DIR)/trusty_qemu_defconfig \ 55 56else 57LINUX_DEFCONFIG_FRAGMENTS := \ 58 $(LINUX_CONFIG_DIR)/gki_defconfig \ 59 $(if $(LINUX_TRUSTY_INTREE),$(LINUX_CONFIG_DIR)/trusty_qemu_defconfig.fragment) \ 60 61endif 62 63ifeq (,$(LINUX_TRUSTY_INTREE)) 64LINUX_DEFCONFIG_FRAGMENTS += \ 65 linux/common-modules/trusty/system_heap.fragment \ 66 linux/common-modules/trusty/trusty_defconfig.fragment \ 67 linux/common-modules/virtual-device/aarch64.fragment \ 68 linux/common-modules/virtual-device/virtual_device_core.fragment \ 69 70endif 71 72$(LINUX_TMP_DEFCONFIG): LINUX_SRC := $(LINUX_SRC) 73$(LINUX_TMP_DEFCONFIG): $(LINUX_DEFCONFIG_FRAGMENTS) 74 KCONFIG_CONFIG="$@" $(LINUX_SRC)/scripts/kconfig/merge_config.sh -m -r $^ 75 76# tmp_defconfig lives in the source tree, 77# so we should delete it after we're done 78.INTERMEDIATE: $(LINUX_TMP_DEFCONFIG) 79 80ifeq (,$(LINUX_TRUSTY_INTREE)) 81# Make a copy of common-modules/trusty because the kernel build system 82# creates files directly in the directory passed to M= 83LINUX_TRUSTY_MODULES_SRC_DIR := linux/common-modules/trusty 84LINUX_TRUSTY_MODULES_COPY_DIR := $(abspath $(BUILDDIR)/linux-trusty-modules) 85LINUX_TRUSTY_MODULES_SRC_FILES := $(shell find $(LINUX_TRUSTY_MODULES_SRC_DIR) -type f) 86LINUX_TRUSTY_MODULES_COPY_FILES := $(patsubst $(LINUX_TRUSTY_MODULES_SRC_DIR)/%,$(LINUX_TRUSTY_MODULES_COPY_DIR)/%,$(LINUX_TRUSTY_MODULES_SRC_FILES)) 87$(LINUX_TRUSTY_MODULES_COPY_FILES): $(LINUX_TRUSTY_MODULES_COPY_DIR)/%: $(LINUX_TRUSTY_MODULES_SRC_DIR)/% 88 @$(MKDIR) 89 @cp $< $@ 90 91# For now, symlink the Trusty module Kconfig into Kconfig.ext 92# The kernel will import the latter into its build. 93LINUX_KCONFIG_EXT_PREFIX := $(LINUX_TRUSTY_MODULES_COPY_DIR)/ 94LINUX_TRUSTY_MODULES_KCONFIG_EXT := $(LINUX_TRUSTY_MODULES_COPY_DIR)/Kconfig.ext 95$(LINUX_TRUSTY_MODULES_KCONFIG_EXT): $(LINUX_TRUSTY_MODULES_COPY_DIR)/drivers/trusty/Kconfig 96 @ln -srf $< $@ 97 98LINUX_MODULES_STAGING_DIR := $(abspath $(BUILDDIR)/linux-modules-staging) 99LINUX_RAMDISK_IMAGE := $(abspath $(BUILDDIR)/ramdisk.img) 100endif # LINUX_TRUSTY_INTREE 101 102$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_TMP_DEFCONFIG := $(LINUX_TMP_DEFCONFIG) 103$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): PATH_TOOLS_BINDIR := $(PATH_TOOLS_BINDIR) 104$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS := -C $(LINUX_SRC) 105$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += O=$(LINUX_BUILD_DIR) 106$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += ARCH=$(LINUX_ARCH) 107 108# Preserve compatibility with older linux kernel 109ifeq (,$(wildcard $(LINUX_SRC)/Documentation/kbuild/llvm.rst)) 110$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): CLANG_BINDIR := $(CLANG_BINDIR) 111$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += CROSS_COMPILE=$(ARCH_$(LINUX_ARCH)_TOOLCHAIN_PREFIX) 112$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += CC=$(CLANG_BINDIR)/clang 113$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += LD=$(CLANG_BINDIR)/ld.lld 114$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += CLANG_TRIPLE=$(LINUX_CLANG_TRIPLE) 115else 116# Newer linux kernel versions need a newer toolchain (optionally specified in 117# LINUX_CLANG_BINDIR) than the older linux kernel needs or supports. 118LINUX_CLANG_BINDIR ?= $(CLANG_BINDIR) 119$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): CLANG_BINDIR := $(LINUX_CLANG_BINDIR) 120$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += CROSS_COMPILE=$(LINUX_CLANG_TRIPLE) 121$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += LLVM=1 122$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += LLVM_IAS=1 123endif 124 125$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += LEX=$(BUILDTOOLS_BINDIR)/flex 126$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += YACC=$(BUILDTOOLS_BINDIR)/bison 127$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += BISON_PKGDATADIR=$(BUILDTOOLS_COMMON)/bison 128$(LINUX_IMAGE): $(LINUX_TMP_DEFCONFIG) 129 PATH=$(CLANG_BINDIR):$(PATH_TOOLS_BINDIR):$(PATH) $(MAKE) $(LINUX_MAKE_ARGS) $(notdir $(LINUX_TMP_DEFCONFIG)) 130 PATH=$(CLANG_BINDIR):$(PATH_TOOLS_BINDIR):$(PATH) $(MAKE) $(LINUX_MAKE_ARGS) 131 132ifneq (,$(LINUX_RAMDISK_IMAGE)) 133$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += INSTALL_MOD_PATH=$(LINUX_MODULES_STAGING_DIR) 134$(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE): LINUX_MAKE_ARGS += KCONFIG_EXT_PREFIX=$(LINUX_KCONFIG_EXT_PREFIX) 135 136$(LINUX_RAMDISK_IMAGE): LINUX_MODULES_STAGING_DIR := $(LINUX_MODULES_STAGING_DIR) 137$(LINUX_RAMDISK_IMAGE): LINUX_TRUSTY_MODULES_MAKEFILE_DIR := $(LINUX_TRUSTY_MODULES_COPY_DIR)/drivers/trusty 138$(LINUX_RAMDISK_IMAGE): BUILDTOOLS_BINDIR := $(BUILDTOOLS_BINDIR) 139$(LINUX_RAMDISK_IMAGE): KERNEL_BUILDTOOLS_BINDIR := linux/prebuilts/build-tools/linux-x86/bin 140$(LINUX_RAMDISK_IMAGE): REPLACE_RAMDISK_MODULES := $(PY3) trusty/host/common/scripts/replace_ramdisk_modules/replace_ramdisk_modules.py 141$(LINUX_RAMDISK_IMAGE): ANDROID_RAMDISK := trusty/prebuilts/aosp/android/out/target/product/trusty/ramdisk.img 142$(LINUX_RAMDISK_IMAGE): $(LINUX_IMAGE) $(LINUX_TRUSTY_MODULES_COPY_FILES) $(LINUX_TRUSTY_MODULES_KCONFIG_EXT) 143 @echo building Linux ramdisk 144 @rm -rf $(LINUX_MODULES_STAGING_DIR) 145 PATH=$(CLANG_BINDIR):$(PATH_TOOLS_BINDIR):$(PATH) $(MAKE) $(LINUX_MAKE_ARGS) modules_install 146 PATH=$(CLANG_BINDIR):$(PATH_TOOLS_BINDIR):$(PATH) $(MAKE) $(LINUX_MAKE_ARGS) M=$(LINUX_TRUSTY_MODULES_MAKEFILE_DIR) modules 147 PATH=$(CLANG_BINDIR):$(PATH_TOOLS_BINDIR):$(PATH) $(MAKE) $(LINUX_MAKE_ARGS) M=$(LINUX_TRUSTY_MODULES_MAKEFILE_DIR) modules_install 148 PATH=$(BUILDTOOLS_BINDIR):$(KERNEL_BUILDTOOLS_BINDIR):$(PATH) $(REPLACE_RAMDISK_MODULES) --android-ramdisk $(ANDROID_RAMDISK) --kernel-ramdisk $(LINUX_MODULES_STAGING_DIR) --output-ramdisk $@ 149 150endif # LINUX_RAMDISK_IMAGE 151else 152$(LINUX_BUILD_DIR): $(LINUX_PREBUILTS_IMAGE) 153 @echo copying Linux prebuilts 154 @rm -rf $@ 155 @$(MKDIR) 156 157$(LINUX_IMAGE): $(LINUX_BUILD_DIR) 158 @mkdir -p $(@D) 159 @cp -r ${LINUX_PREBUILTS_IMAGE} $@ 160 161endif 162 163# Add LINUX_IMAGE to the list of project dependencies 164EXTRA_BUILDDEPS += $(LINUX_IMAGE) $(LINUX_RAMDISK_IMAGE) 165 166LINUX_DEFCONFIG_FRAGMENTS := 167LINUX_TMP_DEFCONFIG := 168LINUX_CONFIG_DIR := 169LINUX_SRC := 170LINUX_CLANG_TRIPLE := 171LINUX_TRUSTY_INTREE := 172LINUX_TRUSTY_MODULES_SRC_DIR := 173LINUX_TRUSTY_MODULES_COPY_DIR := 174LINUX_TRUSTY_MODULES_SRC_FILES := 175LINUX_TRUSTY_MODULES_COPY_FILES := 176LINUX_KCONFIG_EXT_PREFIX := 177LINUX_TRUSTY_MODULES_KCONFIG_EXT := 178LINUX_MODULES_STAGING_DIR := 179