#!/usr/bin/make -f
SHELL		:= bash

deb_version		:= $(shell dpkg-parsechangelog | sed -ne "s/^Version: \(.*\)/\1/p")
upstream_version	:= $(shell echo $(deb_version) | sed -e "s/-[^-]*$$//")

package		:= grub2

DEB_HOST_ARCH ?= $(shell dpkg-architecture -qDEB_HOST_ARCH 2>/dev/null)
DEB_HOST_ARCH_OS ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_OS 2>/dev/null)
DEB_HOST_ARCH_CPU ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_CPU 2>/dev/null)

HOST_CFLAGS := -g -Wall -Wno-error=unused-result

ifneq (,$(findstring noopt,$(DEB_BUILD_OPTIONS)))
	HOST_CFLAGS += -O0
else
	HOST_CFLAGS += -O2
endif

unexport CFLAGS
export HOST_CFLAGS
export TARGET_CPPFLAGS := -Wno-unused-but-set-variable

ifeq (,$(shell which qemu-system-i386 2>/dev/null))
with_check := no
else
with_check := yes
endif

CC := gcc-4.7

# Enable external modules from grub-extras.
export GRUB_CONTRIB := $(CURDIR)/debian/grub-extras

confflags = PACKAGE_VERSION="$(deb_version)" PACKAGE_STRING="GRUB $(deb_version)" CC=$(CC) TARGET_CC=$(CC) --enable-grub-mkfont

AUTOGEN_DEB_FILES = config templates preinst postinst postrm dirs install links

BUILD_PACKAGES := $(strip $(shell dh_listpackages))
REAL_PACKAGES = grub-emu grub-pc grub-coreboot grub-efi-ia32 grub-efi-amd64 grub-efi-ia64 grub-ieee1275 grub-firmware-qemu grub-yeeloong

ifneq (,$(filter i386 amd64,$(DEB_HOST_ARCH_CPU)))
COMMON_PLATFORM := pc
else ifneq (,$(filter powerpc ppc64 sparc,$(DEB_HOST_ARCH_CPU)))
COMMON_PLATFORM := ieee1275
else ifeq (mipsel,$(DEB_HOST_ARCH_CPU))
COMMON_PLATFORM := yeeloong
else ifeq (ia64,$(DEB_HOST_ARCH_CPU))
COMMON_PLATFORM := efi-ia64
else
$(error COMMON_PLATFORM not set for $(DEB_HOST_ARCH_CPU))
endif

ifeq (yes,$(shell dpkg-vendor --derives-from Ubuntu && echo yes))
DEFAULT_CMDLINE := quiet splash
else
DEFAULT_CMDLINE := quiet
endif

%:
	dh $@ --parallel

override_dh_auto_configure: $(patsubst %,configure/%,$(BUILD_PACKAGES))

override_dh_auto_build: $(patsubst %,build/%,$(BUILD_PACKAGES))

override_dh_auto_install: $(patsubst %,install/%,$(BUILD_PACKAGES))

$(patsubst %,configure/%,$(REAL_PACKAGES)) :: configure/% : build/stamps/configure-%
$(patsubst %,build/%,$(REAL_PACKAGES) grub-rescue-pc) :: build/% : build/stamps/build-%

build/stamps/configure-%: package = $(subst build/stamps/configure-,,$@)
build/stamps/configure-%: export DH_OPTIONS = -p$(package) -Bbuild/$(package)

build/stamps/build-%: package = $(subst build/stamps/build-,,$@)
build/stamps/build-%: export DH_OPTIONS = -p$(package) -Bbuild/$(package)

install/%: package = $(subst install/,,$@)
install/%: package_bin = $(package)-bin
install/%: package_dbg = $(package)-dbg
install/grub-emu: package_bin = grub-emu
install/grub-emu: package_dbg = grub-emu-dbg
install/%: export DH_OPTIONS = -p$(package) -Bbuild/$(patsubst grub-common,grub-$(COMMON_PLATFORM),$(package))

