# *****************************************************************************
# * Copyright (c) 2004, 2008 IBM Corporation
# * All rights reserved.
# * This program and the accompanying materials
# * are made available under the terms of the BSD License
# * which accompanies this distribution, and is available at
# * http://www.opensource.org/licenses/bsd-license.php
# *
# * Contributors:
# *     IBM Corporation - initial implementation
# ****************************************************************************/


MAKEARG = BOARD=$(BOARD) PLATFORM=$(PLATFORM) FLAG=$(FLAG) TARG=$(TARG)

BUILDS  = tools_build romfs_build

include ../make.rules

ifdef DRIVER
RELEASE=$(shell cat ../VERSION)
export DRIVER_NAME=$(shell cat ../VERSION | sed -e "s/-/./g" | awk -F . '{ printf("%s%02d%02d%1s%02s",$$1,$$2,$$3,$$4,$$5); }')
else
ifneq (,$(wildcard ../.git))
RELEASE=git-$(shell git rev-parse --short=16 HEAD)
else
ifneq (,$(shell cat ../VERSION))
RELEASE="$(USER)@$(HOSTNAME) release $(shell cat ../VERSION)"
export DRIVER_NAME=HEAD
else
RELEASE="$(USER)@$(HOSTNAME)(private build)"
export DRIVER_NAME=HEAD
endif
endif
endif


DRVDATE=$(shell date +%Y-%h%d)

FLASH_SIZE_MB = `echo $$[ $(FLASH_SIZE)/1024/1024 ]`

DTB_ROMFS_FLAG ?= 0
DTB_ROMFS_ADDR ?= 0

llfw_disassembly:
	$(MAKE) -C $(LLFWBRDDIR) stage1.dis stage2.dis stageS.dis

clients_build:
	@echo " ====== Building clients ======"
	$(MAKE) -C ../clients $(MAKEARG)

other_licence_build:
	$(MAKE) -C ../other-licence $(MAKEARG)

tools_build:
	$(MAKE) -C ../tools

romfs_build:
	$(MAKE) -C ../romfs/tools $(MAKEARG)

../build_info.img:
	@echo "$(CC)" > ../build_info.img
	@$(CC) -v >> ../build_info.img 2>&1
	@$(LD) -V >> ../build_info.img 2>&1

../$(SUBBOARD).dtb:
	@if [ -e dts/$(SUBBOARD).dts ]; then \
		 dtc -q -I dts -O dtb dts/$(SUBBOARD).dts > $@; \
	fi

boot_rom.bin:	$(BUILDS) ../build_info.img ../$(SUBBOARD).dtb
	@echo " ====== Building $@ ======"
	@if [ -e $(ROMFSBRDDIR)/boot_rom.$(SUBBOARD).ffs ]; then \
		cat $(ROMFSBRDDIR)/boot_rom.$(SUBBOARD).ffs > ../.boot_rom.ffs; \
	else \
		cat $(ROMFSBRDDIR)/boot_rom.ffs > ../.boot_rom.ffs; \
	fi
	@if [ -e $(PCDBRDDIR)/pcdfiles.ffs ]; then \
		cat $(PCDBRDDIR)/pcdfiles.ffs >> ../.boot_rom.ffs; \
	fi
	cat $(SLOFBRDDIR)/OF.ffs >> ../.boot_rom.ffs
	@echo build_info.img  build_info.img 0 0 >> ../.boot_rom.ffs
	@if [ -e ../$(SUBBOARD).dtb ]; then \
		echo dtb $(SUBBOARD).dtb $(DTB_ROMFS_FLAG) \
			$(DTB_ROMFS_ADDR) >> ../.boot_rom.ffs; \
	fi
	cd .. && ./romfs/tools/build_romfs $(ROMFS_OPTIONS) .boot_rom.ffs $@
	cd .. && if [ -f $@.gz ]; then rm -f $@.gz; gzip -9 $@ ; fi
	rm -f ../.boot_rom.*ffs
	rm -f ../$(SUBBOARD).dtb


external_flasher: ../boot_rom.bin
	../tools/make-flasher-image.sh $(FLASH_SIZE) ../boot_rom.bin \
		../boot_rom-$(FLASH_SIZE_MB)MB-BigEndian.bin

