#!/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' -e 's/^$(full_version)$$/HEAD/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=%)
abiname		:= 0
ld_target	:= $(shell ld --help | sed -ne "s/[^ :]*: supported targets: \([^ ]*\) .*/\1/p")
clang_version	:= $(shell cat CLANG_VERSION)

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

#SVN		:= https://svn0.us-west.freebsd.org/base/release/$(version).0
#SVN		:= https://svn0.us-west.freebsd.org/base/releng/$(version)
#SVN		:= https://svn0.us-west.freebsd.org/base/stable/$(major)
SVN		:= https://svn0.us-west.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)
ORIG_DIR	:= kfreebsd-$(major)-$(tar_version)
ORIG_TAR	:= kfreebsd-$(major)_$(tar_version).orig.tar.xz
PATH		:= /usr/lib/freebsd:$(PATH)

ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
	NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))

	# Do not mess with MAKEFLAGS until we transfer control to BSD make (see below)
	BSD_MAKEFLAGS += -j$(NUMJOBS)
endif

ifneq (,$(filter debug,$(DEB_BUILD_OPTIONS)))
	debug_config	:= sys/conf/DEBIAN_DEBUG
else
	debug_config	:= sys/conf/DEBIAN_NODEBUG
endif

MAKE		:= \
		MAKEFLAGS=$(BSD_MAKEFLAGS) \
		bmake \
		MACHINE_ARCH=$(kfreebsd_cpu) \
		-DWITHOUT_SOURCELESS

# Clang is the default compiler on these architectures (see src/share/mk/bsd.own.mk)
clang_cpus	:= i386 amd64 armel

ifneq ($(clang_version), 3.4)
$(error Upstream is now using a different Clang version than we expected. Consider updating cc_pkg and cc_cmd)
endif

cc_pkg		:= clang-3.4 [$(foreach cpu,$(clang_cpus),any-$(cpu))], \
		gcc-4.8 [$(foreach cpu,$(clang_cpus),!any-$(cpu))]

ifneq (, $(filter $(clang_cpus), $(DEB_HOST_ARCH_CPU)))
cc_cmd		:= clang
else
cc_cmd		:= gcc-4.8
endif

ifeq ($(cc_cmd), clang)
MAKE	+= -DWITH_CLANG_IS_CC
else
MAKE	+= -DWITHOUT_CLANG_IS_CC
MAKE	+= WERROR=
endif

# Disable install of *.ko.symbols files (their presence would trigger an
# "unstripped-binary-or-object" lintian error).
MAKE += -DWITHOUT_KERNEL_SYMBOLS	

get-orig-source:
	rm -rf $(ORIG_DIR)
	svn export -r $(svn_revision) $(SVN)/sys $(ORIG_DIR)/sys
	# The Clang version used by upstream
	svn cat -r $(svn_revision) $(SVN)/lib/clang/include/clang/Basic/Version.inc \
		| sed -ne 's/.*\sCLANG_VERSION\s\+//p' \
		> $(ORIG_DIR)/CLANG_VERSION
	cd $(ORIG_DIR) && $(CURDIR)/debian/prune.sh
	tar --numeric-owner --owner 0 --group 0 -cJf ../$(ORIG_TAR) $(ORIG_DIR)
	rm -rf $(ORIG_DIR)

control: clean
	for arch in `ls $(CURDIR)/debian/arch/` ; do \
		KW_CONFIG_DIR=debian/installer/$$arch ; \
		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/@cc_pkg@/$(cc_pkg)/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_DEFCONFIG_DIR=debian/installer ; \
		export KW_CONFIG_DIR=debian/installer/$$arch ; \
		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 kfreebsd-source-* sys/*/compile/* sys/*/conf/*.config
	rm -f debian/kfreebsd-image-*.{preinst,prerm,postinst,postrm}

	rm -f *-stamp
	dh_clean

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

	mkdir -p $(SRC_DIR)
	cp -af sys $(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 -i
	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

build-arch: $(foreach flavor,$(flavours),build-flavor-$(flavor)-stamp)
# Anti-dependency on build-indep (it needs a pristine build directory)
build-flavor-%-stamp: build-indep
	# Configure the kernel
	cat \
		debian/arch/$(cpu)/$*.config \
		$(debug_config) \
		> sys/$(kfreebsd_cpu)/conf/$*.config
	cd sys/$(kfreebsd_cpu)/conf && config $*.config

	# Change ident to the kernel version
	sed -i -e 's/^KERN_IDENT=.*/KERN_IDENT=Debian $* ($(full_version))/g' \
		sys/$(kfreebsd_cpu)/compile/$*.config/Makefile

	# Build it
	$(MAKE) \
		BRANCH_OVERRIDE="$(abiname)-$*" \
		CC=$(cc_cmd) \
		-C sys/$(kfreebsd_cpu)/compile/$*.config/ \
		depend all

	touch build-flavor-$*-stamp

