#!/usr/bin/make -f
# -*- makefile -*-
# Sample debian/rules that uses debhelper. 
# This file was originally written by Joey Hess and Craig Small.
# As a special exception, when this file is copied by dh-make into a
# dh-make output file, you may use that output file without restriction.
# This special exception was added by Craig Small in version 0.37 of dh-make.
#
# This version is for a hypothetical package that can build a kernel modules
# architecture-dependant package via make-kpkg, as well as an
# architecture-independent module source package, and other packages
# either dep/indep for things like common files or userspace components
# needed for the kernel modules.

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

# where all bios and other support files are installed
sharedir := /usr/share
confsuffix := /qemu
bdir := /usr/share/qemu
tdir := debian/qemu-kvm
tbdir := ${tdir}$(bdir)
cdir := debian/qemu-common
udir := debian/qemu-utils

# where various other packages keeps their data files
ipxe := /usr/lib/ipxe
seabios := /usr/share/seabios
vgabios := /usr/share/vgabios

DEB_BUILD_ARCH     ?= $(shell dpkg-architecture -qDEB_BUILD_ARCH)
DEB_HOST_ARCH       ?= $(shell dpkg-architecture -qDEB_HOST_ARCH)
DEB_HOST_ARCH_CPU   ?= $(shell dpkg-architecture -qDEB_HOST_ARCH_CPU)
BASE_ARCH := $(DEB_BUILD_ARCH)
DEB_VERSION := $(shell sed -n -e 's/^[^(]* (\([^)]*\)) .*/\1/p' -e1q debian/changelog)

export DEB_BUILD_HARDENING=1

# Handle DEB_BUILD_OPTIONS=parallel=N
, := ,
ifneq (,$(filter parallel=%,$(subst $(,), ,$(DEB_BUILD_OPTIONS))))
  NUMJOBS := $(patsubst parallel=%,%,$(filter parallel=%,$(subst $(,), ,$(DEB_BUILD_OPTIONS))))
  MAKEFLAGS += -j$(NUMJOBS)
endif

ifeq (i386,$(DEB_BUILD_ARCH))
	BASE_ARCH := x86
endif
ifeq (amd64,$(DEB_BUILD_ARCH))
	BASE_ARCH := x86
endif

ifeq (powerpc,$(BASE_ARCH))
QEMU_TARGET = "ppc-softmmu ppc64-softmmu"
else
QEMU_TARGET = "x86_64-softmmu i386-softmmu x86_64-linux-user i386-linux-user"
endif

CFLAGS = $(shell dpkg-buildflags --get CFLAGS)
CFLAGS += $(shell dpkg-buildflags --get CPPFLAGS)
CFLAGS += -Wall
LDFLAGS = $(shell dpkg-buildflags --get LDFLAGS)

ifeq ($(DEB_HOST_ARCH_CPU),arm)
CFLAGS += -fno-var-tracking
endif

#export DH_OPTIONS = --with=quilt --parallel

.PHONY: binary binary-arch binary-indep build build-arch build-indep clean install install-arch install-indep
binary binary-arch binary-indep build build-arch build-indep clean install install-arch install-indep:
# "+" in front of dh is to work around dh completely ignoring
# --parallel and DEB_BUILD_OPTIONS=parallel=NN
	+dh $@

# These systems have real KVM support
ifeq ($(filter $(DEB_HOST_ARCH),i386 amd64 lpia powerpc),)
conf_arch += --disable-kvm
else
conf_arch += --enable-kvm
endif

# On PowerPC, we have a couple device tree blobs we need
ifeq (powerpc,$(BASE_ARCH))
conf_arch += --enable-fdt
blobs_arch += bamboo.dts
else
conf_arch += --disable-blobs
endif

