#!/usr/bin/make -f
# -*- makefile -*-

export DH_VERBOSE=1

SOURCE_VERSION := $(shell sed -n 's/^Build-Depends-Indep: .*kernel-source-\([^ ]*\).*$$/\1/; t e; b; :e; p; q' debian/control)
WEEK := $(shell date +%Y%W)

KERNELRELEASE = $(shell cat $(CURDIR)/kernel-source-$(SOURCE_VERSION)/include/config/kernel.release 2> /dev/null)

PACKAGE := $(shell sed -n 's/^Source:[\t ]*\([^ ]*\).*$$/\1/; t e; b; :e; p; q' debian/control)
FLASHER_PACKAGE=$(PACKAGE)-flasher
OPROFILE_PACKAGE=$(PACKAGE)-oprofile
DEBUG_PACKAGE=$(PACKAGE)-debug
HEADERS_PACKAGE=$(PACKAGE)-headers
MODULES_PACKAGE=$(PACKAGE)-modules
MODULES_EXTRA_PACKAGE=$(PACKAGE)-modules-extra
KBUILD_PACKAGE=$(PACKAGE)-kbuild

PRODUCT := diablo
DEBIAN_DIR := debian
DEFCONFIG := nokia_2420_defconfig

ARCH = $(shell dpkg-architecture -qDEB_HOST_ARCH_CPU)

INCLUDE_HEADERS =  asm asm-generic asm-$(ARCH) Kbuild linux mtd rdma sound acpi config math-emu net rxrpc video keys media pcmcia scsi
MODULES_EXTRA = fs/lockd/lockd.ko fs/nfs/nfs.ko net/sunrpc/sunrpc.ko

HOSTCC=/scratchbox/compilers/cs2005q3.2-glibc2.5-arm/bin/arm-linux-gcc

build: kernel-oprofile kernel headers kernel modules

build-extra: modules-extra

kernel: configure-stamp
	echo "compile $(PRODUCT) kernel"
	cd $(CURDIR)/kernel-source-$(SOURCE_VERSION)/ && \
	make HOSTCC=$(HOSTCC) bzImage

kernel-oprofile: configure-oprofile-stamp
	echo "compile $(PRODUCT) oprofile kernel"
	cd $(CURDIR)/kernel-source-$(SOURCE_VERSION)-oprofile/ && \
	make HOSTCC=$(HOSTCC)

modules: configure-stamp
	echo "compile $(PRODUCT) kernel modules"
	cd $(CURDIR)/kernel-source-$(SOURCE_VERSION)/ && \
	make HOSTCC=$(HOSTCC) modules

modules-extra: configure-stamp
	echo "compile $(PRODUCT) kernel EXTRA modules"
	cd $(CURDIR)/kernel-source-$(SOURCE_VERSION)/ && \
	patch -p1 < $(CURDIR)/$(DEBIAN_DIR)/modules-extra_config.patch && \
	make HOSTCC=$(HOSTCC) oldconfig modules && \
	patch -p1 -R < $(CURDIR)/$(DEBIAN_DIR)/modules-extra_config.patch && \
	make HOSTCC=$(HOSTCC) oldconfig

headers: modules-extra
	echo "prepare $(PRODUCT) kernel headers"
	cd $(CURDIR)/kernel-source-$(SOURCE_VERSION)/ && \
	make HOSTCC=$(HOSTCC) modules_prepare

configure-stamp: sources-stamp
	cd $(CURDIR)/kernel-source-$(SOURCE_VERSION)/ && \
	make HOSTCC=$(HOSTCC) $(DEFCONFIG)
	touch $@

configure-oprofile-stamp: sources-oprofile-stamp
	cd $(CURDIR)/kernel-source-$(SOURCE_VERSION)-oprofile/ && \
	make HOSTCC=$(HOSTCC) $(DEFCONFIG) && \
	patch -p1 < $(CURDIR)/$(DEBIAN_DIR)/oprofile_config.patch && \
	make HOSTCC=$(HOSTCC) oldconfig
	touch $@

sources-stamp:
	test -d $(CURDIR)/kernel-source-$(SOURCE_VERSION) || tar jxf /usr/src/kernel-source-$(SOURCE_VERSION).tar.bz2
	touch $@

sources-oprofile-stamp: sources-stamp
	cp -a $(CURDIR)/kernel-source-$(SOURCE_VERSION)/ $(CURDIR)/kernel-source-$(SOURCE_VERSION)-oprofile/
	touch $@

clean:
	dh_testdir
	dh_testroot
	rm -f configure-stamp sources-stamp
	rm -f configure-oprofile-stamp sources-oprofile-stamp
	rm -rf kernel-source-$(SOURCE_VERSION)
	rm -rf kernel-source-$(SOURCE_VERSION)-oprofile
	dh_clean

