# "MokoMakefile" - a Makefile for setting up Openmoko builds
#
# Copyright (c) 2007  Rod Whitby <rod@whitby.id.au>
# All rights reserved.
# 
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# version 2 as published by the Free Software Foundation.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor,
# Boston, MA  02110-1301, USA

MKDOSFS := /sbin/mkdosfs

OM_GIT_SITE := git.openmoko.org
OM_GIT_REPO := git/openmoko.git
OM_GIT_BRANCH := org.openmoko.asu.stable
OM_IMAGE_NAME := openmoko-asu-image
# OM_GIT_BRANCH := org.openmoko.dev
# OM_IMAGE_NAME := openmoko-base-image

BB_GIT_SITE := git.openmoko.org
BB_GIT_BRANCH := bitbake-om

MM_SVN_SITE := svn.projects.openmoko.org
MM_SVN_PATH := svnroot/mokomakefile/trunk

.PHONY: all
all:	${OM_IMAGE_NAME} \
	build-qemu \
	openmoko-feed openmoko-toolchain \
	openmoko-devel-tools

.PHONY: image
image: ${OM_IMAGE_NAME}

.PHONY: tools
tools: openmoko-devel-tools

.PHONY: feed
feed: openmoko-feed

.PHONY: toolchain
toolchain: openmoko-toolchain

.PHONY: force-rebuild
force-rebuild:
	find build/tmp/work -name "*+svn*" -type d -print | \
		xargs /bin/rm -rf
	find build/tmp/stamps -name "*+svn*" -type f -print | \
		xargs /bin/rm -f

.PHONY: setup
setup:  setup-bitbake setup-openembedded setup-openmoko \
	setup-config setup-env

.PHONY: update
update: update-bitbake update-openembedded update-openmoko

.PHONY: setup-bitbake
setup-bitbake stamps/bitbake:
	( [ -e stamps/bitbake ] && \
	  [ -e bitbake/.git ] ) || \
	( git clone -n git://${BB_GIT_SITE}/git/bitbake.git bitbake )
	( cd bitbake && \
	  ( git branch | egrep -e ' ${BB_GIT_BRANCH}$$' > /dev/null || \
	    git checkout -b ${BB_GIT_BRANCH} --track origin/${BB_GIT_BRANCH} ))
	( cd bitbake && git checkout ${BB_GIT_BRANCH} )
	[ -d stamps ] || mkdir stamps
	touch stamps/bitbake

.PHONY: setup-openembedded
setup-openembedded stamps/openembedded:
	( [ -e stamps/openembedded ] && \
	  [ -e openembedded/.git ] ) || \
	( git clone -n git://${OM_GIT_SITE}/${OM_GIT_REPO} openembedded )
	( cd openembedded && \
	  ( git branch | egrep -e ' ${OM_GIT_BRANCH}$$' > /dev/null || \
	    git checkout -b ${OM_GIT_BRANCH} --track origin/${OM_GIT_BRANCH} ))
	( cd openembedded && git checkout ${OM_GIT_BRANCH} )
	[ -d stamps ] || mkdir stamps
	touch stamps/openembedded

.PHONY: setup-openmoko-developer
setup-openmoko-developer:
	[ ! -e openmoko ] || ( mv openmoko openmoko-user )
	[ -e openmoko ] || ( mkdir openmoko )
	[ -e stamps/openmoko ] || [ -e openmoko/trunk/.svn/entries ] || \
	( cd openmoko && svn co https://svn.openmoko.org/trunk )
	[ -e stamps/openmoko ] || [ -e openmoko/developers/.svn/entries ] || \
	( cd openmoko && svn co https://svn.openmoko.org/developers )
	[ -d stamps ] || mkdir stamps
	touch stamps/openmoko

.PHONY: setup-openmoko
setup-openmoko stamps/openmoko:
	[ -e openmoko ] || ( mkdir openmoko )
	[ -e stamps/openmoko ] || [ -e openmoko/trunk/.svn/entries ] || \
	( cd openmoko && svn co http://svn.openmoko.org/trunk )
	[ -e stamps/openmoko ] || [ -e openmoko/developers/.svn/entries ] || \
	( cd openmoko && svn co http://svn.openmoko.org/developers )
	[ -d stamps ] || mkdir stamps
	touch stamps/openmoko

.PHONY: setup-config
setup-config build/conf/local.conf:
	mkdir -p build/conf
	[ -e build/conf/local.conf ] || \
	( echo 'MACHINE = "om-gta01"' > build/conf/local.conf ; \
	  echo 'DISTRO = "openmoko"' >> build/conf/local.conf ; \
	  echo 'BUILD_ARCH = "'`uname -m`'"' >> build/conf/local.conf ; \
	  echo 'INHERIT += "rm_work"' >> build/conf/local.conf )
	rm -f build/conf/site.conf
	( ln -sfn ../../openmoko/trunk/src/host/openembedded/site.conf build/conf/site.conf )

.PHONY: setup-machine-gta02 setup-machine-freerunner
setup-machine-freerunner setup-machine-gta02: setup-machine-om-gta02

.PHONY: setup-machine-gta01 setup-machine-neo
setup-machine-neo setup-machine-gta01: setup-machine-om-gta01

.PHONY: setup-machine-pc
setup-machine-pc: setup-machine-x86

.PHONY: setup-machine-%
setup-machine-%: setup-config
	( grep "MACHINE = \"$*\"" build/conf/local.conf > /dev/null ) || \
	sed -i -e 's/^MACHINE[[:space:]]*=[[:space:]]*\".*\"/MACHINE = \"$*\"/' \
		build/conf/local.conf

.PHONY: setup-distro-%
setup-distro-%: setup-config
	( grep "DISTRO = \"$*\"" build/conf/local.conf > /dev/null ) || \
	sed -i -e 's/^DISTRO[[:space:]]*=[[:space:]]*\".*\"/DISTRO = \"$*\"/' \
		build/conf/local.conf

setup-env:
	[ -e setup-env ] || \
	echo 'export OMDIR="'`pwd`'"' > setup-env
	echo \
	'export BBPATH="$${OMDIR}/build:$${OMDIR}/openembedded"' \
		>> setup-env
	echo \
	'export PYTHONPATH="$${OMDIR}/bitbake/libbitbake"' \
		>> setup-env
	echo \
	'export PATH="$${OMDIR}/bitbake/bin:$${PATH}"' \
		>> setup-env

.PHONY: update-makefile
update-makefile:
	( wget -O Makefile.new http://${MM_SVN_SITE}/${MM_SVN_PATH}/Makefile && \
	  mv Makefile.new Makefile )

.PHONY: check-makefile
check-makefile:
	( wget -O - http://${MM_SVN_SITE}/${MM_SVN_PATH}/Makefile | \
	  diff -u Makefile - )

.PHONY: update-bitbake
update-bitbake: stamps/bitbake
	( cd bitbake && \
	  ( git branch | egrep -e ' ${BB_GIT_BRANCH}$$' > /dev/null || \
	    git checkout -b ${BB_GIT_BRANCH} --track origin/${BB_GIT_BRANCH} ))
	( cd bitbake && \
	  git checkout ${BB_GIT_BRANCH} && \
	  git fetch && \
	  git rebase origin/${BB_GIT_BRANCH} )

.PHONY: update-openembedded
update-openembedded: stamps/openembedded
	( cd openembedded && \
	  ( git branch | egrep -e ' ${OM_GIT_BRANCH}$$' > /dev/null || \
	    git checkout -b ${OM_GIT_BRANCH} --track origin/${OM_GIT_BRANCH} ))
	( cd openembedded && \
	  git checkout ${OM_GIT_BRANCH} && \
	  git fetch && \
	  git rebase origin/${OM_GIT_BRANCH} )

.PHONY: update-openmoko
update-openmoko: stamps/openmoko
	( cd openmoko && svn update trunk developers )

.PHONY: prefetch-sources
prefetch-sources: stamps/openmoko stamps/bitbake \
		stamps/openembedded \
		build/conf/local.conf setup-env
	( cd build && . ../setup-env && \
	  ( bitbake -c fetch ${OM_IMAGE_NAME} ) )

.PHONY: remove-work
remove-work: stamps/openmoko stamps/bitbake \
		stamps/openembedded \
		build/conf/local.conf setup-env
	( cd build && . ../setup-env && \
	  ( bitbake -c rm_work ${OM_IMAGE_NAME} ) )

.PHONY: ${OM_IMAGE_NAME}
${OM_IMAGE_NAME} stamps/${OM_IMAGE_NAME}: \
		stamps/openmoko stamps/bitbake \
		stamps/openembedded \
		build/conf/local.conf setup-env
	( cd build && . ../setup-env && \
	  ( bitbake ${OM_IMAGE_NAME} ) )
	[ -d stamps ] || mkdir stamps
	touch stamps/${OM_IMAGE_NAME}

.PHONY: u-boot-openmoko
u-boot-openmoko stamps/u-boot-openmoko: \
		stamps/openmoko stamps/bitbake \
		stamps/openembedded \
		build/conf/local.conf setup-env
	( cd build && . ../setup-env && \
	  ( bitbake u-boot-openmoko ) )
	[ -d stamps ] || mkdir stamps
	touch stamps/u-boot-openmoko

.PHONY: openmoko-devel-tools
openmoko-devel-tools stamps/openmoko-devel-tools: \
		stamps/openmoko stamps/bitbake \
		stamps/openembedded \
		build/conf/local.conf setup-env
	( cd build && . ../setup-env && \
	  bitbake dfu-util-native openocd-native )
	[ -d stamps ] || mkdir stamps
	touch stamps/openmoko-devel-tools

.PHONY: openmoko-feed
openmoko-feed stamps/openmoko-feed: \
		stamps/openmoko stamps/bitbake \
		stamps/openembedded \
		build/conf/local.conf setup-env
	( cd build && . ../setup-env && \
	  bitbake openmoko-feed )
	[ -d stamps ] || mkdir stamps
	touch stamps/openmoko-feed

.PHONY: openmoko-toolchain
openmoko-toolchain stamps/openmoko-toolchain: \
		stamps/openmoko stamps/bitbake \
		stamps/openembedded \
		build/conf/local.conf setup-env
	( cd build && . ../setup-env && \
	  bitbake meta-toolchain-openmoko )
	[ -d stamps ] || mkdir stamps
	touch stamps/openmoko-toolchain

.PHONY: qemu
qemu: setup-qemu build-qemu download-images flash-qemu-official run-qemu

.PHONY: qemu-local
qemu-local: setup-qemu build-qemu ${OM_IMAGE_NAME} u-boot-openmoko flash-qemu-local run-qemu

.PHONY: setup-qemu
setup-qemu stamps/qemu: setup-env stamps/openmoko 
	[ -e build/qemu ] || \
	( mkdir -p build/qemu )
	[ -e build/qemu/Makefile ] || \
	( . ./setup-env && cd build/qemu && \
	  $${OMDIR}/openmoko/trunk/src/host/qemu-neo1973/configure \
		--target-list=arm-softmmu )
	[ -e build/qemu/openmoko ] || \
	( . ./setup-env && cd build/qemu && mkdir openmoko && \
	  for f in $${OMDIR}/openmoko/trunk/src/host/qemu-neo1973/openmoko/* ; do \
	    ln -s $$f openmoko/`basename $$f` ; \
	  done )
	ln -sf `pwd`/openmoko/trunk/src/host/qemu-neo1973/openmoko/env build/qemu/openmoko/env
	[ -d stamps ] || mkdir stamps
	touch stamps/qemu

.PHONY: build-qemu
build-qemu build/qemu/arm-softmmu/qemu-system-arm: stamps/qemu
	( cd build/qemu && ${MAKE} )

.PHONY: download-images
download-images stamps/images: stamps/openmoko
	[ -e images/openmoko ] || mkdir -p images/openmoko
	ln -sf `pwd`/openmoko/trunk/src/host/qemu-neo1973/openmoko/env images/openmoko/env
	( cd images && ../openmoko/trunk/src/host/qemu-neo1973/openmoko/download.sh )
	rm -f images/openmoko/env
	[ -d stamps ] || mkdir stamps
	touch stamps/images

.PHONY: flash-qemu-official
flash-qemu-official: stamps/qemu stamps/images
	( cd build/qemu && openmoko/flash.sh ../../images/openmoko )

.PHONY: flash-qemu-local
flash-qemu-local: stamps/qemu stamps/${OM_IMAGE_NAME} stamps/u-boot-openmoko
	( cd build/qemu && openmoko/flash.sh ../tmp/deploy/glibc/images/neo1973 )

build/qemu/openmoko/openmoko-sd.image:
	( cd build/qemu && ${MKDOSFS} -C -F 32 -v openmoko/openmoko-sd.image 500000 )

.PHONY: run-qemu
run-qemu: stamps/qemu build/qemu/openmoko/openmoko-sd.image
	( cd build/qemu && arm-softmmu/qemu-system-arm \
		-M gta01 -m 130 -usb -show-cursor \
		-usbdevice keyboard \
		-mtdblock openmoko/openmoko-flash.image \
		-sd openmoko/openmoko-sd.image \
		-kernel openmoko/openmoko-kernel.bin )

.PHONY: run-qemu-snapshot
run-qemu-snapshot: stamps/qemu build/qemu/openmoko/openmoko-sd.image
	( cd build/qemu && arm-softmmu/qemu-system-arm \
		-M gta01 -m 130 -usb -show-cursor -snapshot \
		-usbdevice keyboard \
		-mtdblock openmoko/openmoko-flash.image \
		-sd openmoko/openmoko-sd.image \
		-kernel openmoko/openmoko-kernel.bin )

.PHONY: run-qemu-vnc
run-qemu-vnc: stamps/qemu build/qemu/openmoko/openmoko-sd.image
	( cd build/qemu && arm-softmmu/qemu-system-arm \
		-M gta01 -m 130 -usb -show-cursor \
		-vnc localhost:1 -monitor stdio \
		-mtdblock openmoko/openmoko-flash.image \
		-sd openmoko/openmoko-sd.image \
		-kernel openmoko/openmoko-kernel.bin )

.PHONY: flash-neo-official
flash-neo-official: flash-neo-kernel-official flash-neo-rootfs-official

.PHONY: flash-neo-kernel-official
flash-neo-kernel-official: stamps/openmoko-devel-tools stamps/images
	( cd build && \
		sudo ./tmp/staging/`uname -m`-`uname -s | tr '[A-Z]' '[a-z]'`/usr/bin/dfu-util \
		--device 0x1457:0x5119 -a kernel -D `ls -t ../images/openmoko/uImage-*.bin | head -1` )

.PHONY: flash-neo-rootfs-official
flash-neo-rootfs-official: stamps/openmoko-devel-tools stamps/images
	( cd build && \
		sudo ./tmp/staging/`uname -m`-`uname -s | tr '[A-Z]' '[a-z]'`/usr/bin/dfu-util \
		--device 0x1457:0x5119 -a rootfs -D `ls -t ../images/openmoko/*.jffs2 | head -1` )

.PHONY: flash-neo-local
flash-neo-local: flash-neo-kernel-local flash-neo-rootfs-local

.PHONY: flash-neo-kernel-local
flash-neo-kernel-local: stamps/openmoko-devel-tools stamps/${OM_IMAGE_NAME}
	( cd build && \
		sudo ./tmp/staging/`uname -m`-`uname -s | tr '[A-Z]' '[a-z]'`/usr/bin/dfu-util \
		--device 0x1457:0x5119 -a kernel -D `ls -t tmp/deploy/glibc/images/om-gta01/uImage-*.bin | head -1` )

.PHONY: flash-neo-rootfs-local
flash-neo-rootfs-local: stamps/openmoko-devel-tools stamps/${OM_IMAGE_NAME}
	( cd build && \
		sudo ./tmp/staging/`uname -m`-`uname -s | tr '[A-Z]' '[a-z]'`/usr/bin/dfu-util \
		--device 0x1457:0x5119 -a rootfs -D `ls -t tmp/deploy/glibc/images/om-gta01/Openmoko-${OM_IMAGE_NAME}-*.jffs2 | head -1` )

.PHONY: flash-fr-official
flash-fr-official: flash-fr-kernel-official flash-fr-rootfs-official

.PHONY: flash-fr-kernel-official
flash-fr-kernel-official: stamps/openmoko-devel-tools stamps/images
	( cd build && \
		sudo ./tmp/staging/`uname -m`-`uname -s | tr '[A-Z]' '[a-z]'`/usr/bin/dfu-util \
		--device 0x1d50:0x5119 -a kernel -D `ls -t ../images/openmoko/uImage-*.bin | head -1` )

.PHONY: flash-fr-rootfs-official
flash-fr-rootfs-official: stamps/openmoko-devel-tools stamps/images
	( cd build && \
		sudo ./tmp/staging/`uname -m`-`uname -s | tr '[A-Z]' '[a-z]'`/usr/bin/dfu-util \
		--device 0x1d50:0x5119 -a rootfs -D `ls -t ../images/openmoko/*.jffs2 | head -1` )

.PHONY: flash-fr-local
flash-fr-local: flash-fr-kernel-local flash-fr-rootfs-local

.PHONY: flash-fr-kernel-local
flash-fr-kernel-local: stamps/openmoko-devel-tools stamps/${OM_IMAGE_NAME}
	( cd build && \
		sudo ./tmp/staging/`uname -m`-`uname -s | tr '[A-Z]' '[a-z]'`/usr/bin/dfu-util \
		--device 0x1d50:0x5119 -a kernel -D `ls -t tmp/deploy/glibc/images/om-gta02/uImage-*.bin | head -1` )

.PHONY: flash-fr-rootfs-local
flash-fr-rootfs-local: stamps/openmoko-devel-tools stamps/${OM_IMAGE_NAME}
	( cd build && \
		sudo ./tmp/staging/`uname -m`-`uname -s | tr '[A-Z]' '[a-z]'`/usr/bin/dfu-util \
		--device 0x1d50:0x5119 -a rootfs -D `ls -t tmp/deploy/glibc/images/om-gta02/Openmoko-${OM_IMAGE_NAME}-*.jffs2 | head -1` )

.PHONY: push-openembedded
push-openembedded: update-mtn openembedded/_MTN/revision
	if [ `${MTN} --db=OE.mtn automate heads ${OM_BRANCH} | wc -l` \
		!= "1" ] ; then \
	  ${MTN} --db=OE.mtn merge -b ${OM_BRANCH} ; \
	fi
	( cd openembedded && ${MTN} update )
	if [ `${MTN} --db=OE.mtn automate heads ${OM_BRANCH} | wc -l` \
		!= "1" ] ; then \
	  ${MTN} --db=OE.mtn merge -b ${OM_BRANCH} ; \
	fi
	( cd openembedded && ${MTN} push ${OM_MONOTONE_SITE} ${OM_BRANCH} )

.PHONY: build-package-%
build-package-%:
	( . ./setup-env && cd build && bitbake -c build $* )

.PHONY: rebuild-package-%
rebuild-package-%:
	( . ./setup-env && cd build && bitbake -c rebuild $* )

.PHONY: clean-package-%
clean-package-%:
	( . ./setup-env && cd build && bitbake -c clean $* )

.PHONY: qemu-copy-package-%
qemu-copy-package-%: build/qemu/openmoko/openmoko-sd.image
	mcopy -i build/qemu/openmoko/openmoko-sd.image -v build/tmp/deploy/glibc/ipk/*/$*_*.ipk ::

.PHONY: clean
clean: clean-openembedded clean-qemu

.PHONY: clean-openembedded
clean-openembedded:
	rm -rf build/tmp \
		stamps/${OM_IMAGE_NAME} \
		stamps/openmoko-devel-tools \
		stamps/openmoko-feed

.PHONY: clean-qemu
clean-qemu:
	rm -rf build/qemu stamps/qemu

.PHONY: clobber
clobber: clobber-bitbake clobber-openmoko clobber-openembedded clobber-qemu

.PHONY: clobber-bitbake
clobber-bitbake:
	rm -rf bitbake stamps/bitbake

.PHONY: clobber-openmoko
clobber-openmoko:
	rm -rf openmoko stamps/openmoko

.PHONY: clobber-openembedded
clobber-openembedded: clean-openembedded
	rm -rf openembedded stamps/openembedded

.PHONY: clobber-qemu
clobber-qemu: clean-qemu
