#!/usr/bin/make -f
# Sample debian/rules that uses debhelper.
# GNU copyright 1997 to 1999 by Joey Hess.

SHELL = bash

# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1

DEB_HOST_ARCH_OS	?= $(shell dpkg-architecture -qDEB_HOST_ARCH_OS)
DEB_HOST_ARCH_CPU	?= $(shell dpkg-architecture -qDEB_HOST_ARCH_CPU)

full_version	:= $(shell dpkg-parsechangelog | grep ^Version: | sed -e 's/^.*: //g')
tar_version	:= $(shell echo $(full_version) | sed -e 's/-.*//g')
svn_revision	:= $(shell echo $(full_version) | sed -e 's/.*~svn\([0-9]*\)-[0-9]*/\1/g')
version		:= $(shell echo $(full_version) | sed -e 's/[~+-].*//g')
major           := $(shell echo $(version) | sed -e 's/\..*//g')
revision	:= $(shell echo $(full_version) | sed -e 's/^[^+-]*//g')
cpu		:= $(shell dpkg-architecture -qDEB_HOST_ARCH_CPU)
config_files	:= $(wildcard debian/arch/$(cpu)/*.config)
flavours	:= $(config_files:debian/arch/$(cpu)/%.config=%)
configfile	:= DEBCUSTOM
abiname		:= 0
ld_target	:= $(shell ld --help | sed -ne "s/[^ :]*: supported targets: \([^ ]*\) .*/\1/p")
gcc_version	:= 4.4

ifeq ($(cpu), mipsel)
kfreebsd_cpu	:= mips
else
kfreebsd_cpu	:= $(cpu)
endif

#SVN		:= http://svn.freebsd.org/base/release/$(version).0
#SVN		:= http://svn.freebsd.org/base/releng/$(version)
#SVN		:= http://svn.freebsd.org/base/stable/$(major)
SVN		:= http://svn.freebsd.org/base/head
SOURCE_PACKAGE	:= $(CURDIR)/debian/kfreebsd-source-$(version)
IMAGE_PACKAGE	:= $(CURDIR)/debian/kfreebsd-image-$(version)-$(abiname)
HEADERS_PACKAGE	:= $(CURDIR)/debian/kfreebsd-headers-$(version)-$(abiname)
SRC_TAR		:= kfreebsd-source-$(version).tar.xz
SRC_DIR		:= kfreebsd-source-$(version)
HEADERS_DIR	:= kfreebsd-headers-$(version)-$(abiname)
FLAVOR_DIR	:= flavor-$(version)-$(abiname)
ORIG_DIR	:= kfreebsd-$(major)-$(tar_version)
ORIG_TAR	:= kfreebsd-$(major)_$(tar_version).orig.tar.gz
MAKE		:= make MACHINE_ARCH=$(kfreebsd_cpu) CC=gcc-$(gcc_version) WERROR=
PATH		:= $(CURDIR)/config:/usr/lib/freebsd:$(PATH)

get-orig-source:
	rm -rf $(ORIG_DIR)
	for i in sys usr.sbin/config ; do \
		svn export -r $(svn_revision) $(SVN)/$$i $(ORIG_DIR)/$$i ; \
	done
	cd $(ORIG_DIR) && $(CURDIR)/debian/prune.sh
	tar --numeric-owner --owner 0 --group 0 -czf ../$(ORIG_TAR) $(ORIG_DIR)
	rm -rf $(ORIG_DIR)

control: clean
	for arch in `ls $(CURDIR)/debian/arch/` ; do \
		KW_CONFIG_DIR=debian/arch/$$arch/installer ; \
		if test -e $$KW_CONFIG_DIR ; then \
			for config in `ls $(CURDIR)/debian/arch/$$arch/ | grep \.config` ; do \
				flavor=$${config/.config/} ; \
				if test -e debian/arch/$$arch/$$flavor.installer ; then \
					echo "kfreebsd-$$arch $(version)-$(abiname) $$flavor $(version)-$(abiname)-$$flavor - -" ; \
				fi ; \
			done > $$KW_CONFIG_DIR/kernel-versions ; \
		fi ; \
		echo ; \
	done
	sed -e "s/@major@/$(major)/g" -e "s/@version@/$(version)/g" -e "s/@abiname@/$(abiname)/g" -e "s/@flavor@/$$flavor/g" -e "s/@gcc_version@/$(gcc_version)/g" \
		$(CURDIR)/debian/control.in > $(CURDIR)/debian/control
	echo >> $(CURDIR)/debian/control
	for arch in `ls $(CURDIR)/debian/arch/` ; do \
		for config in `ls $(CURDIR)/debian/arch/$$arch/ | grep \.config` ; do \
			flavor=$${config/.config/} ; \
			recommends= ; \
			test -f $(CURDIR)/debian/arch/$$arch/$$flavor.defines && recommends=`awk '/^Recommends: / {print $$2}' $(CURDIR)/debian/arch/$$arch/$$flavor.defines` ; \
			sed -e "s/@major@/$(major)/g" -e "s/@version@/$(version)/g" -e "s/@abiname@/$(abiname)/g" -e "s/@flavor@/$$flavor/g" -e "s/@arch@/$$arch/g" -e "s/@recommends@/$$recommends/g" \
				$(CURDIR)/debian/control.flavor.in ; \
			echo ; \
		done ; \
		export KW_CONFIG_DIR=debian/arch/$$arch/installer ; \
		if test -e $$KW_CONFIG_DIR/kernel-versions ; then \
			kernel-wedge gen-control ; \
		fi ; \
		echo ; \
	done >> $(CURDIR)/debian/control

clean:
	dh_testdir
	dh_testroot
	rm -rf src kfreebsd-source-* flavor-* config
	rm -f debian/kfreebsd-image-*.preinst
	rm -f debian/kfreebsd-image-*.prerm
	rm -f debian/kfreebsd-image-*.postinst
	rm -f debian/kfreebsd-image-*.postrm

	rm -f *-stamp
	dh_clean

src: src-stamp
src-stamp:
	mkdir $(CURDIR)/src
	cp -af $(CURDIR)/sys $(CURDIR)/usr.sbin $(CURDIR)/src

	touch src-stamp

build-indep: build-indep-stamp
build-indep-stamp: src
	dh_testdir

	cp -af src $(SRC_DIR)

	touch build-indep-stamp

build: build-arch build-indep

install-indep: install-indep-stamp
install-indep-stamp: build-indep
	dh_testdir
	dh_testroot
	dh_clean -k
	dh_installdirs -i

	mkdir -p $(SOURCE_PACKAGE)/usr/src
	chown -R root.src $(SRC_DIR)
	tar cfJ $(SOURCE_PACKAGE)/usr/src/$(SRC_TAR) $(SRC_DIR)

	touch install-indep-stamp

config: config-stamp
config-stamp: src
	rm -rf config
	cp -af src/usr.sbin/config config
	CFLAGS="-D__va_list=__builtin_va_list $(shell pkg-config --cflags libbsd-overlay) -lbsd" $(MAKE) -C config
	touch $@

build-arch: $(foreach flavor,$(flavours),build-flavor-$(flavor)-stamp)
src-flavor-%-stamp: src config
	cp -af src $(FLAVOR_DIR)-$*
	touch $@
build-flavor-%-stamp: src-flavor-%-stamp
	# Add the abiname and the flavor to the kernel version
	sed -i -e 's/^RELEASE=".*"/RELEASE="$(version)-$(abiname)-$*"/g' $(FLAVOR_DIR)-$*/sys/conf/newvers.sh

	# Change ident to the kernel version
	sed -i -e 's/^i=.*/i="Debian $* ($(full_version))"/g' $(FLAVOR_DIR)-$*/sys/conf/newvers.sh

	# Set /lib/modules/${RELEASE} as module dir
	sed -i -e 's,^KODIR?=.*,KODIR="/lib/modules/$(version)-$(abiname)-$*",g' $(FLAVOR_DIR)-$*/sys/conf/kern.pre.mk
	sed -i -e '/^static char linker_path/s,".*","/lib/modules/$(version)-$(abiname)-$*",g' $(FLAVOR_DIR)-$*/sys/kern/kern_linker.c

	# Always set explicit link target to match with ld's implicit target (needed
	# to build on non-kFreeBSD)
	sed -i \
		-e 's/elf32-i386-freebsd/$(ld_target)/g' \
		-e 's/elf64-x86-64-freebsd/$(ld_target)/g' \
		-e 's/elf32-tradlittlemips-freebsd/$(ld_target)/g' \
		-e 's/elf32-tradbigmips-freebsd/$(ld_target)/g' \
	$(FLAVOR_DIR)-$*/sys/conf/ldscript.$(kfreebsd_cpu)

	# Configure the kernel
	cp debian/arch/$(cpu)/$*.config $(FLAVOR_DIR)-$*/sys/$(kfreebsd_cpu)/conf/
	ln -sf $*.config $(FLAVOR_DIR)-$*/sys/$(kfreebsd_cpu)/conf/$(configfile)
	cd $(FLAVOR_DIR)-$*/sys/$(kfreebsd_cpu)/conf \
		&& config $(configfile)

	# Build it
	$(MAKE) -C $(FLAVOR_DIR)-$*/sys/$(kfreebsd_cpu)/compile/$(configfile)/ depend
	$(MAKE) -C $(FLAVOR_DIR)-$*/sys/$(kfreebsd_cpu)/compile/$(configfile)/

	touch build-flavor-$*-stamp

install-common-stamp: src
	dh_testdir
	dh_testroot
	mkdir -p $(HEADERS_PACKAGE)/usr/src/$(HEADERS_DIR)
	cd src \
		&& find . -type f -name "*.h" -not -regex ".*modules.*" -not -regex ".*sys/$(kfreebsd_cpu)/.*" -exec cp --parents {} $(HEADERS_PACKAGE)/usr/src/$(HEADERS_DIR) \;

	mkdir -p $(HEADERS_PACKAGE)/usr/src/$(HEADERS_DIR)/conf
	cd src && cp --parents \
		sys/conf/kern.mk \
		sys/conf/kmod.mk \
		sys/conf/kmod_syms.awk \
		sys/kern/bus_if.m \
		sys/dev/pci/pci_if.m \
		sys/kern/device_if.m \
		sys/kern/vnode_if.src \
		sys/tools/vnode_if.awk \
		sys/tools/makeobjops.awk \
		$(HEADERS_PACKAGE)/usr/src/$(HEADERS_DIR)

	find $(HEADERS_PACKAGE)/usr/src/$(HEADERS_DIR) -type f -exec chmod 644 {} \;
	find $(HEADERS_PACKAGE)/usr/src/$(HEADERS_DIR) -type f -name "*.awk" -exec chmod 755 {} \;

	touch install-common-stamp

install-arch: $(foreach flavor,$(flavours),install-flavor-$(flavor)-stamp)
install-flavor-%-stamp: install-common-stamp build-flavor-%-stamp
	dh_testdir
	dh_testroot
	dh_clean -k -pkfreebsd-image-$(version)-$(abiname)-$*

	mkdir -p $(IMAGE_PACKAGE)-$*/{boot,lib/modules/$(version)-$(abiname)-$*}

	# make the install target happy
	install -o root -g root -m 644 \
		$(FLAVOR_DIR)-$*/sys/$(kfreebsd_cpu)/conf/GENERIC.hints \
		$(IMAGE_PACKAGE)-$*/boot/device.hints || touch $(IMAGE_PACKAGE)-$*/boot/device.hints
	install -o root -g root -m 644 \
		$(FLAVOR_DIR)-$*/sys/boot/forth/loader.conf \
		$(IMAGE_PACKAGE)-$*/boot/loader.conf
	mkdir -p $(IMAGE_PACKAGE)-$*/boot/defaults
	install -o root -g root -m 644 \
		$(FLAVOR_DIR)-$*/sys/boot/forth/loader.conf \
		$(IMAGE_PACKAGE)-$*/boot/defaults/loader.conf

	# install the config file
	install -o root -g root -m 644 \
		$(FLAVOR_DIR)-$*/sys/$(kfreebsd_cpu)/conf/$*.config \
		$(IMAGE_PACKAGE)-$*/boot/config-$(version)-$(abiname)-$*

	# now install the kernel
	$(MAKE) -C $(FLAVOR_DIR)-$*/sys/$(kfreebsd_cpu)/compile/$(configfile) DESTDIR=$(IMAGE_PACKAGE)-$* install
	mv $(IMAGE_PACKAGE)-$*/lib/modules/$(version)-$(abiname)-$*/kernel $(IMAGE_PACKAGE)-$*/boot/kfreebsd-$(version)-$(abiname)-$*
	chmod 644 $(IMAGE_PACKAGE)-$*/boot/kfreebsd-$(version)-$(abiname)-$*
	gzip -9 $(IMAGE_PACKAGE)-$*/boot/kfreebsd-$(version)-$(abiname)-$*

	# fix broken perms in module dir
	-chmod 644 $(IMAGE_PACKAGE)-$*/lib/modules/$(version)-$(abiname)-$*/*

	# remove loader.conf (part of kfreebsd-loader)
	rm -f $(IMAGE_PACKAGE)-$*/boot/loader.conf
	rm -rf $(IMAGE_PACKAGE)-$*/boot/defaults

	# remove device.hints (built into kernel)
	rm -f $(IMAGE_PACKAGE)-$*/boot/device.hints

	# README file
	mkdir -p $(IMAGE_PACKAGE)-$*/usr/share/doc/kfreebsd-image-$(version)-$(abiname)-$*
	install -p -o root -g root -m 644 \
		debian/kfreebsd-image.README.Debian \
		$(IMAGE_PACKAGE)-$*/usr/share/doc/kfreebsd-image-$(version)-$(abiname)-$*/README.Debian

	# override file
	mkdir -p $(IMAGE_PACKAGE)-$*/usr/share/lintian/overrides
	install -p -o root -g root -m 644 \
		debian/kfreebsd-image.overrides \
		$(IMAGE_PACKAGE)-$*/usr/share/lintian/overrides/kfreebsd-image-$(version)-$(abiname)-$*
	mkdir -p $(CURDIR)/debian/zlib-modules-$(version)-$(abiname)-$*-di/usr/share/lintian/overrides
	install -p -o root -g root -m 644 \
		debian/zlib-modules.overrides \
		$(CURDIR)/debian/zlib-modules-$(version)-$(abiname)-$*-di/usr/share/lintian/overrides/zlib-modules-$(version)-$(abiname)-$*-di

	# scripts
	for script in preinst prerm postinst postrm ; do \
		sed -e "s/@VERSION@/$(version)/g" \
		    -e "s/@RELEASE@/$(version)-$(abiname)-$*/g" \
		    debian/kfreebsd-image.$$script.in \
			> debian/kfreebsd-image-$(version)-$(abiname)-$*.$$script ; \
	done

	# headers package
	mkdir -p $(HEADERS_PACKAGE)-$*/usr/src/$(HEADERS_DIR)-$*/sys/$(kfreebsd_cpu)
	cd $(FLAVOR_DIR)-$*/sys/$(kfreebsd_cpu) \
		&& find . -type f -name "*.h" -not -regex ".*modules.*" -exec cp --parents {} $(HEADERS_PACKAGE)-$*/usr/src/$(HEADERS_DIR)-$*/sys/$(kfreebsd_cpu) \; \
		&& cp -d --parents compile/$(configfile)/machine $(HEADERS_PACKAGE)-$*/usr/src/$(HEADERS_DIR)-$*/sys/$(kfreebsd_cpu) \
		&& cp -d --parents conf/$(configfile) $(HEADERS_PACKAGE)-$*/usr/src/$(HEADERS_DIR)-$*/sys/$(kfreebsd_cpu)
	find $(HEADERS_PACKAGE)-$*/usr/src/$(HEADERS_DIR)-$*/sys/$(kfreebsd_cpu) -type f -exec chmod 644 {} \;
	for dir in `ls $(HEADERS_PACKAGE)/usr/src/$(HEADERS_DIR)/sys` ; do \
		ln -s ../../$(HEADERS_DIR)/sys/$$dir $(HEADERS_PACKAGE)-$*/usr/src/$(HEADERS_DIR)-$*/sys/$$dir ; \
	done
	ln -s $(kfreebsd_cpu)/include $(HEADERS_PACKAGE)-$*/usr/src/$(HEADERS_DIR)-$*/sys/machine

ifeq ($(DEB_HOST_ARCH_OS), kfreebsd)
	KW_CONFIG_DIR=debian/arch/$(DEB_HOST_ARCH_CPU)/installer kernel-wedge install-files \
		$(version)-$(abiname) debian/arch/$(DEB_HOST_ARCH_CPU)/installer
endif

	touch install-flavor-$*-stamp


# Build architecture-independent files here.
binary-indep: build-indep install-indep
	dh_testdir
	dh_testroot
	dh_installdocs -i
	dh_installchangelogs -i
	dh_link -i
	dh_strip -i
	dh_compress -i
	dh_fixperms -i
	dh_makeshlibs -i
	dh_installdeb -i
	dh_shlibdeps -i
	dh_gencontrol -i
	dh_md5sums -i
	dh_builddeb -i

# Build architecture-dependent files here.
binary-arch: build-arch install-arch
	dh_testdir
	dh_testroot
	dh_installdocs -s
	dh_installchangelogs -s
	dh_link -s
	dh_strip -s -X/boot -X/lib/modules
	dh_compress -s
	dh_fixperms -s
	dh_makeshlibs -s
	dh_installdeb -s
	dh_shlibdeps -s -X/boot -X/lib/modules
	dh_gencontrol -s
	dh_md5sums -s
	dh_builddeb -s

binary: binary-indep binary-arch

.PHONY: clean build build-indep
.PHONY: binary-indep binary-arch binary-indep binary-arch binary