install: build install-kernel install-kernel-flasher install-modules install-headers install-kernel-oprofile

install-kernel:
	dh_testdir
	dh_testroot
	dh_installdirs

	install $(CURDIR)/kernel-source-$(SOURCE_VERSION)/arch/arm/boot/zImage \
                $(CURDIR)/$(DEBIAN_DIR)/$(PACKAGE)/boot/zImage-$(PRODUCT)-$(WEEK) && \
	cd $(CURDIR)/kernel-source-$(SOURCE_VERSION); \
	chmod a-x $(CURDIR)/$(DEBIAN_DIR)/$(PACKAGE)/boot/zImage-$(PRODUCT)-$(WEEK)

install-kernel-flasher:
	dh_testdir
	dh_testroot
	dh_installdirs

	install $(CURDIR)/kernel-source-$(SOURCE_VERSION)/arch/arm/boot/zImage \
                $(CURDIR)/$(DEBIAN_DIR)/$(FLASHER_PACKAGE)/boot/zImage-$(PRODUCT)-$(WEEK) && \
	chmod a-x $(CURDIR)/$(DEBIAN_DIR)/$(FLASHER_PACKAGE)/boot/zImage-$(PRODUCT)-$(WEEK)
	ln -s /boot/zImage-$(PRODUCT)-$(WEEK) $(CURDIR)/$(DEBIAN_DIR)/$(FLASHER_PACKAGE)/etc/flash-and-reboot/kernel

install-kernel-oprofile:
	dh_testdir
	dh_testroot
	dh_installdirs

	install $(CURDIR)/kernel-source-$(SOURCE_VERSION)-oprofile/arch/arm/boot/zImage \
		$(CURDIR)/$(DEBIAN_DIR)/$(OPROFILE_PACKAGE)/boot/zImage-oprofile-$(PRODUCT)-$(WEEK)
	chmod a-x $(CURDIR)/$(DEBIAN_DIR)/$(OPROFILE_PACKAGE)/boot/zImage-oprofile-$(PRODUCT)-$(WEEK)
	install $(CURDIR)/kernel-source-$(SOURCE_VERSION)-oprofile/vmlinux \
		$(CURDIR)/$(DEBIAN_DIR)/$(DEBUG_PACKAGE)/usr/lib/debug/vmlinux-oprofile-$(PRODUCT)-$(WEEK)
	install $(CURDIR)/kernel-source-$(SOURCE_VERSION)/vmlinux \
		$(CURDIR)/$(DEBIAN_DIR)/$(DEBUG_PACKAGE)/usr/lib/debug/vmlinux-$(PRODUCT)-$(WEEK)
	chmod a-x $(CURDIR)/$(DEBIAN_DIR)/$(DEBUG_PACKAGE)/usr/lib/debug/vmlinux-*

install-modules:
	dh_testdir
	dh_testroot

	mkdir -p $(CURDIR)/$(DEBIAN_DIR)/$(MODULES_PACKAGE)/lib/modules/$(KERNELRELEASE)
	for f in $$(find $(CURDIR)/kernel-source-$(SOURCE_VERSION) -name "*.ko"); do \
		install -c -m 644 $$f $(CURDIR)/$(DEBIAN_DIR)/$(MODULES_PACKAGE)/lib/modules/$(KERNELRELEASE)/$$(basename $$f); \
	done
	ln -sf $(KERNELRELEASE) $(CURDIR)/$(DEBIAN_DIR)/$(MODULES_PACKAGE)/lib/modules/current

