DEST_IMPORTS	= /usr/local/imports/hsshellscript
DEST_LIB	= /usr/local/lib
DEST_DOC	= /usr/local/share/doc/hsshellscript
export DEST_IMPORTS DEST_LIB DEST_DOC

VERSION		= 2.1.0
HC 		= ghc
CC		= gcc
CFLAGS		= -ibuild:src/lib:src/test -odir build -hidir build -fglasgow-exts -package unix -package util -package text \
		  -package lang -package parsec
LIBS   		= build/libhsshellscript.a -syslib lang -syslib posix -syslib text -syslib util
SRC_LIB_HS	= HsShellScript HsShellScript/Paths HsShellScript/Shell HsShellScript/Args
SRC_LIB_CHS	= HsShellScript/Commands HsShellScript/ProcErr HsShellScript/Misc
LIB_HS		= $(foreach hs, $(SRC_LIB_HS), src/lib/$(hs).hs) $(foreach hs, $(SRC_LIB_CHS), build/$(hs).hs)
TEST_HS		= $(wildcard src/test/*.hs)
LIB_HI		= $(foreach hs, $(SRC_LIB_CHS) $(SRC_LIB_HS), build/$(hs).hi)
LIB_O		= $(foreach hs, $(SRC_LIB_HS) $(SRC_LIB_CHS), build/$(hs).o) \
		  $(foreach hs, $(SRC_LIB_CHS), build/$(hs)_c.o)
TEST 		= $(notdir $(basename $(wildcard src/test/*.hs)))


0 :: lib doc
all :: lib doc tests
doc :: apidoc manual
apidoc :: build/apidoc/index.html
manual :: build/manual/index.html
lib :: build/libhsshellscript.a
tests :: $(foreach f, $(TEST), build/$(f))

dist :: build/hsshellscript-$(VERSION).tar.gz
	cp -f $^ web/dist
	chmod -R go+r web

install :: install_lib install_doc

install_lib :: build/libhsshellscript.a
	rm -rf $(DESTDIR)/$(DEST_IMPORTS)/HsShellScript
	mkdir -p $(DESTDIR)/$(DEST_IMPORTS) $(DESTDIR)/$(DEST_IMPORTS)/HsShellScript $(DESTDIR)/$(DEST_LIB)
	cp -f build/libhsshellscript.a $(DESTDIR)/$(DEST_LIB)/libhsshellscript.a
	cp -f build/HsShellScript.hi src/lib/hsshellscript.h $(DESTDIR)/$(DEST_IMPORTS)
	cp -f build/HsShellScript/*.hi $(DESTDIR)/$(DEST_IMPORTS)/HsShellScript
	chmod -R u=rwX,go=rX $(DESTDIR)/$(DEST_LIB)/libhsshellscript.a $(DESTDIR)/$(DEST_IMPORTS)/{HsShellScript,HsShellScript.hi}
	ghc-pkg -i lib/hsshellscript.pkg --update-package --auto-ghci-libs

install_doc :: build/apidoc/index.html build/manual/index.html
	mkdir -p $(DESTDIR)/$(DEST_DOC)
	chmod -R u+w $(DESTDIR)/$(DEST_DOC)
	rm -rf $(DESTDIR)/$(DEST_DOC)/*
	cp -r build/apidoc build/manual $(DESTDIR)/$(DEST_DOC)
	chmod -R a=rX $(DESTDIR)/$(DEST_DOC)

# Fr die Main-Module wird immer nur "build/Main.o : ..." eingetragen. Das macht nichts.
depend :: $(LIB_HS) $(TEST_HS)
	-mkdir build/HsShellScript 2>/dev/null
	touch build/HsShellScript.hi \
	      $(foreach s, $(SRC_LIB_HS) $(SRC_LIB_CHS), build/$(s).hi) \
	      $(foreach s, $(SRC_LIB_CHS), build/$(s).c)
	$(HC) -M $(CFLAGS) -optdep-f -optdepbuild/depend $^
	rm -f Makefile~
	sed "s/.o : /.hi : /" build/depend > build/depend1

clean :: realclean depend

realclean ::
	rm -rf build/* src/*/*~ src/*/*/*~ *~

build/apidoc/index.html : $(LIB_HS)
	-mkdir build/apidoc 2>/dev/null
	rm -f build/apidoc/*
	haddock -h $^ -o build/apidoc
	chmod -R a+r build/apidoc

build/manual/index.html : $(wildcard src/manual/*) $(wildcard src/examples/*) $(wildcard src/examples/src/*)
	rm -rf build/manual
	mkdir build/manual
	cp -r src/manual build/
	cp -r src/examples build/manual/
	rm -f build/manual/*~
	sed 's|@VERSION|'$(VERSION)'|g' < build/manual/index.html > build/manual/index.html.tmp
	mv -f build/manual/index.html.tmp build/manual/index.html
	$(call expand, build/manual/index.html)
	chmod -R a+r build/manual
	cd build/manual/examples; make depend

build/libhsshellscript.a : $(LIB_O)
	ar cqs $@ $^

build/HsShellScript/%_c.o : build/HsShellScript/%.c
	$(CC) -c -o $@ $<

build/%.hi : build/%.o
	@:

build/HsShellScript/%.hi : build/HsShellScript/%.o
	@:

build/%.o : src/lib/%.hs
	$(HC) $(CFLAGS) -c -o $@ $<

build/%.o : build/%.hs
	$(HC) $(CFLAGS) -c -o $@ $<

build/%.o : src/test/%.hs build/libhsshellscript.a
	$(HC) $(CFLAGS) -ohi build/$*.hi -c -o $@ $<

build/HsShellScript/%.o : build/HsShellScript/%.hs
	$(HC) $(CFLAGS) -c -o $@ $<

build/HsShellScript/%.o : src/lib/HsShellScript/%.hs
	$(HC) $(CFLAGS) -c -o $@ $<

build/HsShellScript/%.hs : src/lib/HsShellScript/%.chs
	-chmod u+w $@ 2>/dev/null
	-mkdir build/HsShellScript 2>/dev/null
	c2hs --cppopts="-Isrc/lib" -o $@ $<
	mv -f $(basename $@).h $(basename $@).c
	chmod u-w $@ $(basename $@).c

build/HsShellScript/%.c : build/HsShellScript/%.hs
	@:

# Das von c2hs erzeugte "-- **" verwirrt haddock. Deswegen umschreiben.
#	mv $@ build/c2hs.tmp
#	sed "s/-- .. Edit the orignal .chs file instead!/-- Edit the orignal .chs file instead!/" < build/c2hs.tmp > $@
#	rm build/c2hs.tmp

# Because of a bug in GHC6, the libraries must be first on the command line.
build/% : build/%.o build/libhsshellscript.a
	$(HC) -o $@ -odir build $(LIBS) build/$*.o

# Alles in src/ kommt in die Distribution.
build/hsshellscript-$(VERSION).tar.gz : clean depend doc
	mkdir hsshellscript-$(VERSION)
	cp -r build src Makefile README lib hsshellscript-$(VERSION)
	tar cfzv $@ hsshellscript-$(VERSION)
	rm -rf hsshellscript-$(VERSION)
	chmod a+r $@

-include build/depend
-include build/depend1
