#!/usr/bin/make -f
#
# $Id: rules 391 2009-03-07 05:21:19Z aurel32 $
#

# support parallel build using DEB_BUILD_OPTIONS=parallel=N
ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
  MAKEFLAGS += -j$(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
endif

# Packaging version
DEB_VERSION := $(shell dpkg-parsechangelog | egrep '^Version:' | cut -f 2 -d ' ')

# Compiler flags
CFLAGS = $(shell dpkg-buildflags --get CFLAGS) $(shell dpkg-buildflags --get CPPFLAGS)
LDFLAGS = $(shell dpkg-buildflags --get LDFLAGS) -Wl,--as-needed

# Architecture/system specific configuration
DEB_HOST_ARCH = $(shell dpkg-architecture -qDEB_HOST_ARCH)
DEB_HOST_ARCH_OS = $(shell dpkg-architecture -qDEB_HOST_ARCH_OS)

common_configure_opts = \
	--with-pkgversion="Debian $(DEB_VERSION)" \
	--extra-cflags="$(CFLAGS)" \
	--extra-ldflags="$(LDFLAGS)" \
	--prefix=/usr \
	--sysconfdir=/etc \
	--libexecdir=/usr/lib \
	--disable-blobs \
	--disable-strip \
	--with-system-pixman \
	--interp-prefix=/etc/qemu-binfmt/%M \
	--localstatedir=/var \
	--enable-uname-release=2.6.32 \

# list of system (softmmu) targets, from ./configure
system_targets = \
 i386 x86_64 alpha arm cris lm32 m68k microblaze microblazeel \
 mips mipsel mips64 mips64el or32 ppc ppcemb ppc64 sh4 sh4eb \
 sparc sparc64 s390x xtensa xtensaeb unicore32

# qemu-system subpackages
sys_systems = arm mips ppc sparc x86
systems = ${sys_systems} misc
sysarch_arm   = $(filter arm,${system_targets})
sysarch_mips  = $(filter mips mipsel mips64 mips64el,${system_targets})
sysarch_ppc   = $(filter ppc ppc64 ppcemb,${system_targets})
sysarch_sparc = $(filter sparc sparc64,${system_targets})
sysarch_x86   = $(filter i386 x86_64,${system_targets})
sysarch_misc  = $(filter-out $(foreach s,${sys_systems},${sysarch_$s}),${system_targets})

ifeq ($(DEB_HOST_ARCH_OS),linux)

# list of linux-user targets, from ./configure
user_targets = \
 i386 x86_64 alpha arm armeb cris m68k microblaze microblazeel \
 mips mipsel or32 ppc ppc64 ppc64abi32 sh4 sh4eb sparc sparc64 sparc32plus \
 unicore32 s390x

# binfmt linux-user support

all_binfmt_targets = \
 $(patsubst debian/binfmts/qemu-%,%,$(wildcard debian/binfmts/qemu-*))

# find which targets needs to be filtered out, which is arch-dependent.
# Drop support for emulating amd64 on i386, http://bugs.debian.org/604712
filter_binfmts = $(shell \
 case $(DEB_HOST_ARCH) in \
   (amd64 | i386) echo i386 x86_64 ;;\
   (arm | armel | armhf) echo arm ;;\
   (mips | mipsel) echo $(DEB_HOST_ARCH) ;;\
   (powerpc) echo ppc ;;\
   (ppc64) echo ppc ppc64 ppc64abi32 ;;\
   (s390x) echo s390x ;;\
   (sparc | sparc64) echo sparc sparc32plus sparc64 ;;\
 esac)

binfmt_targets = $(filter-out $(filter_binfmts), $(all_binfmt_targets))

enable_linux_user = --enable-linux-user

else

enable_linux_user =

endif	# linux

configure-stamp: configure
	dh_testdir

	# system build
	mkdir -p qemu-build && cd qemu-build && \
		../configure ${common_configure_opts} \
			--enable-system --disable-user ${enable_linux_user} \
			$(shell sh debian/configure-opts $(DEB_HOST_ARCH) $(DEB_HOST_ARCH_OS)) \
			$(QEMU_CONFIGURE_OPTIONS)

ifeq ($(DEB_HOST_ARCH_OS),kfreebsd)
# Hack alert.  qemu-1.3 still needs this.
# On recent kFreebsd, old USB host API has been removed,
# but qemu did not learn to use new USB API.
# Just do not build USB host support.
	sed -i 's/^HOST_USB=bsd/HOST_USB=stub/' \
		$(CURDIR)/qemu-build/config-host.mak
endif

ifeq ($(DEB_HOST_ARCH_OS),linux)
# do not use debian/configure-opts here, all optional stuff will be enabled
# automatically, dependencies are already verified in the main build
	mkdir -p user-static-build && cd user-static-build && \
		../configure ${common_configure_opts} \
			--static --disable-system \
			--target-list="$(addsuffix -linux-user,${user_targets})"
endif
	touch $@

build: build-arch build-indep
build-arch: build-stamp
build-indep: build-stamp
build-stamp: configure-stamp
	dh_testdir

	# system build
	$(MAKE) -C $(CURDIR)/qemu-build
	dtc -o qemu-build/pc-bios/bamboo.dtb pc-bios/bamboo.dts

# special case for spapr-rtas.bin file.
# this is an entry point for PPC architecture, which consists of just 5
# processor instructions.  We use a pre-compiled pseudo-assembler version
# in debian/spapr-rtas.hex which can be "compiled" using sed magic.
# After "compiling" it this way, we compare with the upstream version,
# it should be the same.
# Use /usr/bin/printf since dash's printf does not understand \xNN.
	/usr/bin/printf "$$(sed -n 's|^ .*:	\(.*\)	.*|\1|p' debian/spapr-rtas.hex | \
		tr -d ' \n' | sed 's|\([0-9a-f]\{2\}\)|\\x\1|g')" > \
		qemu-build/pc-bios/spapr-rtas.bin
ifeq ($(DEB_HOST_ARCH),powerpc)
	$(MAKE) -C qemu-build/pc-bios/spapr-rtas spapr-rtas.bin
	cmp qemu-build/pc-bios/spapr-rtas.bin \
	    qemu-build/pc-bios/spapr-rtas/spapr-rtas.bin
endif

ifeq ($(DEB_HOST_ARCH_OS),linux)
	# user-static build
	# we use this invocation to build just the binaries
	$(MAKE) -C $(CURDIR)/user-static-build $(foreach t,${user_targets},subdir-${t}-linux-user)
endif
	touch $@

clean:
	dh_testdir
	rm -rf $(CURDIR)/*-build/
	rm -f $(CURDIR)/*-stamp
	find $(CURDIR)/scripts/ -name '*.pyc' -delete || :
	dh_clean

define inst-system
	for x in postinst prerm; do \
	  sed 's/@ARCH@/${sysarch_$1}/' debian/qemu-system.$$x-in > debian/qemu-system-$1.$$x.debhelper; \
	done
	mkdir -p debian/qemu-system-$1/usr/share/man/man1 debian/qemu-system-$1/usr/bin
	for t in ${sysarch_$1}; do \
	    mv debian/tmp/usr/bin/qemu-system-$$t debian/qemu-system-$1/usr/bin/; \
	    echo ".so qemu.1" > debian/qemu-system-$1/usr/share/man/man1/qemu-system-$$t.1; \
	done
	echo sysarch:$1=${sysarch_$1} > debian/qemu-system-$1.substvars
	echo sysprovides:$1=${addprefix qemu-system-,${filter-out $1,${sysarch_$1}}} | \
	  sed -e 's/ /, /g' -e 'y/_/-/' >> debian/qemu-system-$1.substvars

endef

install: build-stamp
	dh_testdir
	dh_testroot
	dh_prep
	dh_installdirs -a

	# system build
	$(MAKE) -C $(CURDIR)/qemu-build DESTDIR=$(CURDIR)/debian/tmp install

	# qemu-system subpackages
	$(foreach s,${systems},$(call inst-system,$s))

ifeq ($(DEB_HOST_ARCH_OS),linux)

# /usr/bin/kvm compat script.  This needs some more work for other arches
# How about a manpage for it?
ifneq ($(filter $(DEB_HOST_ARCH),amd64 i386),)
	dh_install -pqemu-system-x86 debian/kvm /usr/bin/
endif

# virtfs-proxy-helper is linux-specific
	for f in usr/bin/virtfs-proxy-helper \
	         usr/share/man/man1/virtfs-proxy-helper.1 ; do \
	  mkdir -p debian/qemu-system-common/$${f%/*} ; \
	  mv debian/tmp/$$f debian/qemu-system-common/$$f ; \
	done

	# qemu-user
	mkdir -p debian/qemu-user/usr/bin debian/qemu-user/usr/share/man/man1
	for t in ${user_targets}; do \
	    mv debian/tmp/usr/bin/qemu-$$t \
		debian/qemu-user/usr/bin ; \
	    ln -s qemu-user.1 \
		debian/qemu-user/usr/share/man/man1/qemu-$$t.1 ; \
	done

	# qemu-user-static
	mkdir -p debian/qemu-user-static/usr/bin debian/qemu-user-static/usr/share/man/man1
	for t in ${user_targets}; do \
	    cp -p user-static-build/$$t-linux-user/qemu-$$t \
		debian/qemu-user-static/usr/bin/qemu-$$t-static ; \
	    ln -s qemu-user-static.1 \
		    debian/qemu-user-static/usr/share/man/man1/qemu-$$t-static.1 ; \
	done

	# binfmt support
	for x in postinst prerm; do \
	    sed 's/@BINFMT_TARGETS@/${all_binfmt_targets}/' \
		debian/qemu-user-static.$$x-in > debian/qemu-user-static.$$x.debhelper ; \
	done

	mkdir -p debian/qemu-user-static/usr/share/binfmts
	install -m 644 -t debian/qemu-user-static/usr/share/binfmts/ \
		$(addprefix debian/binfmts/qemu-,${binfmt_targets})
endif

# qemu-ifup is arch-specific
	install -D debian/qemu-ifup.$(DEB_HOST_ARCH_OS) \
		debian/qemu-system-common/etc/qemu-ifup

	dh_install --list-missing
	dh_installdocs
	dh_installinit -pqemu-system-x86 --no-restart-on-upgrade --error-handler=true --name=qemu-kvm
	dh_installchangelogs Changelog
	dh_installudev
	dh_link
	dh_strip
	dh_compress
	dh_fixperms
	dh_installdeb
	dh_shlibdeps
	dh_gencontrol
	dh_md5sums
	dh_builddeb

binary-indep: install
binary-arch: install
binary: install

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

