#!/usr/bin/make -f

MAKEDIR := $(dir $(lastword $(MAKEFILE_LIST)))
include $(MAKEDIR)conf.mk

MPROC := +$(MAKE) --no-print-directory
FAKEROOT ?= fakeroot
RPROC := +$(FAKEROOT) $(MAKE) --no-print-directory

CLEAN_FILES := image image.tmp rootfs.tmp rootfs
FULLCLEAN_FILES :=

BUILDER := Makefile conf.mk

# Phony build targets
.PHONY: all clean fullclean
all: image
clean:
	rm -fr $(CLEAN_FILES)
fullclean: clean
	rm -f $(FULLCLEAN_FILES)

# Parts
include $(MAKEDIR)linux.mk
include $(MAKEDIR)rkbin.mk
include $(MAKEDIR)u-boot.mk
include $(MAKEDIR)busybox.mk
include $(MAKEDIR)initrd.mk
include $(MAKEDIR)bootstrap.mk

export ARCH
export CROSS_COMPILE
export BL31 := ../$(_BL31)
export ROCKCHIP_TPL := ../$(_ROCKCHIP_TPL)

balign = $(shell expr \( $1 - 1 \) / 2048 \* 2048 + 2048)
sector = $(shell expr \( $1 - 1 \) / 512 + 1)
sizeof = $(shell wc -c $1 | cut -d' ' -f1)
sum = $(shell expr $(firstword $1)$(foreach \
	n,$(wordlist 2,$(words $1),$1), + $n))
sumsizeof = $(call sum,$(foreach f,$1,$(call sizeof,$f)))

FSOVERHEAD_OFFSET = 8388608
FSOVERHEAD_RATE = 20
UBOOT_SIZE = $(call sizeof,u-boot/u-boot-rockchip.bin)
ROOT_OFFSET = $(call balign,$(shell expr $(UBOOT_SIZE) + 32768))
ROOT_ISIZE = $(call sumsizeof, \
	initrd.bootstrap.gz \
	linux/arch/arm64/boot/Image \
	linux/arch/arm64/boot/dts/rockchip/rk3566-orangepi-cm4.dtb \
	uboot.env.bootstrap \
	bootstrap.tar.xz)
ROOT_SIZE = $(call balign,$(shell expr $(ROOT_ISIZE) / $(FSOVERHEAD_RATE) \
	+ $(ROOT_ISIZE) + $(FSOVERHEAD_OFFSET)))
IMAGE_SIZE = $(call sum,$(ROOT_OFFSET) $(ROOT_SIZE) 16896)

image: rootfs \
  u-boot/u-boot-rockchip.bin \
  $(BUILDER)
	head -c$(IMAGE_SIZE) /dev/zero > image.tmp
	printf '%s\n' \
		'label: gpt' \
		'unit: sectors' \
		'first-lba: 64' \
		'sector-size: 512' \
		'name=bootloader start=64 size=$(call sector,$(UBOOT_SIZE)) type=b0e05c7d-1f0c-4ae2-ac11-80a6accaa28d' \
		'name=root start=$(call sector,$(ROOT_OFFSET)) size=$(call sector,$(ROOT_SIZE)) type=L' \
	| /sbin/sfdisk image.tmp
	dd bs=512 seek=64 if=u-boot/u-boot-rockchip.bin of=image.tmp
	dd bs=512 seek=$(call sector,$(ROOT_OFFSET)) \
		if=rootfs of=image.tmp
	mv image.tmp image

rootfs: initrd.bootstrap.gz \
  linux/arch/arm64/boot/Image \
  linux/arch/arm64/boot/dts/rockchip/rk3566-orangepi-cm4.dtb \
  uboot.env.bootstrap \
  uboot.env.final \
  bootstrap.tar.xz \
  $(BUILDER)
	head -c$(ROOT_SIZE) /dev/zero > rootfs.tmp
	/usr/sbin/mke2fs -text4 rootfs.tmp
	printf '%s\n' \
		'mkdir boot' \
		'write linux/arch/arm64/boot/dts/rockchip/rk3566-orangepi-cm4.dtb boot/rk3566-orangepi-cm4.dtb' \
		'write linux/arch/arm64/boot/Image.gz boot/vmlinuz' \
		'write initrd.bootstrap.gz boot/initrd.bootstrap.gz' \
		'write uboot.env.bootstrap boot/uboot.env' \
		'write uboot.env.final boot/uboot.env.final' \
		'write bootstrap.tar.xz bootstrap.tar.xz' \
	| /usr/sbin/debugfs -w -f- rootfs.tmp
	mv rootfs.tmp rootfs

# Download and Extract helpers
.PHONY: _download_% _check_% _extract_%
_download_%:
	wget -nv -O$(subst _download_,,$@) $(URL)
_check_%:
	[ "x$$(b2sum $(subst _check_,,$@) | cut -d' ' -f1)" = "x$(HASH)" ]
_extract_%.tar.gz: ZOPT=-z
_extract_%.tar.gz: NAME=$(subst .tar.gz,,$(ANAME))
_extract_%.tar.bz2: ZOPT=-j
_extract_%.tar.bz2: NAME=$(subst .tar.bz2,,$(ANAME))
_extract_%.tar.xz: ZOPT=-J
_extract_%.tar.xz: NAME=$(subst .tar.xz,,$(ANAME))
_extract_%: ANAME=$(subst _extract_,,$@)
_extract_%: $(ANAME)
	mkdir -p $(NAME)
	tar -m --strip-components=1 $(ZOPT) -xf $(ANAME) -C $(NAME)
