-$(LINUX_DIR)/vmlinux: $(STAMP_DIR)/.linux-compile pkg-install ramdisk-config
- $(MAKE) -C $(LINUX_DIR) CROSS_COMPILE="$(KERNEL_CROSS)" ARCH=$(LINUX_KARCH) PATH=$(TARGET_PATH)
-
-$(LINUX_KERNEL): $(LINUX_DIR)/vmlinux
- $(TARGET_CROSS)objcopy -O binary -R .reginfo -R .note -R .comment -R .mdebug -S $< $@
- touch -c $(LINUX_KERNEL)
-
-$(LINUX_DIR)/.modules_done:
- rm -rf $(KERNEL_BUILD_DIR)/modules
- $(MAKE) -C "$(LINUX_DIR)" CROSS_COMPILE="$(KERNEL_CROSS)" ARCH=$(LINUX_KARCH) PATH="$(TARGET_PATH)" modules
- $(MAKE) -C "$(LINUX_DIR)" CROSS_COMPILE="$(KERNEL_CROSS)" DEPMOD=true INSTALL_MOD_PATH=$(KERNEL_BUILD_DIR)/modules modules_install
- touch $(LINUX_DIR)/.modules_done
-
-modules: $(LINUX_DIR)/.modules_done
-packages: $(TARGETS)
-
-$(STAMP_DIR)/.linux-compile:
- @$(MAKE) modules
- @$(MAKE) packages
- ln -sf $(KERNEL_BUILD_DIR)/linux-$(LINUX_VERSION) $(BUILD_DIR)/linux
- touch $@
-
-$(KERNEL_IPKG):
- rm -rf $(KERNEL_IDIR)
- mkdir -p $(KERNEL_IDIR)/etc
- $(SCRIPT_DIR)/make-ipkg-dir.sh $(KERNEL_IDIR) ../control/kernel.control $(LINUX_VERSION)-$(BOARD)-$(LINUX_RELEASE) $(ARCH)
- if [ -f ./config/$(BOARD).modules ]; then \
- cp ./config/$(BOARD).modules $(KERNEL_IDIR)/etc/modules; \
- fi
- $(IPKG_BUILD) $(KERNEL_IDIR) $(KERNEL_BUILD_DIR)
-
-$(TOPDIR)/.kernel.mk:
- echo "BOARD:=$(BOARD)" > $@
- echo "LINUX_VERSION:=$(LINUX_VERSION)" >> $@
- echo "LINUX_RELEASE:=$(LINUX_RELEASE)" >> $@
-
-pkg-install: FORCE
- @{ [ "$(INSTALL_TARGETS)" != "" ] && $(IPKG) install $(INSTALL_TARGETS) || true; }
-
-source: $(DL_DIR)/$(LINUX_SOURCE)
-prepare: $(LINUX_DIR)/.configured
- @mkdir -p $(STAMP_DIR) $(PACKAGE_DIR)
-
-compile: prepare $(STAMP_DIR)/.linux-compile
-
-install: compile $(LINUX_KERNEL)
-
-mostlyclean: FORCE
- rm -f $(STAMP_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))
+
+ $(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
+ +$(MAKE) $(KERNEL_MAKEOPTS) 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 -F ' r __ksymtab' | sed -e 's,........ r __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
+ $(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: $(DL_DIR)/$(LINUX_SOURCE)
+ prepare: $(STAMP_CONFIGURED)
+ compile: $(LINUX_DIR)/.modules
+ $(MAKE) -C image compile TARGET_BUILD=
+
+ oldconfig menuconfig nconfig: $(STAMP_PREPARED) $(STAMP_CHECKED) FORCE
+ rm -f $(STAMP_CONFIGURED)
+ $(LINUX_RECONF_CMD) > $(LINUX_DIR)/.config
+ $(_SINGLE)$(MAKE) -C $(LINUX_DIR) $(KERNEL_MAKEOPTS) $$@
+ $(LINUX_RECONF_DIFF) $(LINUX_DIR)/.config > $(LINUX_RECONFIG_TARGET)
+
+ install: $(LINUX_DIR)/.image
+ +$(MAKE) -C image compile install TARGET_BUILD=
+
+ clean: FORCE