#         Christopher Townsend <christopher.townsend@canonical.com>
#	  David Henningsson <david.henningsson@canonical.com>
# License: GPL2
# Descriptiom:  rules to create a dkms and fish package from scratch
#		for a collection of linux kernel versions.
# vim:set syntax=make noexpandtab tabstop=8 shiftwidth=8:

##
## Parameters commonly changed by users ##
##

include Makefile.parameters

##
## Local directories and paths ##
##

DKMS = PKG_IGNORE_CURRENTLY_BUILDING=1 /usr/sbin/dkms

TOP			:= $(shell pwd)
LOCAL_BUILD		= $(TOP)/buildroot
DKMS_INSTALL_ROOT	= $(LOCAL_BUILD)/install
DKMS_BUILD_ROOT		= $(LOCAL_BUILD)/build
DRIVER_BUILD		= $(LOCAL_BUILD)/driver-build
DKMS_SRC_ROOT		= $(LOCAL_BUILD)/src
DKMS_NAME		= $(PACKAGE_NAME)-$(PACKAGE_VERSION)
SRC_DIR			= $(DKMS_SRC_ROOT)/$(DKMS_NAME)
ifeq (,$(QUILT_PATCHES))
QUILT_PATCHES		= $(TOP)/patches-$(DISTRIBUTION)
endif
QUILT_RC		= $(LOCAL_BUILD)/quiltrc
QUILT_PC_DIR            = $(LOCAL_BUILD)/quiltpc
FINAL_DIR		= $(LOCAL_BUILD)
UNSTABLE_TARBALL_SUBDIR = alsa-driver/alsa/alsa-kernel/pci/hda
UNSTABLE_TARBALL_COREDIR = alsa-driver/alsa/alsa-kernel/hda
UNSTABLE_TARBALL_INCLUDEDIR = alsa-driver/alsa/alsa-kernel/include
ifeq (,$(KERNEL_VERSION))
KERNEL_VERSION		:= $(shell cat $(QUILT_PATCHES)/kernel_version)
endif

##
## Kernel headers ##
##

# build against installed headers if not specified in KBUILD_TARGET
TARGS := $(shell cd /lib/modules; for i in $(KERNEL_VERSION).*; do test -d $$i/build && echo $$i; done)
MKDEB_TARGS = $(shell cd /lib/modules; for i in $(KERNEL_VERSION).*; do echo -k $$i; done)

ifeq (,$(KBUILD_TARGET))
KBUILD_TARGET = $(firstword $(TARGS))
endif

##
## DKMS Config ##
##

# Dkms template, I want to be able to auto-generate the whole thing
# including the KOs in it's redundant manifest
AUTOINSTALL_MK = yes

# necessary switches for dkms to build locally
DKMS_LOCAL = --dkmstree $(DKMS_BUILD_ROOT) --sourcetree $(DKMS_SRC_ROOT) \
 --installtree $(DKMS_INSTALL_ROOT)

# without this, dkms may ruin your kernel-headers when you build as root
DKMS_SETUP = --no-prepare-kernel --no-clean-kernel $(DKMS_LOCAL)
DKMS_ARGS = $(DKMS_SETUP) -m $(PACKAGE_NAME) -v $(PACKAGE_VERSION)

# Use a custom mkdeb/mkdsc template included in the framework package
DKMS_MKDEB_TEMPLATE = dkms-mkdeb-template
DKMS_MKDEB_DIR = $(SRC_DIR)/$(PACKAGE_NAME)-dkms-mkdeb
DKMS_MKDSC_DIR = $(SRC_DIR)/$(PACKAGE_NAME)-dkms-mkdsc


##
## Makefile targets ##
##

source-only-dsc: dkms-mkdsc-source-only
	@echo "Finished DKMS .dsc source only packaging: $(shell date)"

source-only: dkms-mkdeb-source-only
	@echo "Finished DKMS .deb source only packaging: $(shell date)"

pre-built: dkms-mkdeb
	@echo "Finished DKMS .deb pre-built binaries packaging: $(shell date)"

pre-built-dsc: dkms-mkdsc
	@echo "Finished DKMS .dsc pre-built binaries packaging: $(shell date)"


