#!/usr/bin/make -f
# -*- makefile -*-
# Sample debian/rules that uses debhelper.

SHELL = bash

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

# This has to be exported to make some magic below work.
export DH_OPTIONS

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

include /usr/share/dpkg/architecture.mk

# Determine host architecture compiler
ifeq ($(origin CC),default)
CC := $(DEB_HOST_GNU_TYPE)-gcc
endif

# Use hardening flags
export DEB_BUILD_MAINT_OPTIONS = hardening=+all

# Pre-define CFLAGS, for hardening, debug and optimisation level
DPKG_EXPORT_BUILDFLAGS = 1
include /usr/share/dpkg/buildflags.mk

EXTRA_CFLAGS = \
	-D__FreeBSD_version=__FreeBSD_kernel_version \
	-D_GNU_SOURCE -pipe -Wall \
	-Werror=implicit-function-declaration \
	-I. -I$(CURDIR)/sys \
	-isystem /usr/include/freebsd \
	-fPIC \
	$(CPPFLAGS) \
	$(NULL)
CFLAGS	+= $(EXTRA_CFLAGS)

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

SVN_BASE	:= https://svn.freebsd.org/base
#SVN		:= $(SVN_BASE)/release/$(version).0
SVN		:= $(SVN_BASE)/releng/$(version)
#SVN		:= $(SVN_BASE)/stable/$(major)
#SVN		:= $(SVN_BASE)/head

SOURCE = freebsd-libs
ORIGDIR = $(SOURCE)-$(tar_version)
TARNAME = $(SOURCE)_$(tar_version).orig.tar.xz
SOURCE_DATE_EPOCH ?= $(shell date -d "$$(dpkg-parsechangelog -SDate)" +%s)

PATH := /usr/lib/freebsd:$(PATH)
DESTDIR = $(CURDIR)/debian/tmp
CFLAGS += -I$(CURDIR)/debian/local/include
PMAKE_COMMON = \
	MAKEFLAGS=$(BSD_MAKEFLAGS) \
	NO_WERROR=1 NOGCCERROR=1 \
        NOSHARED=NO NO_SHARED=NO NO_PROFILE=1 DESTDIR=$(DESTDIR) \
	SHLIB_MAJOR=0 \
	bmake \
	CC=$(CC) \
	$(NULL)
PMAKE = \
	CFLAGS="$(CFLAGS)" \
	$(PMAKE_COMMON)
PMAKE_FOREIGN = \
	CFLAGS="$(CFLAGS) -D__FREEBSD_GLUE_USE_EMBEDDED_HEADERS" \
	$(PMAKE_COMMON)

kernel = $(DEB_HOST_ARCH_OS)

get-orig-source:
	rm -rf $(ORIGDIR)
	mkdir -p $(ORIGDIR)/share/misc
	mkdir -p $(ORIGDIR)/sys/kern
	mkdir -p $(ORIGDIR)/sys/sys \
		$(ORIGDIR)/sys/netipx
	for i in lib/libcam lib/libdevstat lib/libgeom lib/libipx \
		lib/libelf \
		lib/libdwarf \
	         lib/libkiconv lib/libnetgraph lib/libjail \
	         lib/libkvm lib/libmemstat lib/libsbuf lib/libusb \
	         lib/libusbhid sys/cam \
		lib/libutil \
		lib/libalias sys/netinet/libalias sys/modules/libalias \
		lib/Makefile.inc \
	         sys/kern/subr_prf.c \
	         sys/kern/subr_sbuf.c \
	         sys/sys/sbuf.h \
		sys/netipx/ipx.h \
	         share/misc/usb_hid_usages ; do \
	    svn export --ignore-keywords -r $(svn_revision) $(SVN)/$$i $(ORIGDIR)/$$i || exit ; \
	done
	# Remove unused files with non GPL compatible license (eg BSD 4 clauses)
	rm -f $(ORIGDIR)/sys/cam/scsi/scsi_ch.*
	rm -f $(ORIGDIR)/lib/libkvm/kvm_ia64.c
	rm -f $(ORIGDIR)/lib/libkvm/kvm_powerpc.c

	# Remove all CAM kernel headers to ensure system-wide version is used instead
	find $(ORIGDIR)/sys/cam -name \*.h | xargs rm -f

	# Clamp timestamps to be no newer than last changelog entry, see
	# https://wiki.debian.org/ReproducibleBuilds/TimestampsInTarball
	find $(ORIGDIR) -newermt "@$(SOURCE_DATE_EPOCH)" -print0 \
	 | xargs -0r touch --no-dereference --date="@$(SOURCE_DATE_EPOCH)"
	# Create tarball with files sorted in a stable order, see
	# https://wiki.debian.org/ReproducibleBuilds/FileOrderInTarballs
	find $(ORIGDIR) -print0 | LC_ALL=C sort -z \
	 | tar --null --no-recursion --files-from - \
	    --numeric-owner --owner 0 --group 0 \
	    -cJf ../$(TARNAME)
	rm -rf $(ORIGDIR)

