#
# Build darcs
#
ifeq (,$(findstring clean,$(MAKECMDGOALS)))
ifneq (config,$(MAKECMDGOALS))
include autoconf.mk
endif
endif

ifneq (,$(RTSFLAGS))
GHCFLAGS += +RTS $(RTSFLAGS) -RTS
endif

GHCFLAGS += -Wall -Werror -package util -I.

DARCS_FILES	= Lcs.lhs SlurpDirectory.lhs DarcsCommands.lhs		\
	Init.lhs DarcsArguments.lhs Add.lhs Repository.lhs		\
	WhatsNew.lhs Diff.lhs Record.lhs PatchInfo.lhs Unrecord.lhs	\
	Check.lhs Patch.lhs Revert.lhs Get.lhs Pull.lhs PatchCheck.lhs	\
	RepoPrefs.lhs Test.lhs Dist.lhs Remove.lhs Mv.lhs	\
	Replace.lhs Tag.lhs TheCommands.lhs Push.lhs Apply.lhs		\
	Depends.lhs ArgumentDefaults.lhs RepoTypes.lhs \
	FastPackedString.hs DiffCommand.lhs SetPref.lhs \
	Resolution.lhs External.hs Lock.lhs Changes.lhs Autoconf.lhs \
	Curl.hs PrintPatch.lhs PopulationData.lhs Population.lhs \
	FileName.lhs UTF8.lhs Exec.lhs Zlib.lhs RegChars.lhs \
	Unrevert.lhs PatchChoices.lhs SelectChanges.lhs \
	IsoDate.lhs SHA1.lhs TrackDown.lhs Optimize.lhs \
	AmendRecord.lhs Context.lhs AntiMemo.hs ReportBug.lhs \
	Rollback.lhs SignalHandler.lhs Workaround.hs Annotate.lhs \
	CheckFileSystem.lhs \
	Repair.lhs DarcsUtils.lhs TouchesFiles.lhs DarcsURL.hs Printer.lhs \
	PatchBundle.lhs DarcsFlags.lhs Resolve.lhs DateMatcher.lhs \
	Send.lhs PatchMatch.lhs PatchMatchData.lhs Match.lhs

CGI_FILES = Lcs.lhs SlurpDirectory.lhs	\
	Repository.lhs DarcsArguments.lhs	\
	Diff.lhs PatchInfo.lhs DateMatcher.lhs \
	Patch.lhs PatchCheck.lhs SignalHandler.lhs	\
	RepoPrefs.lhs Test.lhs AntiMemo.hs	\
	Depends.lhs RepoTypes.lhs PatchChoices.lhs \
	FastPackedString.hs SHA1.lhs IsoDate.lhs \
	Resolution.lhs External.hs Lock.lhs Autoconf.lhs Workaround.hs \
	Curl.hs PrintPatch.lhs Population.lhs PopulationData.lhs \
	FileName.lhs UTF8.lhs Exec.lhs Zlib.lhs RegChars.lhs \
	DarcsUtils.lhs DarcsURL.lhs Printer.lhs \
	CheckFileSystem.lhs \
	PatchBundle.lhs DarcsFlags.lhs \
	PatchMatch.lhs PatchMatchData.lhs Match.lhs

C_OBJS = compat.o fpstring.o zlib_helper.o c_context.o

ifeq ($(SYS), windows)
GHCFLAGS += -iwin32 -Iwin32 -threaded -DOVERRIDE_RENAMEFILE -DWIN32
DARCS_FILES += win32/Posix.hs win32/CtrlC.hs
CGI_FILES += win32/Posix.hs
C_OBJS += win32/CtrlC_stub.o win32/CtrlC.o
endif

ifeq ($(HAVE_CURSES),True)
GHCFLAGS += -DHAVE_CURSES
endif

ifeq ($(HAVE_MAPI),True)
C_OBJS += win32/send_email.o
CPPFLAGS += -Iwin32
GHCFLAGS += -lmapi32 -DHAVE_MAPI
endif

ifeq ($(HAVE_LIBCURL),True)
C_OBJS += hscurl.o
GHCFLAGS += -DHAVE_CURL
endif

CGI_OBJS	= $(patsubst %.hs,%.o,$(patsubst %.lhs,%.o,$(CGI_FILES)))
DARCS_OBJS	= $(patsubst %.hs,%.o,$(patsubst %.lhs,%.o,$(DARCS_FILES)))