override_dh_auto_configure config:
	mkdir -p build/
	cd build && ../configure \
		--with-pkgversion="qemu-kvm-$(DEB_VERSION), Debian" \
		--target-list=$(QEMU_TARGET) \
		--prefix=/usr \
		--with-confsuffix=${confsuffix} \
		--datadir=${sharedir} \
		--sysconfdir=/etc \
		--libexecdir=/usr/lib \
		--extra-cflags="$(CFLAGS)" \
		--extra-ldflags="$(LDFLAGS)" \
		--disable-strip \
		--disable-xen \
		--disable-guest-agent \
		--audio-drv-list="pa,alsa,sdl,oss" \
		--enable-docs \
		--audio-card-list="ac97 es1370 sb16 cs4231a adlib gus hda" \
		`sed 's/#.*//' ../debian/optional-features` \
		$(conf_arch) \
		$(QEMU_KVM_CONFIGURE_OPTIONS) \
	  || { echo == config.log ==; cat config.log; echo == config.log end ==; exit 1; }
	cat build/config-host.mak

override_dh_auto_build:
# main executable and support tools
	$(MAKE) -C build/ ROMS= TOOLS=
ifeq (x86, $(BASE_ARCH))
	$(MAKE) -C build/pc-bios/optionrom
endif

# arch-specific stuff

override_dh_auto_test:

