#!/usr/bin/make -f

export SHELL=/bin/bash
export DH_OPTIONS

DEB_HOST_GNU_SYSTEM := $(shell dpkg-architecture -qDEB_HOST_GNU_SYSTEM)

BUILDER := $(shell echo $${DEBEMAIL:-$${EMAIL:-$$(echo $$LOGNAME@$$(cat /etc/mailname 2> /dev/null))}})

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

ifeq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS)))
  MAKETEST = yes
else
  MAKETEST = no
endif

INSTALL+=install
ifeq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
  INSTALL+=-s
endif

CFLAGS+=$(if $(findstring nodebug,$(DEB_BUILD_OPTIONS)),,-g -Wall)
CFGFLAGS+=--prefix=/usr
CFGFLAGS+=--mandir='$${prefix}'/share/man
CFGFLAGS+=--with-compiledby="$(BUILDER)"

# "vim-tiny" features: in addition to those coming from the --with-features=xxx,
# "vim-tiny" is built with those listed in debian/tiny/features.txt
TINYFLAGS+=--with-features=small
TINYFLAGS+=--disable-syntax
TINYFLAGS+=--disable-gui
TINYFLAGS+=--disable-xsmp
TINYFLAGS+=--disable-xsmp-interact
TINYFLAGS+=--disable-netbeans
TINYFLAGS+=--disable-acl
TINYFLAGS+=--disable-gpm
TINYFLAGS+=--enable-nls
TINYFLAGS+=--enable-multibyte
TINYFLAGS+=--enable-multilang

# add -DFEAT_* from debian/tiny/features.txt
TINYCFLAGS:=$(patsubst %,-D%,$(shell grep ^FEAT_ debian/tiny/features.txt | cut -f 1))

OPTFLAGS+=--enable-gpm
OPTFLAGS+=--enable-cscope
OPTFLAGS+=--with-features=big
OPTFLAGS+=--enable-multibyte

GUIFLAGS+=--with-x
GUIFLAGS+=--enable-xim
GUIFLAGS+=--enable-fontset
GTK2FLAGS+=--enable-gui=gtk2
GTK2FLAGS+=--with-features=big

GNOMEFLAGS+=--enable-gui=gnome2

LESSTIFFLAGS+=--enable-gui=motif

PERLFLAGS+=--enable-perlinterp
PERLFLAGS+=--disable-mzschemeinterp
PERLFLAGS+=--disable-pythoninterp
PERLFLAGS+=--disable-rubyinterp
PERLFLAGS+=--disable-tclinterp

PYTHONFLAGS+=--enable-pythoninterp
PYTHONFLAGS+=--disable-mzschemeinterp
PYTHONFLAGS+=--disable-perlinterp
PYTHONFLAGS+=--disable-rubyinterp
PYTHONFLAGS+=--disable-tclinterp

RUBYFLAGS+=--enable-rubyinterp
RUBYFLAGS+=--disable-mzschemeinterp
RUBYFLAGS+=--disable-perlinterp
RUBYFLAGS+=--disable-pythoninterp
RUBYFLAGS+=--disable-tclinterp

TCLFLAGS+=--enable-tclinterp
TCLFLAGS+=--disable-mzschemeinterp
TCLFLAGS+=--disable-perlinterp
TCLFLAGS+=--disable-pythoninterp
TCLFLAGS+=--disable-rubyinterp

BASICFLAGS+=--disable-mzschemeinterp
BASICFLAGS+=--disable-tclinterp
BASICFLAGS+=--disable-perlinterp
BASICFLAGS+=--disable-pythoninterp
BASICFLAGS+=--disable-rubyinterp

ALLINTERPFLAGS+=--disable-mzschemeinterp
ALLINTERPFLAGS+=--enable-perlinterp
ALLINTERPFLAGS+=--enable-pythoninterp
ALLINTERPFLAGS+=--enable-rubyinterp
ALLINTERPFLAGS+=--enable-tclinterp

