X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fsvn-archive%2Farchive.git;a=blobdiff_plain;f=include%2Fimage.mk;h=8d21f24c240d852259ed30588da42e484bb37fc8;hp=1c532aed89971bbbefdeae56b37d82854ac23a8e;hb=23c5f411265882be0bbfb0b6c270756a12e04338;hpb=a0a2de749767100fc97340cfe5f4d84e03f1bbaa diff --git a/include/image.mk b/include/image.mk index 1c532aed89..8d21f24c24 100644 --- a/include/image.mk +++ b/include/image.mk @@ -9,6 +9,7 @@ override TARGET_BUILD= include $(INCLUDE_DIR)/prereq.mk include $(INCLUDE_DIR)/kernel.mk include $(INCLUDE_DIR)/host.mk +include $(INCLUDE_DIR)/version.mk override MAKE:=$(_SINGLE)$(SUBMAKE) override NO_TRACE_MAKE:=$(_SINGLE)$(NO_TRACE_MAKE) @@ -16,7 +17,7 @@ override NO_TRACE_MAKE:=$(_SINGLE)$(NO_TRACE_MAKE) KDIR=$(KERNEL_BUILD_DIR) DTS_DIR:=$(LINUX_DIR)/arch/$(ARCH)/boot/dts/ -IMG_PREFIX:=openwrt-$(BOARD)$(if $(SUBTARGET),-$(SUBTARGET)) +IMG_PREFIX:=openwrt-$(if $(CONFIG_VERSION_FILENAMES),$(VERSION_NUMBER)-)$(BOARD)$(if $(SUBTARGET),-$(SUBTARGET)) MKFS_DEVTABLE_OPT := -D $(INCLUDE_DIR)/device_table.txt @@ -69,8 +70,16 @@ fs-types-$(CONFIG_TARGET_ROOTFS_JFFS2) += $(addprefix jffs2-,$(JFFS2_BLOCKSIZE)) fs-types-$(CONFIG_TARGET_ROOTFS_JFFS2_NAND) += $(addprefix jffs2-nand-,$(NAND_BLOCKSIZE)) fs-types-$(CONFIG_TARGET_ROOTFS_EXT4FS) += ext4 fs-types-$(CONFIG_TARGET_ROOTFS_ISO) += iso +fs-subtypes-$(CONFIG_TARGET_ROOTFS_JFFS2) += $(addsuffix -raw,$(addprefix jffs2-,$(JFFS2_BLOCKSIZE))) +fs-subtypes-$(CONFIG_TARGET_ROOTFS_CPIOGZ) += cpiogz +fs-subtypes-$(CONFIG_TARGET_ROOTFS_TARGZ) += targz + TARGET_FILESYSTEMS := $(fs-types-y) +FS_64K := $(filter-out jffs2-%,$(TARGET_FILESYSTEMS)) jffs2-64k +FS_128K := $(filter-out jffs2-%,$(TARGET_FILESYSTEMS)) jffs2-128k +FS_256K := $(filter-out jffs2-%,$(TARGET_FILESYSTEMS)) jffs2-256k + define add_jffs2_mark echo -ne '\xde\xad\xc0\xde' >> $(1) endef @@ -79,13 +88,29 @@ define toupper $(shell echo $(1) | tr '[:lower:]' '[:upper:]') endef +define split_args +$(foreach data, \ + $(subst |,$(space),\ + $(subst $(space),^,$(1))), \ + $(call $(2),$(strip $(subst ^,$(space),$(data))))) +endef + +define build_cmd +$(if $(Build/$(word 1,$(1))),,$(error Missing Build/$(word 1,$(1)))) +$(call Build/$(word 1,$(1)),$(wordlist 2,$(words $(1)),$(1))) + +endef + +define concat_cmd +$(call split_args,$(1),build_cmd) +endef + # pad to 4k, 8k, 16k, 64k, 128k, 256k and add jffs2 end-of-filesystem mark define prepare_generic_squashfs $(STAGING_DIR_HOST)/bin/padjffs2 $(1) 4 8 16 64 128 256 endef define Image/BuildKernel/Initramfs - cp $(KDIR)/vmlinux-initramfs.elf $(BIN_DIR)/$(IMG_PREFIX)-vmlinux-initramfs.elf $(call Image/Build/Initramfs) endef @@ -102,14 +127,17 @@ define Image/BuildKernel/MkFIT endef define Image/mkfs/jffs2/sub - # FIXME: removing this line will cause strange behaviour in the foreach loop below $(STAGING_DIR_HOST)/bin/mkfs.jffs2 $(3) --pad -e $(patsubst %k,%KiB,$(1)) -o $(KDIR)/root.jffs2-$(2) -d $(TARGET_DIR) -v 2>&1 1>/dev/null | awk '/^.+$$$$/' - $(STAGING_DIR_HOST)/bin/mkfs.jffs2 $(3) -e $(patsubst %k,%KiB,$(1)) -o $(KDIR)/root.jffs2-$(2)-raw -d $(TARGET_DIR) -v 2>&1 1>/dev/null | awk '/^.+$$$$/' $(call add_jffs2_mark,$(KDIR)/root.jffs2-$(2)) endef +define Image/mkfs/jffs2/sub-raw + $(STAGING_DIR_HOST)/bin/mkfs.jffs2 $(3) -e $(patsubst %k,%KiB,$(1)) -o $(KDIR)/root.jffs2-$(2)-raw -d $(TARGET_DIR) -v 2>&1 1>/dev/null | awk '/^.+$$$$/' +endef + define Image/mkfs/jffs2/template Image/mkfs/jffs2-$(1) = $$(call Image/mkfs/jffs2/sub,$(1),$(1),$(JFFS2OPTS)) + Image/mkfs/jffs2-$(1)-raw = $$(call Image/mkfs/jffs2/sub-raw,$(1),$(1),$(JFFS2OPTS)) endef @@ -140,6 +168,7 @@ ifneq ($(CONFIG_NAND_SUPPORT),) (cd "$(KDIR_TMP)"; $(TAR) cvf \ "$(BIN_DIR)/$(IMG_PREFIX)-$(1)-$(2)-sysupgrade.tar" sysupgrade-$(1)) endef + # $(1) board name # $(2) ubinize-image options (e.g. --uboot-env and/or --kernel kernelimage) # $(3) rootfstype (e.g. squashfs or ubifs) @@ -147,7 +176,7 @@ ifneq ($(CONFIG_NAND_SUPPORT),) define Image/Build/UbinizeImage sh $(TOPDIR)/scripts/ubinize-image.sh $(2) \ "$(KDIR)/root.$(3)" \ - "$(BIN_DIR)/$(IMG_PREFIX)-$(1)-$(3)-ubinized.bin" \ + "$(KDIR)/$(IMG_PREFIX)-$(1)-$(3)-ubinized.bin" \ $(4) endef @@ -187,25 +216,20 @@ ifneq ($(CONFIG_TARGET_ROOTFS_UBIFS),) $(call Image/Build,ubifs) ifneq ($($(PROFILE)_UBI_OPTS)$(UBI_OPTS),) - $(call Image/mkfs/ubifs/generate,) + $(if $(wildcard ./ubinize.cfg),$(call Image/mkfs/ubifs/generate,)) $(if $(wildcard ./ubinize-overlay.cfg),$(call Image/mkfs/ubifs/generate,-overlay)) endif - $(call Image/Build,ubi) + $(if $(wildcard ./ubinize.cfg),$(call Image/Build,ubi)) endef endif -ifneq ($(CONFIG_TARGET_ROOTFS_CPIOGZ),) - define Image/mkfs/cpiogz - ( cd $(TARGET_DIR); find . | cpio -o -H newc | gzip -9 >$(BIN_DIR)/$(IMG_PREFIX)-rootfs.cpio.gz ) - endef -endif +define Image/mkfs/cpiogz + ( cd $(TARGET_DIR); find . | cpio -o -H newc | gzip -9 >$(BIN_DIR)/$(IMG_PREFIX)-rootfs.cpio.gz ) +endef -ifneq ($(CONFIG_TARGET_ROOTFS_TARGZ),) - define Image/mkfs/targz - # Preserve permissions (-p) when building as non-root user - $(TAR) -czpf $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE),-$(PROFILE))-rootfs.tar.gz --numeric-owner --owner=0 --group=0 -C $(TARGET_DIR)/ . - endef -endif +define Image/mkfs/targz + $(TAR) -czpf $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE),-$(PROFILE))-rootfs.tar.gz --numeric-owner --owner=0 --group=0 -C $(TARGET_DIR)/ . +endef E2SIZE=$(shell echo $$(($(CONFIG_TARGET_ROOTFS_PARTSIZE)*1024*1024/$(CONFIG_TARGET_EXT4_BLOCKSIZE)))) @@ -244,6 +268,155 @@ define BuildImage/mkfs .PHONY: mkfs-$(1) mkfs-$(1): mkfs_prepare $(Image/mkfs/$(1)) + $(call Build/mkfs/default,$(1)) + $(call Build/mkfs/$(1),$(1)) + $(KDIR)/root.$(1): mkfs-$(1) + +endef + +# Build commands that can be called from Device/* templates +define Build/uImage + mkimage -A $(LINUX_KARCH) \ + -O linux -T kernel \ + -C $(1) -a $(KERNEL_LOADADDR) -e $(if $(KERNEL_ENTRY),$(KERNEL_ENTRY),$(KERNEL_LOADADDR)) \ + -n '$(call toupper,$(LINUX_KARCH)) OpenWrt Linux-$(LINUX_VERSION)' -d $@ $@.new + @mv $@.new $@ +endef + +define Build/lzma + $(STAGING_DIR_HOST)/bin/lzma e $@ -lc1 -lp2 -pb2 $(1) $@.new + @mv $@.new $@ +endef + +define Build/kernel-bin + rm -f $@ + cp $^ $@ +endef + +define Build/patch-cmdline + $(STAGING_DIR_HOST)/bin/patch-cmdline $@ '$(CMDLINE)' +endef + +define Build/append-kernel + dd if=$(word 1,$^) $(if $(1),bs=$(1) conv=sync) >> $@ +endef + +define Build/append-rootfs + dd if=$(word 2,$^) $(if $(1),bs=$(1) conv=sync) >> $@ +endef + +define Build/pad-rootfs + $(call prepare_generic_squashfs,$@ $(1)) +endef + +define Build/pad-offset + let \ + size="$$(stat -c%s $@)" \ + pad="$(word 1, $(1))" \ + offset="$(word 2, $(1))" \ + pad="(pad - ((size + offset) % pad)) % pad" \ + newsize='size + pad'; \ + dd if=$@ of=$@.new bs=$$newsize count=1 conv=sync + mv $@.new $@ +endef + +define Build/check-size + @[ $$(($(subst k,* 1024,$(subst m, * 1024k,$(1))))) -gt "$$(stat -c%s $@)" ] || { \ + echo "WARNING: Image file $@ is too big"; \ + rm -f $@; \ + } +endef + + +define Device/Init + PROFILES := $(PROFILE) + KERNEL:= + KERNEL_INITRAMFS = $$(KERNEL) + KERNEL_SIZE:= + CMDLINE:= + + IMAGE_PREFIX := $(IMG_PREFIX)-$(1) + IMAGE_NAME = $$(IMAGE_PREFIX)-$$(1)-$$(2) + KERNEL_PREFIX = $(1) + KERNEL_SUFFIX := -kernel.bin + KERNEL_IMAGE = $$(KERNEL_PREFIX)$$(KERNEL_SUFFIX) + KERNEL_INITRAMFS_PREFIX = $$(IMAGE_PREFIX)-initramfs + KERNEL_INITRAMFS_IMAGE = $$(KERNEL_INITRAMFS_PREFIX)$$(KERNEL_SUFFIX) + KERNEL_INSTALL := + KERNEL_NAME := vmlinux + KERNEL_SIZE := + + FILESYSTEMS := $(TARGET_FILESYSTEMS) +endef + +define Device/ExportVar + $(1) : $(2):=$$($(2)) + +endef +Device/Export = $(foreach var,$(DEVICE_VARS) KERNEL,$(call Device/ExportVar,$(1),$(var))) + +define Device/Check + _TARGET = $$(if $$(filter $(PROFILE),$$(PROFILES)),install,install-disabled) +endef + +define Device/Build/initramfs + $$(_TARGET): $(BIN_DIR)/$$(KERNEL_INITRAMFS_IMAGE) + + $(BIN_DIR)/$$(KERNEL_INITRAMFS_IMAGE): $(KDIR)/$$(KERNEL_INITRAMFS_IMAGE) + cp $$^ $$@ + + $(KDIR)/$$(KERNEL_INITRAMFS_IMAGE): $(KDIR)/$$(KERNEL_NAME)-initramfs + @rm -f $$@ + $$(call concat_cmd,$$(KERNEL_INITRAMFS)) +endef + +define Device/Build/check_size + @[ $$(($(subst k,* 1024,$(subst m, * 1024k,$(1))))) -gt "$$(stat -c%s $@)" ] || { \ + echo "WARNING: Image file $@ is too big"; \ + rm -f $@; \ + } +endef + +define Device/Build/kernel + $$(_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))) + $(eval $(call Device/Export,$(KDIR)/$(KERNEL_INITRAMFS_IMAGE))) + $(eval $(call Device/Export,$(KDIR)/$(call IMAGE_NAME,$(1),$(2)))) + $(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)))) + + $(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 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)) endef @@ -257,10 +430,10 @@ define BuildImage ifeq ($(IB),) .PHONY: download prepare compile clean image_prepare mkfs_prepare kernel_prepare install - compile: compile-targets + compile: $(call Build/Compile) - clean: clean-targets + clean: $(call Build/Clean) image_prepare: compile @@ -275,19 +448,14 @@ define BuildImage $(if $(CONFIG_TARGET_ROOTFS_INITRAMFS),$(call Image/BuildKernel/Initramfs)) $(call Image/InstallKernel) - $(foreach fs,$(TARGET_FILESYSTEMS),$(call BuildImage/mkfs,$(fs))) + $(foreach device,$(TARGET_DEVICES),$(call Device,$(device))) + $(foreach fs,$(TARGET_FILESYSTEMS) $(fs-subtypes-y),$(call BuildImage/mkfs,$(fs))) - install: kernel_prepare install-targets - $(call Image/mkfs/cpiogz) - $(call Image/mkfs/targz) + install: kernel_prepare $(foreach fs,$(TARGET_FILESYSTEMS), $(call Image/Build,$(fs)) ) $(call Image/mkfs/ubifs) $(call Image/Checksum) - compile-targets: - install-targets: - clean-targets: - endef