build/stamps/autogen: autogen.sh configure.ac Makefile.util.def grub-core/Makefile.core.def
	mkdir -p build/stamps
	env -u DH_OPTIONS dh_autoreconf -- ./autogen.sh
	touch $@

build/stamps/configure-grub-common: build/stamps/configure-grub-$(COMMON_PLATFORM)

build/stamps/build-grub-common: build/stamps/build-grub-$(COMMON_PLATFORM)

build/stamps/configure-grub-pc build/stamps/configure-grub-ieee1275 build/stamps/configure-grub-coreboot build/stamps/configure-grub-emu build/stamps/configure-grub-yeeloong: build/stamps/autogen
	mkdir -p build/stamps build/$(package)
	dh_auto_configure -- $(confflags) --with-platform=$(subst grub-,,$(package))
	touch $@

# This name scheme leaves room for things like amd32 someday
build/stamps/configure-grub-efi-ia32: build/stamps/autogen
	mkdir -p build/stamps build/$(package)
	dh_auto_configure -- $(confflags) --with-platform=efi --target=i386-pe --program-prefix=""
	touch $@
build/stamps/configure-grub-efi-amd64: build/stamps/autogen
	mkdir -p build/stamps $(subst build/stamps/configure-,build/,$@)
	dh_auto_configure -- $(confflags) --with-platform=efi --target=amd64-pe --program-prefix=""
	touch $@
build/stamps/configure-grub-efi-ia64: build/stamps/autogen
	mkdir -p build/stamps $(subst build/stamps/configure-,build/,$@)
	dh_auto_configure -- $(confflags) --with-platform=efi
	touch $@

build/stamps/configure-grub-firmware-qemu: build/stamps/autogen
	mkdir -p build/stamps $(subst build/stamps/configure-,build/,$@)
	dh_auto_configure -- $(confflags) --with-platform=qemu
	touch $@

build/stamps/build-grub-efi-ia32 build/stamps/build-grub-efi-amd64 build/stamps/build-grub-efi-ia64 build/stamps/build-grub-ieee1275 build/stamps/build-grub-coreboot build/stamps/build-grub-emu build/stamps/build-grub-yeeloong: build/stamps/build-%: build/stamps/configure-%
	dh_auto_build
	touch $@

build/stamps/build-grub-pc: build/stamps/configure-grub-pc
	dh_auto_build
ifeq ($(with_check), yes)
	PATH="$$PATH:/sbin:/usr/sbin" dh_auto_test
endif
	touch $@