override_dh_auto_clean:
	rm -rf build/
	rm -f scripts/*.pyc
	rm -f scripts/tracetool/*.pyc
	rm -f scripts/tracetool/backend/*.pyc
	rm -f scripts/tracetool/format/*.pyc

override_dh_auto_install:
	$(MAKE) -C build DESTDIR=$(CURDIR)/debian/qemu-kvm install BLOBS="$(blobs_arch)"
ifeq (powerpc,$(BASE_ARCH))
	# Generate the compiled device tree blobs
	dtc -I dts -O dtb -o debian/qemu-kvm$(bdir)/bamboo.dtb \
		debian/qemu-kvm$(bdir)/bamboo.dts
endif
	# dirctory links we use in Ubuntu
	dh_link usr/share/qemu usr/share/qemu-kvm
	dh_link usr/share/qemu usr/share/kvm
	dh_link usr/share/doc/qemu usr/share/doc/kvm
	dh_link etc/qemu etc/kvm
ifeq (powerpc,$(BASE_ARCH))
	dh_link usr/bin/qemu-system-ppc usr/bin/kvm
	dh_link usr/share/man/man1/qemu-kvm.1 usr/share/man/man1/qemu-ppc.1
	dh_link usr/share/man/man1/qemu-kvm.1 usr/share/man/man1/qemu-ppc64.1
	dh_link usr/share/man/man1/qemu.1 usr/share/man/man1/qemu-system-ppc.1
	dh_link usr/share/man/man1/qemu.1 usr/share/man/man1/qemu-system-ppc64.1
else
	dh_link usr/bin/qemu-system-x86_64 usr/bin/kvm
	dh_link usr/share/man/man1/qemu-kvm.1 usr/share/man/man1/qemu-i386.1
	dh_link usr/share/man/man1/qemu-kvm.1 usr/share/man/man1/qemu-x86_64.1
	dh_link usr/share/man/man1/qemu.1 usr/share/man/man1/qemu-system-i386.1
	dh_link usr/share/man/man1/qemu.1 usr/share/man/man1/qemu-system-x86_64.1
endif

# qemu builds only a few files and we will rename them all anyway,
# so install it all here manually.
	install -Dp build/qemu.1 ${tdir}/usr/share/man/man1/kvm.1

	# Install the userspace utilities
	install -m 0755 scripts/kvm/kvm_stat ${tdir}/usr/bin/

	# Move files for Ubuntu's qemu-utils package
	mv ${tdir}/usr/bin/qemu-nbd ${udir}/usr/bin/qemu-nbd
	mv ${tdir}/usr/bin/qemu-img ${udir}/usr/bin/qemu-img
	mv ${tdir}/usr/share/man/man1/qemu-img.1 ${udir}/usr/share/man/man1
	mv ${tdir}/usr/share/man/man8/qemu-nbd.8 ${udir}/usr/share/man/man8

	# copy ifup/down and keymaps to Ubuntu's qemu-common
	install -Dp -m 0755 debian/kvm-ifup ${cdir}/usr/bin/qemu-ifup
	install -Dp -m 0755 debian/kvm-ifdown ${cdir}/usr/bin/qemu-ifdown
	mkdir -p ${cdir}/usr/share/qemu
	mv ${tdir}/usr/share/qemu/keymaps ${cdir}/usr/share/qemu/

ifeq (x86,$(BASE_ARCH))
	# link appropriate bios files from seabios package
	dh_link -pqemu-common \
	  ${seabios}/bios.bin ${bdir}/bios.bin \
	  ${seabios}/optionrom/extboot.bin ${bdir}/extboot.bin \
	  ${seabios}/optionrom/linuxboot.bin ${bdir}/linuxboot.bin \
	  ${seabios}/optionrom/multiboot.bin ${bdir}/multiboot.bin \
	  ${seabios}/optionrom/kvmvapic.bin ${bdir}/kvmvapic.bin \
	  ${seabios}/optionrom/kvmvapic.bin ${bdir}/vapic.bin \

	# link to vgabios files and vgabios.bin too, for now
	dh_link -pqemu-common \
	  ${vgabios}/vgabios.cirrus.bin ${bdir}/vgabios-cirrus.bin \
	  ${vgabios}/vgabios.stdvga.bin ${bdir}/vgabios-stdvga.bin \
	  ${vgabios}/vgabios.vmware.bin ${bdir}/vgabios-vmware.bin \
	  ${vgabios}/vgabios.qxl.bin ${bdir}/vgabios-qxl.bin \
	  ${vgabios}/vgabios.bin ${bdir}/vgabios.bin

# note - we get our ipxe roms from kvm-ipxe

# x86 cpu definitions
	install -Dp -m 0644 \
	  sysconfigs/target/target-x86_64.conf \
	  sysconfigs/target/cpus-x86_64.conf \
	  ${tdir}/etc/kvm/
endif

#ifeq (powerpc,$(BASE_ARCH))
#	cp build/pc-bios/bamboo.dtd ${tbdir}/bamboo.dtd
#endif

override_dh_installinit:
	dh_installinit --no-restart-on-upgrade

override_dh_strip:
	dh_strip -a

debsrc_ver := $(shell dpkg-parsechangelog | sed -n -e 's/^Version: //p' | perl -pe 's/-[^-]+$$//o')
debian_rev := $(shell dpkg-parsechangelog | sed -n -e 's/^Version: //p' | perl -pe 's/.*-//o')

override_dh_gencontrol:
	dh_gencontrol -Nkvm
	dh_gencontrol -pkvm -- -v1:84+dfsg-0ubuntu16+$(debsrc_ver)+$(debian_rev)

.PHONY: config
.PHONY: override_dh_auto_configure override_dh_auto_build override_dh_auto_test override_dh_auto_clean override_dh_auto_install override_dh_installinit override_dh_strip override_dh_gencontrol

# get-orig-source adapted from /usr/share/gnome-pkg-tools/1/rules/sf-get-source.mk from the gnome-pkg-tools package
# copied from CDBS' buildvars
DEB_SOURCE_PACKAGE ?= $(strip $(shell egrep '^Source: ' debian/control | cut -f 2 -d ':'))
DEB_VERSION ?= $(shell dpkg-parsechangelog | egrep '^Version:' | cut -f 2 -d ' ')
DEB_NOEPOCH_VERSION ?= $(shell echo $(DEB_VERSION) | cut -d: -f2-)
DEB_UPSTREAM_VERSION ?= $(shell echo $(DEB_NOEPOCH_VERSION) | sed 's/+[^-]*-[^-]*$$//')

# where to store the resulting .orig tarball
DEB_TARBALL_DOWNLOAD_DIR ?= ../tarballs
TARBALL_EXT ?= tar.gz

#SF_PROJECT ?= $(DEB_SOURCE_PACKAGE)
SF_PROJECT = kvm
SF_MODULE ?= $(DEB_SOURCE_PACKAGE)
SF_TARBALL ?= $(SF_MODULE)-$(DEB_UPSTREAM_VERSION).$(TARBALL_EXT)
SF_DOWNLOAD_URL ?= http://$$sf_mirror.dl.sourceforge.net/$(SF_PROJECT)/$(SF_TARBALL)
SF_MIRRORS ?= dfn heanet internap jaist kent mesh nchc ovh puzzle superb-east superb-west surfnet switch ufpr waix
SF_TARBALL_DESTINATION = $(DEB_TARBALL_DOWNLOAD_DIR)/$(DEB_SOURCE_PACKAGE)_$(DEB_UPSTREAM_VERSION).orig.$(TARBALL_EXT)
SF_DOWNLOAD_COMMAND ?= for sf_mirror in $(SF_MIRRORS); do wget -nv -T10 -t1 -O $(SF_TARBALL_DESTINATION).tmp $(SF_DOWNLOAD_URL) && break; done

get-orig-tarball: $(SF_TARBALL_DESTINATION)
$(SF_TARBALL_DESTINATION):
	dh_testdir
	@@echo 'Source package:                      $(DEB_SOURCE_PACKAGE)'
	@@echo 'Source package:                      $(DEB_VERSION)'
	@@echo 'Source version without epoch:        $(DEB_NOEPOCH_VERSION)'
	@@echo 'Upstream version (for orig tarball): $(DEB_UPSTREAM_VERSION)'
	mkdir -p $(DEB_TARBALL_DOWNLOAD_DIR)
	$(SF_DOWNLOAD_COMMAND)
	mv $(SF_TARBALL_DESTINATION).tmp $(SF_TARBALL_DESTINATION)

get-orig-source: $(SF_TARBALL_DESTINATION)
	case "$(TARBALL_EXT)" in \
	tar.bz2|tbz) \
	  bzcat $(DEB_TARBALL_DOWNLOAD_DIR)/$(DEB_SOURCE_PACKAGE)_$(DEB_UPSTREAM_VERSION).orig.$(TARBALL_EXT) | \
	  gzip -9 >$(DEB_TARBALL_DOWNLOAD_DIR)/$(DEB_SOURCE_PACKAGE)_$(DEB_UPSTREAM_VERSION).orig.tar.gz ; \
	  rm -f $(DEB_TARBALL_DOWNLOAD_DIR)/$(DEB_SOURCE_PACKAGE)_$(DEB_UPSTREAM_VERSION).orig.$(TARBALL_EXT) \
	  ;;\
	esac
	cd $(DEB_TARBALL_DOWNLOAD_DIR) && \
	  tar xzf $(DEB_SOURCE_PACKAGE)_$(DEB_UPSTREAM_VERSION).orig.tar.gz
	cd $(DEB_TARBALL_DOWNLOAD_DIR)/$(DEB_SOURCE_PACKAGE)-$(DEB_UPSTREAM_VERSION) && \
	  rm -f \
		pc-bios/*.bin \
		pc-bios/*.rom \
		pc-bios/openbios-* \
		pc-bios/*.dtb \
		pc-bios/palcode-clipper \
		pc-bios/optionrom/*.bin \
		.git?*
	cd $(DEB_TARBALL_DOWNLOAD_DIR) && \
	  tar c $(DEB_SOURCE_PACKAGE)-$(DEB_UPSTREAM_VERSION) | \
	  gzip -9 >$(DEB_TARBALL_DOWNLOAD_DIR)/$(DEB_SOURCE_PACKAGE)_$(DEB_UPSTREAM_VERSION)+dfsg.orig.tar.gz


.PHONY: get-orig-tarball get-orig-source