BUILD_ARCH_TARGETS = \
	build-sbuf \
	build-dwarf \
	build-elf \
	build-util \
	build-ipx \
	$(NULL)

ifeq ($(kernel), kfreebsd)
BUILD_ARCH_TARGETS += \
	build-cam \
	build-geom \
	build-kiconv \
	build-kvm \
	build-usbhid \
	build-usb \
	build-devstat \
	build-memstat \
	build-netgraph \
	build-jail \
	build-alias
endif

build: build-indep build-arch
build-indep:
build-arch: $(BUILD_ARCH_TARGETS)

build-cam: build-cam-stamp
build-cam-stamp: build-sbuf
	$(PMAKE) -C $(CURDIR)/lib/libcam SHLIBDIR=./
	touch $@

build-geom: build-geom-stamp
build-geom-stamp: build-sbuf
	$(PMAKE) -C $(CURDIR)/lib/libgeom SHLIBDIR=./
	touch $@

build-netgraph: build-netgraph-stamp
build-netgraph-stamp:
	$(PMAKE) -C $(CURDIR)/lib/libnetgraph SHLIBDIR=./
	touch $@

build-ipx: build-ipx-stamp
build-ipx-stamp:
	$(PMAKE) -C $(CURDIR)/lib/libipx SHLIBDIR=./
	touch $@

build-kiconv: build-kiconv-stamp
build-kiconv-stamp:
	$(PMAKE) -C $(CURDIR)/lib/libkiconv SHLIBDIR=./
	touch $@

build-kvm: build-kvm-stamp
build-kvm-stamp:
	$(PMAKE) -C $(CURDIR)/lib/libkvm SHLIBDIR=./
	touch $@

build-devstat: build-devstat-stamp
build-devstat-stamp: build-kvm
	$(PMAKE) -C $(CURDIR)/lib/libdevstat SHLIBDIR=./
	touch $@

build-elf: build-elf-stamp
build-elf-stamp:
	$(PMAKE_FOREIGN) -C $(CURDIR)/lib/libelf SHLIBDIR=./
	touch $@

build-dwarf: build-dwarf-stamp
build-dwarf-stamp: build-elf
	$(PMAKE_FOREIGN) -C $(CURDIR)/lib/libdwarf SHLIBDIR=./
	touch $@

build-memstat: build-memstat-stamp
build-memstat-stamp: build-kvm
	$(PMAKE) -C $(CURDIR)/lib/libmemstat SHLIBDIR=./
	touch $@

build-sbuf: build-sbuf-stamp
build-sbuf-stamp:
	$(PMAKE_FOREIGN) -C $(CURDIR)/lib/libsbuf SHLIBDIR=./
	touch $@

build-usbhid: build-usbhid-stamp
build-usbhid-stamp:
	$(PMAKE) -C $(CURDIR)/lib/libusbhid SHLIBDIR=./
	touch $@

build-usb: build-usb-stamp
build-usb-stamp:
	$(PMAKE) -C $(CURDIR)/lib/libusb SHLIBDIR=./
	touch $@

build-util: build-util-stamp
build-util-stamp:
	$(PMAKE) -C $(CURDIR)/lib/libutil SHLIBDIR=./
	touch $@

build-jail: build-jail-stamp
build-jail-stamp:
	$(PMAKE) -C $(CURDIR)/lib/libjail SHLIBDIR=./
	touch $@

build-alias: build-alias-stamp
build-alias-stamp:
	$(PMAKE) -C $(CURDIR)/lib/libalias SHLIBDIR=./
	touch $@

clean:
	dh_testdir
	dh_testroot
	$(PMAKE) -C $(CURDIR)/lib/libsbuf clean
	$(PMAKE) -C $(CURDIR)/lib/libdwarf clean
	$(PMAKE) -C $(CURDIR)/lib/libelf clean
	$(PMAKE) -C $(CURDIR)/lib/libutil clean
ifeq ($(kernel), kfreebsd)
	$(PMAKE) -C $(CURDIR)/lib/libcam clean
	$(PMAKE) -C $(CURDIR)/lib/libnetgraph clean
	$(PMAKE) -C $(CURDIR)/lib/libdevstat clean
	$(PMAKE) -C $(CURDIR)/lib/libmemstat clean
	$(PMAKE) -C $(CURDIR)/lib/libgeom clean
	$(PMAKE) -C $(CURDIR)/lib/libipx clean
	$(PMAKE) -C $(CURDIR)/lib/libkiconv clean
	$(PMAKE) -C $(CURDIR)/lib/libkvm clean
	$(PMAKE) -C $(CURDIR)/lib/libusbhid clean
	$(PMAKE) -C $(CURDIR)/lib/libusb clean
	$(PMAKE) -C $(CURDIR)/lib/libjail clean
	$(PMAKE) -C $(CURDIR)/lib/libalias clean