dkms-mkdeb-source-only: dkms-setup
	$(Q)$(DKMS) mkdeb --source-only $(DKMS_ARGS) $(MKDEB_TARGS)
	$(Q)cp -f $(DKMS_BUILD_ROOT)/$(PACKAGE_NAME)/$(PACKAGE_VERSION)/deb/*.deb $(FINAL_DIR)

dkms-mkdeb: dkms-build
	$(Q)$(DKMS) mkdeb $(DKMS_ARGS) $(MKDEB_TARGS)
	$(Q)cp -f $(DKMS_BUILD_ROOT)/$(PACKAGE_NAME)/$(PACKAGE_VERSION)/deb/*.deb $(FINAL_DIR)

dkms-mkdsc: dkms-build
	$(Q)$(DKMS) mkdsc $(DKMS_ARGS) $(MKDEB_TARGS)
	$(Q)cp -f $(DKMS_BUILD_ROOT)/$(PACKAGE_NAME)/$(PACKAGE_VERSION)/dsc/* $(FINAL_DIR)

dkms-mkdsc-source-only: dkms-setup
	$(Q)$(DKMS) mkdsc --source-only $(DKMS_ARGS) $(MKDEB_TARGS)
	$(Q)cp -f $(DKMS_BUILD_ROOT)/$(PACKAGE_NAME)/$(PACKAGE_VERSION)/dsc/* $(FINAL_DIR)

dkms-build: dkms-setup
	$(Q)for i in $(TARGS); do \
	    echo Prepare to build $(DKMS_NAME) against target $$i; \
	    $(DKMS) build $(DKMS_ARGS) --kernelsourcedir=/lib/modules/$$i/build  -k $$i; \
	done

dkms-setup-clean: create-dirs
	$(Q)rm -rf $(DKMS_BUILD_ROOT)/*
	$(Q)rm -rf $(DKMS_INSTALL_ROOT)/*
	-$(Q)rm -rf $(DKMS_MKDEB_DIR)
	-$(Q)rm -rf $(DKMS_MKDSC_DIR)


dkms-setup: create-dirs $(SRC_DIR)/dkms.conf create-modaliases dkms-setup-clean
	$(Q)cp /var/lib/dkms/dkms_dbversion $(DKMS_BUILD_ROOT)
	$(Q)cp -r $(DKMS_MKDEB_TEMPLATE) $(DKMS_SRC)/$(DKMS_MKDEB_DIR)
	$(Q)ln -s $(DKMS_MKDEB_DIR) $(DKMS_SRC)/$(DKMS_MKDSC_DIR)
	$(Q)$(DKMS) add $(DKMS_ARGS)


$(SRC_DIR)/dkms.conf: driver-build
	$(Q)cd $(SRC_DIR); \
	echo "PACKAGE_NAME=\"$(PACKAGE_NAME)\"" > dkms.conf; \
	echo "PACKAGE_VERSION=\"$(PACKAGE_VERSION)\"" >> dkms.conf; \
	echo "AUTOINSTALL=\"$(AUTOINSTALL_MK)\"" >> dkms.conf; \
	echo "OBSOLETE_BY=\"$(OBSOLETE_BY)\"" >> dkms.conf; \
	echo "BUILD_EXCLUSIVE_KERNEL=\"^$(KERNEL_VERSION).*\"" >> dkms.conf; \
	echo 'MAKE="make KVER=$$kernelver"' >> dkms.conf; \
	echo 'CLEAN="make KVER=$$kernelver clean"' >> dkms.conf; \
	echo >> dkms.conf; \
	cd $(DRIVER_BUILD); \
	$(TOP)/helper-scripts/dkms_module_gen $(DRIVER_BUILD) >> $(SRC_DIR)/dkms.conf;


# Test build the driver so that we know what modules come out of it
driver-build: create-dirs patched-source 
	$(Q)cp -r $(SRC_DIR)/* $(DRIVER_BUILD)
	$(Q)make -C /lib/modules/$(KBUILD_TARGET)/build M=$(DRIVER_BUILD) modules

create-modaliases: driver-build
	modinfo $(DRIVER_BUILD)/snd-hda-intel.ko | grep ^alias | sed -e 's/^alias:\s*\([a-zA-F0-9\*:]*\)/alias \1 hwe $(PACKAGE_NAME)-dkms/'  > $(DKMS_MKDEB_TEMPLATE)/debian/modaliases
	cp $(DKMS_MKDEB_TEMPLATE)/debian/modaliases debian/modaliases
	dh_modaliases
	cp debian/$(PACKAGE_NAME)-dkms.substvars debian/substvars

# Apply patches needed to make the source compile.
# NOTE: The patches must be in $(QUILT_PATCHES), e.g. ./patches-maverick/
# The "unpatched-source" file can be created by several targets. 
patched-source: $(LOCAL_BUILD)/unpatched-source
	grep "eedless plumbing" $(SRC_DIR)/Makefile || cat helper-scripts/Makefile.for.dkms >> $(SRC_DIR)/Makefile
	echo "QUILT_PATCHES=$(QUILT_PATCHES)" > $(QUILT_RC)
	-mv $(QUILT_PC_DIR) $(SRC_DIR)/.pc
	# Unfortunately quilt's return status is unreliable for this purpose :-(
	-cd $(SRC_DIR); quilt push -a --quiltrc=$(QUILT_RC)
	# move away quilt's directory so that it isn't included in the dkms build later
	-mv $(SRC_DIR)/.pc $(QUILT_PC_DIR)
	# special to advertise our version in dmesg
	sed -i "s/__DKMS_PACKAGE_VERSION__/$(PACKAGE_VERSION)/g" $(SRC_DIR)/hda_intel.c

# Take source from sound/pci/hda and put in $(SRC_DIR)
fetch-src-from-directory: create-dirs clean-src
	$(Q)cp -r $(UPSTREAM_SRC_DIR)/* $(SRC_DIR)
	$(Q)touch $(LOCAL_BUILD)/unpatched-source

# Take source from sound/pci/hda and put in $(SRC_DIR)
fetch-src-from-kernel: create-dirs clean-src
	$(Q)cp -r $(UPSTREAM_KERNEL_DIR)/sound/pci/hda/* $(SRC_DIR)
	$(Q)cp -r $(UPSTREAM_KERNEL_DIR)/sound/hda/* $(SRC_DIR)/hdacore
	$(Q)cp -r $(UPSTREAM_KERNEL_DIR)/include/sound/hda* $(SRC_DIR)/include
	$(Q)touch $(LOCAL_BUILD)/unpatched-source


# Take Takashi's snapshot tarball (he builds one every night) and put in $(SRC_DIR)
fetch-src-from-tarball: create-dirs clean-src
	$(Q)wget -O snapshot.tar.gz $(UNSTABLE_TARBALL_SRC) 
	$(Q)tar -xzf snapshot.tar.gz $(UNSTABLE_TARBALL_SUBDIR)
	$(Q)tar -xzf snapshot.tar.gz $(UNSTABLE_TARBALL_COREDIR)
	$(Q)tar -xzf snapshot.tar.gz $(UNSTABLE_TARBALL_INCLUDEDIR)
	$(Q)cp $(UNSTABLE_TARBALL_SUBDIR)/* $(SRC_DIR)
	$(Q)cp -rf $(UNSTABLE_TARBALL_COREDIR)/* $(SRC_DIR)/hdacore
	$(Q)cp $(UNSTABLE_TARBALL_INCLUDEDIR)/hda* $(SRC_DIR)/include
	$(Q)rm -rf alsa-driver
	$(Q)touch $(LOCAL_BUILD)/unpatched-source


# cleans the source subdirectory only
clean-src:
	-$(Q)rm $(LOCAL_BUILD)/unpatched-source
	-$(Q)rm -rf $(SRC_DIR)/*
	-$(Q)mkdir -p $(SRC_DIR)/hdacore
	-$(Q)mkdir -p $(SRC_DIR)/include
	-$(Q)rm -rf $(QUILT_PC_DIR)


# Sets up build directories
create-dirs:
	$(Q)mkdir -p $(LOCAL_BUILD)
	$(Q)mkdir -p $(SRC_DIR)
	$(Q)mkdir -p $(DKMS_BUILD_ROOT)
	$(Q)mkdir -p $(DKMS_INSTALL_ROOT)
	$(Q)mkdir -p $(DRIVER_BUILD)


clean: 
	# created by create-dirs
	-$(Q)rm -rf $(LOCAL_BUILD)
	# created by driver-build 
	-$(Q)rm -f $(TOP)/Module.symvers  $(TOP)/modules.order
	# created by fetch-src-from-tarball
	-$(Q)rm snapshot.tar.gz
	

.PHONY: clean clean-src create-dirs fetch-src-from-tarball driver-build driver-clean patched-source dkms-setup dkms-setup-clean dkms-mkdeb-source-only


