blob: 1404fb3c57efd8082ce9493383b498ed13d3d1fe [file] [log] [blame]
pulser5c9a4f32013-08-25 14:15:02 +02001# Copyright (C) 2012 The CyanogenMod 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# Android makefile to build kernel as a part of Android Build
16
17-include vendor/omni/config/branding.mk
18
19TARGET_AUTO_KDIR := $(shell echo $(TARGET_DEVICE_DIR) | sed -e 's/^device/kernel/g')
20
21## Externally influenced variables
22# kernel location - optional, defaults to kernel/<vendor>/<device>
23TARGET_KERNEL_SOURCE ?= $(TARGET_AUTO_KDIR)
24KERNEL_SRC := $(TARGET_KERNEL_SOURCE)
25# kernel configuration - mandatory
26KERNEL_DEFCONFIG := $(TARGET_KERNEL_CONFIG)
27VARIANT_DEFCONFIG := $(TARGET_KERNEL_VARIANT_CONFIG)
28SELINUX_DEFCONFIG := $(TARGET_KERNEL_SELINUX_CONFIG)
29
30## Internal variables
31KERNEL_OUT := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ
32KERNEL_CONFIG := $(KERNEL_OUT)/.config
33
34TARGET_KERNEL_ARCH := $(strip $(TARGET_KERNEL_ARCH))
35ifeq ($(TARGET_KERNEL_ARCH),)
36KERNEL_ARCH := $(TARGET_ARCH)
37else
38KERNEL_ARCH := $(TARGET_KERNEL_ARCH)
39endif
40
41TARGET_KERNEL_HEADER_ARCH := $(strip $(TARGET_KERNEL_HEADER_ARCH))
42ifeq ($(TARGET_KERNEL_HEADER_ARCH),)
43KERNEL_HEADER_ARCH := $(KERNEL_ARCH)
44else
45KERNEL_HEADER_ARCH := $(TARGET_KERNEL_HEADER_ARCH)
46endif
47
48KERNEL_HEADER_DEFCONFIG := $(strip $(KERNEL_HEADER_DEFCONFIG))
49ifeq ($(KERNEL_HEADER_DEFCONFIG),)
50KERNEL_HEADER_DEFCONFIG := $(KERNEL_DEFCONFIG)
51endif
52
53
54ifneq ($(BOARD_KERNEL_IMAGE_NAME),)
55 TARGET_PREBUILT_INT_KERNEL_TYPE := $(BOARD_KERNEL_IMAGE_NAME)
56else
57 ifeq ($(TARGET_USES_UNCOMPRESSED_KERNEL),true)
58 TARGET_PREBUILT_INT_KERNEL_TYPE := Image
59 else
60 TARGET_PREBUILT_INT_KERNEL_TYPE := zImage
61 endif
62endif
63
64TARGET_PREBUILT_INT_KERNEL := $(KERNEL_OUT)/arch/$(KERNEL_ARCH)/boot/$(TARGET_PREBUILT_INT_KERNEL_TYPE)
65
66# Clear this first to prevent accidental poisoning from env
67MAKE_FLAGS :=
68
69ifeq ($(KERNEL_ARCH),arm)
70 # Avoid "Unknown symbol _GLOBAL_OFFSET_TABLE_" errors
71 MAKE_FLAGS += CFLAGS_MODULE="-fno-pic"
72endif
73
74ifeq ($(KERNEL_ARCH),arm64)
75 # Avoid "unsupported RELA relocation: 311" errors (R_AARCH64_ADR_GOT_PAGE)
76 MAKE_FLAGS += CFLAGS_MODULE="-fno-pic"
77 ifeq ($(TARGET_ARCH),arm)
78 KERNEL_CONFIG_OVERRIDE := CONFIG_ANDROID_BINDER_IPC_32BIT=y
79 endif
80endif
81
82ifneq ($(TARGET_KERNEL_ADDITIONAL_CONFIG),)
83KERNEL_ADDITIONAL_CONFIG := $(TARGET_KERNEL_ADDITIONAL_CONFIG)
84endif
85
86## Do be discontinued in a future version. Notify builder about target
87## kernel format requirement
88ifeq ($(BOARD_KERNEL_IMAGE_NAME),)
89ifeq ($(BOARD_USES_UBOOT),true)
90 $(error "Please set BOARD_KERNEL_IMAGE_NAME to uImage")
91else ifeq ($(BOARD_USES_UNCOMPRESSED_BOOT),true)
92 $(error "Please set BOARD_KERNEL_IMAGE_NAME to Image")
93endif
94endif
95
96ifeq "$(wildcard $(KERNEL_SRC) )" ""
97 ifneq ($(TARGET_PREBUILT_KERNEL),)
98 HAS_PREBUILT_KERNEL := true
99 NEEDS_KERNEL_COPY := true
100 else
101 $(foreach cf,$(PRODUCT_COPY_FILES), \
102 $(eval _src := $(call word-colon,1,$(cf))) \
103 $(eval _dest := $(call word-colon,2,$(cf))) \
104 $(ifeq kernel,$(_dest), \
105 $(eval HAS_PREBUILT_KERNEL := true)))
106 endif
107
108 ifneq ($(HAS_PREBUILT_KERNEL),)
109 $(warning ***************************************************************)
110 $(warning * Using prebuilt kernel binary instead of source *)
111 $(warning * THIS IS DEPRECATED, AND WILL BE DISCONTINUED *)
112 $(warning * Please configure your device to download the kernel *)
113 $(warning * source repository to $(KERNEL_SRC))
114 $(warning * See $(URL_INTEGRATED_KERNEL_BUILD))
115 $(warning * for more information *)
116 $(warning ***************************************************************)
117 FULL_KERNEL_BUILD := false
118 KERNEL_BIN := $(TARGET_PREBUILT_KERNEL)
119 else
120 $(warning ***************************************************************)
121 $(warning * *)
122 $(warning * No kernel source found, and no fallback prebuilt defined. *)
123 $(warning * Please make sure your device is properly configured to *)
124 $(warning * download the kernel repository to $(KERNEL_SRC))
125 $(warning * and add the TARGET_KERNEL_CONFIG variable to BoardConfig.mk *)
126 $(warning * *)
127 $(warning * As an alternative, define the TARGET_PREBUILT_KERNEL *)
128 $(warning * variable with the path to the prebuilt binary kernel image *)
129 $(warning * in your BoardConfig.mk file *)
130 $(warning * *)
131 $(warning ***************************************************************)
132 $(error "NO KERNEL")
133 endif
134else
135 NEEDS_KERNEL_COPY := true
136 ifeq ($(TARGET_KERNEL_CONFIG),)
137 $(warning **********************************************************)
138 $(warning * Kernel source found, but no configuration was defined *)
139 $(warning * Please add the TARGET_KERNEL_CONFIG variable to your *)
140 $(warning * BoardConfig.mk file *)
141 $(warning **********************************************************)
142 # $(error "NO KERNEL CONFIG")
143 else
144 #$(info Kernel source found, building it)
145 FULL_KERNEL_BUILD := true
146 KERNEL_BIN := $(TARGET_PREBUILT_INT_KERNEL)
147 endif
148endif
149
150ifeq ($(FULL_KERNEL_BUILD),true)
151
152KERNEL_HEADERS_INSTALL := $(KERNEL_OUT)/usr
153KERNEL_MODULES_INSTALL := system
154KERNEL_MODULES_OUT := $(TARGET_OUT)/lib/modules
155
156TARGET_KERNEL_CROSS_COMPILE_PREFIX := $(strip $(TARGET_KERNEL_CROSS_COMPILE_PREFIX))
157ifeq ($(TARGET_KERNEL_CROSS_COMPILE_PREFIX),)
158ifeq ($(KERNEL_TOOLCHAIN_PREFIX),)
159 ifeq ($(KERNEL_ARCH),arm64)
160 KERNEL_TOOLCHAIN_PREFIX := aarch64-linux-android-
161 else
162 KERNEL_TOOLCHAIN_PREFIX := arm-eabi-
163 endif
164endif
165else
166KERNEL_TOOLCHAIN_PREFIX := $(TARGET_KERNEL_CROSS_COMPILE_PREFIX)
167endif
168
169ifeq ($(KERNEL_TOOLCHAIN),)
170KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN_PREFIX)
171else
172ifneq ($(KERNEL_TOOLCHAIN_PREFIX),)
173KERNEL_TOOLCHAIN_PATH := $(KERNEL_TOOLCHAIN)/$(KERNEL_TOOLCHAIN_PREFIX)
174endif
175endif
176
177ifneq ($(USE_CCACHE),)
178 # Detect if the system already has ccache installed to use instead of the prebuilt
179 ccache := $(shell command -v ccache)
180 ifeq ($(ccache),)
181 ccache := $(ANDROID_BUILD_TOP)/prebuilts/misc/$(HOST_PREBUILT_TAG)/ccache/ccache
182 endif
183 $(info Using '$(ccache)' binary on '$(HOST_PREBUILT_TAG)')
184 # Check that the executable is here.
185 ccache := $(strip $(wildcard $(ccache)))
186endif
187
188KERNEL_CROSS_COMPILE := CROSS_COMPILE="$(ccache) $(KERNEL_TOOLCHAIN_PATH)"
189ccache =
190
191define mv-modules
192 mdpath=`find $(KERNEL_MODULES_OUT) -type f -name modules.order`;\
193 if [ "$$mdpath" != "" ];then\
194 mpath=`dirname $$mdpath`;\
195 ko=`find $$mpath/kernel -type f -name *.ko`;\
196 for i in $$ko; do $(KERNEL_TOOLCHAIN_PATH)strip --strip-unneeded $$i;\
197 mv $$i $(KERNEL_MODULES_OUT)/; done;\
198 fi
199endef
200
201define clean-module-folder
202 mdpath=`find $(KERNEL_MODULES_OUT) -type f -name modules.order`;\
203 if [ "$$mdpath" != "" ];then\
204 mpath=`dirname $$mdpath`; rm -rf $$mpath;\
205 fi
206endef
207
208ifeq ($(HOST_OS),darwin)
209 MAKE_FLAGS += C_INCLUDE_PATH=$(ANDROID_BUILD_TOP)/external/elfutils/0.153/libelf/
210endif
211
212ifeq ($(TARGET_KERNEL_MODULES),)
213 TARGET_KERNEL_MODULES := no-external-modules
214endif
215
216$(KERNEL_OUT):
217 mkdir -p $(KERNEL_OUT)
218 mkdir -p $(KERNEL_MODULES_OUT)
219
220$(KERNEL_CONFIG): $(KERNEL_OUT)
221 $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_DEFCONFIG)
222 $(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \
223 echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \
224 echo $(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; \
225 $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) oldconfig; fi
226 $(hide) if [ ! -z "$(KERNEL_ADDITIONAL_CONFIG)" ]; then \
227 echo "Using additional config '$(KERNEL_ADDITIONAL_CONFIG)'"; \
228 cat $(KERNEL_SRC)/arch/$(KERNEL_ARCH)/configs/$(KERNEL_ADDITIONAL_CONFIG) >> $(KERNEL_OUT)/.config; \
229 $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) oldconfig; fi
230
231TARGET_KERNEL_BINARIES: $(KERNEL_OUT) $(KERNEL_CONFIG) $(KERNEL_HEADERS_INSTALL)
232 $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) $(TARGET_PREBUILT_INT_KERNEL_TYPE)
233 $(hide) if grep -q 'CONFIG_OF=y' $(KERNEL_CONFIG) ; \
234 then \
235 echo -e ${CL_GRN}"Building DTBs"${CL_RST} ; \
236 $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) dtbs ; \
237 else \
238 echo "DTBs not enabled" ; \
239 fi ;
240 $(hide) if grep -q 'CONFIG_MODULES=y' $(KERNEL_CONFIG) ; \
241 then \
242 echo -e ${CL_GRN}"Building Kernel Modules"${CL_RST} ; \
243 $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules && \
244 $(MAKE) $(MAKE_FLAGS) -C $(KERNEL_SRC) O=$(KERNEL_OUT) INSTALL_MOD_PATH=../../$(KERNEL_MODULES_INSTALL) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) modules_install && \
245 $(mv-modules) && \
246 $(clean-module-folder) ; \
247 else \
248 echo "Kernel Modules not enabled" ; \
249 fi ;
250
251
252$(TARGET_KERNEL_MODULES): TARGET_KERNEL_BINARIES
253
254$(TARGET_PREBUILT_INT_KERNEL): $(TARGET_KERNEL_MODULES)
255 $(mv-modules)
256 $(clean-module-folder)
257
258$(KERNEL_HEADERS_INSTALL): $(KERNEL_OUT) $(KERNEL_CONFIG)
259 $(hide) if [ ! -z "$(KERNEL_HEADER_DEFCONFIG)" ]; then \
260 rm -f ../$(KERNEL_CONFIG); \
261 $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_HEADER_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_HEADER_DEFCONFIG); \
262 $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_HEADER_ARCH) $(KERNEL_CROSS_COMPILE) headers_install; fi
263 $(hide) if [ "$(KERNEL_HEADER_DEFCONFIG)" != "$(KERNEL_DEFCONFIG)" ]; then \
264 echo "Used a different defconfig for header generation"; \
265 rm -f ../$(KERNEL_CONFIG); \
266 $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) VARIANT_DEFCONFIG=$(VARIANT_DEFCONFIG) SELINUX_DEFCONFIG=$(SELINUX_DEFCONFIG) $(KERNEL_DEFCONFIG); fi
267 $(hide) if [ ! -z "$(KERNEL_CONFIG_OVERRIDE)" ]; then \
268 echo "Overriding kernel config with '$(KERNEL_CONFIG_OVERRIDE)'"; \
269 echo $(KERNEL_CONFIG_OVERRIDE) >> $(KERNEL_OUT)/.config; \
270 $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) oldconfig; fi
271 $(hide) if [ ! -z "$(KERNEL_ADDITIONAL_CONFIG)" ]; then \
272 echo "Using additional config '$(KERNEL_ADDITIONAL_CONFIG)'"; \
273 cat $(KERNEL_SRC)/arch/$(KERNEL_ARCH)/configs/$(KERNEL_ADDITIONAL_CONFIG) >> $(KERNEL_OUT)/.config; \
274 $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) oldconfig; fi
275
276kerneltags: $(KERNEL_OUT) $(KERNEL_CONFIG)
277 $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) tags
278
279kernelconfig: $(KERNEL_OUT) $(KERNEL_CONFIG)
280 env KCONFIG_NOTIMESTAMP=true \
281 $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) menuconfig
282 env KCONFIG_NOTIMESTAMP=true \
283 $(MAKE) -C $(KERNEL_SRC) O=$(KERNEL_OUT) ARCH=$(KERNEL_ARCH) $(KERNEL_CROSS_COMPILE) savedefconfig
284 cp $(KERNEL_OUT)/defconfig $(KERNEL_SRC)/arch/$(KERNEL_ARCH)/configs/$(KERNEL_DEFCONFIG)
285
286endif # FULL_KERNEL_BUILD
287
288## Install it
289
290ifeq ($(NEEDS_KERNEL_COPY),true)
291file := $(INSTALLED_KERNEL_TARGET)
292ALL_PREBUILT += $(file)
293$(file) : $(KERNEL_BIN) | $(ACP)
294 $(transform-prebuilt-to-target)
295
296ALL_PREBUILT += $(INSTALLED_KERNEL_TARGET)
297endif