OSDN Git Service

add kernel.mk to build kernel image on-fly
authorChih-Wei Huang <cwhuang@linux.org.tw>
Wed, 8 Jul 2009 10:07:09 +0000 (18:07 +0800)
committerChih-Wei Huang <cwhuang@linux.org.tw>
Mon, 9 Nov 2009 05:16:39 +0000 (13:16 +0800)
core/Makefile
core/kernel.mk [new file with mode: 0644]

index 2c4d133..57b8a4e 100644 (file)
@@ -302,6 +302,8 @@ $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES)
        $(hide) $(call assert-max-file-size,$@,$(BOARD_BOOTIMAGE_MAX_SIZE),raw)
 endif # TARGET_BOOTIMAGE_USE_EXT2
 
+include $(BUILD_SYSTEM)/kernel.mk
+
 else   # TARGET_NO_KERNEL
 # HACK: The top-level targets depend on the bootimage.  Not all targets
 # can produce a bootimage, though, and emulator targets need the ramdisk
@@ -621,7 +623,7 @@ define build-systemimage-target
 endef
 endif # TARGET_USERIMAGES_USE_EXT2
 
-$(BUILT_SYSTEMIMAGE_UNOPT): $(INTERNAL_SYSTEMIMAGE_FILES) $(INTERNAL_MKUSERFS)
+$(BUILT_SYSTEMIMAGE_UNOPT): $(INSTALLED_KERNEL_TARGET) $(INTERNAL_SYSTEMIMAGE_FILES) $(INTERNAL_MKUSERFS)
        $(call build-systemimage-target,$@)
 
 # The installed image, which may be optimized or unoptimized.
diff --git a/core/kernel.mk b/core/kernel.mk
new file mode 100644 (file)
index 0000000..5cec2d9
--- /dev/null
@@ -0,0 +1,45 @@
+ifeq ($(TARGET_PREBUILT_KERNEL),)
+
+ifeq ($(TARGET_ARCH),x86)
+KERNEL_TARGET := bzImage
+TARGET_KERNEL_CONFIG ?= android-x86_defconfig
+endif
+ifeq ($(TARGET_ARCH),arm)
+KERNEL_TARGET := zImage
+TARGET_KERNEL_CONFIG ?= goldfish_defconfig
+endif
+
+KBUILD_OUTPUT := $(CURDIR)/$(TARGET_OUT_INTERMEDIATES)/kernel
+$(KBUILD_OUTPUT):
+       mkdir -p $(KBUILD_OUTPUT)
+
+mk_kernel := + $(hide) $(MAKE) -C kernel O=$(KBUILD_OUTPUT) ARCH=$(TARGET_ARCH) $(if $(SHOW_COMMANDS),V=1)
+ifneq ($(TARGET_ARCH),$(HOST_ARCH))
+mk_kernel += CROSS_COMPILE=$(CURDIR)/$(TARGET_TOOLS_PREFIX)
+endif
+
+# I understand Android build system discourage to use submake,
+# but I don't want to write a complex Android.mk to build kernel.
+# This is the simplest way I can think.
+BUILT_KERNEL_TARGET := $(KBUILD_OUTPUT)/arch/$(TARGET_ARCH)/boot/$(KERNEL_TARGET)
+$(BUILT_KERNEL_TARGET): kernel/arch/$(TARGET_ARCH)/configs/$(TARGET_KERNEL_CONFIG) | $(KBUILD_OUTPUT)
+       $(mk_kernel) $(TARGET_KERNEL_CONFIG)
+       $(mk_kernel) $(KERNEL_TARGET) modules
+
+$(INSTALLED_KERNEL_TARGET): $(BUILT_KERNEL_TARGET) | $(ACP)
+       $(transform-prebuilt-to-target)
+ifdef TARGET_PREBUILT_MODULES
+       $(ACP) -r $(TARGET_PREBUILT_MODULES) $(TARGET_OUT)/lib
+else
+       $(mk_kernel) INSTALL_MOD_PATH=$(CURDIR)/$(TARGET_OUT) modules_install
+       $(hide) rm -f $(TARGET_OUT)/lib/modules/*/{build,source}
+endif
+
+installclean: FILES += $(KBUILD_OUTPUT) $(INSTALLED_KERNEL_TARGET)
+
+TARGET_PREBUILT_KERNEL  := $(INSTALLED_KERNEL_TARGET)
+
+.PHONY: kernel
+kernel: $(TARGET_PREBUILT_KERNEL)
+
+endif