install-common-stamp:
	dh_testdir
	dh_testroot
	dh_clean -k -p$(HEADERS_PACKAGE)

	mkdir -p $(HEADERS_PACKAGE)/usr/src/$(HEADERS_DIR)
	find sys -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
	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-udeb-stamp
install-flavor-%-stamp: install-common-stamp build-flavor-%-stamp
	dh_testdir
	dh_testroot
	dh_clean -k -pkfreebsd-image-$(version)-$(abiname)-$*

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

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

	# now install the kernel
	$(MAKE) CC=$(cc_cmd) -C sys/$(kfreebsd_cpu)/compile/$*.config DESTDIR=$(IMAGE_PACKAGE)-$* install

	# reallocate kernel image
	mv \
		$(IMAGE_PACKAGE)-$*/boot/kernel/kernel \
		$(IMAGE_PACKAGE)-$*/boot/kfreebsd-$(version)-$(abiname)-$*
	chmod 644 $(IMAGE_PACKAGE)-$*/boot/kfreebsd-$(version)-$(abiname)-$*
	gzip -9 -n $(IMAGE_PACKAGE)-$*/boot/kfreebsd-$(version)-$(abiname)-$*

	# reallocate module dir (sans kernel image)
	mkdir -p $(IMAGE_PACKAGE)-$*/lib/modules $(IMAGE_PACKAGE)-$*/boot/modules
	mv \
		$(IMAGE_PACKAGE)-$*/boot/kernel \
		$(IMAGE_PACKAGE)-$*/boot/modules/$(version)-$(abiname)-$*
	-chmod 644 $(IMAGE_PACKAGE)-$*/boot/modules/$(version)-$(abiname)-$*/*
	ln -s \
		../../boot/modules/$(version)-$(abiname)-$* \
		$(IMAGE_PACKAGE)-$*/lib/modules/$(version)-$(abiname)-$*

ifeq ($(DEB_HOST_ARCH_OS), kfreebsd)
	# Assert linker.hints presence (upstream build system silently skips it when
	# it can't find kldxref).
	test -e $(IMAGE_PACKAGE)-$*/lib/modules/$(version)-$(abiname)-$*/linker.hints
endif

	# 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)-$*

	# 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 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/$*.config/machine $(HEADERS_PACKAGE)-$*/usr/src/$(HEADERS_DIR)-$*/sys/$(kfreebsd_cpu) \
		&& cp -d --parents conf/$*.config $(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

	touch install-flavor-$*-stamp

install-udeb-stamp: $(foreach flavor,$(flavours),install-flavor-$(flavor)-stamp)
ifeq ($(DEB_HOST_ARCH_OS), kfreebsd)
	dh_testdir
	dh_testroot
	for i in debian/arch/$(DEB_HOST_ARCH_CPU)/*.installer ; do \
		subarch=`basename $$i .installer` ; \
			dh_clean -k -pkernel-image-$(version)-$(abiname)-$${subarch}-di ; \
	done

	export KW_DEFCONFIG_DIR=debian/installer ; \
	KW_CONFIG_DIR=debian/installer/$(DEB_HOST_ARCH_CPU) kernel-wedge install-files \
		$(version)-$(abiname) debian/installer/$(DEB_HOST_ARCH_CPU)

	for i in debian/arch/$(DEB_HOST_ARCH_CPU)/*.installer ; do \
		subarch=`basename $$i .installer` ; \
		# override file \n\
		mkdir -p $(CURDIR)/debian/zlib-modules-$(version)-$(abiname)-$${subarch}-di/usr/share/lintian/overrides ; \
		install -p -o root -g root -m 644 \
			debian/zlib-modules.overrides \
			$(CURDIR)/debian/zlib-modules-$(version)-$(abiname)-$${subarch}-di/usr/share/lintian/overrides/zlib-modules-$(version)-$(abiname)-$${subarch}-di ; \
		\
		# fixup kernel path (so that this udeb can be installed alongside other major versions of kfreebsd) \n\
		mv debian/kernel-image-$(version)-$(abiname)-$${subarch}-di/boot/kfreebsd{,-$(major)}.gz ; \
	done
endif
	touch $@


# Build architecture-independent files here.
binary-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: install-arch
	dh_testdir
	dh_testroot
	dh_installdocs -s
	dh_installchangelogs -s
	dh_link -s
	dh_strip -s -X/boot
	dh_compress -s
	dh_fixperms -s
	dh_makeshlibs -s
	dh_installdeb -s
	dh_shlibdeps -s -X/boot
	dh_gencontrol -s
	dh_md5sums -s
	dh_builddeb -s -- -Zxz

binary: binary-indep binary-arch

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