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