blob: 140d4a06ac8687668347b01b4fe545e944db198a [file] [log] [blame]
Rashed Abdel-Tawab2735c4a2019-09-05 21:21:13 -07001# Copyright (C) 2018 The LineageOS Project
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14#
15#
16# Kernel build configuration variables
17# ====================================
18#
19# These config vars are usually set in BoardConfig.mk:
20#
21# TARGET_KERNEL_SOURCE = Kernel source dir, optional, defaults
22# to kernel/$(TARGET_DEVICE_DIR)
Rashed Abdel-Tawab2735c4a2019-09-05 21:21:13 -070023# TARGET_KERNEL_ARCH = Kernel Arch
24# TARGET_KERNEL_CROSS_COMPILE_PREFIX = Compiler prefix (e.g. arm-eabi-)
25# defaults to arm-linux-androidkernel- for arm
26# aarch64-linux-androidkernel- for arm64
27# x86_64-linux-androidkernel- for x86
28#
29# TARGET_KERNEL_CLANG_COMPILE = Compile kernel with clang, defaults to false
Michael Bestas07736f62022-11-01 14:41:42 +020030# TARGET_KERNEL_CLANG_VERSION = Clang prebuilts version, optional, defaults to clang-stable
31# TARGET_KERNEL_CLANG_PATH = Clang prebuilts path, optional
Rashed Abdel-Tawab2735c4a2019-09-05 21:21:13 -070032#
33# KERNEL_TOOLCHAIN_PREFIX = Overrides TARGET_KERNEL_CROSS_COMPILE_PREFIX,
34# Set this var in shell to override
35# toolchain specified in BoardConfig.mk
36# KERNEL_TOOLCHAIN = Path to toolchain, if unset, assumes
37# TARGET_KERNEL_CROSS_COMPILE_PREFIX
38# is in PATH
39# USE_CCACHE = Enable ccache (global Android flag)
40
41BUILD_TOP := $(shell pwd)
42
43TARGET_AUTO_KDIR := $(shell echo $(TARGET_DEVICE_DIR) | sed -e 's/^device/kernel/g')
44TARGET_KERNEL_SOURCE ?= $(TARGET_AUTO_KDIR)
45ifneq ($(TARGET_PREBUILT_KERNEL),)
46TARGET_KERNEL_SOURCE :=
47endif
48
49TARGET_KERNEL_ARCH := $(strip $(TARGET_KERNEL_ARCH))
50ifeq ($(TARGET_KERNEL_ARCH),)
51KERNEL_ARCH := $(TARGET_ARCH)
52else
53KERNEL_ARCH := $(TARGET_KERNEL_ARCH)
54endif
55
Michael Bestas07736f62022-11-01 14:41:42 +020056ifneq ($(TARGET_KERNEL_CLANG_VERSION),)
57 KERNEL_CLANG_VERSION := clang-$(TARGET_KERNEL_CLANG_VERSION)
58else
59 # Use the default version of clang if TARGET_KERNEL_CLANG_VERSION hasn't been set by the device config
micky387de088872024-10-12 10:40:41 -040060 KERNEL_CLANG_VERSION := $(LLVM_AOSP_PREBUILTS_VERSION)
Michael Bestas07736f62022-11-01 14:41:42 +020061endif
62TARGET_KERNEL_CLANG_PATH ?= $(BUILD_TOP)/prebuilts/clang/host/$(HOST_PREBUILT_TAG)/$(KERNEL_CLANG_VERSION)
micky3870d7eac42021-08-14 08:51:32 +020063
Bruno Martins10749972020-09-24 11:51:33 +010064GCC_PREBUILTS := $(BUILD_TOP)/prebuilts/gcc/$(HOST_PREBUILT_TAG)
Rashed Abdel-Tawabb208fe22019-09-06 14:26:34 -070065# arm64 toolchain
66KERNEL_TOOLCHAIN_arm64 := $(GCC_PREBUILTS)/aarch64/aarch64-linux-android-4.9/bin
67KERNEL_TOOLCHAIN_PREFIX_arm64 := aarch64-linux-android-
68# arm toolchain
69KERNEL_TOOLCHAIN_arm := $(GCC_PREBUILTS)/arm/arm-linux-androideabi-4.9/bin
70KERNEL_TOOLCHAIN_PREFIX_arm := arm-linux-androidkernel-
71# x86 toolchain
72KERNEL_TOOLCHAIN_x86 := $(GCC_PREBUILTS)/x86/x86_64-linux-android-4.9/bin
73KERNEL_TOOLCHAIN_PREFIX_x86 := x86_64-linux-android-
74
Rashed Abdel-Tawab2735c4a2019-09-05 21:21:13 -070075TARGET_KERNEL_CROSS_COMPILE_PREFIX := $(strip $(TARGET_KERNEL_CROSS_COMPILE_PREFIX))
76ifneq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),)
77KERNEL_TOOLCHAIN_PREFIX ?= $(TARGET_KERNEL_CROSS_COMPILE_PREFIX)
Rashed Abdel-Tawab2735c4a2019-09-05 21:21:13 -070078else
Rashed Abdel-Tawabb208fe22019-09-06 14:26:34 -070079KERNEL_TOOLCHAIN ?= $(KERNEL_TOOLCHAIN_$(KERNEL_ARCH))
80KERNEL_TOOLCHAIN_PREFIX ?= $(KERNEL_TOOLCHAIN_PREFIX_$(KERNEL_ARCH))
Rashed Abdel-Tawab2735c4a2019-09-05 21:21:13 -070081endif
82
83ifeq ($(KERNEL_TOOLCHAIN),)
84KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN_PREFIX)
Rashed Abdel-Tawabb208fe22019-09-06 14:26:34 -070085else
Rashed Abdel-Tawab2735c4a2019-09-05 21:21:13 -070086KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN)/$(KERNEL_TOOLCHAIN_PREFIX)
87endif
88
Marko Man0de88b12019-10-08 13:28:11 +020089# We need to add GCC toolchain to the path no matter what
90# for tools like `as`
Alessandro Astone2094bd32021-12-11 01:49:53 +010091KERNEL_TOOLCHAIN_PATH_gcc := $(KERNEL_TOOLCHAIN_$(KERNEL_ARCH))
Marko Man0de88b12019-10-08 13:28:11 +020092
Rashed Abdel-Tawab2735c4a2019-09-05 21:21:13 -070093ifneq ($(USE_CCACHE),)
Rashed Abdel-Tawab59c3b1b2019-09-05 21:26:19 -070094 ifneq ($(CCACHE_EXEC),)
95 # Android 10+ deprecates use of a build ccache. Only system installed ones are now allowed
96 CCACHE_BIN := $(CCACHE_EXEC)
Rashed Abdel-Tawab2735c4a2019-09-05 21:21:13 -070097 endif
98endif
99
100ifeq ($(TARGET_KERNEL_CLANG_COMPILE),true)
101 KERNEL_CROSS_COMPILE := CROSS_COMPILE="$(KERNEL_TOOLCHAIN_PATH)"
102else
103 KERNEL_CROSS_COMPILE := CROSS_COMPILE="$(CCACHE_BIN) $(KERNEL_TOOLCHAIN_PATH)"
104endif
105
106# Needed for CONFIG_COMPAT_VDSO, safe to set for all arm64 builds
107ifeq ($(KERNEL_ARCH),arm64)
Rashed Abdel-Tawabb208fe22019-09-06 14:26:34 -0700108 KERNEL_CROSS_COMPILE += CROSS_COMPILE_ARM32="$(KERNEL_TOOLCHAIN_arm)/$(KERNEL_TOOLCHAIN_PREFIX_arm)"
Rashed Abdel-Tawab2735c4a2019-09-05 21:21:13 -0700109endif
110
111# Clear this first to prevent accidental poisoning from env
112KERNEL_MAKE_FLAGS :=
113
114# Add back threads, ninja cuts this to $(nproc)/2
Luca Stefani1ddcd1f2019-09-08 13:50:21 -0700115KERNEL_MAKE_FLAGS += -j$(shell nproc --all)
Rashed Abdel-Tawab2735c4a2019-09-05 21:21:13 -0700116
117ifeq ($(KERNEL_ARCH),arm)
118 # Avoid "Unknown symbol _GLOBAL_OFFSET_TABLE_" errors
119 KERNEL_MAKE_FLAGS += CFLAGS_MODULE="-fno-pic"
120endif
121
122ifeq ($(KERNEL_ARCH),arm64)
123 # Avoid "unsupported RELA relocation: 311" errors (R_AARCH64_ADR_GOT_PAGE)
124 KERNEL_MAKE_FLAGS += CFLAGS_MODULE="-fno-pic"
125endif
126
127ifeq ($(HOST_OS),darwin)
LuK133726cad852020-09-22 23:11:21 +0200128 KERNEL_MAKE_FLAGS += HOSTCFLAGS="-I$(BUILD_TOP)/external/elfutils/libelf -I/usr/local/opt/openssl/include -fuse-ld=lld" HOSTLDFLAGS="-L/usr/local/opt/openssl/lib -fuse-ld=lld"
Rashed Abdel-Tawabc19c6f42019-09-17 11:28:34 -0700129else
maxwene8129552021-11-02 16:01:33 +0100130 KERNEL_MAKE_FLAGS += HOSTLDFLAGS="-L/usr/lib/x86_64-linux-gnu -L/usr/lib64 -fuse-ld=lld"
Rashed Abdel-Tawab2735c4a2019-09-05 21:21:13 -0700131endif
132
Rashed Abdel-Tawab2735c4a2019-09-05 21:21:13 -0700133# Set DTBO image locations so the build system knows to build them
Luca Stefaniacf449e2020-08-02 19:08:31 +0200134ifeq (true,$(filter true, $(TARGET_NEEDS_DTBOIMAGE) $(BOARD_KERNEL_SEPARATED_DTBO)))
135BOARD_PREBUILT_DTBOIMAGE ?= $(TARGET_OUT_INTERMEDIATES)/DTBO_OBJ/arch/$(KERNEL_ARCH)/boot/dtbo.img
Rashed Abdel-Tawab2735c4a2019-09-05 21:21:13 -0700136endif
137
138# Set use the full path to the make command
Bruno Martins10749972020-09-24 11:51:33 +0100139KERNEL_MAKE_CMD := $(BUILD_TOP)/prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/make
Rashed Abdel-Tawabe3f7fc92019-09-05 21:24:07 -0700140
LuK133726cad852020-09-22 23:11:21 +0200141# Set the full path to the clang command
Michael Bestas07736f62022-11-01 14:41:42 +0200142KERNEL_MAKE_FLAGS += HOSTCC=$(TARGET_KERNEL_CLANG_PATH)/bin/clang
143KERNEL_MAKE_FLAGS += HOSTCXX=$(TARGET_KERNEL_CLANG_PATH)/bin/clang++
Marko Manef692442019-10-08 13:27:09 +0200144
dianlujitao74e9bb22020-03-11 19:05:29 +0800145# Since Linux 4.16, flex and bison are required
Bruno Martins10749972020-09-24 11:51:33 +0100146KERNEL_MAKE_FLAGS += LEX=$(BUILD_TOP)/prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/flex
147KERNEL_MAKE_FLAGS += YACC=$(BUILD_TOP)/prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/bison
148KERNEL_MAKE_FLAGS += M4=$(BUILD_TOP)/prebuilts/build-tools/$(HOST_PREBUILT_TAG)/bin/m4
dianlujitao74e9bb22020-03-11 19:05:29 +0800149TOOLS_PATH_OVERRIDE += BISON_PKGDATADIR=$(BUILD_TOP)/prebuilts/build-tools/common/bison
150
Marko Manef692442019-10-08 13:27:09 +0200151# Set the out dir for the kernel's O= arg
152# This needs to be an absolute path, so only set this if the standard out dir isn't used
153OUT_DIR_PREFIX := $(shell echo $(OUT_DIR) | sed -e 's|/target/.*$$||g')
154KERNEL_BUILD_OUT_PREFIX :=
155ifeq ($(OUT_DIR_PREFIX),out)
156KERNEL_BUILD_OUT_PREFIX := $(BUILD_TOP)/
157endif