
OBJECT_DIR    := build/$(shell uname -s)-$(shell uname -m)
INTERFACE_DIR := build/Interface


SOURCE = $(patsubst %, src/%, $(TOPLEVEL)) \
	 $(HASKORE_INTERFACE) $(MUSIC) \
	 $(PLAIN) $(FILTER) $(DIMENSION) $(VOLUME) $(SRCONTEXT) $(PHYSICAL) \
         $(FUSION) $(STORABLE) \
         $(INFERENCE) $(SOX)

TOPLEVEL = \
	 BinarySample.hs
#	 DiscreteWavelet/Lifting DiscreteWavelet/Lattice \
#	 Signal.hs ShiftedSignal.hs

MUSIC = $(patsubst %, src/Music/%, \
	    WinterAde.hs FilterSaw.hs FMBassLine.hs SwanLake.hs \
            ChildSong6ToSignal.hs Guitar.hs )

HASKORE_INTERFACE = \
	 $(patsubst %, src/Haskore/Interface/Signal/%, \
	            Note.hs InstrumentMap.hs Write.hs)

SIGNAL    = $(wildcard src/Sound/Signal/*.hs) src/Sound/Signal.hs

PLAIN     = $(wildcard src/Synthesizer/Plain/*.hs) \
            $(wildcard src/Synthesizer/Plain/Effect/*.hs) \
            $(wildcard src/Synthesizer/Plain/Filter/*.hs) \
            $(wildcard src/Synthesizer/Plain/Filter/Delay/*.hs)
FILTER    = $(wildcard src/Filter/*.hs)
DIMENSION = $(wildcard src/Synthesizer/Dimension/*.hs) \
            $(wildcard src/Synthesizer/Dimension/Amplitude/*.hs) \
            $(wildcard src/Synthesizer/Dimension/Rate/*.hs) \
            $(wildcard src/Synthesizer/Dimension/RateAmplitude/*.hs)
VOLUME    = $(wildcard src/Synthesizer/Amplitude/*.hs)
SRCONTEXT = $(wildcard src/Synthesizer/SampleRateContext/*.hs)
FUSION    = $(wildcard src/Synthesizer/FusionList/*.hs)
STORABLE  = $(wildcard src/Synthesizer/Storable/*.hs)
PHYSICAL  = $(wildcard src/Synthesizer/Physical/*.hs)
INFERENCE = $(wildcard src/Synthesizer/Inference/Monad/*.hs) \
            $(wildcard src/Synthesizer/Inference/Monad/Signal/*.hs) \
            $(wildcard src/Synthesizer/Inference/Monad/SignalSeq/*.hs) \
            $(wildcard src/Synthesizer/Inference/Reader/*.hs)
SOX = src/Sox.hs $(wildcard src/Sox/*.hs)



HTML = doc/html

STDHADDOCK = base/base.haddock

CUSTOMHADDOCK = numericprelude/docs/numericprelude.haddock haskore/docs/haskore.haddock

HADDOCK_INCL = $(patsubst %, -i /usr/local/share/ghc-6.2/html/libraries/%, $(STDHADDOCK)) \
               $(patsubst %, -i $(HOME)/programming/haskell/%, $(CUSTOMHADDOCK))

# if the 6.4.1 files are used, many identifiers like ExitCode can not be found
# CUSTOMHADDOCK = numericprelude/docs/numericprelude.haddock haskore/docs/haskore.haddock
# HADDOCK_INCL = $(patsubst %, -i /usr/share/doc/ghc-6.4.1/libraries/%, $(STDHADDOCK)) \
#                $(patsubst %, -i $(HOME)/programming/haskell/%, $(CUSTOMHADDOCK))

HADDOCK_SOURCE = $(SOURCE) src/Synthesizer/Physical.hs src/Synthesizer/Inference/Monad.hs


#MODULES = Synthesizer Instruments SignalIO Signal Test Filter/Test

MODULE_PATH = src:src-3  # the other modules are now present by (Cabal) packages


HC      = ghc   # ghc-6.2.2
HCINT   = ghci  # ghci-6.2.2

GHC_OPTIONS = -O -Wall -odir$(OBJECT_DIR) -hidir$(INTERFACE_DIR) -hide-package synthesizer


.PHONY:	all doc build test clean perm

all:	build

clean:
	rm -r $(OBJECT_DIR) $(INTERFACE_DIR)/*

doc:	$(SOURCE)
	haddock --html-help=devhelp -o $(HTML) -t Synthesizer -p doc/Prologue.txt -h --dump-interface=doc/synthesizer.haddock \
	        $(HADDOCK_INCL) $(HADDOCK_SOURCE)
	chmod -R o+rx $(HTML)

publish-doc:	doc
	tar cz $(HTML) | ssh cvs.haskell.org tar xz --directory=/home/darcs/synthesizer

build:
	-mkdir $(OBJECT_DIR)
	$(HC) --make $(GHC_OPTIONS) -i:$(MODULE_PATH) $(SOURCE)
#       $(HC) --make -O -Wall $(patsubst %, %.hs, $(MODULES))

perm:
	(cd /home/thielema; \
	chgrp -R perform projects/paper/haskellsignal programming/haskell/synthesizer; \
	chmod -R g+rw projects/paper/haskellsignal programming/haskell; \
	chmod g+x `find programming/haskell -type d`; \
	rm /tmp/curve.dat; )

test:
	$(HC) $(GHC_OPTIONS) -i:$(MODULE_PATH) --make src/Test.hs
	time $(HC) $(GHC_OPTIONS) -i:$(MODULE_PATH) -e main src/Test.hs
#	time a.out

main:
	$(HC) $(GHC_OPTIONS) -i:$(MODULE_PATH) --make Main.hs
	time a.out

ghci:
	$(HCINT) -Wall -odirdist/build -hidirdist/build -hide-package synthesizer -i:$(MODULE_PATH)

ghci-custom:
	$(HCINT) $(GHC_OPTIONS) -i:$(MODULE_PATH)

tutorial:
	$(HCINT) -Wall -fobject-code -fexcess-precision -O2 -fvia-C -optc-O2 -odirdist/build -hidirdist/build -hide-package synthesizer -i:$(MODULE_PATH) src/Synthesizer/Generic/Tutorial.hs

%.o:	%.hs
	$(HC) -i:$(MODULE_PATH) -O --make $<

%.o:	%.c
	gcc -c -o $@ $<
