diff options
Diffstat (limited to 'linux')
-rw-r--r-- | linux/Config.in | 133 | ||||
-rw-r--r-- | linux/linux.mk | 162 |
2 files changed, 295 insertions, 0 deletions
diff --git a/linux/Config.in b/linux/Config.in new file mode 100644 index 000000000..d8a5157e2 --- /dev/null +++ b/linux/Config.in @@ -0,0 +1,133 @@ +menu "Kernel" + +config BR2_LINUX_KERNEL + bool "Linux Kernel" + help + Enable this option if you want to build a Linux kernel for + your embedded device + +if BR2_LINUX_KERNEL + +# +# Version selection. We provide the choice between: +# +# 1. A single fairly recent stable kernel version +# 2. In case an internal toolchain has been built, the same kernel +# version as the kernel headers +# 3. A custom stable version +# 4. A custom tarball +# +choice + prompt "Kernel version" + default BR2_LINUX_KERNEL_2_6_34 + +config BR2_LINUX_KERNEL_2_6_34 + bool "2.6.34" + +config BR2_LINUX_KERNEL_SAME_AS_HEADERS + bool "Same as toolchain kernel headers" + depends on BR2_TOOLCHAIN_BUILDROOT + help + This option will re-use the same kernel sources as the one + that have been used for the kernel headers of the + cross-compiling toolchain. Having the same version for the + kernel running on the system and for the kernel headers is + not a requirement, but using the same version allows to + download only one tarball of the kernel sources. + +config BR2_LINUX_KERNEL_CUSTOM_VERSION + bool "Custom version" + help + This option allows to use a specific 2.6.x or 2.6.x.y + official versions, as available on kernel.org + +config BR2_LINUX_KERNEL_CUSTOM_TARBALL + bool "Custom tarball" + help + This option allows to specify the http or ftp location of a + specific kernel source tarball + +endchoice + +config BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE + string "Kernel version" + depends on BR2_LINUX_KERNEL_CUSTOM_VERSION + default "2.6.34" + +config BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION + string "URL of custom kernel tarball" + depends on BR2_LINUX_KERNEL_CUSTOM_TARBALL + +config BR2_LINUX_KERNEL_VERSION + string + default "2.6.34" if BR2_LINUX_KERNEL_2_6_34 + default BR2_DEFAULT_KERNEL_HEADERS if BR2_LINUX_KERNEL_SAME_AS_HEADERS + default BR2_LINUX_KERNEL_CUSTOM_VERSION_VALUE if BR2_LINUX_KERNEL_CUSTOM_VERSION + default "custom" if BR2_LINUX_KERNEL_CUSTOM_TARBALL + +# +# Patch selection +# + +config BR2_LINUX_KERNEL_PATCH + string "Custom kernel patch" + help + The location can be an URL, a file path, or a directory. In + the case of a directory, all files matching linux-*.patch + will be applied. + +# +# Configuration selection +# + +choice + prompt "Kernel configuration" + default BR2_LINUX_KERNEL_USE_DEFCONFIG + +config BR2_LINUX_KERNEL_USE_DEFCONFIG + bool "Using a defconfig" + +config BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG + bool "Using a custom config file" + +endchoice + +config BR2_LINUX_KERNEL_DEFCONFIG + string "Defconfig name" + depends on BR2_LINUX_KERNEL_USE_DEFCONFIG + help + Name of the defconfig file to use, without the leading + _defconfig + +config BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE + string "Configuration file path" + depends on BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG + help + Path to the kernel configuration file + +# +# Binary format +# + +choice + prompt "Kernel binary format" + default BR2_LINUX_KERNEL_UIMAGE if !BR2_i386 && !BR2_x86_64 + default BR2_LINUX_KERNEL_BZIMAGE if BR2_i386 || BR2_x86_64 + +config BR2_LINUX_KERNEL_UIMAGE + bool "uImage" + +config BR2_LINUX_KERNEL_BZIMAGE + bool "bzImage" + +config BR2_LINUX_KERNEL_ZIMAGE + bool "zImage" + +config BR2_LINUX_KERNEL_VMLINUX + bool "vmlinux" + +endchoice + +endif # BR2_LINUX_KERNEL + +endmenu diff --git a/linux/linux.mk b/linux/linux.mk new file mode 100644 index 000000000..593a1b40a --- /dev/null +++ b/linux/linux.mk @@ -0,0 +1,162 @@ +############################################################################### +# +# Linux kernel 2.6 target +# +############################################################################### +LINUX26_VERSION=$(call qstrip,$(BR2_LINUX_KERNEL_VERSION)) + +# Compute LINUX26_SOURCE and LINUX26_SITE from the configuration +ifeq ($(LINUX26_VERSION),custom) +LINUX26_TARBALL:=$(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_TARBALL_LOCATION)) +LINUX26_SITE:=$(dir $(LINUX26_TARBALL)) +LINUX26_SOURCE:=$(notdir $(LINUX26_TARBALL)) +else +LINUX26_SOURCE:=linux-$(LINUX26_VERSION).tar.bz2 +LINUX26_SITE:=$(BR2_KERNEL_MIRROR)/linux/kernel/v2.6/ +endif + +LINUX26_DIR:=$(BUILD_DIR)/linux-$(LINUX26_VERSION) +LINUX26_PATCH=$(call qstrip,$(BR2_LINUX_KERNEL_PATCH)) + +LINUX26_MAKE_FLAGS = \ + HOSTCC="$(HOSTCC)" \ + HOSTCFLAGS="$(HOSTCFLAGS)" \ + ARCH=$(KERNEL_ARCH) \ + INSTALL_MOD_PATH=$(TARGET_DIR) \ + CROSS_COMPILE=$(TARGET_CROSS) \ + LDFLAGS="$(TARGET_LDFLAGS)" \ + LZMA="$(LZMA)" + +# Get the real Linux version, which tells us where kernel modules are +# going to be installed in the target filesystem. +LINUX26_VERSION_PROBED = $(shell $(MAKE) $(LINUX26_MAKE_FLAGS) -C $(LINUX26_DIR) --no-print-directory -s kernelrelease) + +ifeq ($(BR2_LINUX_KERNEL_UIMAGE),y) +LINUX26_IMAGE_NAME=uImage +LINUX26_DEPENDENCIES+=$(MKIMAGE) +else ifeq ($(BR2_LINUX_KERNEL_BZIMAGE),y) +LINUX26_IMAGE_NAME=bzImage +else ifeq ($(BR2_LINUX_KERNEL_ZIMAGE),y) +LINUX26_IMAGE_NAME=zImage +else ifeq ($(BR2_LINUX_KERNEL_VMLINUX),y) +LINUX26_IMAGE_NAME=vmlinux.bin +endif + +LINUX26_IMAGE_PATH=$(LINUX26_DIR)/arch/$(KERNEL_ARCH)/boot/$(LINUX26_IMAGE_NAME) + +# Download +$(LINUX26_DIR)/.stamp_downloaded: + @$(call MESSAGE,"Downloading kernel") + $(call DOWNLOAD,$(LINUX26_SITE),$(LINUX26_SOURCE)) +ifneq ($(filter ftp://% http://%,$(LINUX26_PATCH)),) + $(call DOWNLOAD,$(dir $(LINUX26_PATCH)),$(notdir $(LINUX26_PATCH))) +endif + mkdir -p $(@D) + touch $@ + +# Extraction +$(LINUX26_DIR)/.stamp_extracted: $(LINUX26_DIR)/.stamp_downloaded + @$(call MESSAGE,"Extracting kernel") + mkdir -p $(@D) + $(Q)$(INFLATE$(suffix $(LINUX26_SOURCE))) $(DL_DIR)/$(LINUX26_SOURCE) | \ + tar -C $(@D) $(TAR_STRIP_COMPONENTS)=1 $(TAR_OPTIONS) - + $(Q)touch $@ + +# Patch +$(LINUX26_DIR)/.stamp_patched: $(LINUX26_DIR)/.stamp_extracted + @$(call MESSAGE,"Patching kernel") +ifneq ($(LINUX26_PATCH),) +ifneq ($(filter ftp://% http://%,$(LINUX26_PATCH)),) + toolchain/patch-kernel.sh $(@D) $(DL_DIR) $(notdir $(LINUX26_PATCH)) +else ifeq ($(shell test -d $(LINUX26_PATCH) && echo "dir"),dir) + toolchain/patch-kernel.sh $(@D) $(LINUX26_PATCH) linux-\*.patch +else + toolchain/patch-kernel.sh $(@D) $(dir $(LINUX26_PATCH)) $(notdir $(LINUX26_PATCH)) +endif +endif + $(Q)touch $@ + + +# Configuration +$(LINUX26_DIR)/.stamp_configured: $(LINUX26_DIR)/.stamp_patched + @$(call MESSAGE,"Configuring kernel") +ifeq ($(BR2_LINUX_KERNEL_USE_DEFCONFIG),y) + $(TARGET_MAKE_ENV) $(MAKE1) $(LINUX26_MAKE_FLAGS) -C $(@D) $(call qstrip,$(BR2_LINUX_KERNEL_DEFCONFIG))_defconfig +else ifeq ($(BR2_LINUX_KERNEL_USE_CUSTOM_CONFIG),y) + cp $(BR2_LINUX_KERNEL_CUSTOM_CONFIG_FILE) $(@D)/.config +endif +ifeq ($(BR2_ARM_EABI),y) + $(call KCONFIG_ENABLE_OPT,CONFIG_AEABI,$(@D)/.config) +else + $(call KCONFIG_DISABLE_OPT,CONFIG_AEABI,$(@D)/.config) +endif +ifeq ($(BR2_INET_IPV6),y) + $(call KCONFIG_ENABLE_OPT,CONFIG_IPV6,$(@D)/.config) +else + $(call KCONFIG_DISABLE_OPT,CONFIG_IPV6,$(@D)/.config) +endif +ifeq ($(BR2_TARGET_ROOTFS_INITRAMFS),y) + # As the kernel gets compiled before root filesystems are + # built, we create a fake initramfs file list. It'll be + # replaced later by the real list, and the kernel will be + # rebuilt using the linux26-rebuild-with-initramfs target. + touch $(BINARIES_DIR)/rootfs.initramfs + $(call KCONFIG_ENABLE_OPT,CONFIG_BLK_DEV_INITRD,$(@D)/.config) + $(call KCONFIG_SET_OPT,CONFIG_INITRAMFS_SOURCE,\"$(BINARIES_DIR)/rootfs.initramfs\",$(@D)/.config) + $(call KCONFIG_ENABLE_OPT,CONFIG_INITRAMFS_COMPRESSION_GZIP,$(@D)/.config) +else + $(call KCONFIG_DISABLE_OPT,CONFIG_BLK_DEV_INITRD,$(@D)/.config) + $(call KCONFIG_SET_OPT,CONFIG_INITRAMFS_SOURCE,\"\",$(@D)/.config) +endif + $(TARGET_MAKE_ENV) $(MAKE) $(LINUX26_MAKE_FLAGS) -C $(@D) oldconfig + $(Q)touch $@ + +# Compilation. We make sure the kernel gets rebuilt when the +# configuration has changed. +$(LINUX26_DIR)/.stamp_compiled: $(LINUX26_DIR)/.stamp_configured $(LINUX26_DIR)/.config + @$(call MESSAGE,"Compiling kernel") + $(TARGET_MAKE_ENV) $(MAKE) $(LINUX26_MAKE_FLAGS) -C $(@D) $(LINUX26_IMAGE_NAME) + @if [ $(shell grep -c "CONFIG_MODULES=y" $(LINUX26_DIR)/.config) != 0 ] ; then \ + $(TARGET_MAKE_ENV) $(MAKE) $(LINUX26_MAKE_FLAGS) -C $(@D) modules ; \ + fi + $(Q)touch $@ + +# Installation +$(LINUX26_DIR)/.stamp_installed: $(LINUX26_DIR)/.stamp_compiled + @$(call MESSAGE,"Installing kernel") + cp $(LINUX26_IMAGE_PATH) $(BINARIES_DIR) + # Install modules and remove symbolic links pointing to build + # directories, not relevant on the target + @if [ $(shell grep -c "CONFIG_MODULES=y" $(LINUX26_DIR)/.config) != 0 ] ; then \ + $(TARGET_MAKE_ENV) $(MAKE1) $(LINUX26_MAKE_FLAGS) -C $(@D) \ + INSTALL_MOD_PATH=$(TARGET_DIR) modules_install ; \ + rm -f $(TARGET_DIR)/lib/modules/$(LINUX26_VERSION_PROBED)/build ; \ + rm -f $(TARGET_DIR)/lib/modules/$(LINUX26_VERSION_PROBED)/source ; \ + fi + $(Q)touch $@ + +linux26: host-module-init-tools $(LINUX26_DEPENDENCIES) $(LINUX26_DIR)/.stamp_installed + +linux26-menuconfig linux26-xconfig linux26-gconfig: $(LINUX26_DIR)/.stamp_configured + $(MAKE) $(LINUX26_MAKE_FLAGS) -C $(LINUX26_DIR) $(subst linux26-,,$@) + +# Support for rebuilding the kernel after the initramfs file list has +# been generated in $(BINARIES_DIR)/rootfs.initramfs. +$(LINUX26_DIR)/.stamp_initramfs_rebuilt: $(LINUX26_DIR)/.stamp_installed $(BINARIES_DIR)/rootfs.initramfs + @$(call MESSAGE,"Rebuilding kernel with initramfs") + # Remove the previously generated initramfs which was empty, + # to make sure the kernel will actually regenerate it. + $(RM) -f $(@D)/usr/initramfs_data.cpio.* + # Build the kernel. + $(TARGET_MAKE_ENV) $(MAKE) $(LINUX26_MAKE_FLAGS) -C $(@D) $(LINUX26_IMAGE_NAME) + # Copy the kernel image to its final destination + cp $(LINUX26_IMAGE_PATH) $(BINARIES_DIR) + $(Q)touch $@ + +# The initramfs building code must make sure this target gets called +# after it generated the initramfs list of files. +linux26-rebuild-with-initramfs: $(LINUX26_DIR)/.stamp_initramfs_rebuilt + +ifeq ($(BR2_LINUX_KERNEL),y) +TARGETS+=linux26 +endif |