TOPDIR=$(shell pwd)
ARCHIVE=$(TOPDIR)/archive
DOWNLOAD=$(TOPDIR)/download

NOW:=$(shell date +%Y%m%d-%H%M)

CCACHE=ccache

export ARCH?=arm
export CROSS_COMPILE?=$(strip $(CCACHE) /opt/crosstool/gcc-3.4.1-glibc-2.3.3/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu-)

QUILT=quilt

all: 
	$(MAKE) linux
	$(MAKE) romtools

# Convenience stuff

SDMMC=\Storage Card

dnw-n30: dummy
	$(MAKE) -C romtools linux-n30.ubi
	cd romtools && sudo ./dnw linux-n30.ubi

wince-run:
	prun '$(SDMMC)\boot'

wince-kernel:
	pcp $(LINUX_DIR)/arch/arm/boot/zImage ':$(SDMMC)\zImage'

wince-initrd:
	pcp romtools/initrd ':$(SDMMC)\initrd'

wince-boot:
	pcp wince/default.txt ':$(SDMMC)\default.txt'
	pcp wince/boot.exe ':$(SDMMC)\boot.exe'

### Linux

LINUX_VERSION?=2.6.14
LINUX_DIR=linux-$(LINUX_VERSION)

LINUX_PATCHES=$(TOPDIR)/archive/linux-$(LINUX_VERSION)
LINUX_CONFIG=$(LINUX_PATCHES)/config

LINUX_ARCHIVE=$(DOWNLOAD)/linux-$(LINUX_VERSION).tar.gz
LINUX_EXTRA_PATCHES=$(DOWNLOAD)/v2.6.14-gitcurrent.patch $(DOWNLOAD)/v2.6.14-full.patch

linux: $(LINUX_DIR)/.configured dummy
	$(MAKE) -C $(LINUX_DIR) ARCH=$(ARCH) CROSS_COMPILE="$(CROSS_COMPILE)" \
		zImage
	ln -sf ../$(LINUX_DIR)/arch/arm/boot/zImage romtools

linux-modules:
	$(MAKE) -C $(LINUX_DIR) ARCH=$(ARCH) CROSS_COMPILE="$(CROSS_COMPILE)" \
		modules
	$(MAKE) -C $(LINUX_DIR) ARCH=$(ARCH) CROSS_COMPILE="$(CROSS_COMPILE)" \
		INSTALL_MOD_PATH=$(TOPDIR)/modules  modules_install

linux-configure $(LINUX_DIR)/.configured: $(LINUX_DIR)/.config
	$(MAKE) -C $(LINUX_DIR) ARCH=$(ARCH) CROSS_COMPILE="$(CROSS_COMPILE)" oldconfig
	: >$(LINUX_DIR)/.configured

$(LINUX_DIR)/.config: $(LINUX_DIR)/.unpacked $(LINUX_CONFIG)
	cp $(LINUX_CONFIG) $(LINUX_DIR)/.config+
	mv $(LINUX_DIR)/.config+ $(LINUX_DIR)/.config

linux-unpack $(LINUX_DIR)/.unpacked: $(LINUX_ARCHIVE) $(LINUX_EXTRA_PATCHES)
	if [ -d $(LINUX_DIR) ]; then rm -rf $(LINUX_DIR)~; mv $(LINUX_DIR) $(LINUX_DIR)~; fi
	zcat $(LINUX_ARCHIVE) | tar xf -
	ln -s $(LINUX_PATCHES) $(LINUX_DIR)/patches
	ln -sf $(LINUX_EXTRA_PATCHES) $(LINUX_DIR)/patches
	cd $(LINUX_DIR) && $(QUILT) push -a
	$(MAKE) linux-dirvars
	: >$(LINUX_DIR)/.unpacked

linux-dirvars:
	(echo "c-basic-offset: 8"; \
	echo "compile-command: \"make -k -C $(TOPDIR) linux \"") \
	>$(LINUX_DIR)/.emacs-dirvars

linux-clean:
	[ -d $(LINUX_DIR) ] && $(MAKE) -C $(LINUX_DIR) clean || true

linux-distclean:
	rm -rf $(LINUX_DIR) $(LINUX_DIR)~

$(DOWNLOAD)/linux-2.6.14.tar.gz:
	mkdir -p $(DOWNLOAD)
	wget -O $@+ ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.14.tar.gz
	mv $@+ $@

$(DOWNLOAD)/v2.6.14-gitcurrent.patch:
	mkdir -p $(DOWNLOAD)
	wget -O $@+ http://rtpnet.nerim.net/ipaq/patches/2.6.14-3/v2.6.14-gitcurrent.patch
	mv $@+ $@

$(DOWNLOAD)/v2.6.14-full.patch:
	mkdir -p $(DOWNLOAD)
	wget -o $@+ http://rtpnet.nerim.net/ipaq/patches/2.6.14-3/full.patch
	mv $@+ $@

