#
# Build darcs
#
include autoconf.mk

DARCS_FILES	= Lcs.lhs SlurpDirectory.lhs DarcsCommands.lhs		\
	InitTree.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

CGI_FILES = Lcs.lhs SlurpDirectory.lhs	\
	Repository.lhs DarcsArguments.lhs	\
	Diff.lhs PatchInfo.lhs	\
	Patch.lhs PatchCheck.lhs	\
	RepoPrefs.lhs Test.lhs	\
	Depends.lhs RepoTypes.lhs \
	FastPackedString.hs \
	Resolution.lhs External.hs Lock.lhs Autoconf.lhs \
	Curl.hs PrintPatch.lhs Population.lhs PopulationData.lhs

C_OBJS =

ifeq ($(SYS), windows)
.depend: Posix.hs
Posix.hs: Posix-win32.hs
	cp $< $@

Posix.o:	GHCFLAGS += -fffi -fglasgow-exts
DARCS_FILES += Posix.hs
endif

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

CGI_OBJS	= $(CGI_FILES:.lhs=.o)
DARCS_OBJS	= $(DARCS_FILES:.lhs=.o)
GHCFLAGS	+= -package util -package text
darcs_cgi.o darcs_cgi .depend:	GHCFLAGS += -package net

.PHONY:		all clean distclean dist deb test check install installserver

config: configure autoconf.mk

install:	all
	install -d $(DESTDIR)/$(bindir)
	install -c darcs $(DESTDIR)/$(bindir)

	install -d $(DESTDIR)/$(datadir)/doc/manual
	install -m 0644 darcs.ps $(DESTDIR)/$(datadir)/doc
	install -m 0644 manual/* $(DESTDIR)/$(datadir)/doc/manual

	install -d $(DESTDIR)/$(datadir)/doc/examples
	install -m 0644 zsh_completion_new $(DESTDIR)/$(datadir)/doc/examples/
	install -m 0644 zsh_completion_old $(DESTDIR)/$(datadir)/doc/examples/

	install -d $(DESTDIR)/$(sysconfdir)/bash_completion.d/
	install -m 0644 darcs_completion $(DESTDIR)/$(sysconfdir)/bash_completion.d/darcs

	install -d $(DESTDIR)/$(mandir)/man1
	install -m 0644 darcs.1 $(DESTDIR)/$(mandir)/man1/

installserver:	darcs_cgi darcs-patcher darcs-createrepo
	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)/$(libexecdir)
	install darcs-patcher $(DESTDIR)/$(libexecdir)

	install -d $(DESTDIR)/$(sysconfdir)/darcs
	test -e $(DESTDIR)/$(sysconfdir)/darcs/cgi.conf || \
	    install -m 0644 cgi.conf $(DESTDIR)/$(sysconfdir)/darcs/cgi.conf

dist:		darcs
	./darcs dist --dist-name darcs-`./darcs --version`

deb:		darcs
	./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

darcs:		$(DARCS_OBJS) darcs.o $(C_OBJS) rts.o
	@echo Linking $@ ...
	@$(GHC) $(GHCFLAGS) $(LDFLAGS) -o $@ $(CURLFLAGS) $^

Curl.o:			GHCFLAGS += -cpp -fffi
External.o:		GHCFLAGS += -fffi
Lock.o:			GHCFLAGS += -fffi
FastPackedString.o:	GHCFLAGS += -cpp -fffi
preproc darcs_cgi unit darcsman:	\
		LDFLAGS += $(CURLFLAGS)

darcsman:		darcsman.o $(C_OBJS) $(DARCS_OBJS)
darcs_cgi:		darcs_cgi.o rts.o $(C_OBJS) $(CGI_OBJS)
darcs-patcher:		darcs-patcher.o Lock.o rts.o
darcs-createrepo:	darcs-createrepo.o Autoconf.o rts.o
unit:			unit.o $(DARCS_OBJS) PatchCheck.o rts.o $(C_OBJS)
preproc:		preproc.o $(C_OBJS) $(DARCS_OBJS)

darcs.tex:	preproc darcs.lhs darcs_cgi.lhs darcs-patcher.lhs \
		darcs-createrepo.lhs $(DARCS_FILES) building_darcs.tex
	./preproc darcs.lhs > darcs.tex

manual/index.html: darcs.tex darcs_cgi.lhs gpl.tex
	$(LATEX2HTML) -split +1 -local_icons -dir manual darcs.tex

manual/bigpage.html: darcs.tex darcs_cgi.lhs gpl.tex
	ln -s darcs.tex bigpage.tex
	$(LATEX2HTML) -split 0 -external_file darcs -prefix big \
		-no_auto_link -local_icons -dir manual bigpage.tex
	rm bigpage.tex

index.html:	index.html.in darcs manual/bigpage.html
	sed "s/VERSION/`./darcs --version`/" $< > $@

darcs.ps:	darcs.tex

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

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

clean:
	rm -f *.o *.hi unit diff darcs darcs_cgi
	rm -f darcs.tex darcs.dvi darcs.aux
	rm -f darcs-createrepo darcs-patcher preproc darcsman
	rm -rf tests/temp*

distclean:	clean
	rm -rf config.status config.log autoconf.mk config.cache autom4te.cache
	rm -f .depend manual/* darcs.1 darcs.ps Autoconf.lhs

configure:		configure.in
	autoconf

autoconf.mk Autoconf.lhs:	config.status autoconf.mk.in Autoconf.lhs.in
	sh config.status

config.status:	configure
	sh ./configure

.depend:	$(wildcard *.lhs) $(wildcard *.hs)
	@echo Rebuild dependencies ...
	@$(GHC) $(GHCFLAGS) -M -optdep-f -cpp -optdep.depend $^

.depend:	autoconf.mk

include .depend