# Each vim-xxx package is said to be a vim variant and contains only a vim
# binary built with some compile-time options. Makefile VARIANTS below are
# one-to-one with those packages with the exception of "vim-basic". In this
# Makefile vim-basic is used to built 4 packages: "vim", "vim-runtime",
# "vim-common", "vim-gui-common". "vim-tiny" is the only variant package not
# depending on vim-runtime.

# vim-basic must be the last one
ifneq ($(DEB_HOST_GNU_SYSTEM),gnu)
	VARIANTS+=vim-tiny
	VARIANTS+=vim-ruby
	VARIANTS+=vim-tcl
	VARIANTS+=vim-gtk
	VARIANTS+=vim-lesstif
	VARIANTS+=vim-perl
	VARIANTS+=vim-python
	VARIANTS+=vim-gnome
	VARIANTS+=vim-full
	VARIANTS+=vim-basic
else
	VARIANTS+=vim-tiny
	VARIANTS+=vim-ruby
	VARIANTS+=vim-gtk
	VARIANTS+=vim-python
	VARIANTS+=vim-lesstif
	VARIANTS_SKIP+=vim-perl
	VARIANTS_SKIP+=vim-gnome
	VARIANTS_SKIP+=vim-tcl
	VARIANTS_SKIP+=vim-full
	VARIANTS+=vim-basic
endif
ifeq ($(origin VARIANT), command line)
	VARIANTS = $(VARIANT) vim-basic
endif

CFLAGS_vim-basic=$(CFLAGS)
CFGFLAGS_vim-basic=$(CFGFLAGS) $(OPTFLAGS) --without-x --enable-gui=no

CFLAGS_vim-tiny=$(CFLAGS) $(TINYCFLAGS)
CFGFLAGS_vim-tiny=$(CFGFLAGS) $(TINYFLAGS)

CFLAGS_vim-perl=$(CFLAGS)
CFGFLAGS_vim-perl=$(CFGFLAGS) $(OPTFLAGS) $(GUIFLAGS) $(PERLFLAGS) $(GTK2FLAGS)

CFLAGS_vim-python=$(CFLAGS)
CFGFLAGS_vim-python=$(CFGFLAGS) $(OPTFLAGS) $(GUIFLAGS) $(PYTHONFLAGS) $(GTK2FLAGS)

CFLAGS_vim-ruby=$(CFLAGS)
CFGFLAGS_vim-ruby=$(CFGFLAGS) $(OPTFLAGS) $(GUIFLAGS) $(RUBYFLAGS) $(GTK2FLAGS)

CFLAGS_vim-tcl=$(CFLAGS)
CFGFLAGS_vim-tcl=$(CFGFLAGS) $(OPTFLAGS) $(GUIFLAGS) $(TCLFLAGS) $(GTK2FLAGS)

CFLAGS_vim-gtk=$(CFLAGS)
CFGFLAGS_vim-gtk=$(CFGFLAGS) $(OPTFLAGS) $(GUIFLAGS) $(BASICFLAGS) $(GTK2FLAGS)

CFLAGS_vim-gnome=$(CFLAGS)
CFGFLAGS_vim-gnome=$(CFGFLAGS) $(OPTFLAGS) $(GUIFLAGS) $(BASICFLAGS) $(GNOMEFLAGS)

CFLAGS_vim-lesstif=$(CFLAGS)
CFGFLAGS_vim-lesstif=$(CFGFLAGS) $(OPTFLAGS) $(GUIFLAGS) $(BASICFLAGS) $(LESSTIFFLAGS)

CFLAGS_vim-full=$(CFLAGS)
CFGFLAGS_vim-full=$(CFGFLAGS) $(OPTFLAGS) $(GUIFLAGS) $(GNOMEFLAGS) $(ALLINTERPFLAGS)