endif
	rm -f *stamp
	dh_clean

install-indep: build-indep
	dh_testdir
	dh_testroot
	dh_prep -i
	dh_installdirs -i

	mkdir -p $(DESTDIR)
	dh_install -i --list-missing

install-arch: build-arch
	dh_testdir
	dh_testroot
	dh_prep -a
	dh_installdirs -a

	mkdir -p \
		$(DESTDIR)/lib \
		$(DESTDIR)/lib/$(DEB_HOST_MULTIARCH) \
		$(DESTDIR)/usr/lib \
		$(DESTDIR)/usr/lib/$(DEB_HOST_MULTIARCH) \
		$(DESTDIR)/usr/lib/pkgconfig \
		$(DESTDIR)/usr/lib/$(DEB_HOST_MULTIARCH)/pkgconfig \
		$(DESTDIR)/usr/include \
		$(DESTDIR)/usr/share/man/man3
	$(PMAKE) -C $(CURDIR)/lib/libsbuf install SHLIBDIR=/lib
	$(PMAKE) -C $(CURDIR)/lib/libdwarf install SHLIBDIR=/usr/lib
	$(PMAKE) -C $(CURDIR)/lib/libelf install SHLIBDIR=/usr/lib
	$(PMAKE) -C $(CURDIR)/lib/libutil install SHLIBDIR=/lib
	$(PMAKE) -C $(CURDIR)/lib/libipx install SHLIBDIR=/lib
ifeq ($(kernel), kfreebsd)
	$(PMAKE) -C $(CURDIR)/lib/libcam install SHLIBDIR=/usr/lib
	$(PMAKE) -C $(CURDIR)/lib/libgeom install SHLIBDIR=/lib
	$(PMAKE) -C $(CURDIR)/lib/libkiconv install SHLIBDIR=/usr/lib
	$(PMAKE) -C $(CURDIR)/lib/libkvm install SHLIBDIR=/lib
	$(PMAKE) -C $(CURDIR)/lib/libdevstat install SHLIBDIR=/usr/lib
	$(PMAKE) -C $(CURDIR)/lib/libmemstat install SHLIBDIR=/usr/lib
	$(PMAKE) -C $(CURDIR)/lib/libnetgraph install SHLIBDIR=/usr/lib
	$(PMAKE) -C $(CURDIR)/lib/libusbhid install SHLIBDIR=/usr/lib
	$(PMAKE) -C $(CURDIR)/lib/libusb install SHLIBDIR=/lib/$(DEB_HOST_MULTIARCH) LIBDIR=/usr/lib/$(DEB_HOST_MULTIARCH)
	$(PMAKE) -C $(CURDIR)/lib/libjail install SHLIBDIR=/lib
	$(PMAKE) -C $(CURDIR)/lib/libalias install SHLIBDIR=/usr/lib

	mkdir -p $(CURDIR)/debian/tmp/usr/bin
	install -m755 debian/libusb-config $(CURDIR)/debian/tmp/usr/bin
endif

	mkdir -p $(CURDIR)/debian/tmp/usr/include/sys
	install -m644 sys/sys/sbuf.h $(CURDIR)/debian/tmp/usr/include/sys

	dh_install -a --list-missing --sourcedir=debian/tmp

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

# Build architecture-dependent files here.
binary-arch: install-arch
	dh_testdir
	dh_testroot
	dh_installchangelogs -a
	dh_installdocs -a
#	dh_installexamples
#	dh_installinit
#	dh_installcron
#	dh_installinfo
#	dh_installman
	dh_link -a
	dh_strip -a
	dh_compress -a
	dh_fixperms -a
#	dh_perl
#	dh_python
	dh_makeshlibs -a
ifeq ($(kernel), kfreebsd)
	dh_makeshlibs -plibgeom1 --add-udeb=libgeom1-udeb
	dh_makeshlibs -plibipx2 --add-udeb=libipx2-udeb
	dh_makeshlibs -plibsbuf6 --add-udeb=libsbuf6-udeb
	dh_makeshlibs -plibusb3 --add-udeb=libusb3-udeb
endif
	dh_installdeb -a
	dh_shlibdeps -a
	dh_gencontrol -a
	dh_md5sums -a
	dh_builddeb -a

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