darcs_cgi.o darcs_cgi .depend:	GHCFLAGS += -package net

.PHONY:		all clean distclean realclean dist deb test check install \
		installserver installdocs installbin windowsinstaller \
		website

config: configure autoconf.mk

installbin:	all
	$(INSTALL) -d $(DESTDIR)/$(bindir)
	$(INSTALL) darcs $(DESTDIR)/$(bindir)

	$(INSTALL) -d $(DESTDIR)/$(sysconfdir)/bash_completion.d/
	$(INSTALL_DATA) darcs_completion $(DESTDIR)/$(sysconfdir)/bash_completion.d/darcs

	$(INSTALL) -d $(DESTDIR)/$(mandir)/man1
	$(INSTALL_DATA) darcs.1 $(DESTDIR)/$(mandir)/man1/

installdocs:	darcs.ps manual/index.html
	$(INSTALL) -d $(DESTDIR)/$(datadir)/doc/darcs/manual
	$(INSTALL_DATA) darcs.ps $(DESTDIR)/$(datadir)/doc/darcs
	$(INSTALL_DATA) manual/* $(DESTDIR)/$(datadir)/doc/darcs/manual

	$(INSTALL) -d $(DESTDIR)/$(datadir)/doc/darcs/examples
	$(INSTALL_DATA) zsh_completion_new $(DESTDIR)/$(datadir)/doc/darcs/examples/
	$(INSTALL_DATA) zsh_completion_old $(DESTDIR)/$(datadir)/doc/darcs/examples/

installserver:	darcs_cgi darcs-createrepo cgi/darcs.cgi
	$(INSTALL) -d $(DESTDIR)/$(libexecdir)/cgi-bin
	$(INSTALL) darcs_cgi $(DESTDIR)/$(libexecdir)/cgi-bin/darcs

	$(INSTALL) -d $(DESTDIR)/$(sbindir)
	$(INSTALL) darcs-createrepo $(DESTDIR)/$(sbindir)

	$(INSTALL) -d $(DESTDIR)/$(sysconfdir)/darcs
	test -e $(DESTDIR)/$(sysconfdir)/darcs/cgi.conf || \
	    $(INSTALL_DATA) cgi/cgi.conf $(DESTDIR)/$(sysconfdir)/darcs/cgi.conf
	$(INSTALL) cgi/darcs.cgi $(DESTDIR)/$(libexecdir)/cgi-bin/darcs.cgi
	$(INSTALL) -d $(DESTDIR)/$(datadir)/darcs
	$(INSTALL) -d $(DESTDIR)/$(datadir)/darcs/xslt
	$(INSTALL_DATA) cgi/xslt/*.xslt $(DESTDIR)/$(datadir)/darcs/xslt/
	$(INSTALL_DATA) cgi/xslt/styles.css $(DESTDIR)/$(datadir)/darcs/xslt/styles.css

# Debian policy doesn't allow symlinks as configuration files.
#	test -e $(DESTDIR)/$(sysconfdir)/darcs/styles.css || \
#	    ln -s $(datadir)/darcs/xslt/styles.css \
#		$(DESTDIR)/$(sysconfdir)/darcs/styles.css
	$(INSTALL) -m 644 cgi/xslt/styles.css $(DESTDIR)/$(sysconfdir)/darcs/styles.css

dist:		darcs
	./darcs dist --dist-name darcs-`./darcs --version`
	ln -sf darcs-`darcs --version`.tar.gz darcs-latest.tar.gz


deb:		darcs
	rm -rf /tmp/darcs-deb_temp && \
	./darcs dist --dist-name darcs-deb_temp && \
	mv darcs-deb_temp.tar.gz /tmp && \
	cd /tmp && tar zxf darcs-deb_temp.tar.gz && \
	cd darcs-deb_temp && debuild && \
	rm -rf /tmp/darcs-deb_temp

windowsinstaller:	darcs manual/index.html darcs.nsi
	echo "!define VERSION $(DARCS_VERSION)" > version.nsi
	"$(MAKENSIS)" version.nsi darcs.nsi
	rm -f version.nsi

darcs:		$(DARCS_OBJS) darcs.lhs $(C_OBJS) rts.o
	@echo Linking $@ ...
	@rm -f Main.o Main.hi
	@$(GHC) $(GHCFLAGS) $(OPTLLDFLAGS) -o $@ $^

ghci: $(DARCS_FILES) $(C_OBJS)
	ghci $(filter-out -Wall,$(GHCFLAGS)) $(OPTLLDFLAGS) darcs.lhs $(C_OBJS)
.PHONY: ghci

darcsman:		darcsman.hs $(C_OBJS) $(DARCS_OBJS)
authors:		authors.hs $(C_OBJS) $(DARCS_OBJS)
darcs_cgi:		darcs_cgi.lhs rts.o $(C_OBJS) $(CGI_OBJS)
darcs-createrepo:	darcs-createrepo.lhs Autoconf.o rts.o
unit:			unit.lhs $(DARCS_OBJS) rts.o $(C_OBJS)
preproc:		GHCFLAGS += -package text
preproc:		preproc.hs $(C_OBJS) $(DARCS_OBJS)

TEXSOURCES := preproc darcs.lhs darcs_cgi.lhs features.tex \
	switching.tex configuring_darcs.tex gpl.tex \
	darcs-createrepo.lhs $(DARCS_FILES) building_darcs.tex \
	best_practices.tex
darcs.tex: $(TEXSOURCES)
	./preproc darcs.lhs $(PREPROCHTML) > darcs.tex
darcs_print.tex: $(TEXSOURCES)
	./preproc darcs.lhs > darcs_print.tex

website: darcs-stable.tar.gz darcs.ps manual/index.html manual/bigpage.html darcs \
	index.html

manual/index.html: darcs.tex darcs_cgi.lhs gpl.tex darcs.css
	$(MAKEMANUAL)
	cp -f darcs.css manual/darcs.css

manual/bigpage.html: darcs.tex darcs_cgi.lhs gpl.tex darcs.css
	ln -sf darcs.tex bigpage.tex
	latex2html -split 0 -external_file darcs -prefix big \
		-no_auto_link -dir manual bigpage.tex
	rm bigpage.tex
	cp -f darcs.css manual/bigpage.css

index.html:	index.html.in
	sed "s/VERSION/$(DARCS_VERSION)/g" $< > $@

darcs.ps:	darcs_print.ps
	mv darcs_print.ps darcs.ps

darcs.1:	darcsman
	./darcsman > darcs.1

AUTHORS:	authors
	./authors > AUTHORS

test check:	darcs unit
	@(set -ev && cd tests &&		\
	    for TEST in `ls *.sh`;		\
		do				\
		echo Running $$TEST ...;	\
		sh $$TEST;			\
		done;				\
	    for TEST in `ls *.pl`;		\
		do				\
		echo Running $$TEST ...;	\
		perl $$TEST;			\
		done;				\
	)
	./unit

clean:
	rm -f *.o *.hi unit diff darcs darcs_cgi
	rm -f Context.hs stringify
	rm -f darcs.tex darcs.dvi darcs.aux
	rm -f darcs_print.tex darcs_print.log darcs_print.aux darcs_print.toc
	rm -f darcs-createrepo preproc darcsman
	rm -rf tests/temp* darcs.log darcs.toc
	rm -f conftest* .depend.bak
	rm -f win32/*.o win32/*.hi
	rm -f version.nsi
	rm -f authors

distclean:	clean
	rm -rf config.status config.log autoconf.mk config.cache autom4te.cache
	rm -f darcs.ps darcs.pdf Autoconf.lhs Workaround.hs

realclean: distclean
	rm -f configure darcs.1 .depend AUTHORS c_context.c

configure:		configure.ac aclocal.m4
	autoconf

autoconf.mk Autoconf.lhs cgi/darcs.cgi:	config.status \
		autoconf.mk.in Autoconf.lhs.in cgi/darcs.cgi.in
	sh config.status

config.status:	configure
	if test -f config.command; then sh ./config.command; \
	else sh ./configure; fi

.depend:	$(wildcard *.lhs) $(wildcard *.hs) $(wildcard win32/*.hs)
	@echo Rebuild dependencies ...
	@$(GHC) $(GHCFLAGS) -package util -package text -M -optdep-f -optdep.depend $^

.depend:	autoconf.mk

ifeq (,$(findstring clean,$(MAKECMDGOALS)))
ifneq (config,$(MAKECMDGOALS))
include .depend
endif
endif