### Buildroot

BUILDROOT_VERSION?=20051222
BUILDROOT_DIR=$(TOPDIR)/buildroot
BUILDROOT_ARCHIVE=$(DOWNLOAD)/buildroot-$(BUILDROOT_VERSION).tar.bz2
BUILDROOT_PATCHES=archive/buildroot-$(BUILDROOT_VERSION)-patches
BUILDROOT_CONFIG=$(BUILDROOT_PATCHES)/config
BUILDROOT_ENV=PATH="$(BUILDROOT_DIR)/build_arm_nofpu/staging_dir/bin/:$(PATH)"

buildroot: $(BUILDROOT_DIR)/.configured dummy
	chmod +x $(BUILDROOT_DIR)/target/generic/target_skeleton/etc/init.d/S50telnetd
	$(MAKE) -C $(BUILDROOT_DIR)

buildroot-configure $(BUILDROOT_DIR)/.configured: $(BUILDROOT_DIR)/.unpacked $(BUILDROOT_DIR)/.config
	$(MAKE) -C $(BUILDROOT_DIR) oldconfig
	: >$(BUILDROOT_DIR)/.configured

$(BUILDROOT_DIR)/.config: $(BUILDROOT_CONFIG)
	cp $(BUILDROOT_CONFIG) $(BUILDROOT_DIR)/.config+
	mv $(BUILDROOT_DIR)/.config+ $(BUILDROOT_DIR)/.config

buildroot-unpack $(BUILDROOT_DIR)/.unpacked: $(BUILDROOT_ARCHIVE)
	if [ -d $(BUILDROOT_DIR) ]; then rm -rf $(BUILDROOT_DIR)~; mv $(BUILDROOT_DIR) $(BUILDROOT_DIR)~; fi
	bzcat $(BUILDROOT_ARCHIVE) | tar xf -
	ln -s ../$(BUILDROOT_PATCHES) $(BUILDROOT_DIR)/patches
	cd $(BUILDROOT_DIR) && quilt push -a
	: >$(BUILDROOT_DIR)/.unpacked

buildroot-clean:
	[ -d $(BUILDROOT_DIR) ] && $(MAKE) -C $(BUILDROOT_DIR) clean || true

buildroot-distclean:
	rm -rf $(BUILDROOT_DIR) $(BUILDROOT_DIR)~

$(DOWNLOAD)/buildroot-$(BUILDROOT_VERSION).tar.bz2:
	mkdir -p $(DOWNLOAD)
	wget -o $@+ http://FOOFOOFOO
	mv $@+ $@

### Opie

OPIEDIR=$(TOPDIR)/opie

opie-checkout:
	cvs -d:pserver:anoncvs:anoncvs@cvs.handhelds.org:/cvs login
	cvs -d:pserver:anoncvs:anoncvs@cvs.handhelds.org:/cvs -z3 co opie

### OpenEmbedded

BITBAKE=BBPATH=$(BBPATH) PATH=$(PATH):$(TOPDIR)/bitbake/bin bitbake

OE_BRANCH=org.openembedded.oz354fam083

BBPATH=$(TOPDIR)/oe-build:$(TOPDIR)/$(OE_BRANCH)

bitbake: bitbake/.downloaded dummy

bitbake/.downloaded:
	rm -rf bitbake
	svn co svn://svn.berlios.de/bitbake/trunk/bitbake bitbake
	ln -s ../archive/bitbake-patches bitbake/patches
	cd bitbake && $(QUILT) push -a
	touch bitbake/.downloaded

oe-parse: 
	cd oe-build && $(BITBAKE) bootstrap-image 

bootstrap-image: 
	cd oe-build && $(BITBAKE) bootstrap-image

gpe-image:
	cd oe-build && $(BITBAKE) gpe-image

oe-gpsd:
	cd oe-build && $(BITBAKE) -b ../$(OE_BRANCH)/packages/gpsd/gpsd_2.30.bb

oe-bluez:
	cd oe-build && $(BITBAKE) -b ../$(OE_BRANCH)/packages/bluez/bluez-utils-dbus_2.21.bb

oe-blueprobe:
	cd oe-build && $(BITBAKE) -b ../$(OE_BRANCH)/packages/blueprobe/blueprobe_0.16.bb

opie-image:
	cd oe-build && $(BITBAKE) opie-image

oe-glibc:
	cd oe-build && BBPATH=$(BBPATH) $(BITBAKE) \
	-b $(TOPDIR)/$(OE_BRANCH)/packages/glibc/glibc_2.3.5+cvs20050627.bb

oe-qte:
	cd oe-build && BBPATH=$(BBPATH) $(BITBAKE) \
	-b $(TOPDIR)/$(OE_BRANCH)/packages/qte/qte_2.3.10.bb

