#!/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)

source		:= $(shell dpkg-parsechangelog | grep ^Source: | sed -e 's/^.*: //g')
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=%)
configfile	:= DEBCUSTOM
abiname		:= 0
ld_target	:= $(shell ld --help | sed -ne "s/[^ :]*: supported targets: \([^ ]*\) .*/\1/p")

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)
FLAVOR_DIR	:= flavor-$(version)-$(abiname)
ORIG_DIR	:= $(source)-$(tar_version)
ORIG_TAR	:= $(source)_$(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

MAKE		:= \
		MAKEFLAGS=$(BSD_MAKEFLAGS) \
		make \
		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 arm

cc_pkg		:= clang-3.4 (>= 1:3.4.2-9~exp2) [$(foreach cpu,$(clang_cpus),any-$(cpu))], \
		gcc-4.9 [$(foreach cpu,$(clang_cpus),!any-$(cpu))]

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

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

MAKE += -DWITHOUT_CTF

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

# Disable ssp for now ...
# at least under QEMU it panics, might be due to
#   - QEMU
#   - newer gcc compared to plain FreeBSD
#   - different init order
#   - ...
MAKE += -DWITHOUT_SSP

get-orig-source:
	rm -rf $(ORIG_DIR)
	svn export --ignore-keywords -r $(svn_revision) $(SVN)/sys $(ORIG_DIR)/sys
	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-* flavor-*
	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

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
	dh_installdirs -i

	mkdir -p $(SOURCE_PACKAGE)/usr/src
	chown -R root.src $(SRC_DIR)
	# Avoid the top-level directory timestamp changing
	touch $(SRC_DIR) --reference=$(SRC_DIR)/sys
	tar cfJ $(SOURCE_PACKAGE)/usr/src/$(SRC_TAR) $(SRC_DIR)

	touch install-indep-stamp

build-arch: $(foreach flavor,$(flavours),build-flavor-$(flavor)-stamp)
src-flavor-%-stamp:
	mkdir -p $(FLAVOR_DIR)-$*
	cp -af sys $(FLAVOR_DIR)-$*/

	# Compile objects with relative, not absolute paths, to avoid embedding
	# full build tree paths into modules (Bug #757629)
	find $(FLAVOR_DIR)-$*/sys/modules/ \
	 \( -name Makefile -o -name Makefile.inc \) \
	 -exec sed -i 's@$${.CURDIR}/@@g' \{\} \;

	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

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

	# We must rebuild firmware from sources, per the DFSG
	CFLAGS='-D_GNU_SOURCE -isystem /usr/include/freebsd' LDFLAGS='-ldb -lbsd' \
	 $(MAKE) CC=$(cc_cmd) -C $(FLAVOR_DIR)-$*/sys/modules/aic7xxx/ firmware

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

	touch build-flavor-$*-stamp

install-common-stamp:
	dh_testdir
	dh_testroot
	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)/sys/tools -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)-$*

	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) CC=$(cc_cmd) -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)-$*
	# Brand kernel image and modules as FreeBSD type, in case not building
	# on kfreebsd
	find $(IMAGE_PACKAGE)-$*/lib/modules/$(version)-$(abiname)-$*/ \
	 -name '*.ko' -exec brandelf -t FreeBSD \{\} \;
	brandelf -t FreeBSD $(IMAGE_PACKAGE)-$*/boot/kfreebsd-$(version)-$(abiname)-$*
	gzip -9 -n $(IMAGE_PACKAGE)-$*/boot/kfreebsd-$(version)-$(abiname)-$*

	# fix broken perms in module dir
	-chmod 644 $(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

# FIXME: We're not ready yet. We need to decide what to do about the regressions (e.g. #732692)
	rm -f $(IMAGE_PACKAGE)-$*/lib/modules/$(version)-$(abiname)-$*/linker.hints
endif
	# Symlink to drm2.ko as provider of drmn.ko dependency, for *kms
	# modules (#731182)
	ln -sf drm2.ko $(IMAGE_PACKAGE)-$*/lib/modules/$(version)-$(abiname)-$*/drmn.ko

	# 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 $(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

	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: 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 -- -Zxz

binary: binary-indep binary-arch

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