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