oe/build/conf:
	mkdir -p oe-build/conf
	cp org.openembedded.dev/conf/local.conf.sample oe-build/conf/local.conf

foo:
	mkdir -p oe-build
	mkdir -p oe-build/conf
	cp archive/oe-local.conf oe-build/conf/local.conf

oe-checkout $(OE_BRANCH)/.unpacked:
	rm -rf $(OE_BRANCH)
	monotone --db=oe.db checkout --branch=$(OE_BRANCH)
	ln -sf $(TOPDIR)/archive/$(OE_BRANCH)-patches $(OE_BRANCH)/patches
	cd $(OE_BRANCH) && $(QUILT) push -a
	: >$(OE_BRANCH)/.unpacked

oe-update:
	monotone --db=oe.db pull monotone.vanille.de $(OE_BRANCH)
	if [ -f $(OE_BRANCH)/.unpacked ]; then cd $(OE_BRANCH) && monotone update; fi

oe.db:
	rm -f OE.db.bz2
	wget http://ewi546.ewi.utwente.nl/OE/OE.db.bz2
	bzcat OE.db.bz2 >oe.db+
	mv oe.db+ oe.db

### gpsd

GPSD_VERSION?=2.30
GPSD_DIR=$(TOPDIR)/gpsd-2.30
GPSD_ARCHIVE=$(DOWNLOAD)/gpsd-$(GPSD_VERSION).tar.gz

gpsd: $(GPSD_DIR)/.configured dummy
	$(BUILDROOT_ENV) make -C $(GPSD_DIR)
	cd $(GPSD_DIR) && $(BUILDROOT_ENV) arm-linux-gcc -g -static -o gpsd-static gpsd_dbus.o gpsd.o -lm .libs/libgps.a -lm -lpthread

gpsd-configure $(GPSD_DIR)/.configured: $(GPSD_DIR)/.unpacked
	cd $(GPSD_DIR) && $(BUILDROOT_ENV) ./configure \
		--prefix=/usr --host=arm-linux --disable-sirfII
	: >$(GPSD_DIR)/.configured

gpsd-unpack $(GPSD_DIR)/.unpacked: $(GPSD_ARCHIVE)
	zcat $(GPSD_ARCHIVE) | tar xf -
	: >$(GPSD_DIR)/.unpacked

gpsd-clean: dummy
	rm -f $(GPSD_DIR)/.configured
	-make -C $(GPSD_DIR) distclean

### Romtools

romtools: dummy
	ln -sf ../$(LINUX_DIR)/arch/arm/boot/zImage romtools
	$(MAKE) -C romtools

root-buildroot:
	ln -sf ../$(BUILDROOT_DIR)/rootfs.arm_nofpu.ext2.gz romtools/initrd

initrd: romtools/initcpio.gz
	ln -sf initcpio.gz romtools/initrd

romtools/initcpio.gz: $(BUILDROOT_DIR)/rootfs.arm_nofpu.tar dummy
	rm -f $@ 
	sudo rm -rf tmp
	sudo mkdir tmp
	sudo tar xf $< -C tmp
	sudo cp apps/bootchoice tmp/sbin/bootchoice
	sudo cp archive/toggle-gpio.sh tmp
	sudo cp archive/S60nfs tmp/etc/init.d
	sudo chmod +x tmp/etc/init.d/S50telnetd
	sudo su -c "(cd tmp && find . | cpio -o -H newc | gzip || exit 1) >$@+"
	mv $@+ $@

### NN

NN_DIR=$(TOPDIR)/nn
nn: $(BUILDROOT_DIR)/rootfs.arm_nofpu.tar dummy
	sudo $(NN_DIR)/initrd/nn-initrd.sh "$(TOPDIR)" $(NN_DIR) \
		"$(LINUX_DIR)" "$<" 

### Common

apps: dummy
	make -C apps

dist: dummy
	rm -rf dist
	mkdir dist
	cd dist && cvs -d `cat ../CVS/Root` export -D now -d n30 `cat ../CVS/Repository`
	cd dist && tar cfz src.tar.gz n30
	cd wince && zip -D $(TOPDIR)/dist/wince-boot.zip boot.exe default.txt
	chmod -x romtools/zImage
	scp dist/src.tar.gz zoo:www/zoo/n30/downloads/n30-$(NOW)-src.tar.gz
	scp romtools/zImage zoo:www/zoo/n30/downloads/n30-$(NOW)-zImage.bin
	scp romtools/initrd zoo:www/zoo/n30/downloads/n30-$(NOW)-initrd.bin
	scp dist/wince-boot.zip zoo:www/zoo/n30/downloads/n30-$(NOW)-wince-boot.zip
	rm -rf dist

bar:

dummy:

