#
# Makefile for the output source package
#

ifeq ($(KERNELRELEASE),)

MAKEFLAGS += --no-print-directory
SHELL := /usr/bin/env bash
BACKPORT_DIR := $(shell pwd)

KMODDIR ?= updates
ifneq ($(origin KLIB), undefined)
KMODPATH_ARG := "INSTALL_MOD_PATH=$(KLIB)"
else
KLIB := /lib/modules/$(shell uname -r)/
KMODPATH_ARG :=
endif
KLIB_BUILD ?= $(KLIB)/build/
KERNEL_CONFIG := $(KLIB_BUILD)/.config
KERNEL_MAKEFILE := $(KLIB_BUILD)/Makefile
CONFIG_MD5 := $(shell md5sum $(KERNEL_CONFIG) 2>/dev/null | sed 's/\s.*//')
STAMP_KERNEL_CONFIG := .kernel_config_md5_$(CONFIG_MD5)

export KLIB KLIB_BUILD BACKPORT_DIR KMODDIR KMODPATH_ARG

# disable built-in rules for this file
.SUFFIXES:

.PHONY: default
default:
	@$(MAKE) modules

.PHONY: mrproper
mrproper:
	@test -f .config && $(MAKE) clean || true
	@rm -f .config
	@rm -f .kernel_config_md5 Kconfig.versions Kconfig.kernel
	@rm -f backport-include/backport/autoconf.h

.SILENT: $(STAMP_KERNEL_CONFIG)
$(STAMP_KERNEL_CONFIG):
	@set -e ; test -f .local-symbols || (						\
	echo "/--------------"								;\
	echo "| You shouldn't run make in the backports tree, but only in"		;\
	echo "| the generated output. This here is only the skeleton code"		;\
	echo "| copied into the output directory. To use the backport system"		;\
	echo "| from scratch, go into the top-level directory and run"			;\
	echo "|	./gentree.py /path/to/linux-next/ /tmp/output"				;\
	echo "| and then make menuconfig/... in the output directory. See"		;\
	echo "|	./gentree.py --help"							;\
	echo "| for more options."							;\
	echo "\\--"									;\
	false)
	@set -e ; test -f $(KERNEL_CONFIG) || (						\
	echo "/--------------"								;\
	echo "| Your kernel headers are incomplete/not installed."			;\
	echo "| Please install kernel headers, including a .config"			;\
	echo "| file or use the KLIB/KLIB_BUILD make variables to"			;\
	echo "| set the kernel to build against, e.g."					;\
	echo "|   make KLIB=/lib/modules/3.1.7/"					;\
	echo "| to compile/install for the installed kernel 3.1.7"			;\
	echo "| (that isn't currently running.)"					;\
	echo "\\--"									;\
	false)
	@rm -f .kernel_config_md5_*
	@touch $@

Kconfig.kernel: $(STAMP_KERNEL_CONFIG) .local-symbols
	@printf "Generating local configuration database from kernel ..."
	@grep -v -f .local-symbols $(KERNEL_CONFIG) | grep = | (			\
		while read l ; do						\
			if [ "$${l:0:7}" != "CONFIG_" ] ; then			\
				continue					;\
			fi							;\
			l=$${l:7}						;\
			n=$${l%%=*}						;\
			v=$${l#*=}						;\
			if [ "$$v" = "m" ] ; then				\
				echo config $$n					;\
				echo '    tristate' 				;\
			elif [ "$$v" = "y" ] ; then				\
				echo config $$n					;\
				echo '    bool'					;\
			else							\
				continue					;\
			fi							;\
			echo "    default $$v"					;\
			echo ""							;\
		done								\
	) > $@
	@echo " done."

Kconfig.versions: Kconfig.kernel
	@kver=$$($(MAKE) --no-print-directory -C $(KLIB_BUILD) kernelversion |	\
		sed 's/^\(\(3\|2\.6\)\.[0-9]\+\).*/\1/;t;d')			;\
	test "$$kver" != "" || echo "Kernel version parse failed!"		;\
	test "$$kver" != ""							;\
	kvers="$$(seq 14 39 | sed 's/^/2.6./')"					;\
	kvers="$$kvers $$(seq 0 99 | sed 's/^/3./')"				;\
	print=0									;\
	for v in $$kvers ; do							\
		if [ "$$print" = "1" ] ; then					\
			echo config KERNEL_$$(echo $$v | tr . _)	;\
			echo "    def_bool y"					;\
		fi								;\
		if [ "$$v" = "$$kver" ] ; then print=1 ; fi			;\
	done > $@
	@RHEL_MAJOR=$$(grep '^RHEL_MAJOR' $(KERNEL_MAKEFILE) | 			\
				sed 's/.*=\s*\([0-9]*\)/\1/;t;d')		;\
	RHEL_MINOR=$$(grep '^RHEL_MINOR' $(KERNEL_MAKEFILE) | 			\
				sed 's/.*=\s*\([0-9]*\)/\1/;t;d')		;\
	for v in $$(seq 0 $$RHEL_MINOR) ; do 					\
		echo config BACKPORT_RHEL_KERNEL_$${RHEL_MAJOR}_$$v		;\
		echo "    def_bool y"						;\
	done >> $@

.DEFAULT:
	@$(MAKE) Kconfig.versions
	@$(MAKE) -f Makefile.real "$@"

.PHONY: defconfig-help
defconfig-help:
	@echo "Driver or subsystem configuration targets:"
	@set -e						;\
		bk_configs="$$(ls defconfigs/*)" 	;\
		for cfg in $$bk_configs; do		\
			echo "  defconfig-$${cfg##defconfigs/}"	;\
		done
	@echo ""

.PHONY: help
help: defconfig-help
	@echo "Cleaning targets:"
	@echo "  clean           - Remove most generated files but keep the config and"
	@echo "                    enough build support to build external modules"
	@echo "  mrproper        - Remove all generated files + config + various backup files"
	@echo ""
	@echo "Driver configuration help:"
	@echo "  defconfig-help  - List all prearranged defconfig-targets we have"
	@echo "                    designed for you. You can use this to find"
	@echo "                    driver specific configs in case all you really"
	@echo "                    need is to just compile one or a small group "
	@echo "                    of drivers."
	@echo ""
	@echo "Configuration targets:"
	@echo "  menuconfig      - Update current config utilising a menu based program"
	@echo "  oldconfig       - Update current config utilising a provided .config as base"
	@echo "  oldaskconfig    - ??"
	@echo "  silentoldconfig - Same as oldconfig, but quietly, additionally update deps"
	@echo "  allnoconfig     - New config where all options are answered with no"
	@echo "  allyesconfig    - New config where all options are accepted with yes"
	@echo "  allmodconfig    - New config selecting modules when possible"
	@echo "  alldefconfig    - New config with all symbols set to default"
	@echo "  randconfig      - New config with random answer to all options"
	@echo "  listnewconfig   - List new options"
	@echo "  olddefconfig    - Same as silentoldconfig but sets new symbols to their default value"
	@echo ""
	@echo "Other generic targets:"
	@echo "  all             - Build all targets marked with [*]"
	@echo "* modules         - Build all modules"
	@echo ""
	@echo "Architecture specific targets:"
	@echo "  install         - Install modules"
	@echo "  uninstall       - Uninstall modules"
	@echo ""
	@echo "Execute "make" or "make all" to build all targets marked with [*]"
else
include $(BACKPORT_DIR)/Makefile.kernel
endif
