X-Git-Url: http://git.openwrt.org/?a=blobdiff_plain;f=include%2Fimage.mk;h=fc6bf06e96be11170fbba18ed1c3f2c5610f93a9;hb=4425fa84dad57b6b0046b97e224d50b33f1f536b;hp=b3211e7cb146b2c9ad8b7cb3d9ec9f230a1b4f89;hpb=0a9ee89dbd6f851451b7dc2798de0b1476dfe0e0;p=openwrt%2Fopenwrt.git diff --git a/include/image.mk b/include/image.mk index b3211e7cb1..fc6bf06e96 100644 --- a/include/image.mk +++ b/include/image.mk @@ -8,15 +8,42 @@ override TARGET_BUILD= include $(INCLUDE_DIR)/prereq.mk include $(INCLUDE_DIR)/kernel.mk -include $(INCLUDE_DIR)/host.mk +include $(INCLUDE_DIR)/version.mk +include $(INCLUDE_DIR)/image-commands.mk + +ifndef IB + ifdef CONFIG_TARGET_PER_DEVICE_ROOTFS + TARGET_PER_DEVICE_ROOTFS := 1 + endif +endif + +include $(INCLUDE_DIR)/image-legacy.mk + +ifdef TARGET_PER_DEVICE_ROOTFS + include $(INCLUDE_DIR)/rootfs.mk +endif + +override MAKE:=$(_SINGLE)$(SUBMAKE) +override NO_TRACE_MAKE:=$(_SINGLE)$(NO_TRACE_MAKE) + +target_params = $(subst +,$(space),$*) +param_get = $(patsubst $(1)=%,%,$(filter $(1)=%,$(2))) +param_get_default = $(firstword $(call param_get,$(1),$(2)) $(3)) +param_mangle = $(subst $(space),_,$(strip $(1))) +param_unmangle = $(subst _,$(space),$(1)) + +mkfs_packages_id = $(shell echo $(sort $(1)) | mkhash md5 | head -c 8) +mkfs_target_dir = $(if $(call param_get,pkg,$(1)),$(KDIR)/target-dir-$(call param_get,pkg,$(1)),$(TARGET_DIR)) -.NOTPARALLEL: -override MAKEFLAGS= -override MAKE:=$(SUBMAKE) KDIR=$(KERNEL_BUILD_DIR) -DTS_DIR:=$(LINUX_DIR)/arch/$(ARCH)/boot/dts/ +KDIR_TMP=$(KDIR)/tmp +DTS_DIR:=$(LINUX_DIR)/arch/$(LINUX_KARCH)/boot/dts -IMG_PREFIX:=openwrt-$(BOARD)$(if $(SUBTARGET),-$(SUBTARGET)) +IMG_PREFIX_EXTRA:=$(if $(EXTRA_IMAGE_NAME),$(call sanitize,$(EXTRA_IMAGE_NAME))-) +IMG_PREFIX_VERNUM:=$(if $(CONFIG_VERSION_FILENAMES),$(call sanitize,$(VERSION_NUMBER))-) +IMG_PREFIX_VERCODE:=$(if $(CONFIG_VERSION_CODE_FILENAMES),$(call sanitize,$(VERSION_CODE))-) + +IMG_PREFIX:=$(VERSION_DIST_SANITIZED)-$(IMG_PREFIX_VERNUM)$(IMG_PREFIX_VERCODE)$(IMG_PREFIX_EXTRA)$(BOARD)$(if $(SUBTARGET),-$(SUBTARGET)) MKFS_DEVTABLE_OPT := -D $(INCLUDE_DIR)/device_table.txt @@ -52,9 +79,6 @@ SQUASHFSOPT := -b $(SQUASHFS_BLOCKSIZE) SQUASHFSOPT += -p '/dev d 755 0 0' -p '/dev/console c 600 0 0 5 1' SQUASHFSCOMP := gzip LZMA_XZ_OPTIONS := -Xpreset 9 -Xe -Xlc 0 -Xlp 2 -Xpb 2 -ifeq ($(CONFIG_SQUASHFS_LZMA),y) - SQUASHFSCOMP := lzma $(LZMA_XZ_OPTIONS) -endif ifeq ($(CONFIG_SQUASHFS_XZ),y) ifneq ($(filter arm x86 powerpc sparc,$(LINUX_KARCH)),) BCJ_FILTER:=-Xbcj $(LINUX_KARCH) @@ -64,12 +88,41 @@ 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-types-$(CONFIG_TARGET_ROOTFS_UBIFS) += ubifs +fs-subtypes-$(CONFIG_TARGET_ROOTFS_JFFS2) += $(addsuffix -raw,$(addprefix jffs2-,$(JFFS2_BLOCKSIZE))) + +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 -define toupper -$(shell echo $(1) | tr '[:lower:]' '[:upper:]') +PROFILE_SANITIZED := $(call sanitize,$(PROFILE)) + +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 @@ -78,65 +131,99 @@ define prepare_generic_squashfs endef define Image/BuildKernel/Initramfs - cp $(KDIR)/vmlinux-initramfs.elf $(BIN_DIR)/$(IMG_PREFIX)-vmlinux-initramfs.elf $(call Image/Build/Initramfs) endef define Image/BuildKernel/MkuImage mkimage -A $(ARCH) -O linux -T kernel -C $(1) -a $(2) -e $(3) \ - -n '$(call toupper,$(ARCH)) OpenWrt Linux-$(LINUX_VERSION)' -d $(4) $(5) + -n '$(call toupper,$(ARCH)) LEDE Linux-$(LINUX_VERSION)' -d $(4) $(5) endef define Image/BuildKernel/MkFIT $(TOPDIR)/scripts/mkits.sh \ - -D $(1) -o $(KDIR)/fit-$(1).its -k $(2) -d $(3) -C $(4) -a $(5) -e $(6) \ - -A $(ARCH) -v $(LINUX_VERSION) + -D $(1) -o $(KDIR)/fit-$(1).its -k $(2) $(if $(3),-d $(3)) -C $(4) -a $(5) -e $(6) \ + -A $(LINUX_KARCH) -v $(LINUX_VERSION) PATH=$(LINUX_DIR)/scripts/dtc:$(PATH) mkimage -f $(KDIR)/fit-$(1).its $(KDIR)/fit-$(1)$(7).itb endef +ifdef CONFIG_TARGET_IMAGES_GZIP + define Image/Gzip + rm -f $(1).gz + gzip -9n $(1) + endef +endif + +# $(1) source dts file +# $(2) target dtb file +# $(3) extra CPP flags +# $(4) extra DTC flags +define Image/BuildDTB + $(TARGET_CROSS)cpp -nostdinc -x assembler-with-cpp \ + -I$(DTS_DIR) \ + -I$(DTS_DIR)/include \ + -I$(LINUX_DIR)/include/ \ + -undef -D__DTS__ $(3) \ + -o $(2).tmp $(1) + $(LINUX_DIR)/scripts/dtc/dtc -O dtb \ + -i$(dir $(1)) $(4) \ + -o $(2) $(2).tmp + $(RM) $(2).tmp +endef + +define Image/mkfs/jffs2/sub-raw + $(STAGING_DIR_HOST)/bin/mkfs.jffs2 \ + $(2) \ + -e $(patsubst %k,%KiB,$(1)) \ + -o $@ -d $(call mkfs_target_dir,$(3)) \ + -v 2>&1 1>/dev/null | awk '/^.+$$$$/' +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)) + $(call Image/mkfs/jffs2/sub-raw,$(1),--pad $(2),$(3)) + $(call add_jffs2_mark,$@) 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/template + Image/mkfs/jffs2-$(1) = $$(call Image/mkfs/jffs2/sub,$(1),$(JFFS2OPTS),$$(1)) + Image/mkfs/jffs2-$(1)-raw = $$(call Image/mkfs/jffs2/sub-raw,$(1),$(JFFS2OPTS),$$(1)) -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 +endef -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 +define Image/mkfs/jffs2-nand/template + Image/mkfs/jffs2-nand-$(1) = \ + $$(call Image/mkfs/jffs2/sub, \ + $(word 2,$(subst -, ,$(1))), \ + $(JFFS2OPTS) --no-cleanmarkers --pagesize=$(word 1,$(subst -, ,$(1))),$$(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 $(call mkfs_target_dir,$(1)) $@ \ + -nopad -noappend -root-owned \ + -comp $(SQUASHFSCOMP) $(SQUASHFSOPT) \ + -processors 1 \ + $(if $(SOURCE_DATE_EPOCH),-fixed-time $(SOURCE_DATE_EPOCH)) +endef # $(1): board name # $(2): rootfs type # $(3): kernel image +# $(4): compat string ifneq ($(CONFIG_NAND_SUPPORT),) define Image/Build/SysupgradeNAND - mkdir -p "$(KDIR_TMP)/sysupgrade-$(1)/" - echo "BOARD=$(1)" > "$(KDIR_TMP)/sysupgrade-$(1)/CONTROL" - [ -z "$(2)" ] || $(CP) "$(KDIR)/root.$(2)" "$(KDIR_TMP)/sysupgrade-$(1)/root" - [ -z "$(3)" ] || $(CP) "$(3)" "$(KDIR_TMP)/sysupgrade-$(1)/kernel" + mkdir -p "$(KDIR_TMP)/sysupgrade-$(if $(4),$(4),$(1))/" + echo "BOARD=$(if $(4),$(4),$(1))" > "$(KDIR_TMP)/sysupgrade-$(if $(4),$(4),$(1))/CONTROL" + [ -z "$(2)" ] || $(CP) "$(KDIR)/root.$(2)" "$(KDIR_TMP)/sysupgrade-$(if $(4),$(4),$(1))/root" + [ -z "$(3)" ] || $(CP) "$(3)" "$(KDIR_TMP)/sysupgrade-$(if $(4),$(4),$(1))/kernel" (cd "$(KDIR_TMP)"; $(TAR) cvf \ - "$(BIN_DIR)/$(IMG_PREFIX)-$(1)-$(2)-sysupgrade.tar" sysupgrade-$(1)) + "$(BIN_DIR)/$(IMG_PREFIX)-$(1)-$(2)-sysupgrade.tar" sysupgrade-$(if $(4),$(4),$(1)) \ + $(if $(SOURCE_DATE_EPOCH),--mtime="@$(SOURCE_DATE_EPOCH)") \ + ) endef + # $(1) board name # $(2) ubinize-image options (e.g. --uboot-env and/or --kernel kernelimage) # $(3) rootfstype (e.g. squashfs or ubifs) @@ -144,162 +231,347 @@ 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 endif -ifneq ($(CONFIG_TARGET_ROOTFS_UBIFS),) - define Image/mkfs/ubifs/generate - $(CP) ./ubinize$(1).cfg $(KDIR) - ( cd $(KDIR); \ - $(STAGING_DIR_HOST)/bin/ubinize \ - $(if $($(PROFILE)_UBI_OPTS), \ - $(shell echo $($(PROFILE)_UBI_OPTS)), \ - $(shell echo $(UBI_OPTS)) \ - ) \ - -o $(KDIR)/root$(1).ubi \ - ubinize$(1).cfg \ - ) - endef - - define Image/mkfs/ubifs - - ifneq ($($(PROFILE)_UBIFS_OPTS)$(UBIFS_OPTS),) - $(STAGING_DIR_HOST)/bin/mkfs.ubifs \ - $(if $($(PROFILE)_UBIFS_OPTS), \ - $(shell echo $($(PROFILE)_UBIFS_OPTS)), \ - $(shell echo $(UBIFS_OPTS)) \ - ) \ - $(if $(CONFIG_TARGET_UBIFS_FREE_SPACE_FIXUP),--space-fixup) \ - $(if $(CONFIG_TARGET_UBIFS_COMPRESSION_NONE),--force-compr=none) \ - $(if $(CONFIG_TARGET_UBIFS_COMPRESSION_LZO),--force-compr=lzo) \ - $(if $(CONFIG_TARGET_UBIFS_COMPRESSION_ZLIB),--force-compr=zlib) \ - $(if $(shell echo $(CONFIG_TARGET_UBIFS_JOURNAL_SIZE)),--jrn-size=$(CONFIG_TARGET_UBIFS_JOURNAL_SIZE)) \ - --squash-uids \ - -o $(KDIR)/root.ubifs \ - -d $(TARGET_DIR) - endif - $(call Image/Build,ubifs) - - ifneq ($($(PROFILE)_UBI_OPTS)$(UBI_OPTS),) - $(call Image/mkfs/ubifs/generate,) - $(if $(wildcard ./ubinize-overlay.cfg),$(call Image/mkfs/ubifs/generate,-overlay)) - endif - $(call Image/Build,ubi) - endef -endif +define Image/mkfs/ubifs + $(STAGING_DIR_HOST)/bin/mkfs.ubifs \ + $(UBIFS_OPTS) $(call param_unmangle,$(call param_get,fs,$(1))) \ + $(if $(CONFIG_TARGET_UBIFS_FREE_SPACE_FIXUP),--space-fixup) \ + $(if $(CONFIG_TARGET_UBIFS_COMPRESSION_NONE),--compr=none) \ + $(if $(CONFIG_TARGET_UBIFS_COMPRESSION_LZO),--compr=lzo) \ + $(if $(CONFIG_TARGET_UBIFS_COMPRESSION_ZLIB),--compr=zlib) \ + $(if $(shell echo $(CONFIG_TARGET_UBIFS_JOURNAL_SIZE)),--jrn-size=$(CONFIG_TARGET_UBIFS_JOURNAL_SIZE)) \ + --squash-uids \ + -o $@ -d $(call mkfs_target_dir,$(1)) +endef -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 +E2SIZE=$(shell echo $$(($(CONFIG_TARGET_ROOTFS_PARTSIZE)*1024*1024))) + +define Image/mkfs/ext4 + $(STAGING_DIR_HOST)/bin/make_ext4fs \ + -l $(E2SIZE) -b $(CONFIG_TARGET_EXT4_BLOCKSIZE) \ + $(if $(CONFIG_TARGET_EXT4_RESERVED_PCT),-m $(CONFIG_TARGET_EXT4_RESERVED_PCT)) \ + $(if $(CONFIG_TARGET_EXT4_JOURNAL),,-J) \ + $(if $(SOURCE_DATE_EPOCH),-T $(SOURCE_DATE_EPOCH)) \ + $@ $(call mkfs_target_dir,$(1))/ +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)/ . +define Image/Manifest + $(STAGING_DIR_HOST)/bin/opkg \ + --offline-root $(TARGET_DIR) \ + --add-arch all:100 \ + --add-arch $(if $(ARCH_PACKAGES),$(ARCH_PACKAGES),$(BOARD)):200 list-installed > \ + $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED)).manifest +endef + +ifdef CONFIG_TARGET_ROOTFS_TARGZ + define Image/Build/targz + $(TAR) -cp --numeric-owner --owner=0 --group=0 --sort=name \ + $(if $(SOURCE_DATE_EPOCH),--mtime="@$(SOURCE_DATE_EPOCH)") \ + -C $(TARGET_DIR)/ . | gzip -9n > $(BIN_DIR)/$(IMG_PREFIX)$(if $(PROFILE_SANITIZED),-$(PROFILE_SANITIZED))-rootfs.tar.gz endef endif -ifneq ($(CONFIG_TARGET_ROOTFS_EXT4FS),) - E2SIZE=$(shell echo $$(($(CONFIG_TARGET_ROOTFS_PARTSIZE)*1024*1024/$(CONFIG_TARGET_EXT4_BLOCKSIZE)))) - - 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) +ifdef CONFIG_TARGET_ROOTFS_CPIOGZ + define Image/Build/cpiogz + ( cd $(TARGET_DIR); find . | cpio -o -H newc -R root:root | gzip -9n >$(BIN_DIR)/$(IMG_PREFIX)-rootfs.cpio.gz ) endef endif -ifneq ($(CONFIG_TARGET_ROOTFS_ISO),) - define Image/mkfs/iso - $(call Image/Build,iso) - endef +mkfs_packages = $(filter-out @%,$(PACKAGES_$(call param_get,pkg,pkg=$(target_params)))) +mkfs_packages_add = $(filter-out -%,$(mkfs_packages)) +mkfs_packages_remove = $(patsubst -%,%,$(filter -%,$(mkfs_packages))) +mkfs_cur_target_dir = $(call mkfs_target_dir,pkg=$(target_params)) + +opkg_target = \ + $(call opkg,$(mkfs_cur_target_dir)) \ + -f $(mkfs_cur_target_dir).conf + +target-dir-%: FORCE + rm -rf $(mkfs_cur_target_dir) $(mkfs_cur_target_dir).opkg + $(CP) $(TARGET_DIR_ORIG) $(mkfs_cur_target_dir) + -mv $(mkfs_cur_target_dir)/etc/opkg $(mkfs_cur_target_dir).opkg + echo 'src default file://$(PACKAGE_DIR_ALL)' > $(mkfs_cur_target_dir).conf + $(if $(mkfs_packages_remove), \ + -$(call opkg,$(mkfs_cur_target_dir)) remove \ + $(mkfs_packages_remove)) + $(if $(call opkg_package_files,$(mkfs_packages_add)), \ + $(opkg_target) update && \ + $(opkg_target) install \ + $(call opkg_package_files,$(mkfs_packages_add))) + $(call prepare_rootfs,$(mkfs_cur_target_dir)) + -mv $(mkfs_cur_target_dir).opkg $(mkfs_cur_target_dir)/etc/opkg + rm -f $(mkfs_cur_target_dir).conf + +$(KDIR)/root.%: kernel_prepare + $(call Image/mkfs/$(word 1,$(target_params)),$(target_params)) + +define Device/InitProfile + PROFILES := $(PROFILE) + DEVICE_TITLE := + DEVICE_PACKAGES := + DEVICE_DESCRIPTION = Build firmware images for $$(DEVICE_TITLE) +endef + +define Device/Init + DEVICE_NAME := $(1) + KERNEL:= + KERNEL_INITRAMFS = $$(KERNEL) + KERNEL_SIZE:= + CMDLINE:= + + IMAGES := + IMAGE_PREFIX := $(IMG_PREFIX)-$(1) + IMAGE_NAME = $$(IMAGE_PREFIX)-$$(1)-$$(2) + KERNEL_PREFIX = $$(IMAGE_PREFIX) + KERNEL_SUFFIX := -kernel.bin + KERNEL_INITRAMFS_SUFFIX = $$(KERNEL_SUFFIX) + KERNEL_IMAGE = $$(KERNEL_PREFIX)$$(KERNEL_SUFFIX) + KERNEL_INITRAMFS_PREFIX = $$(IMAGE_PREFIX)-initramfs + KERNEL_INITRAMFS_IMAGE = $$(KERNEL_INITRAMFS_PREFIX)$$(KERNEL_INITRAMFS_SUFFIX) + KERNEL_INITRAMFS_NAME = $$(KERNEL_NAME)-initramfs + KERNEL_INSTALL := + KERNEL_NAME := vmlinux + KERNEL_DEPENDS := + KERNEL_SIZE := + + UBOOTENV_IN_UBI := + KERNEL_IN_UBI := + BLOCKSIZE := + PAGESIZE := + SUBPAGESIZE := + VID_HDR_OFFSET := + UBINIZE_OPTS := + UBINIZE_PARTS := + MKUBIFS_OPTS := + + FS_OPTIONS/ubifs = $$(MKUBIFS_OPTS) + + DEVICE_DTS := + DEVICE_DTS_DIR := + + BOARD_NAME := + UIMAGE_NAME := + SUPPORTED_DEVICES := + IMAGE_METADATA := + + FILESYSTEMS := $(TARGET_FILESYSTEMS) +endef + +DEFAULT_DEVICE_VARS := \ + DEVICE_NAME KERNEL KERNEL_INITRAMFS KERNEL_SIZE KERNEL_INITRAMFS_IMAGE \ + KERNEL_LOADADDR DEVICE_DTS DEVICE_DTS_DIR BOARD_NAME CMDLINE \ + UBOOTENV_IN_UBI KERNEL_IN_UBI \ + BLOCKSIZE PAGESIZE SUBPAGESIZE VID_HDR_OFFSET \ + UBINIZE_OPTS UIMAGE_NAME UBINIZE_PARTS \ + SUPPORTED_DEVICES IMAGE_METADATA + +define Device/ExportVar + $(1) : $(2):=$$($(2)) + +endef +define Device/Export + $(foreach var,$(DEVICE_VARS) $(DEFAULT_DEVICE_VARS),$(call Device/ExportVar,$(1),$(var))) + $(1) : FILESYSTEM:=$(2) +endef + +ifdef IB + DEVICE_CHECK_PROFILE = $(filter $(1),DEVICE_$(PROFILE) $(PROFILE)) +else + DEVICE_CHECK_PROFILE = $(CONFIG_TARGET_$(if $(CONFIG_TARGET_MULTI_PROFILE),DEVICE_)$(call target_conf,$(BOARD)$(if $(SUBTARGET),_$(SUBTARGET)))_$(1)) endif +DEVICE_EXTRA_PACKAGES = $(call qstrip,$(CONFIG_TARGET_DEVICE_PACKAGES_$(call target_conf,$(BOARD)$(if $(SUBTARGET),_$(SUBTARGET)))_DEVICE_$(1))) + +define merge_packages + $(1) := + $(foreach pkg,$(2), + $(1) := $$(strip $$(filter-out -$$(patsubst -%,%,$(pkg)) $$(patsubst -%,%,$(pkg)),$$($(1))) $(pkg)) + ) +endef + +define Device/Check/Common + _PROFILE_SET = $$(strip $$(foreach profile,$$(PROFILES) DEVICE_$(1),$$(call DEVICE_CHECK_PROFILE,$$(profile)))) + ifdef TARGET_PER_DEVICE_ROOTFS + $$(eval $$(call merge_packages,_PACKAGES,$$(DEVICE_PACKAGES) $$(call DEVICE_EXTRA_PACKAGES,$(1)))) + ROOTFS_ID/$(1) := $$(if $$(_PROFILE_SET),$$(call mkfs_packages_id,$$(_PACKAGES))) + PACKAGES_$$(ROOTFS_ID/$(1)) := $$(_PACKAGES) + 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 d -print0 | $(XARGS) -0 chmod u+rwx,g+rx,o+rx - $(INSTALL_DIR) $(TARGET_DIR)/tmp - chmod 1777 $(TARGET_DIR)/tmp +define Device/Check + $(Device/Check/Common) + KDIR_KERNEL_IMAGE := $(KDIR)/$(1)$$(KERNEL_SUFFIX) + _TARGET := $$(if $$(_PROFILE_SET),install-images,install-disabled) + ifndef IB + _COMPILE_TARGET := $$(if $(CONFIG_IB)$$(_PROFILE_SET),compile,compile-disabled) + endif endef -define Image/mkfs/prepare - $(call Image/mkfs/prepare/default) +ifndef IB +define Device/Build/initramfs + $(call Device/Export,$(KDIR)/tmp/$$(KERNEL_INITRAMFS_IMAGE),$(1)) + $$(_TARGET): $$(if $$(KERNEL_INITRAMFS),$(BIN_DIR)/$$(KERNEL_INITRAMFS_IMAGE)) + + $(KDIR)/$$(KERNEL_INITRAMFS_NAME):: image_prepare + $(BIN_DIR)/$$(KERNEL_INITRAMFS_IMAGE): $(KDIR)/tmp/$$(KERNEL_INITRAMFS_IMAGE) + cp $$^ $$@ + + $(KDIR)/tmp/$$(KERNEL_INITRAMFS_IMAGE): $(KDIR)/$$(KERNEL_INITRAMFS_NAME) $(CURDIR)/Makefile $$(KERNEL_DEPENDS) image_prepare + @rm -f $$@ + $$(call concat_cmd,$$(KERNEL_INITRAMFS)) endef +endif + +define Device/Build/compile + $$(_COMPILE_TARGET): $(KDIR)/$(1) + $(eval $(call Device/Export,$(KDIR)/$(1))) + $(KDIR)/$(1): + $$(call concat_cmd,$(COMPILE/$(1))) +endef -define Image/Checksum - ( cd ${BIN_DIR} ; \ - $(FIND) -maxdepth 1 -type f \! -name 'md5sums' -printf "%P\n" | sort | xargs \ - md5sum --binary > md5sums \ +define Device/Build/kernel + $(KDIR)/$$(KERNEL_NAME):: image_prepare + $$(_TARGET): $$(if $$(KERNEL_INSTALL),$(BIN_DIR)/$$(KERNEL_IMAGE)) + $(call Device/Export,$$(KDIR_KERNEL_IMAGE),$(1)) + $(BIN_DIR)/$$(KERNEL_IMAGE): $$(KDIR_KERNEL_IMAGE) + cp $$^ $$@ + ifndef IB + ifdef CONFIG_IB + install: $$(KDIR_KERNEL_IMAGE) + endif + $$(KDIR_KERNEL_IMAGE): $(KDIR)/$$(KERNEL_NAME) $(CURDIR)/Makefile $$(KERNEL_DEPENDS) image_prepare + @rm -f $$@ + $$(call concat_cmd,$$(KERNEL)) + $$(if $$(KERNEL_SIZE),$$(call Build/check-size,$$(KERNEL_SIZE))) + endif +endef + +define Device/Build/image + GZ_SUFFIX := $(if $(filter %dtb %gz,$(2)),,$(if $(and $(findstring ext4,$(1)),$(CONFIG_TARGET_IMAGES_GZIP)),.gz)) + $$(_TARGET): $(BIN_DIR)/$(call IMAGE_NAME,$(1),$(2))$$(GZ_SUFFIX) + $(eval $(call Device/Export,$(KDIR)/tmp/$(call IMAGE_NAME,$(1),$(2)),$(1))) + ROOTFS/$(1)/$(3) := \ + $(KDIR)/root.$(1)$$(strip \ + $$(if $$(FS_OPTIONS/$(1)),+fs=$$(call param_mangle,$$(FS_OPTIONS/$(1)))) \ + )$$(strip \ + $(if $(TARGET_PER_DEVICE_ROOTFS),+pkg=$$(ROOTFS_ID/$(3))) \ ) + ifndef IB + $$(ROOTFS/$(1)/$(3)): $(if $(TARGET_PER_DEVICE_ROOTFS),target-dir-$$(ROOTFS_ID/$(3))) + endif + $(KDIR)/tmp/$(call IMAGE_NAME,$(1),$(2)): $$(KDIR_KERNEL_IMAGE) $$(ROOTFS/$(1)/$(3)) + @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)).gz: $(KDIR)/tmp/$(call IMAGE_NAME,$(1),$(2)) + gzip -c -9n $$^ > $$@ + + $(BIN_DIR)/$(call IMAGE_NAME,$(1),$(2)): $(KDIR)/tmp/$(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/DumpInfo +Target-Profile: DEVICE_$(1) +Target-Profile-Name: $(DEVICE_TITLE) +Target-Profile-Packages: $(DEVICE_PACKAGES) +Target-Profile-Description: +$(DEVICE_DESCRIPTION) +@@ + +endef + +define Device/Dump +$$(eval $$(if $$(DEVICE_TITLE),$$(info $$(call Device/DumpInfo,$(1))))) endef +define Device + $(call Device/InitProfile,$(1)) + $(call Device/Init,$(1)) + $(call Device/Default,$(1)) + $(call Device/$(1),$(1)) + $(call Device/Check,$(1)) + $(call Device/$(if $(DUMP),Dump,Build),$(1)) + +endef define BuildImage + ifneq ($(DUMP),) + all: dumpinfo + dumpinfo: FORCE + @true + endif + download: prepare: + compile: + clean: + legacy-images-prepare: + legacy-images: + image_prepare: ifeq ($(IB),) - compile: compile-targets FORCE - $(call Build/Compile) - else + .PHONY: download prepare compile clean image_prepare kernel_prepare install install-images compile: - endif + $(call Build/Compile) - ifeq ($(IB),) - install: compile install-targets FORCE + clean: + $(call Build/Clean) + + image_prepare: compile + mkdir -p $(BIN_DIR) $(KDIR)/tmp $(call Image/Prepare) - $(call Image/mkfs/prepare) - $(call Image/BuildKernel) - $(if $(CONFIG_TARGET_ROOTFS_INITRAMFS),$(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) - $(if $(CONFIG_TARGET_ROOTFS_INITRAMFS),$(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) + legacy-images-prepare-make: image_prepare + $(MAKE) legacy-images-prepare + else - clean: + image_prepare: + mkdir -p $(BIN_DIR) $(KDIR)/tmp endif - compile-targets: - install-targets: - clean-targets: + kernel_prepare: image_prepare + $(call Image/Build/targz) + $(call Image/Build/cpiogz) + $(call Image/BuildKernel) + $(if $(CONFIG_TARGET_ROOTFS_INITRAMFS),$(if $(IB),,$(call Image/BuildKernel/Initramfs))) + $(call Image/InstallKernel) + + $(foreach device,$(TARGET_DEVICES),$(call Device,$(device))) + $(foreach device,$(LEGACY_DEVICES),$(call LegacyDevice,$(device))) + + install-images: kernel_prepare $(foreach fs,$(filter-out $(if $(UBIFS_OPTS),,ubifs),$(TARGET_FILESYSTEMS) $(fs-subtypes-y)),$(KDIR)/root.$(fs)) + $(foreach fs,$(TARGET_FILESYSTEMS), + $(call Image/Build,$(fs)) + ) + + legacy-images-make: install-images + $(call Image/mkfs/ubifs/legacy) + $(MAKE) legacy-images + + install: install-images + $(call Image/Manifest) endef