install-headers:
	dh_testdir
	dh_testroot
	dh_installdirs

	install -d $(CURDIR)/$(DEBIAN_DIR)/$(HEADERS_PACKAGE)/usr/src/$(HEADERS_PACKAGE)/
	cd $(CURDIR)/kernel-source-$(SOURCE_VERSION); \
	install -p -o root -g root -m 644 .config  $(CURDIR)/$(DEBIAN_DIR)/$(HEADERS_PACKAGE)/usr/src/$(HEADERS_PACKAGE)/ && \
	install -p -o root -g root -m 644 Makefile $(CURDIR)/$(DEBIAN_DIR)/$(HEADERS_PACKAGE)/usr/src/$(HEADERS_PACKAGE)/ && \
	install -p -o root -g root -m 644 Module.symvers $(CURDIR)/debian/$(HEADERS_PACKAGE)/usr/src/$(HEADERS_PACKAGE)/ && \
	install -p -o root -g root -m 644 -D include/config/auto.conf \
		$(CURDIR)/$(DEBIAN_DIR)/$(HEADERS_PACKAGE)/usr/src/$(HEADERS_PACKAGE)/include/config/auto.conf && \
	find arch/$(ARCH) $(foreach dir,$(INCLUDE_HEADERS),include/$(dir)) -name '*.h' \
		-exec install -D -m644 {} $(CURDIR)/$(DEBIAN_DIR)/$(HEADERS_PACKAGE)/usr/src/$(HEADERS_PACKAGE)/{} \; && \
	find ./ \( -name Makefile -or -name Kbuild -or -name Kconfig\* \) \
		-exec install -D -m644 {} $(CURDIR)/$(DEBIAN_DIR)/$(HEADERS_PACKAGE)/usr/src/$(HEADERS_PACKAGE)/{} \;

	ln -sf asm-$(ARCH) $(CURDIR)/$(DEBIAN_DIR)/$(HEADERS_PACKAGE)/usr/src/$(HEADERS_PACKAGE)/include/asm

	rm -rf $(CURDIR)/$(DEBIAN_DIR)/$(HEADERS_PACKAGE)/usr/src/$(HEADERS_PACKAGE)/scripts
	ln -sf ../$(KBUILD_PACKAGE)/scripts $(CURDIR)/$(DEBIAN_DIR)/$(HEADERS_PACKAGE)/usr/src/$(HEADERS_PACKAGE)

	cp -a $(CURDIR)/kernel-source-$(SOURCE_VERSION)/include/asm-$(ARCH)/arch \
		$(CURDIR)/$(DEBIAN_DIR)/$(HEADERS_PACKAGE)/usr/src/$(HEADERS_PACKAGE)/include/asm-$(ARCH)

	cp $(CURDIR)/kernel-source-$(SOURCE_VERSION)/arch/$(ARCH)/kernel/asm-offsets.s \
		$(CURDIR)/$(DEBIAN_DIR)/$(HEADERS_PACKAGE)/usr/src/$(HEADERS_PACKAGE)/arch/$(ARCH)/kernel
#install /lib/modules symlink
	install -d -m 755 $(CURDIR)/$(DEBIAN_DIR)/$(HEADERS_PACKAGE)/lib/modules/$(KERNELRELEASE)/
	ln -sf /usr/src/$(HEADERS_PACKAGE) $(CURDIR)/$(DEBIAN_DIR)/$(HEADERS_PACKAGE)/lib/modules/$(KERNELRELEASE)/build
#install kbuild
	install -d $(CURDIR)/$(DEBIAN_DIR)/$(HEADERS_PACKAGE)/usr/src/$(KBUILD_PACKAGE)
	cp -a $(CURDIR)/kernel-source-$(SOURCE_VERSION)/scripts $(CURDIR)/$(DEBIAN_DIR)/$(HEADERS_PACKAGE)/usr/src/$(KBUILD_PACKAGE)
#kbuild fixes
	cd $(CURDIR)/$(DEBIAN_DIR)/$(HEADERS_PACKAGE)/usr/src/$(KBUILD_PACKAGE)/scripts && \
		( rm -f $(RM_SCRIPTS); chmod a-x mkcompile_h )

install-modules-extra:
	dh_testdir
	dh_testroot

	mkdir -p $(CURDIR)/$(DEBIAN_DIR)/$(MODULES_EXTRA_PACKAGE)/lib/modules/$(KERNELRELEASE)/extra
	for f in $(MODULES_EXTRA); do \
		install -c -m 644 $(CURDIR)/kernel-source-$(SOURCE_VERSION)/$$f \
			$(CURDIR)/$(DEBIAN_DIR)/$(MODULES_EXTRA_PACKAGE)/lib/modules/$(KERNELRELEASE)/extra/$$(basename $$f); \
	done

install-extra: install-modules-extra

binary-indep: build install build-extra install-extra

binary-arch: build install
	dh_testdir
	dh_testroot
	dh_installchangelogs 
	dh_installdocs
	dh_strip -p$(HEADERS_PACKAGE)
	dh_compress
	dh_fixperms --exclude /usr/src/$(HEADERS_PACKAGE)
	dh_installdeb
	dh_shlibdeps
	dh_gencontrol
	dh_md5sums
	dh_builddeb

binary: binary-indep binary-arch

modules-deb: modules install-modules
	dh_testdir
	dh_testroot
	dh_fixperms -p$(MODULES_PACKAGE) --exclude /usr/src/$(HEADERS_PACKAGE)
	dh_installdeb -p$(MODULES_PACKAGE)
	dh_gencontrol -p$(MODULES_PACKAGE)
	dh_md5sums -p$(MODULES_PACKAGE)
	dh_builddeb -p$(MODULES_PACKAGE)


.PHONY: build clean binary-indep binary-arch binary install headers kernel modules
.PHONY: kernel-oprofile install-kernel-oprofile
