+define Device/Build/kernel
+ _KERNEL_IMAGES += $(KDIR)/$$(KERNEL_NAME)
+ $(KDIR)/$$(KERNEL_NAME): image_prepare
+ $$(_TARGET): $$(if $$(KERNEL_INSTALL),$(BIN_DIR)/$$(KERNEL_IMAGE))
+ $(BIN_DIR)/$$(KERNEL_IMAGE): $(KDIR)/$$(KERNEL_IMAGE)
+ cp $$^ $$@
+ $(KDIR)/$$(KERNEL_IMAGE): $(KDIR)/$$(KERNEL_NAME)
+ @rm -f $$@
+ $$(call concat_cmd,$$(KERNEL))
+ $$(if $$(KERNEL_SIZE),$$(call Device/Build/check_size,$$(KERNEL_SIZE)))
+endef
+
+define Device/Build/image
+ $$(_TARGET): $(BIN_DIR)/$(call IMAGE_NAME,$(1),$(2))
+ $(eval $(call Device/Export,$(KDIR)/$(KERNEL_IMAGE),$(1)))
+ $(eval $(call Device/Export,$(KDIR)/$(KERNEL_INITRAMFS_IMAGE),$(1)))
+ $(eval $(call Device/Export,$(KDIR)/$(call IMAGE_NAME,$(1),$(2)),$(1)))
+ $(KDIR)/$(call IMAGE_NAME,$(1),$(2)): $(KDIR)/$$(KERNEL_IMAGE) $(KDIR)/root.$(1)
+ @rm -f $$@
+ [ -f $$(word 1,$$^) -a -f $$(word 2,$$^) ]
+ $$(call concat_cmd,$(if $(IMAGE/$(2)/$(1)),$(IMAGE/$(2)/$(1)),$(IMAGE/$(2))))
+
+ .IGNORE: $(BIN_DIR)/$(call IMAGE_NAME,$(1),$(2))
+ $(BIN_DIR)/$(call IMAGE_NAME,$(1),$(2)): $(KDIR)/$(call IMAGE_NAME,$(1),$(2))
+ cp $$^ $$@
+
+endef
+
+define Device/Build
+ $(if $(CONFIG_TARGET_ROOTFS_INITRAMFS),$(call Device/Build/initramfs,$(1)))
+ $(call Device/Build/kernel,$(1))
+
+ $$(eval $$(foreach compile,$$(COMPILE), \
+ $$(call Device/Build/compile,$$(compile),$(1))))
+
+ $$(eval $$(foreach image,$$(IMAGES), \
+ $$(foreach fs,$$(filter $(TARGET_FILESYSTEMS),$$(FILESYSTEMS)), \
+ $$(call Device/Build/image,$$(fs),$$(image),$(1)))))
+endef
+
+define Device
+ $(call Device/Init,$(1))
+ $(call Device/Default,$(1))
+ $(call Device/Check,$(1))
+ $(call Device/$(1),$(1))
+ $(call Device/Build,$(1))
+