-$(LINUX_DIR)/vmlinux: ramdisk-config
- $(MAKE) -j$(CONFIG_JLEVEL) -C $(LINUX_DIR) CROSS_COMPILE="$(KERNEL_CROSS)" CC="$(KERNEL_CC)" ARCH=$(LINUX_KARCH) $(KERNELNAME)
-
-$(LINUX_KERNEL): $(LINUX_DIR)/vmlinux
- $(KERNEL_CROSS)objcopy -O binary -R .reginfo -R .note -R .comment -R .mdebug -S $< $@
- touch -c $(LINUX_KERNEL)
-
-$(LINUX_DIR)/.modules_done: $(LINUX_DIR)/.config
- rm -rf $(KERNEL_BUILD_DIR)/modules
- $(MAKE) -j$(CONFIG_JLEVEL) -C "$(LINUX_DIR)" CROSS_COMPILE="$(KERNEL_CROSS)" CC="$(KERNEL_CC)" ARCH=$(LINUX_KARCH) modules
- $(MAKE) -C "$(LINUX_DIR)" CROSS_COMPILE="$(KERNEL_CROSS)" CC="$(KERNEL_CC)" ARCH=$(LINUX_KARCH) DEPMOD=true INSTALL_MOD_PATH=$(KERNEL_BUILD_DIR)/modules modules_install
- touch $(LINUX_DIR)/.modules_done
-
-$(LINUX_DIR)/.linux-compile: $(LINUX_DIR)/.modules_done
- @rm -f $(BUILD_DIR)/linux
- ln -sf $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION) $(BUILD_DIR)/linux
- touch $@
-
-$(TOPDIR)/.kernel.mk: $(TOPDIR)/target/linux/$(BOARD)-$(KERNEL)/Makefile
- echo "CONFIG_BOARD:=$(BOARD)" > $@
- echo "CONFIG_KERNEL:=$(KERNEL)" >> $@
- echo "CONFIG_LINUX_VERSION:=$(LINUX_VERSION)" >> $@
- echo "CONFIG_LINUX_RELEASE:=$(LINUX_RELEASE)" >> $@
- echo "CONFIG_LINUX_KARCH:=$(LINUX_KARCH)" >> $@
-
-download: $(DL_DIR)/$(LINUX_SOURCE)
-prepare: $(LINUX_DIR)/.configured
- @mkdir -p $(LINUX_DIR)
-
-compile: prepare $(LINUX_DIR)/.linux-compile
-install: compile $(LINUX_KERNEL)
-
-mostlyclean: FORCE
- rm -f $(LINUX_DIR)/.linux-compile
- rm -f $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION)/.modules_done
- rm -f $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION)/.drivers-unpacked
- $(MAKE) -C $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION) clean
- rm -f $(LINUX_KERNEL)
-
-rebuild: FORCE
- -$(MAKE) mostlyclean
- if [ -f $(LINUX_KERNEL) ]; then \
- $(MAKE) clean; \
- fi
- $(MAKE) compile $(MAKE_TRACE)
-
-clean: FORCE
- rm -f $(STAMP_DIR)/.linux-compile
+define BuildKernel
+ $(if $(QUILT),$(Build/Quilt))
+ $(if $(LINUX_SITE),$(call Download,kernel))
+ $(if $(call qstrip,$(CONFIG_KERNEL_GIT_CLONE_URI)),$(call Download,git-kernel))
+
+ .NOTPARALLEL:
+
+ $(Kernel/Autoclean)
+ $(STAMP_PREPARED): $(if $(LINUX_SITE),$(DL_DIR)/$(LINUX_SOURCE))
+ -rm -rf $(KERNEL_BUILD_DIR)
+ -mkdir -p $(KERNEL_BUILD_DIR)
+ $(Kernel/Prepare)
+ touch $$@
+
+ $(KERNEL_BUILD_DIR)/symtab.h: FORCE
+ rm -f $(KERNEL_BUILD_DIR)/symtab.h
+ touch $(KERNEL_BUILD_DIR)/symtab.h
+ +$(KERNEL_MAKE) vmlinux
+ find $(LINUX_DIR) $(STAGING_DIR_ROOT)/lib/modules -name \*.ko | \
+ xargs $(TARGET_CROSS)nm | \
+ awk '$$$$1 == "U" { print $$$$2 } ' | \
+ sort -u > $(KERNEL_BUILD_DIR)/mod_symtab.txt
+ $(TARGET_CROSS)nm -n $(LINUX_DIR)/vmlinux.o | grep ' [rR] __ksymtab' | sed -e 's,........ [rR] __ksymtab_,,' > $(KERNEL_BUILD_DIR)/kernel_symtab.txt
+ grep -Ff $(KERNEL_BUILD_DIR)/mod_symtab.txt $(KERNEL_BUILD_DIR)/kernel_symtab.txt > $(KERNEL_BUILD_DIR)/sym_include.txt
+ grep -Fvf $(KERNEL_BUILD_DIR)/mod_symtab.txt $(KERNEL_BUILD_DIR)/kernel_symtab.txt > $(KERNEL_BUILD_DIR)/sym_exclude.txt
+ ( \
+ echo '#define SYMTAB_KEEP \'; \
+ cat $(KERNEL_BUILD_DIR)/sym_include.txt | \
+ awk '{print "KEEP(*(___ksymtab+" $$$$1 ")) \\" }'; \
+ echo; \
+ echo '#define SYMTAB_KEEP_GPL \'; \
+ cat $(KERNEL_BUILD_DIR)/sym_include.txt | \
+ awk '{print "KEEP(*(___ksymtab_gpl+" $$$$1 ")) \\" }'; \
+ echo; \
+ echo '#define SYMTAB_DISCARD \'; \
+ cat $(KERNEL_BUILD_DIR)/sym_exclude.txt | \
+ awk '{print "*(___ksymtab+" $$$$1 ") \\" }'; \
+ echo; \
+ echo '#define SYMTAB_DISCARD_GPL \'; \
+ cat $(KERNEL_BUILD_DIR)/sym_exclude.txt | \
+ awk '{print "*(___ksymtab_gpl+" $$$$1 ") \\" }'; \
+ echo; \
+ ) > $$@
+
+ $(STAMP_CONFIGURED): $(STAMP_PREPARED) $(LINUX_KCONFIG_LIST) $(TOPDIR)/.config FORCE
+ $(Kernel/Configure)
+ touch $$@
+
+ $(LINUX_DIR)/.modules: $(STAMP_CONFIGURED) $(LINUX_DIR)/.config FORCE
+ $(Kernel/CompileModules)
+ touch $$@
+
+ $(LINUX_DIR)/.image: $(STAMP_CONFIGURED) $(if $(CONFIG_STRIP_KERNEL_EXPORTS),$(KERNEL_BUILD_DIR)/symtab.h) FORCE
+ $(Kernel/CompileImage)
+ $(Kernel/CollectDebug)
+ touch $$@
+
+ mostlyclean: FORCE
+ $(Kernel/Clean)
+
+ define BuildKernel
+ endef
+
+ download: $(if $(LINUX_SITE),$(DL_DIR)/$(LINUX_SOURCE))
+ prepare: $(STAMP_PREPARED)
+ compile: $(LINUX_DIR)/.modules
+ $(MAKE) -C image compile TARGET_BUILD=
+
+ oldconfig menuconfig nconfig: $(STAMP_PREPARED) $(STAMP_CHECKED) FORCE
+ rm -f $(LINUX_DIR)/.config.prev
+ rm -f $(STAMP_CONFIGURED)
+ $(LINUX_RECONF_CMD) > $(LINUX_DIR)/.config
+ $(_SINGLE)$(KERNEL_MAKE) \
+ $(if $(findstring Darwin,$(HOST_OS)),HOST_LOADLIBES="-L$(STAGING_DIR_HOST)/lib -lncurses") \
+ $$@
+ $(LINUX_RECONF_DIFF) $(LINUX_DIR)/.config > $(LINUX_RECONFIG_TARGET)
+
+ install: $(LINUX_DIR)/.image
+ +$(MAKE) -C image compile install TARGET_BUILD=
+
+ clean: FORCE