driver_dirs:
	@rm -rf ../driver-$(RELEASE)
	@mkdir -p ../driver-$(RELEASE)/{rom,l2b,disassemblies}

driver_prep:
	@echo "Building driver "$(RELEASE)" for $(BOARD)"

copy_disassemblies:	llfw_disassembly
	cp $(LLFWBRDDIR)/stage1.dis  \
		../driver-$(RELEASE)/disassemblies/$(RELEASE)-stage1.dis
	cp $(LLFWBRDDIR)/stage2.dis  \
		../driver-$(RELEASE)/disassemblies/$(RELEASE)-stage2.dis
	cp $(LLFWBRDDIR)/stageS.dis  \
		../driver-$(RELEASE)/disassemblies/$(RELEASE)-stageS.dis
	cp $(LLFWBRDDIR)/meminit.dis  \
		../driver-$(RELEASE)/disassemblies/$(RELEASE)-meminit.dis
	@if [ -e ../clients/snk/client.dis ]; then cp ../clients/snk/client.dis \
		../driver-$(RELEASE)/disassemblies/$(RELEASE)-client.dis; fi

copy_driver:	copy_disassemblies external_flasher
	mv ../boot_rom-$(FLASH_SIZE_MB)MB-BigEndian.bin \
		../driver-$(RELEASE)/rom/$(RELEASE)-boot_rom-$(FLASH_SIZE_MB)MB-BigEndian.bin
	mv ../boot_rom.bin \
		../driver-$(RELEASE)/rom/$(RELEASE)-boot_rom.bin
	if [ -e ../boot_l2-dd2.ad ]; then \
		mv ../boot_l2-dd2.ad ../driver-$(RELEASE)/l2b/; \
	else \
		mv ../boot_l2.ad ../driver-$(RELEASE)/l2b/; \
	fi
	mv ../boot_xdr.bin ../driver-$(RELEASE)/l2b/
	cp ../VERSION ../driver-$(RELEASE)
	cd ../driver-$(RELEASE) && md5sum rom/*.bin > md5sum.txt

tar_gz:		copy_driver
	@cp -a ../driver-$(RELEASE) ../driver-$(RELEASE)-$(DRVDATE)-devel
	tar czf ../driver-$(RELEASE)-$(DRVDATE)-devel.tar.gz \
		../driver-$(RELEASE)-$(DRVDATE)-devel > /dev/null 2>&1
	@rm -rf ../driver-$(RELEASE)-$(DRVDATE)-devel
	@rm -rf ../driver-$(RELEASE)/disassemblies
	@mv ../driver-$(RELEASE) ../driver-$(RELEASE)-$(DRVDATE)
	tar czf ../driver-$(RELEASE)-$(DRVDATE).tar.gz \
		../driver-$(RELEASE)-$(DRVDATE) > /dev/null  2>&1
	@rm -rf ../driver-$(RELEASE)-$(DRVDATE)

clean_top:
	@rm -f ../build_info.img
	@rm -f ../.crc_flash
	@rm -f ../$(SUBBOARD).dtb

clean_gen:	clean_top
	$(MAKE) -C ../romfs/tools BOARD=$(BOARD) clean
	$(MAKE) -C ../tools clean
	$(MAKE) -C ../other-licence clean
	$(MAKE) -C ../clients clean
	@for dir in $(COMMON_LIBS); do \
		$(MAKE) -C ../lib/$$dir clean || exit 1; \
	done

distclean_gen:	clean_top
	$(MAKE) -C ../romfs/tools BOARD=$(BOARD) distclean
	$(MAKE) -C ../tools distclean
	$(MAKE) -C ../other-licence distclean
	$(MAKE) -C ../clients distclean
	@for dir in $(COMMON_LIBS); do \
		$(MAKE) -C ../lib/$$dir distclean || exit 1; \
	done

common-libs:
	@echo " ====== Building common libraries ======"
	$(MAKE) -C $(LIBCMNDIR) $(COMMON_LIBS)

board-libs:
	$(MAKE) -C lib $(MAKEARG)
