#!/usr/bin/make -f

ARCH ?=$(shell dpkg-architecture -qDEB_HOST_ARCH)

CC =gcc
CPPFLAGS :=$(shell dpkg-buildflags --get CPPFLAGS)
CFLAGS :=-Wall $(shell dpkg-buildflags --get CFLAGS) $(CPPFLAGS)
LDFLAGS :=$(shell dpkg-buildflags --get LDFLAGS)
STRIP =strip
TEST =test
OPTS =NO_OPENSSL=1 prefix=/usr gitexecdir=/usr/lib/git-core \
  libexecdir=/usr/lib/git-core \
  mandir=/usr/share/man htmldir=/usr/share/doc/git/html \
  INSTALLDIRS=vendor \
  NO_PYTHON=1 \
  USE_SRV_RR=1 \
  USE_LIBPCRE=1 \
  THREADED_DELTA_SEARCH=1 \
  NO_CROSS_DIRECTORY_HARDLINKS=1 NO_INSTALL_HARDLINKS=1 \
  DEFAULT_PAGER=pager DEFAULT_EDITOR=editor \
  CC='$(CC)' CFLAGS='$(CFLAGS)' LDFLAGS='$(LDFLAGS)'
DOC_OPTS =prefix=/usr htmldir=/usr/share/doc/git/html \
  ASCIIDOC8=1 ASCIIDOC_NO_ROFF=1

ifneq (,$(findstring nostrip,$(DEB_BUILD_OPTIONS)))
  STRIP =: strip
endif
ifneq (,$(findstring nocheck,$(DEB_BUILD_OPTIONS)))
  TEST =