NAME=vim
VERSION=7.0
DEBVERSION=$(VERSION)
VIMCUR=$(NAME)$(subst .,,$(VERSION))
SRCDIR=$(VIMCUR)
CHANGELOG=$(SRCDIR)/runtime/doc/version7.txt # latest version upstream changelog
MAIN_TARBALL=$(NAME)-$(VERSION).tar.bz2
LANG_TARBALL=$(NAME)-$(VERSION)-lang.tar.gz
EXTRA_TARBALL=$(NAME)-$(VERSION)-extra.tar.gz
SOURCES = $(MAIN_TARBALL) $(LANG_TARBALL) $(EXTRA_TARBALL)
PER_VARIANT_FILES = install postinst prerm links preinst
LANGS += fr fr.ISO8859-1 fr.UTF-8
LANGS += it it.ISO8859-1 it.UTF-8
LANGS += pl pl.ISO8859-2 pl.UTF-8
LANGS += ru

DOT_IN_DEPS = debian/vim-runtime.install
DOT_IN_DEPS += debian/vim-runtime.install
DOT_IN_DEPS += debian/vim-common.install
DOT_IN_DEPS += debian/vim-gui-common.install
DOT_IN_DEPS += debian/vim-common.links
DOT_IN_DEPS += debian/vim-gui-common.links
DOT_IN_DEPS += debian/vim-runtime.links
DOT_IN_DEPS += debian/runtime/debian.vim

# nothing to do per default
all:

extract: extract-stamp
extract-stamp: $(foreach s,$(SOURCES),extract-stamp-$(s))
	if [ ! -L vim -o "`readlink vim`" != "$(VIMCUR)" ]; then \
	  ln -fs $(SRCDIR) vim; \
	fi
	@for f in `find upstream/patches -type f -name '$(VERSION).*' -printf "%P\n" | grep -v .svn | sort -n` ; do\
	  echo "applying upstream patch: $$f" ;\
	  cat upstream/patches/$$f | patch -s -d$(SRCDIR) -p0 ;\
	done
	quilt push -a
	touch $@

# {{{1 hackish way of updating to latest unstable snapshot
# XXX Zack: should this be removed and/or ported to svn-buildpackage?
updatesnapshot:
	zipurl=`uscan --report | tail -2 | head -1` \
	&& test ! -z "$$zipurl" \
	&& zipbasename=`basename $$zipurl` \
	&& wget -O upstream/tarballs/$$zipbasename $$zipurl \
	&& noext=`echo $$zipbasename | sed 's/.zip//'` \
	&& rulesversion=`echo $$noext | cut -c5-8` \
	&& rulessnapshot=`echo $$noext | cut -c9-10` \
	&& sedcmd="s/^VERSION=.*/VERSION=$$rulesversion/;s/^SNAPSHOT=.*/SNAPSHOT=$$rulessnapshot/" \
	&& sed -i.bak "$$sedcmd" debian/rules \
	&& sed -i.bak "1{s/+.*-/+$$rulesversion$$rulessnapshot-/};4{s/(......)/($$rulesversion$$rulessnapshot)/}" debian/changelog
# }}}

extract-stamp-%.bz2:
	bunzip2 -c upstream/tarballs/$(*).bz2 | tar -x
	touch $@

extract-stamp-%.gz:
	gunzip -c upstream/tarballs/$(*).gz | tar -x
	touch $@

extract-stamp-%.zip:
	unzip -d $(SRCDIR) upstream/tarballs/$(*).zip
	touch $@

clean: $(foreach v,$(VARIANTS),clean-$(v))
	dh_testdir
	dh_testroot
	rm -f extract-stamp* build-stamp* install-stamp*
	rm -f debian/helpztags.1
	- quilt pop -a
	rm -rf $(SRCDIR)
	rm -f vim
	dh_clean

clean-vim-basic:
	for x in $(PER_VARIANT_FILES) ; do \
	  rm -f debian/vim.$$x ; \
	done
	for x in vim-gui-common.{install,links} vim-common.{install,links} \
	         vim-runtime.install; do \
	  rm -f debian/$$x; \
	done
	rm -f $(DOT_IN_DEPS)

clean-%:
	for x in $(PER_VARIANT_FILES) ; do \
	  rm -f debian/$*.$$x ; \
	done
	rm -f debian/vim.links
	rm -f debian/lintian/$*