build/stamps/build-grub-firmware-qemu: build/stamps/configure-grub-firmware-qemu
	dh_auto_build
	grub_dir=`mktemp -d` ; \
	grub_memdisk=`mktemp` ; \
	trap "rm -rf $${grub_dir} $${grub_memdisk}" EXIT HUP INT QUIT TERM ; \
	mkdir -p $${grub_dir}/boot/grub ; \
	cp debian/grub-firmware-qemu_grub.cfg $${grub_dir}/boot/grub/grub.cfg ; \
	tar -cf - -C $${grub_dir} boot > $${grub_memdisk} ; \
	build/$(package)/grub-mkimage \
		-O i386-qemu \
		-d $(CURDIR)/build/$(package)/grub-core \
		$(CURDIR)/build/$(package)/grub-core/*.mod \
		-m $${grub_memdisk} \
		-o $(CURDIR)/build/$(package)/grub.bin
	touch $@

build/stamps/build-grub-rescue-pc: build/stamps/build-grub-pc
	mkdir -p build/grub-rescue-pc
	cp -a build/grub-pc/grub-mkrescue build/grub-pc/grub-mkconfig_lib \
		build/grub-rescue-pc/
	mkdir -p build/grub-rescue-pc/rescue-disk/boot/grub
	cp docs/grub.cfg build/grub-rescue-pc/rescue-disk/boot/grub/
	sed -i 's,^prefix=.*,prefix=$(CURDIR)/build/grub-rescue-pc,' \
		build/grub-rescue-pc/grub-mkrescue
	mkdir -p build/grub-rescue-pc/lib/grub
	rm -rf build/grub-rescue-pc/lib/grub/i386-pc
	cp -a build/grub-pc/grub-core build/grub-rescue-pc/lib/grub/i386-pc
	pkgdatadir=$(CURDIR)/build/grub-rescue-pc \
		build/grub-rescue-pc/grub-mkrescue \
		--grub-mkimage=$(CURDIR)/build/grub-pc/grub-mkimage \
		--output=$(CURDIR)/build/grub-rescue-pc/grub-rescue-cdrom.iso \
		$(CURDIR)/build/grub-rescue-pc/rescue-disk
	# save space for floppy image
	rm -rf build/grub-rescue-pc/lib/grub/i386-pc/po
	pkgdatadir=$(CURDIR)/build/grub-rescue-pc \
		build/grub-rescue-pc/grub-mkrescue \
		--grub-mkimage=$(CURDIR)/build/grub-pc/grub-mkimage \
		--output=$(CURDIR)/build/grub-rescue-pc/grub-rescue-floppy.img \
		--diet \
		$(CURDIR)/build/grub-rescue-pc/rescue-disk
	touch $@

platform_subst = \
	if [ -e debian/$(1) ]; then \
		sed debian/$(1) \
			-e "s/@PACKAGE@/$(2)/g" \
			-e "s/@CPU_PLATFORM@/$$cpu_platform/g" \
			-e "s/@DEFAULT_CMDLINE@/$(DEFAULT_CMDLINE)/g" \
			>> debian/$(2).$(3); \
	fi

install/grub-pc install/grub-efi-ia32 install/grub-efi-amd64 install/grub-efi-ia64 install/grub-ieee1275 install/grub-coreboot install/grub-emu install/grub-yeeloong:
	dh_auto_install --destdir=debian/tmp-$(package)

	if [ "$@" = "install/grub-emu" ] ; then \
		set -e ; \
		for i in $(AUTOGEN_DEB_FILES) ; do \
			> debian/$(package).$$i; \
			$(call platform_subst,$(package).$$i.in,$(package),$$i); \
			$(call platform_subst,$(package).$$i.$(DEB_HOST_ARCH_CPU).in,$(package),$$i); \
			$(call platform_subst,$(package).$$i.$(DEB_HOST_ARCH_OS).in,$(package),$$i); \
			$(call platform_subst,$(package).$$i.$(DEB_HOST_ARCH_OS)-$(DEB_HOST_ARCH_CPU).in,$(package),$$i); \
			[ -s debian/$(package).$$i ] || rm -f debian/$(package).$$i; \
			> debian/$(package_dbg).$$i; \
			$(call platform_subst,$(package_dbg).$$i.in,$(package_dbg),$$i); \
			$(call platform_subst,$(package_dbg).$$i.$(DEB_HOST_ARCH_CPU).in,$(package_dbg),$$i); \
			$(call platform_subst,$(package_dbg).$$i.$(DEB_HOST_ARCH_OS).in,$(package_dbg),$$i); \
			$(call platform_subst,$(package_dbg).$$i.$(DEB_HOST_ARCH_OS)-$(DEB_HOST_ARCH_CPU).in,$(package_dbg),$$i); \
			[ -s debian/$(package_dbg).$$i ] || rm -f debian/$(package_dbg).$$i; \
		done ; \
	else \
		set -e ; \
		cpu_platform=$$(find debian/tmp-$(package)/usr/lib/grub \
			-mindepth 1 -maxdepth 1 -type d -printf '%P\n') ; \
		for i in $(AUTOGEN_DEB_FILES) ; do \
			> debian/$(package).$$i; \
			$(call platform_subst,$$i.in,$(package),$$i); \
			$(call platform_subst,$(package).$$i.in,$(package),$$i); \
			$(call platform_subst,$(package).$$i.$(DEB_HOST_ARCH_CPU).in,$(package),$$i); \
			$(call platform_subst,$(package).$$i.$(DEB_HOST_ARCH_OS).in,$(package),$$i); \
			$(call platform_subst,$(package).$$i.$(DEB_HOST_ARCH_OS)-$(DEB_HOST_ARCH_CPU).in,$(package),$$i); \
			[ -s debian/$(package).$$i ] || rm -f debian/$(package).$$i; \
			> debian/$(package_bin).$$i; \
			$(call platform_subst,$$i-bin.in,$(package_bin),$$i); \
			$(call platform_subst,$(package_bin).$$i.in,$(package_bin),$$i); \
			$(call platform_subst,$(package_bin).$$i.$(DEB_HOST_ARCH_CPU).in,$(package_bin),$$i); \
			$(call platform_subst,$(package_bin).$$i.$(DEB_HOST_ARCH_OS).in,$(package_bin),$$i); \
			$(call platform_subst,$(package_bin).$$i.$(DEB_HOST_ARCH_OS)-$(DEB_HOST_ARCH_CPU).in,$(package_bin),$$i); \
			[ -s debian/$(package_bin).$$i ] || rm -f debian/$(package_bin).$$i; \
			> debian/$(package_dbg).$$i; \
			$(call platform_subst,$$i-dbg.in,$(package_dbg),$$i); \
			$(call platform_subst,$(package_dbg).$$i.in,$(package_dbg),$$i); \
			$(call platform_subst,$(package_dbg).$$i.$(DEB_HOST_ARCH_CPU).in,$(package_dbg),$$i); \
			$(call platform_subst,$(package_dbg).$$i.$(DEB_HOST_ARCH_OS).in,$(package_dbg),$$i); \
			$(call platform_subst,$(package_dbg).$$i.$(DEB_HOST_ARCH_OS)-$(DEB_HOST_ARCH_CPU).in,$(package_dbg),$$i); \
			[ -s debian/$(package_dbg).$$i ] || rm -f debian/$(package_dbg).$$i; \
		done ; \
	fi

	find debian/tmp-$(package)/usr/lib/grub -name modinfo.sh -print0 | \
		xargs -0r chmod +x
	find debian/tmp-$(package)/usr/lib/grub -name gdb_grub -print0 | \
		xargs -0r chmod -x
	find debian/tmp-$(package)/usr/lib/grub -name gmodule.pl -print0 | \
		xargs -0r chmod -x

	mkdir -p debian/$(package_bin)/usr/share/lintian/overrides
	echo "$(package_bin): unstripped-binary-or-object *.mod" \
		>> debian/$(package_bin)/usr/share/lintian/overrides/$(package_bin)
	cd debian/tmp-$(package) && find usr/lib/grub -name kernel.img \
		| sed -e "s%.*%$(package_bin): statically-linked-binary &%g" \
	>> $(CURDIR)/debian/$(package_bin)/usr/share/lintian/overrides/$(package_bin)
	cd debian/tmp-$(package) && find ./usr/lib/grub -name kernel.img \
		| sed -e "s%.*%$(package_bin): statically-linked-binary &%g" \
	>> $(CURDIR)/debian/$(package_bin)/usr/share/lintian/overrides/$(package_bin)
	cd debian/tmp-$(package) && find usr/lib/grub -name kernel.img \
		| sed -e "s%.*%$(package_bin): unstripped-binary-or-object &%g" \
	>> $(CURDIR)/debian/$(package_bin)/usr/share/lintian/overrides/$(package_bin)
	if [ "$@" = "install/grub-efi-amd64" ] && [ "$(DEB_HOST_ARCH_CPU)" = "i386" ] ; then \
		echo "$(package_bin): binary-from-other-architecture *.mod" \
			>> debian/$(package_bin)/usr/share/lintian/overrides/$(package_bin) ; \
		cd debian/tmp-$(package) && find usr/lib/grub -name kernel.img \
			| sed -e "s%.*%$(package_bin): binary-from-other-architecture &%g" \
		>> $(CURDIR)/debian/$(package_bin)/usr/share/lintian/overrides/$(package_bin) ; \
	fi
	if ([ "$@" = "install/grub-pc" ] || \
	    [ "$@" = "install/grub-ieee1275" ] || \
	    [ "$@" = "install/grub-coreboot" ] || \
	    [ "$@" = "install/grub-emu" ]) && \
	   [ "$(DEB_HOST_ARCH_OS)" = "linux" ] && \
	   [ "$(DEB_HOST_ARCH_CPU)" = "i386" ] ; then \
		echo "$(package_bin): binary-from-other-architecture *efiemu64.o" \
			>> debian/$(package_bin)/usr/share/lintian/overrides/$(package_bin) ; \
	fi

	mkdir -p debian/$(package_dbg)/usr/share/lintian/overrides
	echo "$(package_dbg): unstripped-binary-or-object *.module" \
		>> debian/$(package_dbg)/usr/share/lintian/overrides/$(package_dbg)
	echo "$(package_dbg): statically-linked-binary *.image" \
		>> debian/$(package_dbg)/usr/share/lintian/overrides/$(package_dbg)
	cd debian/tmp-$(package) && find usr/lib/grub -name kernel.exec \
		| sed -e "s%.*%$(package_dbg): statically-linked-binary &%g" \
	>> $(CURDIR)/debian/$(package_dbg)/usr/share/lintian/overrides/$(package_dbg)
	if [ "$@" = "install/grub-efi-amd64" ] && [ "$(DEB_HOST_ARCH_CPU)" = "i386" ] ; then \
		echo "$(package_dbg): binary-from-other-architecture *.module" \
			>> debian/$(package_dbg)/usr/share/lintian/overrides/$(package_dbg) ; \
		cd debian/tmp-$(package) && find usr/lib/grub -name kernel.exec \
			| sed -e "s%.*%$(package_dbg): binary-from-other-architecture &%g" \
		>> $(CURDIR)/debian/$(package_dbg)/usr/share/lintian/overrides/$(package_dbg) ; \
	fi

install/grub-common:
	set -e ; for i in $(AUTOGEN_DEB_FILES) ; do \
		if [ -e debian/grub-common.$$i.in ] ; then \
			cat debian/grub-common.$$i.in \
				> debian/grub-common.$$i ; \
		fi ; \
		if [ -e debian/grub-common.$$i.$(DEB_HOST_ARCH_CPU).in ] ; then \
			cat debian/grub-common.$$i.$(DEB_HOST_ARCH_CPU).in \
				>> debian/grub-common.$$i ; \
		fi ; \
		if [ -e debian/grub-common.$$i.$(DEB_HOST_ARCH_OS).in ] ; then \
			cat debian/grub-common.$$i.$(DEB_HOST_ARCH_OS).in \
				>> debian/grub-common.$$i ; \
		fi ; \
	done
	install -m 0755 debian/grub-common.pm-sleep $(CURDIR)/debian/$(package)/etc/pm/sleep.d/10_grub-common

override_dh_install:
	dh_install -pgrub2 -pgrub-linuxbios -pgrub-efi -pgrub-rescue-pc -pgrub-firmware-qemu
	set -e; for package in grub-common grub2-common grub-theme-starfield grub-mount-udeb; do \
		dh_install -p$$package --sourcedir=debian/tmp-grub-$(COMMON_PLATFORM); \
	done
	rm -f debian/grub2-common/usr/share/info/dir*
	rm -f debian/grub-theme-starfield/usr/share/grub/themes/starfield/COPYING.CC-BY-SA-3.0
	set -e; for package in grub-pc grub-efi-ia32 grub-efi-amd64 grub-efi-ia64 grub-ieee1275 grub-coreboot grub-yeeloong; do \
		dh_install -p$$package --sourcedir=debian/tmp-$$package; \
		dh_install -p$$package-bin --sourcedir=debian/tmp-$$package; \
		dh_install -p$$package-dbg --sourcedir=debian/tmp-$$package; \
	done
	dh_install -pgrub-emu --sourcedir=debian/tmp-grub-emu
	dh_install -pgrub-emu-dbg --sourcedir=debian/tmp-grub-emu
	sed -i -e "s/@DEFAULT_CMDLINE@/$(DEFAULT_CMDLINE)/g" \
		debian/grub2-common/usr/share/grub/default/grub
ifeq (yes,$(shell dpkg-vendor --derives-from Ubuntu && echo yes))
ifneq (,$(filter grub-pc,$(BUILD_PACKAGES)))
	patch debian/grub-pc/usr/lib/grub-legacy/update-grub \
		< debian/legacy/update-grub.ubuntu.patch
endif
endif

override_dh_installdocs:
	dh_installdocs -pgrub-common -pgrub-rescue-pc -pgrub-firmware-qemu -A AUTHORS NEWS README THANKS TODO
	dh_installdocs -Ngrub-common -Ngrub-rescue-pc -Ngrub-firmware-qemu --link-doc=grub-common

override_dh_installinit:
	dh_installinit -- start 99 2 3 4 5 .

override_dh_strip:
	dh_strip -X/usr/bin/grub-emu

override_dh_shlibdeps:
	dh_shlibdeps -X.module

ifeq (yes,$(shell dpkg-vendor --derives-from Ubuntu && echo yes))
LEGACY_DOC_CONFLICTS := grub-doc (<< 0.97-29ubuntu60), grub-legacy-doc (<< 0.97-29ubuntu60)
else
LEGACY_DOC_CONFLICTS := grub-doc (<< 0.97-32), grub-legacy-doc (<< 0.97-59)
endif

override_dh_gencontrol:
	dh_gencontrol -- -Vlegacy-doc-conflicts="$(LEGACY_DOC_CONFLICTS)"

TARNAME := grub2_$(deb_version)_$(DEB_HOST_ARCH).tar.gz

override_dh_builddeb:
	dh_builddeb -- -Zxz
ifeq (yes,$(shell dpkg-vendor --derives-from Ubuntu && echo yes))
ifeq ($(DEB_HOST_ARCH),amd64)
	debian/build-efi-images \
		build/grub-$(COMMON_PLATFORM)/grub-mkimage \
		build/grub-efi-amd64/grub-core \
		debian/grub2-images/$(deb_version) \
		x86_64-efi x64
	echo $(deb_version) \
		> debian/grub2-images/$(deb_version)/version
	cd debian/grub2-images && tar czvf ../../../$(TARNAME) .
	dpkg-distaddfile $(TARNAME) raw-uefi -
endif
endif

override_dh_auto_clean:
	-rm -rf build
	-rm -f contrib grub-core/contrib

override_dh_clean: debian/legacy/update-grub debian/grub-extras
	dh_autoreconf_clean
	dh_clean

	chmod +x debian/{script,grub.d/*,legacy/*,kernel/*}

	for i in $(AUTOGEN_DEB_FILES) ; do \
		rm -f debian/grub-{pc,efi-*,ieee1275,coreboot,yeeloong,emu}{,-bin,-dbg}.$$i ; \
	done
	rm -rf debian/tmp-*/
ifeq (yes,$(shell dpkg-vendor --derives-from Ubuntu && echo yes))
ifeq ($(DEB_HOST_ARCH),amd64)
	rm -rf debian/grub2-images
endif
endif

	# make sure PO files are always up-to-date
	debconf-updatepo

debian/legacy/update-grub:
	@echo "Missing $@.  Try: \"bzr cat http://bzr.debian.org/bzr/pkg-grub/trunk/grub-legacy/debian/update-grub > $@\""
	exit 1

debian/grub-extras:
	@echo "Missing $@.  Try: \"mkdir -p $@; for extra in 915resolution ntldr-img; do bzr export $@/\$$extra http://bzr.savannah.nongnu.org/r/grub-extras/\$$extra; done\""
	exit 1

.PHONY: $(patsubst %,configure/%,$(BUILD_PACKAGES)) $(patsubst %,build/%,$(BUILD_PACKAGES)) $(patsubst %,install/%,$(BUILD_PACKAGES))