endif
ifneq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
  NUMJOBS = $(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
  MAKEFLAGS += -j$(NUMJOBS)
endif

PKG_INDEP =
PKG_INDEP += git-doc
PKG_INDEP += git-arch
PKG_INDEP += git-bzr
PKG_INDEP += git-cvs
PKG_INDEP += git-svn
PKG_INDEP += git-mediawiki
PKG_INDEP += git-daemon-run
PKG_INDEP += git-daemon-sysvinit
PKG_INDEP += git-email
PKG_INDEP += git-gui
PKG_INDEP += gitk
PKG_INDEP += gitweb
PKG_INDEP += git-all
PKG_INDEP += git-el
PKG_INDEP += git-man

TMP =$(shell pwd)/tmp
GIT =$(shell pwd)/debian/git

patch: deb-checkdir patch-stamp
patch-stamp:
	for i in `ls -1 debian/diff/*.diff debian/diff/*.patch \
	    2>/dev/null || :`; do \
	  patch -p1 -N -r- <$$i || test $$? = 1 || exit 1; \
	done
	# Set executable bit on new test files since patch can't set it
	chmod a+x t/*.sh
	touch patch-stamp

build: build-arch build-indep

build-arch: deb-checkdir build-arch-stamp
build-arch-stamp: patch-stamp
	-$(CC) -v
	DESTDIR='$(GIT)' $(MAKE) all $(OPTS)
	DESTDIR='$(GIT)' $(MAKE) -C contrib/subtree all $(OPTS)
	ln -s contrib/subtree/git-subtree
	test -z '$(TEST)' || \
	  DESTDIR='$(GIT)' $(MAKE) $(TEST) $(OPTS) || \
	  GIT_TEST_OPTS=--verbose DESTDIR='$(GIT)' $(MAKE) $(TEST) $(OPTS)
	test -z '$(TEST)' || \
	  DESTDIR='$(GIT)' $(MAKE) -C contrib/subtree $(TEST) $(OPTS) || \
	  GIT_TEST_OPTS=--verbose DESTDIR='$(GIT)' $(MAKE) -C contrib/subtree $(TEST) $(OPTS)
	touch build-arch-stamp

build-indep: deb-checkdir build-indep-stamp
build-indep-stamp: patch-stamp build-arch-stamp
	# git-man, git-doc
	$(MAKE) -CDocumentation man html $(DOC_OPTS)
	# git-bzr
	$(MAKE) -CDocumentation $(DOC_OPTS) \
	  MAN_TXT=../debian/git-remote-bzr.txt \
	  ../debian/git-remote-bzr.1 \
	  ../debian/git-remote-bzr.html
	sed -e 's,/usr/bin/env python,/usr/bin/python,' \
	  contrib/remote-helpers/git-remote-bzr >debian/git-remote-bzr
	sed -e 's/test_have_prereq PYTHON/true/' \
	  contrib/remote-helpers/test-bzr.sh >debian/test-bzr.sh
	chmod +x debian/git-remote-bzr debian/test-bzr.sh
	test -z '$(TEST)' || \
	  PATH=$(CURDIR)/debian:$(PATH) \
	    $(MAKE) -C t $(OPTS) $(CURDIR)/debian/test-bzr.sh || \
	  PATH=$(CURDIR)/debian:$(PATH) GIT_TEST_OPTS=--verbose \
	    $(MAKE) -C t $(OPTS) $(CURDIR)/debian/test-bzr.sh
	# git-mediawiki
	$(MAKE) -Ccontrib/mw-to-git all $(OPTS)
	touch build-indep-stamp

clean: deb-checkdir
	rm -f debian/git-remote-bzr debian/test-bzr.sh
	rm -f debian/git-remote-bzr.xml debian/git-remote-bzr.html
	rm -f Documentation/git-remote-bzr.1
	$(MAKE) clean $(OPTS)
	! test -e patch-stamp || \
	{ \
	  set -e; \
	  $(MAKE) -Ccontrib/mw-to-git clean $(OPTS); \
	  for i in `ls -1r debian/diff/*.diff debian/diff/*.patch \
	      2>/dev/null || :`; do \
	    patch -p1 -NR -r- <$$i || test $$? = 1 || exit 1; \
	  done; \
	}
	rm -rf '$(TMP)'
	rm -f patch-stamp build-arch-stamp build-indep-stamp
	set -e; \
	  for i in '' $(patsubst git%,%,$(PKG_INDEP)) -core; do \
	    rm -rf '$(GIT)'$$i; \
	  done
	rm -f debian/files debian/substvars
	rm -f git-subtree

install: install-arch install-indep
git.install: install-arch
install-arch: deb-checkdir deb-checkuid build-arch-stamp
	# git
	rm -rf '$(GIT)'
	install -d -m0755 '$(GIT)'/usr/bin
	DESTDIR='$(GIT)' $(MAKE) install $(OPTS)
	DESTDIR='$(GIT)' $(MAKE) -C contrib/subtree install $(OPTS)
	install -d -m0755 '$(GIT)'/var/lib/git
	rm -f '$(GIT)'/usr/share/perl5/Error.pm
	rm -rf '$(GIT)'/usr/share/man
	chmod 644 '$(GIT)'/usr/share/perl5/Git.pm
	find '$(GIT)'/usr/share/perl5/Git -type d | xargs chmod 0755
	find '$(GIT)'/usr/share/perl5/Git -type f | xargs chmod 0644
	# don't include arch, cvs, svn, email, gui tools, and gitk program
	for i in git-archimport git-cvs git-svn git-send-email \
	 git-gui git-citool; do \
	  rm -f '$(GIT)'/usr/lib/git-core/$$i*; \
	done
	rm -f '$(GIT)'/usr/bin/git-cvsserver
	rm -f '$(GIT)'/usr/bin/gitk
	for i in '$(GIT)'/usr/bin/* '$(GIT)'/usr/lib/git-core/*; do \
	  test -d $$i || \
	  test "`head -c2 $$i`" = '#!' || \
	  test "`head -c2 $$i`" = '# ' || \
	  $(STRIP) -R .comment -R .note $$i; \
	done
	# don't include git-gui's lib
	rm -rf '$(GIT)'/usr/share/git-gui/
	# don't include gitk's lib
	rm -rf '$(GIT)'/usr/share/gitk/
	# don't include git-svn's lib
	rm -rf '$(GIT)'/usr/share/perl5/Git/SVN*
	# bash completion
	install -d -m0755 '$(GIT)'/usr/share/bash-completion/completions
	install -m0644 contrib/completion/git-completion.bash \
	  '$(GIT)'/usr/share/bash-completion/completions/git
	ln -s git '$(GIT)'/usr/share/bash-completion/completions/gitk
	# bash prompt
	install -m0644 contrib/completion/git-prompt.sh \
	  '$(GIT)'/usr/lib/git-core/git-sh-prompt
	install -d -m0755 '$(GIT)'/etc/bash_completion.d
	install -m0644 debian/git-prompt.completion \
	  '$(GIT)'/etc/bash_completion.d/git-prompt
	# sanity check that #642603 fix is still in place
	test $$(stat -c%h \
	  '$(GIT)'/usr/lib/git-core/git-branch) -le 10
	# gitweb
	install -d -m0755 '$(GIT)'/usr/share/gitweb
	ln -s gitweb.cgi '$(GIT)'/usr/share/gitweb/index.cgi
	# contrib hooks
	install -d -m0755 '$(GIT)'/usr/share/git-core/contrib/hooks
	set -e; for i in contrib/hooks/*; do \
	  test "$$i" != contrib/hooks/multimail || continue; \
	  install -m0755 "$$i" \
	    '$(GIT)'/usr/share/git-core/contrib/hooks/; \
	done
	# contrib
	install -d -m0755 '$(GIT)'/usr/share/doc/git
	cp -R contrib '$(GIT)'/usr/share/doc/git/
	rm -rf '$(GIT)'/usr/share/doc/git/contrib/completion
	rm -rf '$(GIT)'/usr/share/doc/git/contrib/emacs
	rm -rf '$(GIT)'/usr/share/doc/git/contrib/mw-to-git
	find '$(GIT)'/usr/share/doc/git/contrib -type f | xargs chmod 0644
	find '$(GIT)'/usr/share/doc/git/contrib -type d | xargs chmod 0755
	  # remove contrib hooks, they are now installed in
	  # /usr/share/git-core/contrib, keep symlink for backward compatibility
	rm -rf '$(GIT)'/usr/share/doc/git/contrib/hooks
	ln -s ../../../git-core/contrib/hooks \
	  '$(GIT)'/usr/share/doc/git/contrib/
	find '$(GIT)'/usr/share/doc/git/ -name .gitignore | xargs rm -f

$(patsubst %,%.install,$(PKG_INDEP)) git-core.install: install-indep
install-indep: build-arch-stamp build-indep-stamp
	rm -rf '$(TMP)'
	install -d -m0755 '$(TMP)'
	DESTDIR='$(TMP)' $(MAKE) install install-doc $(OPTS)
	install -d -m0755 '$(TMP)/usr/share/perl5/Git'
	DESTDIR='$(TMP)' $(MAKE) -Ccontrib/mw-to-git install $(OPTS) \
	  INSTLIBDIR=/usr/share/perl5
	$(MAKE) -CDocumentation install-webdoc WEBDOC_DEST='$(TMP)'/html \
	  2>/dev/null
	$(MAKE) -C contrib/subtree doc $(OPTS)
	install -m 0644 contrib/subtree/git-subtree.txt '$(TMP)'/html
	install -m 0644 contrib/subtree/git-subtree.html '$(TMP)'/html
	# RelNotes are shipped in git
	rm -rf '$(TMP)'/html/RelNotes
	# git-man
	rm -rf '$(GIT)'-man
	install -d -m0755 '$(GIT)'-man/usr/share/man/man3
	DESTDIR='$(GIT)'-man $(MAKE) install-doc $(OPTS)
	PATH=$$PATH:$(CURDIR) DESTDIR='$(GIT)'-man $(MAKE) -C contrib/subtree install-doc $(OPTS)
	install -m 0644 '$(TMP)'/usr/share/man/man3/Git* \
	  '$(GIT)'-man/usr/share/man/man3/
	# don't include arch, cvs, svn, email, gui, and gitk man pages
	for i in git-archimport git-cvs git-svn git-send-email gitk \
	 git-gui git-citool; do \
	  rm -f '$(GIT)'-man/usr/share/man/man1/$$i*; \
	done
	rm -f '$(GIT)'-man/usr/share/man/man3/Git::SVN*.3pm
	chmod 0644 '$(GIT)'-man/usr/share/man/man?/*.[0-9]*
	gzip -9 '$(GIT)'-man/usr/share/man/man?/*.[0-9]*
	# git-doc
	rm -rf '$(GIT)'-doc
	install -d -m0755 '$(GIT)'-doc/usr/share/doc/git
	ln -s ../git-doc '$(GIT)'-doc/usr/share/doc/git/html
	# git-cvs, git-svn
	for i in cvs svn; do \
	  rm -rf '$(GIT)'-$$i && \
	  install -d -m0755 '$(GIT)'-$$i/usr/lib/git-core && \
	  install -m0755 '$(TMP)'/usr/lib/git-core/git-$$i* \
	    '$(GIT)'-$$i/usr/lib/git-core/ && \
	  install -d -m0755 '$(GIT)'-$$i/usr/share/man/man1 && \
	  install -m0644 '$(TMP)'/usr/share/man/man1/git-$$i* \
	    '$(GIT)'-$$i/usr/share/man/man1/ && \
	  gzip -9 '$(GIT)'-$$i/usr/share/man/man1/*.1 || exit 1; \
	done
	install -d -m0755 '$(GIT)'-svn/usr/share/perl5/Git
	cp -R '$(TMP)'/usr/share/perl5/Git/SVN* \
	  '$(GIT)'-svn/usr/share/perl5/Git/
	find '$(GIT)'-svn/usr/share/perl5/Git -type d | xargs chmod 0755
	find '$(GIT)'-svn/usr/share/perl5/Git -type f | xargs chmod 0644
	install -d -m0755 '$(GIT)'-svn/usr/share/man/man3
	install -m 0644 '$(TMP)'/usr/share/man/man3/Git::SVN*.3pm \
	  '$(GIT)'-svn/usr/share/man/man3/
	gzip -9 '$(GIT)'-svn/usr/share/man/man3/*.3pm
	# git-cvs
	install -d -m0755 '$(GIT)'-cvs/usr/bin
	install -m0755 '$(TMP)'/usr/bin/git-cvsserver '$(GIT)'-cvs/usr/bin/
	# git-arch
	rm -rf '$(GIT)'-arch
	install -d -m0755 '$(GIT)'-arch/usr/lib/git-core
	install -m0755 '$(TMP)'/usr/lib/git-core/git-archimport \
	  '$(GIT)'-arch/usr/lib/git-core/
	install -d -m0755 '$(GIT)'-arch/usr/share/man/man1
	install -m0644 '$(TMP)'/usr/share/man/man1/git-archimport.1 \
	  '$(GIT)'-arch/usr/share/man/man1/
	gzip -9 '$(GIT)'-arch/usr/share/man/man1/*.1
	# git-bzr
	rm -rf '$(GIT)'-bzr
	install -d -m0755 '$(GIT)'-bzr/usr/lib/git-core
	install -m0755 debian/git-remote-bzr \
	  '$(GIT)'-bzr/usr/lib/git-core/git-remote-bzr--git
	install -d -m0755 '$(GIT)'-bzr/usr/share/man/man1
	install -m0644 Documentation/git-remote-bzr.1 \
	  '$(GIT)'-bzr/usr/share/man/man1/git-remote-bzr--git.1
	gzip -9 '$(GIT)'-bzr/usr/share/man/man1/*.1
	# git-mediawiki
	rm -rf '$(GIT)'-mediawiki
	install -d -m0755 '$(GIT)'-mediawiki/usr/share/perl5/Git
	install -m0644 '$(TMP)'/usr/share/perl5/Git/Mediawiki.pm \
	  '$(GIT)'-mediawiki/usr/share/perl5/Git/
	install -d -m0755 '$(GIT)'-mediawiki/usr/lib/git-core
	install -m0755 '$(TMP)'/usr/lib/git-core/git-mw \
	  '$(GIT)'-mediawiki/usr/lib/git-core/
	install -m0755 '$(TMP)'/usr/lib/git-core/git-remote-mediawiki \
	  '$(GIT)'-mediawiki/usr/lib/git-core/
	# git-email
	rm -rf '$(GIT)'-email
	install -d -m0755 '$(GIT)'-email/usr/lib/git-core
	install -m0755 '$(TMP)'/usr/lib/git-core/git-send-email \
	  '$(GIT)'-email/usr/lib/git-core/
	install -d -m0755 '$(GIT)'-email/usr/share/man/man1
	install -m0644 '$(TMP)'/usr/share/man/man1/git-send-email.1 \
	  '$(GIT)'-email/usr/share/man/man1/
	gzip -9 '$(GIT)'-email/usr/share/man/man1/*.1
	# git-daemon-run
	rm -rf '$(GIT)'-daemon-run
	install -d -m0755 '$(GIT)'-daemon-run/etc/sv/git-daemon/log
	install -m0755 debian/git-daemon/run \
	  '$(GIT)'-daemon-run/etc/sv/git-daemon/run
	install -m0755 debian/git-daemon/log/run \
	  '$(GIT)'-daemon-run/etc/sv/git-daemon/log/run
	# git-daemon-sysvinit
	rm -rf '$(GIT)'-daemon-sysvinit
	install -d -m0755 '$(GIT)'-daemon-sysvinit/etc/init.d
	install -m0755 debian/git-daemon.init \
	  '$(GIT)'-daemon-sysvinit/etc/init.d/git-daemon
	install -d -m0755 '$(GIT)'-daemon-sysvinit/etc/default
	install -m0644 debian/git-daemon.default \
	  '$(GIT)'-daemon-sysvinit/etc/default/git-daemon
	install -d -m0755 '$(GIT)'-daemon-sysvinit/usr/share/git-core/sysvinit
	>'$(GIT)'-daemon-sysvinit/usr/share/git-core/sysvinit/sentinel
	chmod 0644 \
	  '$(GIT)'-daemon-sysvinit/usr/share/git-core/sysvinit/sentinel
	# git-el
	rm -rf '$(GIT)'-el
	install -m0644 -D debian/git-el.emacsen-startup \
	  '$(GIT)'-el/etc/emacs/site-start.d/50git-core.el
	install -m0755 -D debian/git-el.emacsen-install \
	  '$(GIT)'-el/usr/lib/emacsen-common/packages/install/git
	install -m0755 -D debian/git-el.emacsen-remove \
	  '$(GIT)'-el/usr/lib/emacsen-common/packages/remove/git
	install -d -m0755 '$(GIT)'-el/usr/share/git-core/emacs
	install -m0644 contrib/emacs/git-blame.el \
	  '$(GIT)'-el/usr/share/git-core/emacs/git-blame.el
	install -m0644 contrib/emacs/git.el \
	  '$(GIT)'-el/usr/share/git-core/emacs/git.el
	install -d -m0755 '$(GIT)'-el/usr/share/doc/git-el
	ln -s ../git/README.emacs \
	  '$(GIT)'-el/usr/share/doc/git-el/README.Debian
	install -d -m0755 '$(GIT)'-el/usr/share/doc/git/contrib
	ln -s ../../../git-core/emacs \
	  '$(GIT)'-el/usr/share/doc/git/contrib/emacs
	# git-gui
	rm -rf '$(GIT)'-gui
	install -d -m0755 '$(GIT)'-gui/usr/lib/git-core
	install -m0755 '$(TMP)'/usr/lib/git-core/git-gui \
	  '$(GIT)'-gui/usr/lib/git-core/
	install -m0755 '$(TMP)'/usr/lib/git-core/git-gui--askpass \
	  '$(GIT)'-gui/usr/lib/git-core/
	install -m0755 '$(TMP)'/usr/lib/git-core/git-citool \
	  '$(GIT)'-gui/usr/lib/git-core/
	install -d -m0755 '$(GIT)'-gui/usr/share/man/man1
	for i in gui citool; do \
	  install -m0644 '$(TMP)'/usr/share/man/man1/git-$$i* \
	    '$(GIT)'-gui/usr/share/man/man1/; \
	done
	gzip -9 '$(GIT)'-gui/usr/share/man/man1/*.1
	install -d -m0755 '$(GIT)'-gui/usr/share/git-gui
	cp -a '$(TMP)'/usr/share/git-gui/lib '$(GIT)'-gui/usr/share/git-gui/
	# gitk
	rm -rf '$(GIT)'k
	install -d -m0755 '$(GIT)'k/usr/bin
	install -m0755 '$(TMP)'/usr/bin/gitk \
	  '$(GIT)'k/usr/bin/gitk
	install -d -m0755 '$(GIT)'k/usr/share/man/man1
	install -m0644 '$(TMP)'/usr/share/man/man1/gitk.1 \
	  '$(GIT)'k/usr/share/man/man1/
	gzip -9 '$(GIT)'k/usr/share/man/man1/*.1
	install -d -m0755 '$(GIT)'k/usr/share/gitk
	cp -a '$(TMP)'/usr/share/gitk/lib '$(GIT)'k/usr/share/gitk/
	# gitweb
	rm -rf '$(GIT)'web
	install -d -m0755 '$(GIT)'web/usr/lib/cgi-bin
	ln -s ../../share/gitweb/gitweb.cgi \
	  '$(GIT)'web/usr/lib/cgi-bin/gitweb.cgi
	install -d -m0755 '$(GIT)'web/etc
	install -m0644 debian/gitweb.conf '$(GIT)'web/etc/gitweb.conf
	install -d -m0755 '$(GIT)'web/etc/apache2/conf.d
	install -m0644 debian/gitweb.apache2.conf \
	  '$(GIT)'web/etc/apache2/conf.d/gitweb
	# git-all
	rm -rf '$(GIT)'-all
	install -d -m0755 '$(GIT)'-all
	# git-core
	rm -rf '$(GIT)'-core
	install -d -m0755 '$(GIT)'-core/usr/share/doc
	ln -s git '$(GIT)'-core/usr/share/doc/git-core

git-core.deb-docs:
	: no doc dir

binary: binary-arch binary-indep
binary-arch: install-arch git.deb
	rm -f debian/substvars
	dpkg-shlibdeps '$(GIT)'/usr/bin/* '$(GIT)'/usr/lib/git-core/*
	dpkg-gencontrol -isp -pgit -P'$(GIT)'
	dpkg -b '$(GIT)' ..
binary-indep: install-indep $(patsubst %,%.deb,$(PKG_INDEP)) git-core.deb-DEBIAN
	rm -f debian/substvars
	for i in $(patsubst git%,%,$(PKG_INDEP)) -core; do \
	  dpkg-gencontrol -isp -pgit$$i -P'$(GIT)'$$i && \
	  dpkg -b '$(GIT)'$$i .. || exit 1; \
	done

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

# Git's build system supports parallelism (-j) but does not handle
# multiple concurrent "make" invocations.
.NOTPARALLEL:

include debian/implicit