build: extract
build: build-stamp
build-stamp: $(foreach v,$(VARIANTS),build-stamp-$(v))
	$(MAKE) -C $(SRCDIR)/runtime/doc html # gen html docs (destroys tags)
# (re)generate the tags file
#	$(SRCDIR)/src/vim-common -u /dev/null \
#	  -c "helptags $(SRCDIR)/runtime/doc" -c quit
	touch $@

configure-stamp-%:
	dh_testdir
	@echo "*** DEBIAN *** CONFIGURING VARIANT $*"
	$(MAKE) -C $(SRCDIR) clean
	cd $(SRCDIR) \
	  && make distclean \
	  && CFLAGS="$(CFLAGS_$(*))" ./configure $(CFGFLAGS_$(*))
	touch $@

build-stamp-%: CURCFLAGS=$(CFLAGS_$*)
build-stamp-%: configure-stamp-%
	dh_testdir
	@echo "*** DEBIAN *** BUILDING VARIANT $*"
	if [ "$*" = "vim-tiny" ]; then \
	  patch -Np0 < debian/tiny/vimrc.tiny.diff; \
	fi
	$(MAKE) -C $(SRCDIR) CFLAGS="$(CURCFLAGS)"
	if [ "$*" = "vim-tiny" ]; then \
	  patch -Rp0 < debian/tiny/vimrc.tiny.diff; \
	fi
	mv $(SRCDIR)/src/vim $(SRCDIR)/src/$(subst -,.,$*)
	touch $@

install: build
install: install-stamp
install-stamp: $(foreach v,$(VARIANTS),install-stamp-$(v))
	dh_testdir
	dh_testroot
	touch $@

