Alexandre Belloni | 95442bb | 2013-06-07 12:13:46 +0200 | [diff] [blame] | 1 | ################################################################################ |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 2 | # |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 3 | # Linux kernel target |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 4 | # |
Alexandre Belloni | 95442bb | 2013-06-07 12:13:46 +0200 | [diff] [blame] | 5 | ################################################################################ |
Alexandre Belloni | 7027040 | 2013-06-05 23:53:25 +0000 | [diff] [blame] | 6 | |
Jerzy Grzegorek | e0d9d33 | 2013-07-20 08:52:43 +0200 | [diff] [blame] | 7 | LINUX_VERSION = $(call qstrip,$(BR2_LINUX_KERNEL_VERSION)) |
Luca Ceresoli | 67f1836 | 2012-05-17 19:33:09 +0200 | [diff] [blame] | 8 | LINUX_LICENSE = GPLv2 |
| 9 | LINUX_LICENSE_FILES = COPYING |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 10 | |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 11 | # Compute LINUX_SOURCE and LINUX_SITE from the configuration |
| 12 | ifeq ($(LINUX_VERSION),custom) |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 13 | LINUX_TARBALL = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION)) |
Arnout Vandecappelle (Essensium/Mind) | 579fea2 | 2013-01-09 12:12:44 +0000 | [diff] [blame] | 14 | LINUX_SITE = $(patsubst %/,%,$(dir $(LINUX_TARBALL))) |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 15 | LINUX_SOURCE = $(notdir $(LINUX_TARBALL)) |
Thomas Petazzoni | 205fb19 | 2011-07-11 22:46:11 +0200 | [diff] [blame] | 16 | else ifeq ($(BR2_LINUX_KERNEL_CUSTOM_GIT),y) |
Thomas De Schampheleire | 63ecded | 2013-09-02 22:07:54 +0200 | [diff] [blame] | 17 | LINUX_SITE = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_REPO_URL)) |
Thomas Petazzoni | 205fb19 | 2011-07-11 22:46:11 +0200 | [diff] [blame] | 18 | LINUX_SITE_METHOD = git |
Thomas De Schampheleire | 63ecded | 2013-09-02 22:07:54 +0200 | [diff] [blame] | 19 | else ifeq ($(BR2_LINUX_KERNEL_CUSTOM_HG),y) |
| 20 | LINUX_SITE = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_REPO_URL)) |
| 21 | LINUX_SITE_METHOD = hg |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 22 | else |
Raúl Sánchez Siles | 98b5cc3 | 2013-05-11 01:40:36 +0000 | [diff] [blame] | 23 | LINUX_SOURCE = linux-$(LINUX_VERSION).tar.xz |
Thomas Petazzoni | f45f775 | 2011-07-11 22:46:16 +0200 | [diff] [blame] | 24 | # In X.Y.Z, get X and Y. We replace dots and dashes by spaces in order |
| 25 | # to use the $(word) function. We support versions such as 3.1, |
| 26 | # 2.6.32, 2.6.32-rc1, 3.0-rc6, etc. |
Gustavo Zacarias | 80d7b68 | 2011-10-24 11:54:03 -0300 | [diff] [blame] | 27 | ifeq ($(findstring x2.6.,x$(LINUX_VERSION)),x2.6.) |
| 28 | LINUX_SITE = $(BR2_KERNEL_MIRROR)/linux/kernel/v2.6/ |
| 29 | else |
| 30 | LINUX_SITE = $(BR2_KERNEL_MIRROR)/linux/kernel/v3.x/ |
| 31 | endif |
Thomas Petazzoni | f45f775 | 2011-07-11 22:46:16 +0200 | [diff] [blame] | 32 | # release candidates are in testing/ subdir |
| 33 | ifneq ($(findstring -rc,$(LINUX_VERSION)),) |
Peter Korsgaard | ea7f5ff | 2011-07-14 16:38:07 +0200 | [diff] [blame] | 34 | LINUX_SITE := $(LINUX_SITE)testing/ |
Thomas Petazzoni | f45f775 | 2011-07-11 22:46:16 +0200 | [diff] [blame] | 35 | endif # -rc |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 36 | endif |
| 37 | |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 38 | LINUX_PATCHES = $(call qstrip,$(BR2_LINUX_KERNEL_PATCH)) |
| 39 | |
| 40 | LINUX_INSTALL_IMAGES = YES |
Thomas Petazzoni | b483745 | 2013-08-27 19:28:33 +0200 | [diff] [blame] | 41 | LINUX_DEPENDENCIES += host-kmod host-lzop |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 42 | |
Maxime Ripard | 902609f | 2012-07-30 14:32:46 +0200 | [diff] [blame] | 43 | ifeq ($(BR2_LINUX_KERNEL_UBOOT_IMAGE),y) |
| 44 | LINUX_DEPENDENCIES += host-uboot-tools |
| 45 | endif |
| 46 | |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 47 | LINUX_MAKE_FLAGS = \ |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 48 | HOSTCC="$(HOSTCC)" \ |
| 49 | HOSTCFLAGS="$(HOSTCFLAGS)" \ |
| 50 | ARCH=$(KERNEL_ARCH) \ |
| 51 | INSTALL_MOD_PATH=$(TARGET_DIR) \ |
Martin Hicks | d10e46f | 2011-02-01 12:13:00 -0500 | [diff] [blame] | 52 | CROSS_COMPILE="$(CCACHE) $(TARGET_CROSS)" \ |
Peter Korsgaard | cc34519 | 2013-09-10 21:54:59 +0200 | [diff] [blame] | 53 | DEPMOD=$(HOST_DIR)/sbin/depmod |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 54 | |
| 55 | # Get the real Linux version, which tells us where kernel modules are |
| 56 | # going to be installed in the target filesystem. |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 57 | LINUX_VERSION_PROBED = $(shell $(MAKE) $(LINUX_MAKE_FLAGS) -C $(LINUX_DIR) --no-print-directory -s kernelrelease) |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 58 | |
Maxime Ripard | 69fc497 | 2012-07-30 14:32:45 +0200 | [diff] [blame] | 59 | ifeq ($(BR2_LINUX_KERNEL_USE_INTREE_DTS),y) |
Peter Korsgaard | 309c2f5 | 2012-12-21 08:39:14 +0100 | [diff] [blame] | 60 | KERNEL_DTS_NAME = $(call qstrip,$(BR2_LINUX_KERNEL_INTREE_DTS_NAME)) |
Maxime Ripard | 69fc497 | 2012-07-30 14:32:45 +0200 | [diff] [blame] | 61 | else ifeq ($(BR2_LINUX_KERNEL_USE_CUSTOM_DTS),y) |
Thomas Petazzoni | 82d2a47 | 2013-06-05 06:21:09 +0000 | [diff] [blame] | 62 | KERNEL_DTS_NAME = $(basename $(notdir $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_DTS_PATH)))) |
Maxime Ripard | 69fc497 | 2012-07-30 14:32:45 +0200 | [diff] [blame] | 63 | endif |
| 64 | |
Peter Korsgaard | 0ffdc16 | 2013-04-15 08:55:53 +0200 | [diff] [blame] | 65 | ifeq ($(BR2_LINUX_KERNEL_DTS_SUPPORT)$(KERNEL_DTS_NAME),y) |
| 66 | $(error No kernel device tree source specified, check your \ |
| 67 | BR2_LINUX_KERNEL_USE_INTREE_DTS / BR2_LINUX_KERNEL_USE_CUSTOM_DTS settings) |
| 68 | endif |
| 69 | |
Maxime Ripard | 978928e | 2012-07-30 14:32:47 +0200 | [diff] [blame] | 70 | ifeq ($(BR2_LINUX_KERNEL_APPENDED_DTB),y) |
| 71 | ifneq ($(words $(KERNEL_DTS_NAME)),1) |
| 72 | $(error Kernel with appended device tree needs exactly one DTS source.\ |
| 73 | Check BR2_LINUX_KERNEL_INTREE_DTS_NAME or BR2_LINUX_KERNEL_CUSTOM_DTS_PATH.) |
| 74 | endif |
| 75 | endif |
| 76 | |
Peter Korsgaard | 309c2f5 | 2012-12-21 08:39:14 +0100 | [diff] [blame] | 77 | KERNEL_DTBS = $(addsuffix .dtb,$(KERNEL_DTS_NAME)) |
| 78 | |
Martin Hicks | e2ed6c8 | 2011-03-21 13:39:43 -0400 | [diff] [blame] | 79 | ifeq ($(BR2_LINUX_KERNEL_IMAGE_TARGET_CUSTOM),y) |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 80 | LINUX_IMAGE_NAME=$(call qstrip,$(BR2_LINUX_KERNEL_IMAGE_TARGET_NAME)) |
Martin Hicks | e2ed6c8 | 2011-03-21 13:39:43 -0400 | [diff] [blame] | 81 | else |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 82 | ifeq ($(BR2_LINUX_KERNEL_UIMAGE),y) |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 83 | LINUX_IMAGE_NAME=uImage |
Maxime Ripard | 978928e | 2012-07-30 14:32:47 +0200 | [diff] [blame] | 84 | else ifeq ($(BR2_LINUX_KERNEL_APPENDED_UIMAGE),y) |
| 85 | LINUX_IMAGE_NAME=uImage |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 86 | else ifeq ($(BR2_LINUX_KERNEL_BZIMAGE),y) |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 87 | LINUX_IMAGE_NAME=bzImage |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 88 | else ifeq ($(BR2_LINUX_KERNEL_ZIMAGE),y) |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 89 | LINUX_IMAGE_NAME=zImage |
Maxime Ripard | 978928e | 2012-07-30 14:32:47 +0200 | [diff] [blame] | 90 | else ifeq ($(BR2_LINUX_KERNEL_APPENDED_ZIMAGE),y) |
| 91 | LINUX_IMAGE_NAME=zImage |
Maxime Ripard | 18e752d | 2012-07-30 14:32:48 +0200 | [diff] [blame] | 92 | else ifeq ($(BR2_LINUX_KERNEL_CUIMAGE),y) |
| 93 | LINUX_IMAGE_NAME=cuImage.$(KERNEL_DTS_NAME) |
| 94 | else ifeq ($(BR2_LINUX_KERNEL_SIMPLEIMAGE),y) |
| 95 | LINUX_IMAGE_NAME=simpleImage.$(KERNEL_DTS_NAME) |
| 96 | else ifeq ($(BR2_LINUX_KERNEL_LINUX_BIN),y) |
| 97 | LINUX_IMAGE_NAME=linux.bin |
Thomas Petazzoni | b626dc0 | 2010-09-01 15:26:24 +0200 | [diff] [blame] | 98 | else ifeq ($(BR2_LINUX_KERNEL_VMLINUX_BIN),y) |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 99 | LINUX_IMAGE_NAME=vmlinux.bin |
Thomas Petazzoni | 71c0502 | 2010-12-05 21:53:23 +0100 | [diff] [blame] | 100 | else ifeq ($(BR2_LINUX_KERNEL_VMLINUX),y) |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 101 | LINUX_IMAGE_NAME=vmlinux |
Kelvin Cheung | c1485d5 | 2011-09-20 17:01:26 +0800 | [diff] [blame] | 102 | else ifeq ($(BR2_LINUX_KERNEL_VMLINUZ),y) |
| 103 | LINUX_IMAGE_NAME=vmlinuz |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 104 | endif |
Martin Hicks | e2ed6c8 | 2011-03-21 13:39:43 -0400 | [diff] [blame] | 105 | endif |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 106 | |
Julien Boibessot | 8215e19 | 2013-03-13 11:13:24 +0000 | [diff] [blame] | 107 | LINUX_KERNEL_UIMAGE_LOADADDR=$(call qstrip,$(BR2_LINUX_KERNEL_UIMAGE_LOADADDR)) |
| 108 | ifneq ($(LINUX_KERNEL_UIMAGE_LOADADDR),) |
| 109 | LINUX_MAKE_FLAGS+=LOADADDR="$(LINUX_KERNEL_UIMAGE_LOADADDR)" |
| 110 | endif |
| 111 | |
Thomas Petazzoni | 84c4a10 | 2010-12-05 21:53:26 +0100 | [diff] [blame] | 112 | # Compute the arch path, since i386 and x86_64 are in arch/x86 and not |
| 113 | # in arch/$(KERNEL_ARCH). Even if the kernel creates symbolic links |
| 114 | # for bzImage, arch/i386 and arch/x86_64 do not exist when copying the |
| 115 | # defconfig file. |
| 116 | ifeq ($(KERNEL_ARCH),i386) |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 117 | KERNEL_ARCH_PATH=$(LINUX_DIR)/arch/x86 |
Thomas Petazzoni | 84c4a10 | 2010-12-05 21:53:26 +0100 | [diff] [blame] | 118 | else ifeq ($(KERNEL_ARCH),x86_64) |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 119 | KERNEL_ARCH_PATH=$(LINUX_DIR)/arch/x86 |
Thomas Petazzoni | 84c4a10 | 2010-12-05 21:53:26 +0100 | [diff] [blame] | 120 | else |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 121 | KERNEL_ARCH_PATH=$(LINUX_DIR)/arch/$(KERNEL_ARCH) |
Thomas Petazzoni | 84c4a10 | 2010-12-05 21:53:26 +0100 | [diff] [blame] | 122 | endif |
| 123 | |
Thomas Petazzoni | 71c0502 | 2010-12-05 21:53:23 +0100 | [diff] [blame] | 124 | ifeq ($(BR2_LINUX_KERNEL_VMLINUX),y) |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 125 | LINUX_IMAGE_PATH=$(LINUX_DIR)/$(LINUX_IMAGE_NAME) |
Kelvin Cheung | c1485d5 | 2011-09-20 17:01:26 +0800 | [diff] [blame] | 126 | else ifeq ($(BR2_LINUX_KERNEL_VMLINUZ),y) |
| 127 | LINUX_IMAGE_PATH=$(LINUX_DIR)/$(LINUX_IMAGE_NAME) |
Thomas Petazzoni | 71c0502 | 2010-12-05 21:53:23 +0100 | [diff] [blame] | 128 | else |
Thomas Petazzoni | 9665263 | 2010-09-07 15:08:07 +0200 | [diff] [blame] | 129 | ifeq ($(KERNEL_ARCH),avr32) |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 130 | LINUX_IMAGE_PATH=$(KERNEL_ARCH_PATH)/boot/images/$(LINUX_IMAGE_NAME) |
Thomas Petazzoni | 9665263 | 2010-09-07 15:08:07 +0200 | [diff] [blame] | 131 | else |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 132 | LINUX_IMAGE_PATH=$(KERNEL_ARCH_PATH)/boot/$(LINUX_IMAGE_NAME) |
Thomas Petazzoni | 9665263 | 2010-09-07 15:08:07 +0200 | [diff] [blame] | 133 | endif |
Thomas Petazzoni | 71c0502 | 2010-12-05 21:53:23 +0100 | [diff] [blame] | 134 | endif # BR2_LINUX_KERNEL_VMLINUX |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 135 | |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 136 | define LINUX_DOWNLOAD_PATCHES |
| 137 | $(if $(LINUX_PATCHES), |
| 138 | @$(call MESSAGE,"Download additional patches")) |
| 139 | $(foreach patch,$(filter ftp://% http://%,$(LINUX_PATCHES)),\ |
Alvaro G. M | 0a4856c | 2012-03-16 14:42:53 +0100 | [diff] [blame] | 140 | $(call DOWNLOAD,$(patch))$(sep)) |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 141 | endef |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 142 | |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 143 | LINUX_POST_DOWNLOAD_HOOKS += LINUX_DOWNLOAD_PATCHES |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 144 | |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 145 | define LINUX_APPLY_PATCHES |
| 146 | for p in $(LINUX_PATCHES) ; do \ |
Thomas Petazzoni | 55b0a37 | 2010-12-05 21:53:18 +0100 | [diff] [blame] | 147 | if echo $$p | grep -q -E "^ftp://|^http://" ; then \ |
Thomas Petazzoni | 59a326b | 2011-08-31 23:35:04 +0200 | [diff] [blame] | 148 | support/scripts/apply-patches.sh $(@D) $(DL_DIR) `basename $$p` ; \ |
Thomas Petazzoni | 55b0a37 | 2010-12-05 21:53:18 +0100 | [diff] [blame] | 149 | elif test -d $$p ; then \ |
Thomas Petazzoni | 59a326b | 2011-08-31 23:35:04 +0200 | [diff] [blame] | 150 | support/scripts/apply-patches.sh $(@D) $$p linux-\*.patch ; \ |
Thomas Petazzoni | 55b0a37 | 2010-12-05 21:53:18 +0100 | [diff] [blame] | 151 | else \ |
Thomas Petazzoni | 59a326b | 2011-08-31 23:35:04 +0200 | [diff] [blame] | 152 | support/scripts/apply-patches.sh $(@D) `dirname $$p` `basename $$p` ; \ |
Thomas Petazzoni | 55b0a37 | 2010-12-05 21:53:18 +0100 | [diff] [blame] | 153 | fi \ |
| 154 | done |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 155 | endef |
| 156 | |
| 157 | LINUX_POST_PATCH_HOOKS += LINUX_APPLY_PATCHES |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 158 | |
| 159 | |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 160 | ifeq ($(BR2_LINUX_KERNEL_USE_DEFCONFIG),y) |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 161 | KERNEL_SOURCE_CONFIG = $(KERNEL_ARCH_PATH)/configs/$(call qstrip,$(BR2_LINUX_KERNEL_DEFCONFIG))_defconfig |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 162 | else ifeq ($(BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG),y) |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 163 | KERNEL_SOURCE_CONFIG = $(BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE) |
| 164 | endif |
| 165 | |
| 166 | define LINUX_CONFIGURE_CMDS |
Yann E. MORIN | 0a541c8 | 2014-01-28 21:11:23 +0100 | [diff] [blame^] | 167 | $(INSTALL) -m 0644 $(KERNEL_SOURCE_CONFIG) $(KERNEL_ARCH_PATH)/configs/buildroot_defconfig |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 168 | $(TARGET_MAKE_ENV) $(MAKE1) $(LINUX_MAKE_FLAGS) -C $(@D) buildroot_defconfig |
Thomas Petazzoni | 84c4a10 | 2010-12-05 21:53:26 +0100 | [diff] [blame] | 169 | rm $(KERNEL_ARCH_PATH)/configs/buildroot_defconfig |
Yann E. MORIN | 72189e5 | 2013-07-14 00:27:30 +0200 | [diff] [blame] | 170 | $(if $(BR2_arm)$(BR2_armeb), |
| 171 | $(call KCONFIG_ENABLE_OPT,CONFIG_AEABI,$(@D)/.config)) |
Thomas Petazzoni | ed23c92 | 2013-12-29 18:33:45 +0100 | [diff] [blame] | 172 | $(if $(BR2_TARGET_ROOTFS_CPIO), |
| 173 | $(call KCONFIG_ENABLE_OPT,CONFIG_BLK_DEV_INITRD,$(@D)/.config)) |
Thomas Petazzoni | f507921 | 2010-06-13 19:19:38 +0200 | [diff] [blame] | 174 | # As the kernel gets compiled before root filesystems are |
Arnout Vandecappelle (Essensium/Mind) | 13a3afc | 2011-09-06 23:16:09 +0200 | [diff] [blame] | 175 | # built, we create a fake cpio file. It'll be |
| 176 | # replaced later by the real cpio archive, and the kernel will be |
Thomas Petazzoni | f507921 | 2010-06-13 19:19:38 +0200 | [diff] [blame] | 177 | # rebuilt using the linux26-rebuild-with-initramfs target. |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 178 | $(if $(BR2_TARGET_ROOTFS_INITRAMFS), |
Arnout Vandecappelle (Essensium/Mind) | 13a3afc | 2011-09-06 23:16:09 +0200 | [diff] [blame] | 179 | touch $(BINARIES_DIR)/rootfs.cpio |
Arnout Vandecappelle (Essensium/Mind) | 13a3afc | 2011-09-06 23:16:09 +0200 | [diff] [blame] | 180 | $(call KCONFIG_SET_OPT,CONFIG_INITRAMFS_SOURCE,\"$(BINARIES_DIR)/rootfs.cpio\",$(@D)/.config) |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 181 | $(call KCONFIG_SET_OPT,CONFIG_INITRAMFS_ROOT_UID,0,$(@D)/.config) |
Valentine Barshak | 391c82e | 2012-10-10 03:34:56 +0400 | [diff] [blame] | 182 | $(call KCONFIG_SET_OPT,CONFIG_INITRAMFS_ROOT_GID,0,$(@D)/.config)) |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 183 | $(if $(BR2_ROOTFS_DEVICE_CREATION_STATIC),, |
| 184 | $(call KCONFIG_ENABLE_OPT,CONFIG_DEVTMPFS,$(@D)/.config) |
| 185 | $(call KCONFIG_ENABLE_OPT,CONFIG_DEVTMPFS_MOUNT,$(@D)/.config)) |
| 186 | $(if $(BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_MDEV), |
| 187 | $(call KCONFIG_SET_OPT,CONFIG_UEVENT_HELPER_PATH,\"/sbin/mdev\",$(@D)/.config)) |
Jeremy Rosen | bd53398 | 2014-01-08 14:48:33 +0100 | [diff] [blame] | 188 | $(if $(BR2_ROOTFS_DEVICE_CREATION_DYNAMIC_UDEV), |
| 189 | $(call KCONFIG_ENABLE_OPT,CONFIG_INOTIFY_USER,$(@D)/.config)) |
Anders Darander | aaef2ca | 2013-12-16 11:53:20 +0100 | [diff] [blame] | 190 | $(if $(BR2_PACKAGE_KTAP), |
| 191 | $(call KCONFIG_ENABLE_OPT,CONFIG_DEBUG_FS,$(@D)/.config) |
| 192 | $(call KCONFIG_ENABLE_OPT,CONFIG_EVENT_TRACING,$(@D)/.config) |
| 193 | $(call KCONFIG_ENABLE_OPT,CONFIG_PERF_EVENTS,$(@D)/.config) |
| 194 | $(call KCONFIG_ENABLE_OPT,CONFIG_FUNCTION_TRACER,$(@D)/.config)) |
Maxime Ripard | 90759a6 | 2012-03-23 16:49:53 +0100 | [diff] [blame] | 195 | $(if $(BR2_PACKAGE_SYSTEMD), |
| 196 | $(call KCONFIG_ENABLE_OPT,CONFIG_CGROUPS,$(@D)/.config)) |
Maxime Ripard | 978928e | 2012-07-30 14:32:47 +0200 | [diff] [blame] | 197 | $(if $(BR2_LINUX_KERNEL_APPENDED_DTB), |
| 198 | $(call KCONFIG_ENABLE_OPT,CONFIG_ARM_APPENDED_DTB,$(@D)/.config)) |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 199 | yes '' | $(TARGET_MAKE_ENV) $(MAKE1) $(LINUX_MAKE_FLAGS) -C $(@D) oldconfig |
| 200 | endef |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 201 | |
Maxime Ripard | 69fc497 | 2012-07-30 14:32:45 +0200 | [diff] [blame] | 202 | ifeq ($(BR2_LINUX_KERNEL_DTS_SUPPORT),y) |
Maxime Ripard | 978928e | 2012-07-30 14:32:47 +0200 | [diff] [blame] | 203 | ifeq ($(BR2_LINUX_KERNEL_DTB_IS_SELF_BUILT),) |
Maxime Ripard | 69fc497 | 2012-07-30 14:32:45 +0200 | [diff] [blame] | 204 | define LINUX_BUILD_DTB |
Peter Korsgaard | 309c2f5 | 2012-12-21 08:39:14 +0100 | [diff] [blame] | 205 | $(TARGET_MAKE_ENV) $(MAKE) $(LINUX_MAKE_FLAGS) -C $(@D) $(KERNEL_DTBS) |
Maxime Ripard | 69fc497 | 2012-07-30 14:32:45 +0200 | [diff] [blame] | 206 | endef |
| 207 | define LINUX_INSTALL_DTB |
Peter Korsgaard | 3cab8aa | 2013-04-14 19:31:30 +0200 | [diff] [blame] | 208 | # dtbs moved from arch/<ARCH>/boot to arch/<ARCH>/boot/dts since 3.8-rc1 |
Peter Korsgaard | ef34705 | 2012-12-21 09:07:45 +0100 | [diff] [blame] | 209 | cp $(addprefix \ |
| 210 | $(KERNEL_ARCH_PATH)/boot/$(if $(wildcard \ |
| 211 | $(addprefix $(KERNEL_ARCH_PATH)/boot/dts/,$(KERNEL_DTBS))),dts/),$(KERNEL_DTBS)) \ |
Maxime Ripard | dd1aa62 | 2012-12-19 22:48:09 +0000 | [diff] [blame] | 212 | $(BINARIES_DIR)/ |
Maxime Ripard | 69fc497 | 2012-07-30 14:32:45 +0200 | [diff] [blame] | 213 | endef |
Maxime Ripard | 88d350c | 2013-02-14 04:27:54 +0000 | [diff] [blame] | 214 | define LINUX_INSTALL_DTB_TARGET |
Peter Korsgaard | 3cab8aa | 2013-04-14 19:31:30 +0200 | [diff] [blame] | 215 | # dtbs moved from arch/<ARCH>/boot to arch/<ARCH>/boot/dts since 3.8-rc1 |
Maxime Ripard | 88d350c | 2013-02-14 04:27:54 +0000 | [diff] [blame] | 216 | cp $(addprefix \ |
| 217 | $(KERNEL_ARCH_PATH)/boot/$(if $(wildcard \ |
| 218 | $(addprefix $(KERNEL_ARCH_PATH)/boot/dts/,$(KERNEL_DTBS))),dts/),$(KERNEL_DTBS)) \ |
| 219 | $(TARGET_DIR)/boot/ |
| 220 | endef |
Maxime Ripard | 69fc497 | 2012-07-30 14:32:45 +0200 | [diff] [blame] | 221 | endif |
Maxime Ripard | 978928e | 2012-07-30 14:32:47 +0200 | [diff] [blame] | 222 | endif |
| 223 | |
Arnout Vandecappelle (Essensium/Mind) | a1cfe20 | 2013-01-08 11:23:56 +0000 | [diff] [blame] | 224 | ifeq ($(BR2_LINUX_KERNEL_APPENDED_DTB),y) |
| 225 | # dtbs moved from arch/$ARCH/boot to arch/$ARCH/boot/dts since 3.8-rc1 |
| 226 | define LINUX_APPEND_DTB |
| 227 | if [ -e $(KERNEL_ARCH_PATH)/boot/$(KERNEL_DTS_NAME).dtb ]; then \ |
| 228 | cat $(KERNEL_ARCH_PATH)/boot/$(KERNEL_DTS_NAME).dtb; \ |
| 229 | else \ |
| 230 | cat $(KERNEL_ARCH_PATH)/boot/dts/$(KERNEL_DTS_NAME).dtb; \ |
| 231 | fi >> $(KERNEL_ARCH_PATH)/boot/zImage |
| 232 | endef |
Maxime Ripard | 978928e | 2012-07-30 14:32:47 +0200 | [diff] [blame] | 233 | ifeq ($(BR2_LINUX_KERNEL_APPENDED_UIMAGE),y) |
Maxime Ripard | ae86a3c | 2013-06-07 15:21:43 +0200 | [diff] [blame] | 234 | # We need to generate a new u-boot image that takes into |
| 235 | # account the extra-size added by the device tree at the end |
| 236 | # of the image. To do so, we first need to retrieve both load |
| 237 | # address and entry point for the kernel from the already |
| 238 | # generate uboot image before using mkimage -l. |
Arnout Vandecappelle | 13ae007 | 2013-11-07 00:12:35 +0100 | [diff] [blame] | 239 | LINUX_APPEND_DTB += $(sep) MKIMAGE_ARGS=`$(MKIMAGE) -l $(LINUX_IMAGE_PATH) |\ |
Maxime Ripard | ae86a3c | 2013-06-07 15:21:43 +0200 | [diff] [blame] | 240 | sed -n -e 's/Image Name:[ ]*\(.*\)/-n \1/p' -e 's/Load Address:/-a/p' -e 's/Entry Point:/-e/p'`; \ |
Arnout Vandecappelle | 13ae007 | 2013-11-07 00:12:35 +0100 | [diff] [blame] | 241 | $(MKIMAGE) -A $(MKIMAGE_ARCH) -O linux \ |
Maxime Ripard | ae86a3c | 2013-06-07 15:21:43 +0200 | [diff] [blame] | 242 | -T kernel -C none $${MKIMAGE_ARGS} \ |
| 243 | -d $(KERNEL_ARCH_PATH)/boot/zImage $(LINUX_IMAGE_PATH); |
Arnout Vandecappelle (Essensium/Mind) | a1cfe20 | 2013-01-08 11:23:56 +0000 | [diff] [blame] | 244 | endif |
Maxime Ripard | 978928e | 2012-07-30 14:32:47 +0200 | [diff] [blame] | 245 | endif |
Maxime Ripard | 69fc497 | 2012-07-30 14:32:45 +0200 | [diff] [blame] | 246 | |
Thomas Petazzoni | 4944e8c | 2010-06-13 19:18:34 +0200 | [diff] [blame] | 247 | # Compilation. We make sure the kernel gets rebuilt when the |
| 248 | # configuration has changed. |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 249 | define LINUX_BUILD_CMDS |
Maxime Ripard | 69fc497 | 2012-07-30 14:32:45 +0200 | [diff] [blame] | 250 | $(if $(BR2_LINUX_KERNEL_USE_CUSTOM_DTS), |
| 251 | cp $(BR2_LINUX_KERNEL_CUSTOM_DTS_PATH) $(KERNEL_ARCH_PATH)/boot/dts/) |
Maxime Ripard | ae86a3c | 2013-06-07 15:21:43 +0200 | [diff] [blame] | 252 | $(TARGET_MAKE_ENV) $(MAKE) $(LINUX_MAKE_FLAGS) -C $(@D) $(LINUX_IMAGE_NAME) |
Peter Korsgaard | ce03b89 | 2011-07-07 23:40:09 +0200 | [diff] [blame] | 253 | @if grep -q "CONFIG_MODULES=y" $(@D)/.config; then \ |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 254 | $(TARGET_MAKE_ENV) $(MAKE) $(LINUX_MAKE_FLAGS) -C $(@D) modules ; \ |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 255 | fi |
Maxime Ripard | 69fc497 | 2012-07-30 14:32:45 +0200 | [diff] [blame] | 256 | $(LINUX_BUILD_DTB) |
Maxime Ripard | 978928e | 2012-07-30 14:32:47 +0200 | [diff] [blame] | 257 | $(LINUX_APPEND_DTB) |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 258 | endef |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 259 | |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 260 | |
Thomas Petazzoni | eff25f4 | 2011-07-05 21:53:54 +0200 | [diff] [blame] | 261 | ifeq ($(BR2_LINUX_KERNEL_INSTALL_TARGET),y) |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 262 | define LINUX_INSTALL_KERNEL_IMAGE_TO_TARGET |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 263 | install -m 0644 -D $(LINUX_IMAGE_PATH) $(TARGET_DIR)/boot/$(LINUX_IMAGE_NAME) |
Maxime Ripard | 88d350c | 2013-02-14 04:27:54 +0000 | [diff] [blame] | 264 | $(LINUX_INSTALL_DTB_TARGET) |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 265 | endef |
Thomas Petazzoni | eff25f4 | 2011-07-05 21:53:54 +0200 | [diff] [blame] | 266 | endif |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 267 | |
Thomas De Schampheleire | 707d44d | 2012-05-15 08:18:25 +0000 | [diff] [blame] | 268 | |
| 269 | define LINUX_INSTALL_HOST_TOOLS |
| 270 | # Installing dtc (device tree compiler) as host tool, if selected |
| 271 | if grep -q "CONFIG_DTC=y" $(@D)/.config; then \ |
| 272 | $(INSTALL) -D -m 0755 $(@D)/scripts/dtc/dtc $(HOST_DIR)/usr/bin/dtc ; \ |
| 273 | fi |
| 274 | endef |
| 275 | |
| 276 | |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 277 | define LINUX_INSTALL_IMAGES_CMDS |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 278 | cp $(LINUX_IMAGE_PATH) $(BINARIES_DIR) |
Reuben Dowle | 2355354 | 2013-03-27 23:01:15 +0000 | [diff] [blame] | 279 | $(LINUX_INSTALL_DTB) |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 280 | endef |
| 281 | |
| 282 | define LINUX_INSTALL_TARGET_CMDS |
| 283 | $(LINUX_INSTALL_KERNEL_IMAGE_TO_TARGET) |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 284 | # Install modules and remove symbolic links pointing to build |
| 285 | # directories, not relevant on the target |
Peter Korsgaard | ce03b89 | 2011-07-07 23:40:09 +0200 | [diff] [blame] | 286 | @if grep -q "CONFIG_MODULES=y" $(@D)/.config; then \ |
Peter Korsgaard | 3f81723 | 2013-09-11 13:21:53 +0200 | [diff] [blame] | 287 | $(TARGET_MAKE_ENV) $(MAKE1) $(LINUX_MAKE_FLAGS) -C $(@D) modules_install; \ |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 288 | rm -f $(TARGET_DIR)/lib/modules/$(LINUX_VERSION_PROBED)/build ; \ |
| 289 | rm -f $(TARGET_DIR)/lib/modules/$(LINUX_VERSION_PROBED)/source ; \ |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 290 | fi |
Thomas De Schampheleire | 707d44d | 2012-05-15 08:18:25 +0000 | [diff] [blame] | 291 | $(LINUX_INSTALL_HOST_TOOLS) |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 292 | endef |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 293 | |
Jérôme Pouiller | 741cbcc | 2013-09-03 10:45:41 +0200 | [diff] [blame] | 294 | include $(sort $(wildcard linux/linux-ext-*.mk)) |
Thomas De Schampheleire | 3011d23 | 2011-09-17 22:22:51 +0200 | [diff] [blame] | 295 | |
Arnout Vandecappelle (Essensium/Mind) | e1502eb | 2012-07-03 00:07:32 +0200 | [diff] [blame] | 296 | $(eval $(generic-package)) |
Thomas Petazzoni | 487e21c | 2010-04-03 18:46:46 +0200 | [diff] [blame] | 297 | |
Thomas Petazzoni | f18c516 | 2012-05-04 05:40:53 +0000 | [diff] [blame] | 298 | ifeq ($(BR2_LINUX_KERNEL),y) |
| 299 | linux-menuconfig linux-xconfig linux-gconfig linux-nconfig linux26-menuconfig linux26-xconfig linux26-gconfig linux26-nconfig: dirs linux-configure |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 300 | $(MAKE) $(LINUX_MAKE_FLAGS) -C $(LINUX_DIR) \ |
Peter Korsgaard | c1ce30f | 2010-12-27 22:50:18 +0100 | [diff] [blame] | 301 | $(subst linux-,,$(subst linux26-,,$@)) |
Thomas Petazzoni | 9af0ee8 | 2011-07-11 22:46:08 +0200 | [diff] [blame] | 302 | rm -f $(LINUX_DIR)/.stamp_{built,target_installed,images_installed} |
Thomas Petazzoni | 4944e8c | 2010-06-13 19:18:34 +0200 | [diff] [blame] | 303 | |
Thomas Petazzoni | f18c516 | 2012-05-04 05:40:53 +0000 | [diff] [blame] | 304 | linux-savedefconfig linux26-savedefconfig: dirs linux-configure |
Jean-Christophe PLAGNIOL-VILLARD | f5777ce | 2011-08-22 21:28:47 +0200 | [diff] [blame] | 305 | $(MAKE) $(LINUX_MAKE_FLAGS) -C $(LINUX_DIR) \ |
| 306 | $(subst linux-,,$(subst linux26-,,$@)) |
| 307 | |
Thomas De Schampheleire | 0900c12 | 2011-10-14 16:56:56 +0200 | [diff] [blame] | 308 | ifeq ($(BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG),y) |
Thomas Petazzoni | f18c516 | 2012-05-04 05:40:53 +0000 | [diff] [blame] | 309 | linux-update-config linux26-update-config: linux-configure $(LINUX_DIR)/.config |
Thomas De Schampheleire | 0900c12 | 2011-10-14 16:56:56 +0200 | [diff] [blame] | 310 | cp -f $(LINUX_DIR)/.config $(BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE) |
| 311 | |
| 312 | linux-update-defconfig linux26-update-defconfig: linux-savedefconfig |
| 313 | cp -f $(LINUX_DIR)/defconfig $(BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE) |
| 314 | else |
| 315 | linux-update-config linux26-update-config: ; |
| 316 | linux-update-defconfig linux26-update-defconfig: ; |
| 317 | endif |
Thomas Petazzoni | f18c516 | 2012-05-04 05:40:53 +0000 | [diff] [blame] | 318 | endif |
Thomas De Schampheleire | 0900c12 | 2011-10-14 16:56:56 +0200 | [diff] [blame] | 319 | |
Arnout Vandecappelle (Essensium/Mind) | 13a3afc | 2011-09-06 23:16:09 +0200 | [diff] [blame] | 320 | # Support for rebuilding the kernel after the cpio archive has |
| 321 | # been generated in $(BINARIES_DIR)/rootfs.cpio. |
| 322 | $(LINUX_DIR)/.stamp_initramfs_rebuilt: $(LINUX_DIR)/.stamp_target_installed $(LINUX_DIR)/.stamp_images_installed $(BINARIES_DIR)/rootfs.cpio |
Thomas Petazzoni | f507921 | 2010-06-13 19:19:38 +0200 | [diff] [blame] | 323 | @$(call MESSAGE,"Rebuilding kernel with initramfs") |
Thomas Petazzoni | f507921 | 2010-06-13 19:19:38 +0200 | [diff] [blame] | 324 | # Build the kernel. |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 325 | $(TARGET_MAKE_ENV) $(MAKE) $(LINUX_MAKE_FLAGS) -C $(@D) $(LINUX_IMAGE_NAME) |
Nathan Ford | 1ac04c3 | 2013-07-31 11:47:36 -0400 | [diff] [blame] | 326 | $(LINUX_APPEND_DTB) |
Thomas Petazzoni | f507921 | 2010-06-13 19:19:38 +0200 | [diff] [blame] | 327 | # Copy the kernel image to its final destination |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 328 | cp $(LINUX_IMAGE_PATH) $(BINARIES_DIR) |
Stephan Hoffmann | aaed42d | 2012-03-17 10:46:55 +0100 | [diff] [blame] | 329 | # If there is a .ub file copy it to the final destination |
Markus Kaindl | c9ccdf8 | 2012-03-21 02:19:04 +0100 | [diff] [blame] | 330 | test ! -f $(LINUX_IMAGE_PATH).ub || cp $(LINUX_IMAGE_PATH).ub $(BINARIES_DIR) |
Thomas Petazzoni | f507921 | 2010-06-13 19:19:38 +0200 | [diff] [blame] | 331 | $(Q)touch $@ |
| 332 | |
| 333 | # The initramfs building code must make sure this target gets called |
| 334 | # after it generated the initramfs list of files. |
Thomas Petazzoni | af52661 | 2011-07-11 22:46:07 +0200 | [diff] [blame] | 335 | linux-rebuild-with-initramfs linux26-rebuild-with-initramfs: $(LINUX_DIR)/.stamp_initramfs_rebuilt |
Thomas Petazzoni | f507921 | 2010-06-13 19:19:38 +0200 | [diff] [blame] | 336 | |
Thomas Petazzoni | af5dc83 | 2010-07-29 15:40:28 +0200 | [diff] [blame] | 337 | # Checks to give errors that the user can understand |
Peter Korsgaard | 3e5e39a | 2010-09-28 14:43:25 +0200 | [diff] [blame] | 338 | ifeq ($(filter source,$(MAKECMDGOALS)),) |
Thomas Petazzoni | af5dc83 | 2010-07-29 15:40:28 +0200 | [diff] [blame] | 339 | ifeq ($(BR2_LINUX_KERNEL_USE_DEFCONFIG),y) |
| 340 | ifeq ($(call qstrip,$(BR2_LINUX_KERNEL_DEFCONFIG)),) |
| 341 | $(error No kernel defconfig name specified, check your BR2_LINUX_KERNEL_DEFCONFIG setting) |
| 342 | endif |
| 343 | endif |
| 344 | |
| 345 | ifeq ($(BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG),y) |
| 346 | ifeq ($(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE)),) |
| 347 | $(error No kernel configuration file specified, check your BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE setting) |
| 348 | endif |
Peter Korsgaard | 3e5e39a | 2010-09-28 14:43:25 +0200 | [diff] [blame] | 349 | endif |
| 350 | |
| 351 | endif |