xref: /OK3568_Linux_fs/buildroot/linux/linux.mk (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun################################################################################
2*4882a593Smuzhiyun#
3*4882a593Smuzhiyun# Linux kernel target
4*4882a593Smuzhiyun#
5*4882a593Smuzhiyun################################################################################
6*4882a593Smuzhiyun
7*4882a593SmuzhiyunLINUX_VERSION = $(call qstrip,$(BR2_LINUX_KERNEL_VERSION))
8*4882a593SmuzhiyunLINUX_LICENSE = GPL-2.0
9*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_LATEST_VERSION),y)
10*4882a593SmuzhiyunLINUX_LICENSE_FILES = \
11*4882a593Smuzhiyun	COPYING \
12*4882a593Smuzhiyun	LICENSES/preferred/GPL-2.0 \
13*4882a593Smuzhiyun	LICENSES/exceptions/Linux-syscall-note
14*4882a593Smuzhiyunendif
15*4882a593SmuzhiyunLINUX_CPE_ID_VENDOR = linux
16*4882a593SmuzhiyunLINUX_CPE_ID_PRODUCT = linux_kernel
17*4882a593SmuzhiyunLINUX_CPE_ID_PREFIX = cpe:2.3:o
18*4882a593Smuzhiyun
19*4882a593Smuzhiyun# Compute LINUX_SOURCE and LINUX_SITE from the configuration
20*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_CUSTOM_TARBALL),y)
21*4882a593SmuzhiyunLINUX_TARBALL = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION))
22*4882a593SmuzhiyunLINUX_SITE = $(patsubst %/,%,$(dir $(LINUX_TARBALL)))
23*4882a593SmuzhiyunLINUX_SOURCE = $(notdir $(LINUX_TARBALL))
24*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_CUSTOM_LOCAL),y)
25*4882a593SmuzhiyunLINUX_SITE = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_LOCAL_LOCATION))
26*4882a593SmuzhiyunLINUX_SITE_METHOD = local
27*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_CUSTOM_GIT),y)
28*4882a593SmuzhiyunLINUX_SITE = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_REPO_URL))
29*4882a593SmuzhiyunLINUX_SITE_METHOD = git
30*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_CUSTOM_HG),y)
31*4882a593SmuzhiyunLINUX_SITE = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_REPO_URL))
32*4882a593SmuzhiyunLINUX_SITE_METHOD = hg
33*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_CUSTOM_SVN),y)
34*4882a593SmuzhiyunLINUX_SITE = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_REPO_URL))
35*4882a593SmuzhiyunLINUX_SITE_METHOD = svn
36*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_LATEST_CIP_VERSION)$(BR2_LINUX_KERNEL_LATEST_CIP_RT_VERSION),y)
37*4882a593SmuzhiyunLINUX_SOURCE = linux-cip-$(LINUX_VERSION).tar.gz
38*4882a593SmuzhiyunLINUX_SITE = https://git.kernel.org/pub/scm/linux/kernel/git/cip/linux-cip.git/snapshot
39*4882a593Smuzhiyunelse ifneq ($(findstring -rc,$(LINUX_VERSION)),)
40*4882a593Smuzhiyun# Since 4.12-rc1, -rc kernels are generated from cgit. This also works for
41*4882a593Smuzhiyun# older -rc kernels.
42*4882a593SmuzhiyunLINUX_SITE = https://git.kernel.org/torvalds/t
43*4882a593Smuzhiyunelse
44*4882a593SmuzhiyunLINUX_SOURCE = linux-$(LINUX_VERSION).tar.xz
45*4882a593Smuzhiyunifeq ($(findstring x2.6.,x$(LINUX_VERSION)),x2.6.)
46*4882a593SmuzhiyunLINUX_SITE = $(BR2_KERNEL_MIRROR)/linux/kernel/v2.6
47*4882a593Smuzhiyunelse
48*4882a593SmuzhiyunLINUX_SITE = $(BR2_KERNEL_MIRROR)/linux/kernel/v$(firstword $(subst ., ,$(LINUX_VERSION))).x
49*4882a593Smuzhiyunendif
50*4882a593Smuzhiyunendif
51*4882a593Smuzhiyun
52*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL)$(BR2_LINUX_KERNEL_LATEST_VERSION),y)
53*4882a593SmuzhiyunBR_NO_CHECK_HASH_FOR += $(LINUX_SOURCE)
54*4882a593Smuzhiyunendif
55*4882a593Smuzhiyun
56*4882a593SmuzhiyunLINUX_PATCHES = $(call qstrip,$(BR2_LINUX_KERNEL_PATCH))
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun# We have no way to know the hashes for user-supplied patches.
59*4882a593SmuzhiyunBR_NO_CHECK_HASH_FOR += $(notdir $(LINUX_PATCHES))
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun# We rely on the generic package infrastructure to download and apply
62*4882a593Smuzhiyun# remote patches (downloaded from ftp, http or https). For local
63*4882a593Smuzhiyun# patches, we can't rely on that infrastructure, because there might
64*4882a593Smuzhiyun# be directories in the patch list (unlike for other packages).
65*4882a593SmuzhiyunLINUX_PATCH = $(filter ftp://% http://% https://%,$(LINUX_PATCHES))
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun# while the kernel is built for the target, the build may need various
68*4882a593Smuzhiyun# host libraries depending on config (and version), so use
69*4882a593Smuzhiyun# HOST_MAKE_ENV here. In particular, this ensures that our
70*4882a593Smuzhiyun# host-pkgconf will look for host libraries and not target ones.
71*4882a593SmuzhiyunLINUX_MAKE_ENV = \
72*4882a593Smuzhiyun	$(HOST_MAKE_ENV) \
73*4882a593Smuzhiyun	BR_BINARIES_DIR=$(BINARIES_DIR)
74*4882a593Smuzhiyun
75*4882a593SmuzhiyunLINUX_INSTALL_IMAGES = YES
76*4882a593SmuzhiyunLINUX_DEPENDENCIES = host-kmod
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun# The kernel CONFIG_EXTRA_FIRMWARE feature requires firmware files at build
79*4882a593Smuzhiyun# time. Make sure they are available before the kernel builds.
80*4882a593SmuzhiyunLINUX_DEPENDENCIES += \
81*4882a593Smuzhiyun	$(if $(BR2_PACKAGE_INTEL_MICROCODE),intel-microcode) \
82*4882a593Smuzhiyun	$(if $(BR2_PACKAGE_LINUX_FIRMWARE),linux-firmware) \
83*4882a593Smuzhiyun	$(if $(BR2_PACKAGE_FIRMWARE_IMX),firmware-imx) \
84*4882a593Smuzhiyun	$(if $(BR2_PACKAGE_WIRELESS_REGDB),wireless-regdb)
85*4882a593Smuzhiyun
86*4882a593Smuzhiyun# Starting with 4.16, the generated kconfig paser code is no longer
87*4882a593Smuzhiyun# shipped with the kernel sources, so we need flex and bison, but
88*4882a593Smuzhiyun# only if the host does not have them.
89*4882a593SmuzhiyunLINUX_KCONFIG_DEPENDENCIES = \
90*4882a593Smuzhiyun	$(BR2_BISON_HOST_DEPENDENCY) \
91*4882a593Smuzhiyun	$(BR2_FLEX_HOST_DEPENDENCY)
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun# Starting with 4.18, the kconfig in the kernel calls the
94*4882a593Smuzhiyun# cross-compiler to check its capabilities. So we need the
95*4882a593Smuzhiyun# toolchain before we can call the configurators.
96*4882a593SmuzhiyunLINUX_KCONFIG_DEPENDENCIES += toolchain
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun# host tools needed for kernel compression
99*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_LZ4),y)
100*4882a593SmuzhiyunLINUX_DEPENDENCIES += host-lz4
101*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_LZMA),y)
102*4882a593SmuzhiyunLINUX_DEPENDENCIES += host-lzma
103*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_LZO),y)
104*4882a593SmuzhiyunLINUX_DEPENDENCIES += host-lzop
105*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_XZ),y)
106*4882a593SmuzhiyunLINUX_DEPENDENCIES += host-xz
107*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_ZSTD),y)
108*4882a593SmuzhiyunLINUX_DEPENDENCIES += host-zstd
109*4882a593Smuzhiyunendif
110*4882a593SmuzhiyunLINUX_COMPRESSION_OPT_$(BR2_LINUX_KERNEL_GZIP) += CONFIG_KERNEL_GZIP
111*4882a593SmuzhiyunLINUX_COMPRESSION_OPT_$(BR2_LINUX_KERNEL_LZ4) += CONFIG_KERNEL_LZ4
112*4882a593SmuzhiyunLINUX_COMPRESSION_OPT_$(BR2_LINUX_KERNEL_LZMA) += CONFIG_KERNEL_LZMA
113*4882a593SmuzhiyunLINUX_COMPRESSION_OPT_$(BR2_LINUX_KERNEL_LZO) += CONFIG_KERNEL_LZO
114*4882a593SmuzhiyunLINUX_COMPRESSION_OPT_$(BR2_LINUX_KERNEL_XZ) += CONFIG_KERNEL_XZ
115*4882a593SmuzhiyunLINUX_COMPRESSION_OPT_$(BR2_LINUX_KERNEL_ZSTD) += CONFIG_KERNEL_ZSTD
116*4882a593SmuzhiyunLINUX_COMPRESSION_OPT_$(BR2_LINUX_KERNEL_UNCOMPRESSED) += CONFIG_KERNEL_UNCOMPRESSED
117*4882a593Smuzhiyun
118*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_NEEDS_HOST_OPENSSL),y)
119*4882a593SmuzhiyunLINUX_DEPENDENCIES += host-openssl
120*4882a593Smuzhiyunendif
121*4882a593Smuzhiyun
122*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_NEEDS_HOST_LIBELF),y)
123*4882a593SmuzhiyunLINUX_DEPENDENCIES += host-elfutils host-pkgconf
124*4882a593Smuzhiyunendif
125*4882a593Smuzhiyun
126*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_NEEDS_HOST_PAHOLE),y)
127*4882a593SmuzhiyunLINUX_DEPENDENCIES += host-pahole
128*4882a593Smuzhiyunelse
129*4882a593Smuzhiyundefine LINUX_FIXUP_CONFIG_PAHOLE_CHECK
130*4882a593Smuzhiyun	if grep -q "^CONFIG_DEBUG_INFO_BTF=y" $(KCONFIG_DOT_CONFIG); then \
131*4882a593Smuzhiyun		echo "To use CONFIG_DEBUG_INFO_BTF, enable host-pahole (BR2_LINUX_KERNEL_NEEDS_HOST_PAHOLE)" 1>&2; \
132*4882a593Smuzhiyun		exit 1; \
133*4882a593Smuzhiyun	fi
134*4882a593Smuzhiyunendef
135*4882a593Smuzhiyunendif
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun# If host-uboot-tools is selected by the user, assume it is needed to
138*4882a593Smuzhiyun# create a custom image
139*4882a593Smuzhiyunifeq ($(BR2_PACKAGE_HOST_UBOOT_TOOLS),y)
140*4882a593SmuzhiyunLINUX_DEPENDENCIES += host-uboot-tools
141*4882a593Smuzhiyunendif
142*4882a593Smuzhiyun
143*4882a593Smuzhiyunifneq ($(ARCH_XTENSA_OVERLAY_FILE),)
144*4882a593Smuzhiyundefine LINUX_XTENSA_OVERLAY_EXTRACT
145*4882a593Smuzhiyun	$(call arch-xtensa-overlay-extract,$(@D),linux)
146*4882a593Smuzhiyunendef
147*4882a593SmuzhiyunLINUX_POST_EXTRACT_HOOKS += LINUX_XTENSA_OVERLAY_EXTRACT
148*4882a593SmuzhiyunLINUX_EXTRA_DOWNLOADS += $(ARCH_XTENSA_OVERLAY_URL)
149*4882a593Smuzhiyunendif
150*4882a593Smuzhiyun
151*4882a593Smuzhiyun# We don't want to run depmod after installing the kernel. It's done in a
152*4882a593Smuzhiyun# target-finalize hook, to encompass modules installed by packages.
153*4882a593Smuzhiyun# Disable building host tools with -Werror: newer gcc versions can be
154*4882a593Smuzhiyun# extra picky about some code (https://bugs.busybox.net/show_bug.cgi?id=14826)
155*4882a593SmuzhiyunLINUX_MAKE_FLAGS = \
156*4882a593Smuzhiyun	HOSTCC="$(HOSTCC) $(subst -I/,-isystem /,$(subst -I /,-isystem /,$(HOST_CFLAGS))) $(HOST_LDFLAGS)" \
157*4882a593Smuzhiyun	ARCH=$(KERNEL_ARCH) \
158*4882a593Smuzhiyun	INSTALL_MOD_PATH=$(TARGET_DIR) \
159*4882a593Smuzhiyun	CROSS_COMPILE="$(TARGET_CROSS)" \
160*4882a593Smuzhiyun	WERROR=0 \
161*4882a593Smuzhiyun	REGENERATE_PARSERS=1 \
162*4882a593Smuzhiyun	DEPMOD=$(HOST_DIR)/sbin/depmod
163*4882a593Smuzhiyun
164*4882a593Smuzhiyunifeq ($(BR2_REPRODUCIBLE),y)
165*4882a593SmuzhiyunLINUX_MAKE_ENV += \
166*4882a593Smuzhiyun	KBUILD_BUILD_VERSION=1 \
167*4882a593Smuzhiyun	KBUILD_BUILD_USER=buildroot \
168*4882a593Smuzhiyun	KBUILD_BUILD_HOST=buildroot \
169*4882a593Smuzhiyun	KBUILD_BUILD_TIMESTAMP="$(shell LC_ALL=C TZ='UTC' date -d @$(SOURCE_DATE_EPOCH))"
170*4882a593Smuzhiyunendif
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun# gcc-8 started warning about function aliases that have a
173*4882a593Smuzhiyun# non-matching prototype.  This seems rather useful in general, but it
174*4882a593Smuzhiyun# causes tons of warnings in the Linux kernel, where we rely on
175*4882a593Smuzhiyun# abusing those aliases for system call entry points, in order to
176*4882a593Smuzhiyun# sanitize the arguments passed from user space in registers.
177*4882a593Smuzhiyun# https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82435
178*4882a593Smuzhiyunifeq ($(BR2_TOOLCHAIN_GCC_AT_LEAST_8),y)
179*4882a593SmuzhiyunLINUX_MAKE_ENV += KCFLAGS=-Wno-attribute-alias
180*4882a593Smuzhiyunendif
181*4882a593Smuzhiyun
182*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_DTB_OVERLAY_SUPPORT),y)
183*4882a593SmuzhiyunLINUX_MAKE_ENV += DTC_FLAGS=-@
184*4882a593Smuzhiyunendif
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun# Get the real Linux version, which tells us where kernel modules are
187*4882a593Smuzhiyun# going to be installed in the target filesystem.
188*4882a593Smuzhiyun# Filter out 'w' from MAKEFLAGS, to workaround a bug in make 4.1 (#13141)
189*4882a593SmuzhiyunLINUX_VERSION_PROBED = `MAKEFLAGS='$(filter-out w,$(MAKEFLAGS))' $(MAKE) $(LINUX_MAKE_FLAGS) -C $(LINUX_DIR) --no-print-directory -s kernelrelease 2>/dev/null`
190*4882a593Smuzhiyun
191*4882a593SmuzhiyunLINUX_DTS_NAME += $(call qstrip,$(BR2_LINUX_KERNEL_INTREE_DTS_NAME))
192*4882a593Smuzhiyun
193*4882a593Smuzhiyun# We keep only the .dts files, so that the user can specify both .dts
194*4882a593Smuzhiyun# and .dtsi files in BR2_LINUX_KERNEL_CUSTOM_DTS_PATH. Both will be
195*4882a593Smuzhiyun# copied to arch/<arch>/boot/dts, but only the .dts files will
196*4882a593Smuzhiyun# actually be generated as .dtb.
197*4882a593SmuzhiyunLINUX_DTS_NAME += $(basename $(filter %.dts,$(notdir $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_DTS_PATH)))))
198*4882a593Smuzhiyun
199*4882a593SmuzhiyunLINUX_DTBS = $(addsuffix .dtb,$(LINUX_DTS_NAME))
200*4882a593Smuzhiyun
201*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_IMAGE_TARGET_CUSTOM),y)
202*4882a593SmuzhiyunLINUX_IMAGE_NAME = $(call qstrip,$(BR2_LINUX_KERNEL_IMAGE_NAME))
203*4882a593SmuzhiyunLINUX_TARGET_NAME = $(call qstrip,$(BR2_LINUX_KERNEL_IMAGE_TARGET_NAME))
204*4882a593Smuzhiyunifeq ($(LINUX_IMAGE_NAME),)
205*4882a593SmuzhiyunLINUX_IMAGE_NAME = $(LINUX_TARGET_NAME)
206*4882a593Smuzhiyunendif
207*4882a593Smuzhiyunelse
208*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_UIMAGE),y)
209*4882a593SmuzhiyunLINUX_IMAGE_NAME = uImage
210*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_APPENDED_UIMAGE),y)
211*4882a593SmuzhiyunLINUX_IMAGE_NAME = uImage
212*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_BZIMAGE),y)
213*4882a593SmuzhiyunLINUX_IMAGE_NAME = bzImage
214*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_ZIMAGE),y)
215*4882a593SmuzhiyunLINUX_IMAGE_NAME = zImage
216*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_ZIMAGE_EPAPR),y)
217*4882a593SmuzhiyunLINUX_IMAGE_NAME = zImage.epapr
218*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_APPENDED_ZIMAGE),y)
219*4882a593SmuzhiyunLINUX_IMAGE_NAME = zImage
220*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_CUIMAGE),y)
221*4882a593SmuzhiyunLINUX_IMAGE_NAME = cuImage.$(firstword $(LINUX_DTS_NAME))
222*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_SIMPLEIMAGE),y)
223*4882a593SmuzhiyunLINUX_IMAGE_NAME = simpleImage.$(firstword $(LINUX_DTS_NAME))
224*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_IMAGE),y)
225*4882a593SmuzhiyunLINUX_IMAGE_NAME = Image
226*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_IMAGEGZ),y)
227*4882a593SmuzhiyunLINUX_IMAGE_NAME = Image.gz
228*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_LINUX_BIN),y)
229*4882a593SmuzhiyunLINUX_IMAGE_NAME = linux.bin
230*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_VMLINUX_BIN),y)
231*4882a593SmuzhiyunLINUX_IMAGE_NAME = vmlinux.bin
232*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_VMLINUX),y)
233*4882a593SmuzhiyunLINUX_IMAGE_NAME = vmlinux
234*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_VMLINUZ),y)
235*4882a593SmuzhiyunLINUX_IMAGE_NAME = vmlinuz
236*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_VMLINUZ_BIN),y)
237*4882a593SmuzhiyunLINUX_IMAGE_NAME = vmlinuz.bin
238*4882a593Smuzhiyunendif
239*4882a593Smuzhiyun# The if-else blocks above are all the image types we know of, and all
240*4882a593Smuzhiyun# come from a Kconfig choice, so we know we have LINUX_IMAGE_NAME set
241*4882a593Smuzhiyun# to something
242*4882a593SmuzhiyunLINUX_TARGET_NAME = $(LINUX_IMAGE_NAME)
243*4882a593Smuzhiyunendif
244*4882a593Smuzhiyun
245*4882a593SmuzhiyunLINUX_KERNEL_UIMAGE_LOADADDR = $(call qstrip,$(BR2_LINUX_KERNEL_UIMAGE_LOADADDR))
246*4882a593Smuzhiyunifneq ($(LINUX_KERNEL_UIMAGE_LOADADDR),)
247*4882a593SmuzhiyunLINUX_MAKE_FLAGS += LOADADDR="$(LINUX_KERNEL_UIMAGE_LOADADDR)"
248*4882a593Smuzhiyunendif
249*4882a593Smuzhiyun
250*4882a593Smuzhiyun# Compute the arch path, since i386 and x86_64 are in arch/x86 and not
251*4882a593Smuzhiyun# in arch/$(KERNEL_ARCH). Even if the kernel creates symbolic links
252*4882a593Smuzhiyun# for bzImage, arch/i386 and arch/x86_64 do not exist when copying the
253*4882a593Smuzhiyun# defconfig file.
254*4882a593Smuzhiyunifeq ($(KERNEL_ARCH),i386)
255*4882a593SmuzhiyunLINUX_ARCH_PATH = $(LINUX_DIR)/arch/x86
256*4882a593Smuzhiyunelse ifeq ($(KERNEL_ARCH),x86_64)
257*4882a593SmuzhiyunLINUX_ARCH_PATH = $(LINUX_DIR)/arch/x86
258*4882a593Smuzhiyunelse ifeq ($(KERNEL_ARCH),sparc64)
259*4882a593SmuzhiyunLINUX_ARCH_PATH = $(LINUX_DIR)/arch/sparc
260*4882a593Smuzhiyunelse
261*4882a593SmuzhiyunLINUX_ARCH_PATH = $(LINUX_DIR)/arch/$(KERNEL_ARCH)
262*4882a593Smuzhiyunendif
263*4882a593Smuzhiyun
264*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_VMLINUX),y)
265*4882a593SmuzhiyunLINUX_IMAGE_PATH = $(LINUX_DIR)/$(LINUX_IMAGE_NAME)
266*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_VMLINUZ),y)
267*4882a593SmuzhiyunLINUX_IMAGE_PATH = $(LINUX_DIR)/$(LINUX_IMAGE_NAME)
268*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_VMLINUZ_BIN),y)
269*4882a593SmuzhiyunLINUX_IMAGE_PATH = $(LINUX_DIR)/$(LINUX_IMAGE_NAME)
270*4882a593Smuzhiyunelse
271*4882a593SmuzhiyunLINUX_IMAGE_PATH = $(LINUX_ARCH_PATH)/boot/$(LINUX_IMAGE_NAME)
272*4882a593Smuzhiyunendif # BR2_LINUX_KERNEL_VMLINUX
273*4882a593Smuzhiyun
274*4882a593Smuzhiyundefine LINUX_APPLY_LOCAL_PATCHES
275*4882a593Smuzhiyun	for p in $(filter-out ftp://% http://% https://%,$(LINUX_PATCHES)) ; do \
276*4882a593Smuzhiyun		if test -d $$p ; then \
277*4882a593Smuzhiyun			$(APPLY_PATCHES) $(@D) $$p \*.patch || exit 1 ; \
278*4882a593Smuzhiyun		else \
279*4882a593Smuzhiyun			$(APPLY_PATCHES) $(@D) `dirname $$p` `basename $$p` || exit 1; \
280*4882a593Smuzhiyun		fi \
281*4882a593Smuzhiyun	done
282*4882a593Smuzhiyunendef
283*4882a593Smuzhiyun
284*4882a593SmuzhiyunLINUX_POST_PATCH_HOOKS += LINUX_APPLY_LOCAL_PATCHES
285*4882a593Smuzhiyun
286*4882a593Smuzhiyun# Older versions break on gcc 10+ because of redefined symbols
287*4882a593Smuzhiyundefine LINUX_DROP_YYLLOC
288*4882a593Smuzhiyun	$(Q)grep -Z -l -r -E '^YYLTYPE yylloc;$$' $(@D) \
289*4882a593Smuzhiyun	|xargs -0 -r $(SED) '/^YYLTYPE yylloc;$$/d'
290*4882a593Smuzhiyunendef
291*4882a593SmuzhiyunLINUX_POST_PATCH_HOOKS += LINUX_DROP_YYLLOC
292*4882a593Smuzhiyun
293*4882a593Smuzhiyun# Kernel version < 5.6 breaks if host-gcc version is >= 10 and
294*4882a593Smuzhiyun# 'yylloc' symbol is removed in previous hook, due to missing
295*4882a593Smuzhiyun# '%locations' bison directive in dtc-parser.y.  See:
296*4882a593Smuzhiyun# https://bugs.busybox.net/show_bug.cgi?id=14971
297*4882a593Smuzhiyundefine LINUX_ADD_DTC_LOCATIONS
298*4882a593Smuzhiyun	$(Q)DTC_PARSER=$(@D)/scripts/dtc/dtc-parser.y; \
299*4882a593Smuzhiyun	if test -e "$${DTC_PARSER}" \
300*4882a593Smuzhiyun		&& ! grep -Eq '^%locations$$' "$${DTC_PARSER}" ; then \
301*4882a593Smuzhiyun		$(SED) '/^%{$$/i %locations' "$${DTC_PARSER}"; \
302*4882a593Smuzhiyun	fi
303*4882a593Smuzhiyunendef
304*4882a593SmuzhiyunLINUX_POST_PATCH_HOOKS += LINUX_ADD_DTC_LOCATIONS
305*4882a593Smuzhiyun
306*4882a593Smuzhiyun# Older linux kernels use deprecated perl constructs in timeconst.pl
307*4882a593Smuzhiyun# that were removed for perl 5.22+ so it breaks on newer distributions
308*4882a593Smuzhiyun# Try a dry-run patch to see if this applies, if it does go ahead
309*4882a593Smuzhiyundefine LINUX_TRY_PATCH_TIMECONST
310*4882a593Smuzhiyun	@if patch -p1 --dry-run -f -s -d $(@D) <$(LINUX_PKGDIR)/0001-timeconst.pl-Eliminate-Perl-warning.patch.conditional >/dev/null ; then \
311*4882a593Smuzhiyun		$(APPLY_PATCHES) $(@D) $(LINUX_PKGDIR) 0001-timeconst.pl-Eliminate-Perl-warning.patch.conditional ; \
312*4882a593Smuzhiyun	fi
313*4882a593Smuzhiyunendef
314*4882a593SmuzhiyunLINUX_POST_PATCH_HOOKS += LINUX_TRY_PATCH_TIMECONST
315*4882a593Smuzhiyun
316*4882a593SmuzhiyunLINUX_KERNEL_CUSTOM_LOGO_PATH = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_LOGO_PATH))
317*4882a593Smuzhiyunifneq ($(LINUX_KERNEL_CUSTOM_LOGO_PATH),)
318*4882a593SmuzhiyunLINUX_DEPENDENCIES += host-imagemagick
319*4882a593Smuzhiyundefine LINUX_KERNEL_CUSTOM_LOGO_CONVERT
320*4882a593Smuzhiyun	$(HOST_DIR)/bin/convert $(LINUX_KERNEL_CUSTOM_LOGO_PATH) \
321*4882a593Smuzhiyun		-dither None -colors 224 -compress none \
322*4882a593Smuzhiyun		$(LINUX_DIR)/drivers/video/logo/logo_linux_clut224.ppm
323*4882a593Smuzhiyunendef
324*4882a593SmuzhiyunLINUX_PRE_BUILD_HOOKS += LINUX_KERNEL_CUSTOM_LOGO_CONVERT
325*4882a593Smuzhiyunendif
326*4882a593Smuzhiyun
327*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_USE_DEFCONFIG),y)
328*4882a593SmuzhiyunLINUX_KCONFIG_DEFCONFIG = $(call qstrip,$(BR2_LINUX_KERNEL_DEFCONFIG))_defconfig
329*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_USE_ARCH_DEFAULT_CONFIG),y)
330*4882a593Smuzhiyunifeq ($(BR2_powerpc64le),y)
331*4882a593SmuzhiyunLINUX_KCONFIG_DEFCONFIG = ppc64le_defconfig
332*4882a593Smuzhiyunelse
333*4882a593SmuzhiyunLINUX_KCONFIG_DEFCONFIG = defconfig
334*4882a593Smuzhiyunendif
335*4882a593Smuzhiyunelse ifeq ($(BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG),y)
336*4882a593SmuzhiyunLINUX_KCONFIG_FILE = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE))
337*4882a593Smuzhiyunendif
338*4882a593SmuzhiyunLINUX_KCONFIG_FRAGMENT_FILES = $(call qstrip,$(BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES))
339*4882a593SmuzhiyunLINUX_KCONFIG_EDITORS = menuconfig xconfig gconfig nconfig
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun# LINUX_MAKE_FLAGS overrides HOSTCC to allow the kernel build to find
342*4882a593Smuzhiyun# our host-openssl and host-libelf. However, this triggers a bug in
343*4882a593Smuzhiyun# the kconfig build script that causes it to build with
344*4882a593Smuzhiyun# /usr/include/ncurses.h (which is typically wchar) but link with
345*4882a593Smuzhiyun# $(HOST_DIR)/lib/libncurses.so (which is not).  We don't actually
346*4882a593Smuzhiyun# need any host-package for kconfig, so remove the HOSTCC override
347*4882a593Smuzhiyun# again. In addition, even though linux depends on the toolchain and
348*4882a593Smuzhiyun# therefore host-ccache would be ready, we use HOSTCC_NOCCACHE for
349*4882a593Smuzhiyun# consistency with other kconfig packages.
350*4882a593SmuzhiyunLINUX_KCONFIG_OPTS = $(LINUX_MAKE_FLAGS) HOSTCC="$(HOSTCC_NOCCACHE)"
351*4882a593Smuzhiyun
352*4882a593Smuzhiyun# If no package has yet set it, set it from the Kconfig option
353*4882a593SmuzhiyunLINUX_NEEDS_MODULES ?= $(BR2_LINUX_NEEDS_MODULES)
354*4882a593Smuzhiyun
355*4882a593Smuzhiyun# Make sure the Linux kernel is built with the right endianness. Not
356*4882a593Smuzhiyun# all architectures support
357*4882a593Smuzhiyun# CONFIG_CPU_BIG_ENDIAN/CONFIG_CPU_LITTLE_ENDIAN in Linux, but the
358*4882a593Smuzhiyun# option will be thrown away and ignored if it doesn't exist.
359*4882a593Smuzhiyunifeq ($(BR2_ENDIAN),"BIG")
360*4882a593Smuzhiyundefine LINUX_FIXUP_CONFIG_ENDIANNESS
361*4882a593Smuzhiyun	$(call KCONFIG_ENABLE_OPT,CONFIG_CPU_BIG_ENDIAN)
362*4882a593Smuzhiyunendef
363*4882a593Smuzhiyunelse
364*4882a593Smuzhiyundefine LINUX_FIXUP_CONFIG_ENDIANNESS
365*4882a593Smuzhiyun	$(call KCONFIG_ENABLE_OPT,CONFIG_CPU_LITTLE_ENDIAN)
366*4882a593Smuzhiyunendef
367*4882a593Smuzhiyunendif
368*4882a593Smuzhiyun
369*4882a593Smuzhiyundefine LINUX_KCONFIG_FIXUP_CMDS
370*4882a593Smuzhiyun	$(if $(LINUX_NEEDS_MODULES),
371*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_MODULES))
372*4882a593Smuzhiyun	$(call KCONFIG_ENABLE_OPT,$(strip $(LINUX_COMPRESSION_OPT_y)))
373*4882a593Smuzhiyun	$(foreach opt, $(LINUX_COMPRESSION_OPT_),
374*4882a593Smuzhiyun		$(call KCONFIG_DISABLE_OPT,$(opt))
375*4882a593Smuzhiyun	)
376*4882a593Smuzhiyun	$(LINUX_FIXUP_CONFIG_ENDIANNESS)
377*4882a593Smuzhiyun	$(LINUX_FIXUP_CONFIG_PAHOLE_CHECK)
378*4882a593Smuzhiyun	$(if $(BR2_arm)$(BR2_armeb),
379*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_AEABI))
380*4882a593Smuzhiyun	$(if $(BR2_powerpc)$(BR2_powerpc64)$(BR2_powerpc64le),
381*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_PPC_DISABLE_WERROR))
382*4882a593Smuzhiyun	$(if $(BR2_ARC_PAGE_SIZE_4K),
383*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_ARC_PAGE_SIZE_4K)
384*4882a593Smuzhiyun		$(call KCONFIG_DISABLE_OPT,CONFIG_ARC_PAGE_SIZE_8K)
385*4882a593Smuzhiyun		$(call KCONFIG_DISABLE_OPT,CONFIG_ARC_PAGE_SIZE_16K))
386*4882a593Smuzhiyun	$(if $(BR2_ARC_PAGE_SIZE_8K),
387*4882a593Smuzhiyun		$(call KCONFIG_DISABLE_OPT,CONFIG_ARC_PAGE_SIZE_4K)
388*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_ARC_PAGE_SIZE_8K)
389*4882a593Smuzhiyun		$(call KCONFIG_DISABLE_OPT,CONFIG_ARC_PAGE_SIZE_16K))
390*4882a593Smuzhiyun	$(if $(BR2_ARC_PAGE_SIZE_16K),
391*4882a593Smuzhiyun		$(call KCONFIG_DISABLE_OPT,CONFIG_ARC_PAGE_SIZE_4K)
392*4882a593Smuzhiyun		$(call KCONFIG_DISABLE_OPT,CONFIG_ARC_PAGE_SIZE_8K)
393*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_ARC_PAGE_SIZE_16K))
394*4882a593Smuzhiyun	$(if $(BR2_ARM64_PAGE_SIZE_4K),
395*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_ARM64_4K_PAGES)
396*4882a593Smuzhiyun		$(call KCONFIG_DISABLE_OPT,CONFIG_ARM64_16K_PAGES)
397*4882a593Smuzhiyun		$(call KCONFIG_DISABLE_OPT,CONFIG_ARM64_64K_PAGES))
398*4882a593Smuzhiyun	$(if $(BR2_ARM64_PAGE_SIZE_64K),
399*4882a593Smuzhiyun		$(call KCONFIG_DISABLE_OPT,CONFIG_ARM64_4K_PAGES)
400*4882a593Smuzhiyun		$(call KCONFIG_DISABLE_OPT,CONFIG_ARM64_16K_PAGES)
401*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_ARM64_64K_PAGES))
402*4882a593Smuzhiyun	$(if $(BR2_TARGET_ROOTFS_CPIO),
403*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_BLK_DEV_INITRD))
404*4882a593Smuzhiyun	# As the kernel gets compiled before root filesystems are
405*4882a593Smuzhiyun	# built, we create a fake cpio file. It'll be
406*4882a593Smuzhiyun	# replaced later by the real cpio archive, and the kernel will be
407*4882a593Smuzhiyun	# rebuilt using the linux-rebuild-with-initramfs target.
408*4882a593Smuzhiyun	$(if $(BR2_TARGET_ROOTFS_INITRAMFS),
409*4882a593Smuzhiyun		mkdir -p $(BINARIES_DIR)
410*4882a593Smuzhiyun		touch $(BINARIES_DIR)/rootfs.cpio
411*4882a593Smuzhiyun		$(call KCONFIG_SET_OPT,CONFIG_INITRAMFS_SOURCE,"$${BR_BINARIES_DIR}/rootfs.cpio")
412*4882a593Smuzhiyun		$(call KCONFIG_SET_OPT,CONFIG_INITRAMFS_ROOT_UID,0)
413*4882a593Smuzhiyun		$(call KCONFIG_SET_OPT,CONFIG_INITRAMFS_ROOT_GID,0))
414*4882a593Smuzhiyun	$(if $(BR2_ROOTFS_DEVICE_CREATION_STATIC),,
415*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_DEVTMPFS)
416*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_DEVTMPFS_MOUNT))
417*4882a593Smuzhiyun	$(if $(BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_EUDEV),
418*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_INOTIFY_USER))
419*4882a593Smuzhiyun	$(if $(BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_MDEV),
420*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_NET))
421*4882a593Smuzhiyun	$(if $(BR2_LINUX_KERNEL_APPENDED_DTB),
422*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_ARM_APPENDED_DTB))
423*4882a593Smuzhiyun	$(if $(LINUX_KERNEL_CUSTOM_LOGO_PATH),
424*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_FB)
425*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_LOGO)
426*4882a593Smuzhiyun		$(call KCONFIG_ENABLE_OPT,CONFIG_LOGO_LINUX_CLUT224))
427*4882a593Smuzhiyun	$(call KCONFIG_DISABLE_OPT,CONFIG_GCC_PLUGINS)
428*4882a593Smuzhiyun	$(PACKAGES_LINUX_CONFIG_FIXUPS)
429*4882a593Smuzhiyunendef
430*4882a593Smuzhiyun
431*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_DTS_SUPPORT),y)
432*4882a593Smuzhiyun# Starting with 4.17, the generated dtc parser code is no longer
433*4882a593Smuzhiyun# shipped with the kernel sources, so we need flex and bison. For
434*4882a593Smuzhiyun# reproducibility, we use our owns rather than the host ones.
435*4882a593SmuzhiyunLINUX_DEPENDENCIES += host-bison host-flex
436*4882a593Smuzhiyun
437*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_DTB_IS_SELF_BUILT),)
438*4882a593Smuzhiyundefine LINUX_BUILD_DTB
439*4882a593Smuzhiyun	$(LINUX_MAKE_ENV) $(MAKE) $(LINUX_MAKE_FLAGS) -C $(@D) $(LINUX_DTBS)
440*4882a593Smuzhiyunendef
441*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_APPENDED_DTB),)
442*4882a593Smuzhiyundefine LINUX_INSTALL_DTB
443*4882a593Smuzhiyun	# dtbs moved from arch/<ARCH>/boot to arch/<ARCH>/boot/dts since 3.8-rc1
444*4882a593Smuzhiyun	$(foreach dtb,$(LINUX_DTBS), \
445*4882a593Smuzhiyun		install -D \
446*4882a593Smuzhiyun			$(or $(wildcard $(LINUX_ARCH_PATH)/boot/dts/$(dtb)),$(LINUX_ARCH_PATH)/boot/$(dtb)) \
447*4882a593Smuzhiyun			$(1)/$(if $(BR2_LINUX_KERNEL_DTB_KEEP_DIRNAME),$(dtb),$(notdir $(dtb)))
448*4882a593Smuzhiyun	)
449*4882a593Smuzhiyunendef
450*4882a593Smuzhiyunendif # BR2_LINUX_KERNEL_APPENDED_DTB
451*4882a593Smuzhiyunendif # BR2_LINUX_KERNEL_DTB_IS_SELF_BUILT
452*4882a593Smuzhiyunendif # BR2_LINUX_KERNEL_DTS_SUPPORT
453*4882a593Smuzhiyun
454*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_APPENDED_DTB),y)
455*4882a593Smuzhiyun# dtbs moved from arch/$ARCH/boot to arch/$ARCH/boot/dts since 3.8-rc1
456*4882a593Smuzhiyundefine LINUX_APPEND_DTB
457*4882a593Smuzhiyun	(cd $(LINUX_ARCH_PATH)/boot; \
458*4882a593Smuzhiyun		for dtb in $(LINUX_DTS_NAME); do \
459*4882a593Smuzhiyun			if test -e $${dtb}.dtb ; then \
460*4882a593Smuzhiyun				dtbpath=$${dtb}.dtb ; \
461*4882a593Smuzhiyun			else \
462*4882a593Smuzhiyun				dtbpath=dts/$${dtb}.dtb ; \
463*4882a593Smuzhiyun			fi ; \
464*4882a593Smuzhiyun			cat zImage $${dtbpath} > zImage.$${dtb} || exit 1; \
465*4882a593Smuzhiyun		done)
466*4882a593Smuzhiyunendef
467*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_APPENDED_UIMAGE),y)
468*4882a593Smuzhiyun# We need to generate a new u-boot image that takes into
469*4882a593Smuzhiyun# account the extra-size added by the device tree at the end
470*4882a593Smuzhiyun# of the image. To do so, we first need to retrieve both load
471*4882a593Smuzhiyun# address and entry point for the kernel from the already
472*4882a593Smuzhiyun# generate uboot image before using mkimage -l.
473*4882a593SmuzhiyunLINUX_APPEND_DTB += ; \
474*4882a593Smuzhiyun	MKIMAGE_ARGS=`$(MKIMAGE) -l $(LINUX_IMAGE_PATH) |\
475*4882a593Smuzhiyun	sed -n -e 's/Image Name:[ ]*\(.*\)/-n \1/p' -e 's/Load Address:/-a/p' -e 's/Entry Point:/-e/p'`; \
476*4882a593Smuzhiyun	for dtb in $(LINUX_DTS_NAME); do \
477*4882a593Smuzhiyun		$(MKIMAGE) -A $(MKIMAGE_ARCH) -O linux \
478*4882a593Smuzhiyun			-T kernel -C none $${MKIMAGE_ARGS} \
479*4882a593Smuzhiyun			-d $(LINUX_ARCH_PATH)/boot/zImage.$${dtb} $(LINUX_IMAGE_PATH).$${dtb}; \
480*4882a593Smuzhiyun	done
481*4882a593Smuzhiyunendif
482*4882a593Smuzhiyunendif
483*4882a593Smuzhiyun
484*4882a593Smuzhiyun# Compilation. We make sure the kernel gets rebuilt when the
485*4882a593Smuzhiyun# configuration has changed. We call the 'all' and
486*4882a593Smuzhiyun# '$(LINUX_TARGET_NAME)' targets separately because calling them in
487*4882a593Smuzhiyun# the same $(MAKE) invocation has shown to cause parallel build
488*4882a593Smuzhiyun# issues.
489*4882a593Smuzhiyun# The call to disable gcc-plugins is a stop-gap measure:
490*4882a593Smuzhiyun#   http://lists.busybox.net/pipermail/buildroot/2020-May/282727.html
491*4882a593Smuzhiyundefine LINUX_BUILD_CMDS
492*4882a593Smuzhiyun	$(call KCONFIG_DISABLE_OPT,CONFIG_GCC_PLUGINS)
493*4882a593Smuzhiyun	$(foreach dts,$(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_DTS_PATH)), \
494*4882a593Smuzhiyun		cp -f $(dts) $(LINUX_ARCH_PATH)/boot/dts/
495*4882a593Smuzhiyun	)
496*4882a593Smuzhiyun	$(LINUX_MAKE_ENV) $(MAKE) $(LINUX_MAKE_FLAGS) -C $(@D) all
497*4882a593Smuzhiyun	$(LINUX_MAKE_ENV) $(MAKE) $(LINUX_MAKE_FLAGS) -C $(@D) $(LINUX_TARGET_NAME)
498*4882a593Smuzhiyun	$(LINUX_BUILD_DTB)
499*4882a593Smuzhiyun	$(LINUX_APPEND_DTB)
500*4882a593Smuzhiyunendef
501*4882a593Smuzhiyun
502*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_APPENDED_DTB),y)
503*4882a593Smuzhiyun# When a DTB was appended, install the potential several images with
504*4882a593Smuzhiyun# appended DTBs.
505*4882a593Smuzhiyundefine LINUX_INSTALL_IMAGE
506*4882a593Smuzhiyun	mkdir -p $(1)
507*4882a593Smuzhiyun	cp $(LINUX_ARCH_PATH)/boot/$(LINUX_IMAGE_NAME).* $(1)
508*4882a593Smuzhiyunendef
509*4882a593Smuzhiyunelse
510*4882a593Smuzhiyun# Otherwise, just install the unique image generated by the kernel
511*4882a593Smuzhiyun# build process.
512*4882a593Smuzhiyundefine LINUX_INSTALL_IMAGE
513*4882a593Smuzhiyun	$(INSTALL) -m 0644 -D $(LINUX_IMAGE_PATH) $(1)/$(notdir $(LINUX_IMAGE_NAME))
514*4882a593Smuzhiyunendef
515*4882a593Smuzhiyunendif
516*4882a593Smuzhiyun
517*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_INSTALL_TARGET),y)
518*4882a593Smuzhiyundefine LINUX_INSTALL_KERNEL_IMAGE_TO_TARGET
519*4882a593Smuzhiyun	$(call LINUX_INSTALL_IMAGE,$(TARGET_DIR)/boot)
520*4882a593Smuzhiyun	$(call LINUX_INSTALL_DTB,$(TARGET_DIR)/boot)
521*4882a593Smuzhiyunendef
522*4882a593Smuzhiyunendif
523*4882a593Smuzhiyun
524*4882a593Smuzhiyundefine LINUX_INSTALL_HOST_TOOLS
525*4882a593Smuzhiyun	# Installing dtc (device tree compiler) as host tool, if selected
526*4882a593Smuzhiyun	if grep -q "CONFIG_DTC=y" $(@D)/.config; then \
527*4882a593Smuzhiyun		$(INSTALL) -D -m 0755 $(@D)/scripts/dtc/dtc $(HOST_DIR)/bin/linux-dtc ; \
528*4882a593Smuzhiyun		$(if $(BR2_PACKAGE_HOST_DTC),,ln -sf linux-dtc $(HOST_DIR)/bin/dtc;) \
529*4882a593Smuzhiyun	fi
530*4882a593Smuzhiyunendef
531*4882a593Smuzhiyun
532*4882a593Smuzhiyundefine LINUX_INSTALL_IMAGES_CMDS
533*4882a593Smuzhiyun	$(call LINUX_INSTALL_IMAGE,$(BINARIES_DIR))
534*4882a593Smuzhiyun	$(call LINUX_INSTALL_DTB,$(BINARIES_DIR))
535*4882a593Smuzhiyunendef
536*4882a593Smuzhiyun
537*4882a593Smuzhiyunifeq ($(BR2_STRIP_strip),y)
538*4882a593SmuzhiyunLINUX_MAKE_FLAGS += INSTALL_MOD_STRIP=1
539*4882a593Smuzhiyunendif
540*4882a593Smuzhiyun
541*4882a593Smuzhiyundefine LINUX_INSTALL_TARGET_CMDS
542*4882a593Smuzhiyun	$(LINUX_INSTALL_KERNEL_IMAGE_TO_TARGET)
543*4882a593Smuzhiyun	# Install modules and remove symbolic links pointing to build
544*4882a593Smuzhiyun	# directories, not relevant on the target
545*4882a593Smuzhiyun	@if grep -q "CONFIG_MODULES=y" $(@D)/.config; then \
546*4882a593Smuzhiyun		$(LINUX_MAKE_ENV) $(MAKE1) $(LINUX_MAKE_FLAGS) -C $(@D) modules_install; \
547*4882a593Smuzhiyun		rm -f $(TARGET_DIR)/lib/modules/$(LINUX_VERSION_PROBED)/build ; \
548*4882a593Smuzhiyun		rm -f $(TARGET_DIR)/lib/modules/$(LINUX_VERSION_PROBED)/source ; \
549*4882a593Smuzhiyun	fi
550*4882a593Smuzhiyun	$(LINUX_INSTALL_HOST_TOOLS)
551*4882a593Smuzhiyunendef
552*4882a593Smuzhiyun
553*4882a593Smuzhiyun# Run depmod in a target-finalize hook, to encompass modules installed by
554*4882a593Smuzhiyun# packages.
555*4882a593Smuzhiyundefine LINUX_RUN_DEPMOD
556*4882a593Smuzhiyun	if test -d $(TARGET_DIR)/lib/modules/$(LINUX_VERSION_PROBED) \
557*4882a593Smuzhiyun		&& grep -q "CONFIG_MODULES=y" $(LINUX_DIR)/.config; then \
558*4882a593Smuzhiyun		$(HOST_DIR)/sbin/depmod -a -b $(TARGET_DIR) $(LINUX_VERSION_PROBED); \
559*4882a593Smuzhiyun	fi
560*4882a593Smuzhiyunendef
561*4882a593SmuzhiyunLINUX_TARGET_FINALIZE_HOOKS += LINUX_RUN_DEPMOD
562*4882a593Smuzhiyun
563*4882a593Smuzhiyun# Include all our extensions.
564*4882a593Smuzhiyun#
565*4882a593Smuzhiyun# Note: our package infrastructure uses the full-path of the last-scanned
566*4882a593Smuzhiyun# Makefile to determine what package we're currently defining, using the
567*4882a593Smuzhiyun# last directory component in the path. Additionally, the full path of
568*4882a593Smuzhiyun# the package directory is also stored in _PKGDIR (e.g. to find patches)
569*4882a593Smuzhiyun#
570*4882a593Smuzhiyun# As such, including other Makefiles, like below, before we call one of
571*4882a593Smuzhiyun# the *-package macros usually doesn't work.
572*4882a593Smuzhiyun#
573*4882a593Smuzhiyun# However, by including the in-tree extensions after the ones from the
574*4882a593Smuzhiyun# br2-external trees, we're back to the situation where the last Makefile
575*4882a593Smuzhiyun# scanned *is* included from the correct directory.
576*4882a593Smuzhiyun#
577*4882a593Smuzhiyun# NOTE: this is very fragile, and extra care must be taken to ensure that
578*4882a593Smuzhiyun# we always end up with an in-tree included file. That's mostly OK, because
579*4882a593Smuzhiyun# we do have in-tree linux-extensions.
580*4882a593Smuzhiyun#
581*4882a593Smuzhiyuninclude $(sort $(wildcard $(foreach ext,$(BR2_EXTERNAL_DIRS), \
582*4882a593Smuzhiyun	$(ext)/linux/linux-ext-*.mk)))
583*4882a593Smuzhiyuninclude $(sort $(wildcard linux/linux-ext-*.mk))
584*4882a593Smuzhiyun
585*4882a593SmuzhiyunLINUX_PATCH_DEPENDENCIES += $(foreach ext,$(LINUX_EXTENSIONS),\
586*4882a593Smuzhiyun	$(if $(BR2_LINUX_KERNEL_EXT_$(call UPPERCASE,$(ext))),$(ext)))
587*4882a593Smuzhiyun
588*4882a593SmuzhiyunLINUX_PRE_PATCH_HOOKS += $(foreach ext,$(LINUX_EXTENSIONS),\
589*4882a593Smuzhiyun	$(if $(BR2_LINUX_KERNEL_EXT_$(call UPPERCASE,$(ext))),\
590*4882a593Smuzhiyun		$(call UPPERCASE,$(ext))_PREPARE_KERNEL))
591*4882a593Smuzhiyun
592*4882a593Smuzhiyun# Checks to give errors that the user can understand
593*4882a593Smuzhiyun
594*4882a593Smuzhiyun# When a custom repository has been set, check for the repository version
595*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_CUSTOM_SVN)$(BR2_LINUX_KERNEL_CUSTOM_GIT)$(BR2_LINUX_KERNEL_CUSTOM_HG),y)
596*4882a593Smuzhiyunifeq ($(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION)),)
597*4882a593Smuzhiyun$(error No custom repository version set. Check your BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION setting)
598*4882a593Smuzhiyunendif
599*4882a593Smuzhiyunifeq ($(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_REPO_URL)),)
600*4882a593Smuzhiyun$(error No custom repo URL set. Check your BR2_LINUX_KERNEL_CUSTOM_REPO_URL setting)
601*4882a593Smuzhiyunendif
602*4882a593Smuzhiyunendif
603*4882a593Smuzhiyun
604*4882a593Smuzhiyunifeq ($(BR_BUILDING),y)
605*4882a593Smuzhiyun
606*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_CUSTOM_VERSION),y)
607*4882a593Smuzhiyunifeq ($(LINUX_VERSION),)
608*4882a593Smuzhiyun$(error No custom kernel version set. Check your BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE setting)
609*4882a593Smuzhiyunendif
610*4882a593Smuzhiyunendif
611*4882a593Smuzhiyun
612*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_USE_DEFCONFIG),y)
613*4882a593Smuzhiyun# We must use the user-supplied kconfig value, because
614*4882a593Smuzhiyun# LINUX_KCONFIG_DEFCONFIG will at least contain the
615*4882a593Smuzhiyun# trailing _defconfig
616*4882a593Smuzhiyunifeq ($(call qstrip,$(BR2_LINUX_KERNEL_DEFCONFIG)),)
617*4882a593Smuzhiyun$(error No kernel defconfig name specified, check your BR2_LINUX_KERNEL_DEFCONFIG setting)
618*4882a593Smuzhiyunendif
619*4882a593Smuzhiyunendif
620*4882a593Smuzhiyun
621*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG),y)
622*4882a593Smuzhiyunifeq ($(LINUX_KCONFIG_FILE),)
623*4882a593Smuzhiyun$(error No kernel configuration file specified, check your BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE setting)
624*4882a593Smuzhiyunendif
625*4882a593Smuzhiyunendif
626*4882a593Smuzhiyun
627*4882a593Smuzhiyunifeq ($(BR2_LINUX_KERNEL_DTS_SUPPORT):$(strip $(LINUX_DTS_NAME)),y:)
628*4882a593Smuzhiyun$(error No kernel device tree source specified, check your \
629*4882a593Smuzhiyun	BR2_LINUX_KERNEL_INTREE_DTS_NAME / BR2_LINUX_KERNEL_CUSTOM_DTS_PATH settings)
630*4882a593Smuzhiyunendif
631*4882a593Smuzhiyun
632*4882a593Smuzhiyunendif # BR_BUILDING
633*4882a593Smuzhiyun
634*4882a593Smuzhiyun$(eval $(kconfig-package))
635*4882a593Smuzhiyun
636*4882a593Smuzhiyun# Support for rebuilding the kernel after the cpio archive has
637*4882a593Smuzhiyun# been generated.
638*4882a593Smuzhiyun.PHONY: linux-rebuild-with-initramfs
639*4882a593Smuzhiyunlinux-rebuild-with-initramfs: $(LINUX_DIR)/.stamp_target_installed
640*4882a593Smuzhiyunlinux-rebuild-with-initramfs: $(LINUX_DIR)/.stamp_images_installed
641*4882a593Smuzhiyunlinux-rebuild-with-initramfs: rootfs-cpio
642*4882a593Smuzhiyunlinux-rebuild-with-initramfs:
643*4882a593Smuzhiyun	@$(call MESSAGE,"Rebuilding kernel with initramfs")
644*4882a593Smuzhiyun	# Build the kernel.
645*4882a593Smuzhiyun	$(LINUX_MAKE_ENV) $(MAKE) $(LINUX_MAKE_FLAGS) -C $(LINUX_DIR) $(LINUX_TARGET_NAME)
646*4882a593Smuzhiyun	$(LINUX_APPEND_DTB)
647*4882a593Smuzhiyun	# Copy the kernel image(s) to its(their) final destination
648*4882a593Smuzhiyun	$(call LINUX_INSTALL_IMAGE,$(BINARIES_DIR))
649*4882a593Smuzhiyun	# If there is a .ub file copy it to the final destination
650*4882a593Smuzhiyun	test ! -f $(LINUX_IMAGE_PATH).ub || cp $(LINUX_IMAGE_PATH).ub $(BINARIES_DIR)
651