install-stamp-vim-basic: export DH_OPTIONS=-pvim-runtime -pvim-common -pvim-gui-common -pvim -pvim-doc
install-stamp-vim-basic: DESTDIR=$(CURDIR)/debian/tmp
install-stamp-vim-basic: build-stamp-vim-basic $(DOT_IN_DEPS)
	dh_testdir
	dh_testroot
	@echo "*** DEBIAN *** INSTALLING VARIANT vim-basic"
	dh_clean -k
	dh_installdirs
	
	# UPSTREAM INSTALLATION
	
	cp $(SRCDIR)/src/{vim.basic,vim}
	$(MAKE) -C $(SRCDIR)/src DESTDIR=$(DESTDIR) installvimbin \
	                                            installtutorbin \
	                                            installruntime \
	                                            installtools \
	                                            install-icons \
	                                            install-languages
	if [ $(MAKETEST) = "yes" ]; then \
	  $(MAKE) -C $(SRCDIR)/src DESTDIR=$(DESTDIR) test; \
	fi
	
	# DEBIAN INSTALLATION
	
	# According to #368754 and #323820, Russian manpages should be in
	# /usr/share/man/ru (KOI8-R encoded) and man will handle the
	# transcoding
	mv $(DESTDIR)/usr/share/man/ru{.KOI8-R,}
	# Remove this so the dh_install later doesn't fail
	rm -rf $(DESTDIR)/usr/share/man/ru.UTF-8
	
	 # disabled, waiting for an update
	 #cp debian/vim-install $(DESTDIR)/usr/bin
	mv $(DESTDIR)/usr/bin/{vim,vim.basic} # use variant name
	# rm stuff handled by alternatives
	rm -f $(DESTDIR)/usr/bin/{ex,view}
	@for f in `find $(DESTDIR)/usr/share/man -name view.1 -o -name ex.1`; do \
	  rm -f $$f; \
	done
	 # rm C part of maze (no longer working)
	rm -f $(DESTDIR)/usr/share/vim/$(VIMCUR)/macros/maze/{*.c,Makefile}
	 # fix for CAN-2005-0069
	rm -f $(DESTDIR)/usr/share/vim/$(VIMCUR)/tools/vimspell.*
	 # helpztags manpage
	pod2man -c "User Commands" -s 1 -q none -r "vim 7.0aa"	\
		-d "September 2003" debian/helpztags debian/helpztags.1
	
	 # variant-related installations for package "vim"
	 # to be kept in sync with those in "install-stamp-%" target
	for x in $(PER_VARIANT_FILES) ; do \
	  sed -e "s:@PKG@:vim:;s:@VARIANT@:basic:" \
	      -e "s:@DESTDIR@:debian/tmp/usr/bin:" \
	      -e "s:@COMMON@:vim-common:" \
	  	debian/vim-variant.$$x > debian/vim.$$x ;\
	done
	for L in $(LANGS); do \
	  sed -e "s:\(.*\)@LANG_ALTS@:\1--slave \$$mandir/$$L/man1/\$$i.1.gz \$$i.$$L.1.gz \$$mandir/$$L/man1/vim.1.gz \\\\\n&:" \
	      -i debian/vim.postinst; \
	done
	sed -i "/@LANG_ALTS@/d" debian/vim.postinst
	sed -e "s:@PKG@:vim:;s:@VARIANT@:basic:" \
		debian/lintian/vim-variant > debian/lintian/vim
	
	# Generate language-specific sections of
	# vim-{runtime,common,gui-common}.install files
	@for L in $(LANGS); do \
	  echo debian/tmp/usr/share/man/$$L/man1/vimtutor.1  \
	    usr/share/man/$$L/man1/ >>debian/vim-runtime.install; \
	done
	
	@for L in $(LANGS); do \
	  echo debian/tmp/usr/share/man/$$L/man1/\*  \
	    usr/share/man/$$L/man1/ >>debian/vim-common.install; \
	done
	
	@for L in $(LANGS); do \
	  echo debian/tmp/usr/share/man/$$L/man1/evim.1  \
	    usr/share/man/$$L/man1/ >>debian/vim-gui-common.install; \
	done
	
	dh_installman
	dh_install -X.svn --fail-missing
	# adjust things for vim-gui-common
	cp debian/vim-common/usr/share/man/man1/vim.1 \
	   debian/vim-gui-common/usr/share/man/man1/gvim.1
	cp debian/vim-common/usr/share/man/man1/vimdiff.1 \
	   debian/vim-gui-common/usr/share/man/man1/gvimdiff.1
	rm -f debian/vim-common/usr/share/man/man1/evim.1
	@for L in $(LANGS); do \
	  cp debian/vim-common/usr/share/man/$$L/man1/vim.1 \
	     debian/vim-gui-common/usr/share/man/$$L/man1/gvim.1; \
	  cp debian/vim-common/usr/share/man/$$L/man1/vimdiff.1 \
	     debian/vim-gui-common/usr/share/man/$$L/man1/gvimdiff.1; \
	  rm -f debian/vim-common/usr/share/man/$$L/man1/evim.1; \
	done
	# remove things that are in vim-runtime
	rm -f debian/vim-common/usr/share/man/man1/vimtutor.1
	@for L in $(LANGS); do \
	  rm -f debian/vim-common/usr/share/man/$$L/man1/vimtutor.1; \
	done
	rmdir debian/vim-gui-common/usr/bin
	# Generate language-specific sections of
	# vim-{common,gui-common}.links files
	@for L in $(LANGS); do \
	  for p in rvim rview; do \
	    echo usr/share/man/$$L/man1/vim.1  \
	      usr/share/man/$$L/man1/$$p.1 >>debian/vim-common.links; \
	  done; \
	done
	
	@for L in $(LANGS); do \
	  for p in gview rgvim rgview; do \
	    echo usr/share/man/$$L/man1/gvim.1  \
	      usr/share/man/$$L/man1/$$p.1 >>debian/vim-gui-common.links; \
	  done; \
	  echo usr/share/man/$$L/man1/evim.1 \
	    usr/share/man/$$L/man1/eview.1 >>debian/vim-gui-common.links; \
	done
	dh_link
	
	 # all excepts vim
	dh_installchangelogs -Nvim
	dh_installdocs
	dh_installmenu
	dh_installmime
	
	touch $@

