# *****************************************************************************
# * 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)
export DRIVER_NAME=git-$(shell git rev-parse --short=12 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)  RELEASE=-DRELEASE=\"\\\"$(RELEASE)\\\"\"

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