X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fopenwrt.git;a=blobdiff_plain;f=include%2Fimage.mk;h=ebeec5ebb569955065aee662e87e2d1d39de95c8;hp=3832b7ae8405e3f0d9ea13c242a82bae303e74b4;hb=8ca1e211dfbe2ab1ecac8a6a990df0391a829bbd;hpb=22a35a7b1171cd8ffa50675df1011fae0a3b94e5 diff --git a/include/image.mk b/include/image.mk index 3832b7ae84..ebeec5ebb5 100644 --- a/include/image.mk +++ b/include/image.mk @@ -9,13 +9,15 @@ 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) -.NOTPARALLEL: -override MAKEFLAGS= -override MAKE:=$(SUBMAKE) 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 @@ -63,6 +65,21 @@ endif JFFS2_BLOCKSIZE ?= 64k 128k +fs-types-$(CONFIG_TARGET_ROOTFS_SQUASHFS) += squashfs +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 @@ -71,20 +88,31 @@ 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 -ifneq ($(CONFIG_TARGET_ROOTFS_INITRAMFS),) - define Image/BuildKernel/Initramfs - cp $(KDIR)/vmlinux-initramfs.elf $(BIN_DIR)/$(IMG_PREFIX)-vmlinux-initramfs.elf +define Image/BuildKernel/Initramfs $(call Image/Build/Initramfs) - endef -else - define Image/BuildKernel/Initramfs - endef -endif +endef define Image/BuildKernel/MkuImage mkimage -A $(ARCH) -O linux -T kernel -C $(1) -a $(2) -e $(3) \ @@ -99,35 +127,34 @@ 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)) - $(call Image/Build,jffs2-$(2)) endef -ifneq ($(CONFIG_TARGET_ROOTFS_JFFS2),) - define Image/mkfs/jffs2 - $(foreach SZ,$(JFFS2_BLOCKSIZE),$(call Image/mkfs/jffs2/sub,$(SZ),$(SZ),$(JFFS2OPTS))) - endef -endif +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 -ifneq ($(CONFIG_TARGET_ROOTFS_JFFS2_NAND),) - define Image/mkfs/jffs2_nand - $(foreach SZ,$(NAND_BLOCKSIZE), $(call Image/mkfs/jffs2/sub, \ - $(word 2,$(subst :, ,$(SZ))),nand-$(subst :,-,$(SZ)), \ - $(JFFS2OPTS) --no-cleanmarkers --pagesize=$(word 1,$(subst :, ,$(SZ)))) \ - ) - endef -endif +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)) -ifneq ($(CONFIG_TARGET_ROOTFS_SQUASHFS),) - define Image/mkfs/squashfs - @mkdir -p $(TARGET_DIR)/overlay - $(STAGING_DIR_HOST)/bin/mksquashfs4 $(TARGET_DIR) $(KDIR)/root.squashfs -nopad -noappend -root-owned -comp $(SQUASHFSCOMP) $(SQUASHFSOPT) -processors $(if $(CONFIG_PKG_BUILD_JOBS),$(CONFIG_PKG_BUILD_JOBS),1) - $(call Image/Build,squashfs) - endef -endif +endef + +define Image/mkfs/jffs2-nand/template + Image/mkfs/jffs2-nand-$(1) = \ + $$(call Image/mkfs/jffs2/sub, \ + $(word 2,$(subst -, ,$(1))),nand-$(1), \ + $(JFFS2OPTS) --no-cleanmarkers --pagesize=$(word 1,$(subst -, ,$(1)))) + +endef + +$(eval $(foreach S,$(JFFS2_BLOCKSIZE),$(call Image/mkfs/jffs2/template,$(S)))) +$(eval $(foreach S,$(NAND_BLOCKSIZE),$(call Image/mkfs/jffs2-nand/template,$(S)))) + +define Image/mkfs/squashfs + $(STAGING_DIR_HOST)/bin/mksquashfs4 $(TARGET_DIR) $(KDIR)/root.squashfs -nopad -noappend -root-owned -comp $(SQUASHFSCOMP) $(SQUASHFSOPT) -processors $(if $(CONFIG_PKG_BUILD_JOBS),$(CONFIG_PKG_BUILD_JOBS),1) +endef # $(1): board name # $(2): rootfs type @@ -141,11 +168,16 @@ 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) +# $(4) options to pass-through to ubinize (i.e. $($(PROFILE)_UBI_OPTS))) define Image/Build/UbinizeImage sh $(TOPDIR)/scripts/ubinize-image.sh $(2) \ - "$(KDIR)/root.$(3)" "$(4)" \ - "$(BIN_DIR)/$(IMG_PREFIX)-$(1)-$(3)-ubinized.bin" \ - $(5) + "$(KDIR)/root.$(3)" \ + "$(KDIR)/$(IMG_PREFIX)-$(1)-$(3)-ubinized.bin" \ + $(4) endef endif @@ -184,53 +216,38 @@ 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 -ifneq ($(CONFIG_TARGET_ROOTFS_EXT4FS),) - E2SIZE=$(shell echo $$(($(CONFIG_TARGET_ROOTFS_PARTSIZE)*1024*1024/$(CONFIG_TARGET_EXT4_BLOCKSIZE)))) +E2SIZE=$(shell echo $$(($(CONFIG_TARGET_ROOTFS_PARTSIZE)*1024*1024/$(CONFIG_TARGET_EXT4_BLOCKSIZE)))) - define Image/mkfs/ext4 +define Image/mkfs/ext4 # generate an ext2 fs $(STAGING_DIR_HOST)/bin/genext2fs -U -B $(CONFIG_TARGET_EXT4_BLOCKSIZE) -b $(E2SIZE) -N $(CONFIG_TARGET_EXT4_MAXINODE) -d $(TARGET_DIR)/ $(KDIR)/root.ext4 -m $(CONFIG_TARGET_EXT4_RESERVED_PCT) $(MKFS_DEVTABLE_OPT) # convert it to ext4 $(STAGING_DIR_HOST)/bin/tune2fs $(if $(CONFIG_TARGET_EXT4_JOURNAL),-j) -O extents,uninit_bg,dir_index $(KDIR)/root.ext4 # fix it up $(STAGING_DIR_HOST)/bin/e2fsck -fy $(KDIR)/root.ext4 - $(call Image/Build,ext4) - endef -endif - -ifneq ($(CONFIG_TARGET_ROOTFS_ISO),) - define Image/mkfs/iso - $(call Image/Build,iso) - endef -endif - +endef define Image/mkfs/prepare/default # Use symbolic permissions to avoid clobbering SUID/SGID/sticky bits - - $(FIND) $(TARGET_DIR) -type f -not -perm +0100 -not -name 'ssh_host*' -not -name 'shadow' -print0 | $(XARGS) -0 chmod u+rw,g+r,o+r - - $(FIND) $(TARGET_DIR) -type f -perm +0100 -print0 | $(XARGS) -0 chmod u+rwx,g+rx,o+rx + - $(FIND) $(TARGET_DIR) -type f -not -perm /0100 -not -name 'ssh_host*' -not -name 'shadow' -print0 | $(XARGS) -0 chmod u+rw,g+r,o+r + - $(FIND) $(TARGET_DIR) -type f -perm /0100 -print0 | $(XARGS) -0 chmod u+rwx,g+rx,o+rx - $(FIND) $(TARGET_DIR) -type d -print0 | $(XARGS) -0 chmod u+rwx,g+rx,o+rx - $(INSTALL_DIR) $(TARGET_DIR)/tmp + $(INSTALL_DIR) $(TARGET_DIR)/tmp $(TARGET_DIR)/overlay chmod 1777 $(TARGET_DIR)/tmp endef @@ -241,65 +258,210 @@ endef define Image/Checksum ( cd ${BIN_DIR} ; \ - $(FIND) -maxdepth 1 -type f \! -name 'md5sums' -printf "%P\n" | sort | xargs \ - md5sum --binary > md5sums \ + $(FIND) -maxdepth 1 -type f \! -name 'md5sums' -printf "%P\n" | sort | xargs $1 > $2 \ ) endef +define BuildImage/mkfs + install: mkfs-$(1) + .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 +define Device/Export + $(foreach var,$(DEVICE_VARS) KERNEL KERNEL_INITRAMFS,$(call Device/ExportVar,$(1),$(var))) + $(1) : FILESYSTEM:=$(2) +endef + +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 + $(KDIR)/$$(KERNEL_NAME): image_prepare + touch $$@ + $$(_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 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 define BuildImage download: prepare: + compile: + clean: + image_prepare: ifeq ($(IB),) - compile: compile-targets FORCE - $(call Build/Compile) - else + .PHONY: download prepare compile clean image_prepare mkfs_prepare kernel_prepare install compile: - endif + $(call Build/Compile) - ifeq ($(IB),) - install: compile install-targets FORCE + clean: + $(call Build/Clean) + + image_prepare: compile $(call Image/Prepare) - $(call Image/mkfs/prepare) - $(call Image/BuildKernel) - $(call Image/BuildKernel/Initramfs) - $(call Image/InstallKernel) - $(call Image/mkfs/cpiogz) - $(call Image/mkfs/targz) - $(call Image/mkfs/ext4) - $(call Image/mkfs/iso) - $(call Image/mkfs/jffs2) - $(call Image/mkfs/jffs2_nand) - $(call Image/mkfs/squashfs) - $(call Image/mkfs/ubifs) - $(call Image/Checksum) - else - install: compile install-targets - $(call Image/BuildKernel) - $(call Image/BuildKernel/Initramfs) - $(call Image/InstallKernel) - $(call Image/mkfs/cpiogz) - $(call Image/mkfs/targz) - $(call Image/mkfs/ext4) - $(call Image/mkfs/iso) - $(call Image/mkfs/jffs2) - $(call Image/mkfs/jffs2_nand) - $(call Image/mkfs/squashfs) - $(call Image/mkfs/ubifs) - $(call Image/Checksum) endif - ifeq ($(IB),) - clean: clean-targets - $(call Build/Clean) - else - clean: - endif + mkfs_prepare: image_prepare + $(call Image/mkfs/prepare) - compile-targets: - install-targets: - clean-targets: + kernel_prepare: mkfs_prepare + $(call Image/BuildKernel) + $(if $(CONFIG_TARGET_ROOTFS_INITRAMFS),$(call Image/BuildKernel/Initramfs)) + $(call Image/InstallKernel) + + $(foreach device,$(TARGET_DEVICES),$(call Device,$(device))) + $(foreach fs,$(TARGET_FILESYSTEMS) $(fs-subtypes-y),$(call BuildImage/mkfs,$(fs))) + + install: kernel_prepare + $(foreach fs,$(TARGET_FILESYSTEMS), + $(call Image/Build,$(fs)) + ) + $(call Image/mkfs/ubifs) + $(call Image/Checksum,md5sum --binary,md5sums) + $(call Image/Checksum,openssl dgst -sha256,sha256sums) endef