# the other variants only include the binary
install-stamp-%: export DH_OPTIONS=-p$*
install-stamp-%: DESTDIR=$(CURDIR)/debian/$*
install-stamp-%: build-stamp-%
	dh_testdir
	dh_testroot
	@echo "*** DEBIAN *** INSTALLING VARIANT $*"
	dh_clean -k
	dh_installdirs
	
	 # variant-related installations
	 # to be kept in sync with those in "install-stamp-vim-basic" target
	for x in $(PER_VARIANT_FILES) ; do \
	  if [ "$*" = "vim-tiny" ]; then \
	    sed -e "s:@PKG@:$*:" -e "s:@VARIANT@:$(patsubst vim-%,%,$*):" \
	        -e "s:@DESTDIR@:$(SRCDIR)/src:" -e "s:@COMMON@:vim-common:" \
	        debian/vim-variant.$$x > debian/$*.$$x ;\
	  else \
	    sed -e "s:@PKG@:$*:" -e "s:@VARIANT@:$(patsubst vim-%,%,$*):" \
	        -e "s:@DESTDIR@:$(SRCDIR)/src:" -e "s:@COMMON@:vim-gui-common:" \
	        debian/vim-variant.$$x > debian/$*.$$x ;\
	  fi \
	done
	sed -e "s:@PKG@:$*:;s:@VARIANT@:$(patsubst vim-%,%,$*):" \
	    debian/lintian/vim-variant > debian/lintian/$*
	for L in $(LANGS); do \
	  sed -e "s:\(.*\)@LANG_ALTS@:\1--slave \$$mandir/$$L/man1/\$$i.1.gz \$$i.$$L.1.gz \$$mandir/$$L/man1/vim.1.gz \\\\\n&:" \
	      -i debian/$*.postinst; \
	done
	sed -i "/@LANG_ALTS@/d" debian/$*.postinst
	# fake help installation for vim-tiny
	if [ "$*" = "vim-tiny" ]; then \
		echo "debian/tiny/doc/	usr/share/vim/" >> debian/$*.install; \
	fi
	dh_install -X.svn
	dh_link
	
	touch $@

uninstall:
	dh_testdir
	dh_testroot
	rm -f install-stamp*
	dh_clean

%: %.in
	cat $< | sed 's/@VIMCUR@/$(VIMCUR)/' > $@

binary-indep: export DH_OPTIONS=-i
binary-indep: build install
	dh_testdir
	dh_testroot
	dh_compress
	dh_fixperms
	dh_installdeb
	dh_shlibdeps
	dh_gencontrol
	dh_md5sums
	dh_builddeb

binary-arch: build install
binary-arch: $(foreach v,$(VARIANTS),binary-arch-$(v))

binary-arch-vim-basic: export DH_OPTIONS=-pvim-common -pvim
binary-arch-vim-basic:
	dh_testdir
	dh_testroot
	dh_desktop
	dh_strip
	dh_compress
	dh_fixperms
	dh_installdeb
	dh_shlibdeps
	dh_gencontrol
	dh_md5sums
	dh_builddeb

binary-arch-%: export DH_OPTIONS=-p$* $(foreach v,$(VARIANTS_SKIP),-N$(v))
binary-arch-%: build install
	dh_testdir
	dh_testroot
	dh_desktop
	dh_strip
	dh_compress
	dh_fixperms
	dh_installdeb
	dh_shlibdeps
	dh_gencontrol
	dh_md5sums
	dh_builddeb
binary: beginlog binary-indep binary-arch endlog
.PHONY: extract clean build install uninstall binary-indep binary-arch binary

.PHONY: beginlog endlog
beginlog:
	@echo "*** DEBIAN *** BUILD STARTED"
	@echo "*** DEBIAN *** BUILDING VARIANTS: $(VARIANTS)"
	@echo "*** DEBIAN *** SKIPPING VARIANTS: $(VARIANTS_SKIP)"
endlog:
	@echo "*** DEBIAN *** BUILD COMPLETED"

# vim: set foldmethod=marker:
