# Root location of the Curry System specified by variable CURRYROOT
CURRYROOT := $(shell curry --nocypm :set v0 :set -time :add Curry.Compiler.Distribution :eval "putStrLn installDir" :quit)

# Curry system binary:
export CURRY = $(CURRYROOT)/bin/curry

# The tool name of the application:
TOOL = $(HOME)/.cpm/bin/cypm

# The compiler name (e.g., pakcs or kics2):
CURRYCOMPILER := $(shell $(CURRY) --compiler-name)

# Executable of CurryPP (for generating CPM.Repository.Select):
CURRYPP := $(shell which currypp)

# Executable of CurryCheck (for testing):
CURRYCHECK := $(shell which curry-check)

# The default options for the REPL (options "rts -T" required for KiCS2
# in order to get elapsed times):
ifeq ($(CURRYCOMPILER),kics2)
export REPL_OPTS = --noreadline :set -time :set rts -T
else
export REPL_OPTS = --noreadline :set -time
endif

# Source modules of CPM:
DEPS = src/CPM/*.curry src/CPM/*/*.curry src/CPM/Repository/Select.curry

.PHONY: build
build: fetchdeps src/CPM/ConfigPackage.curry $(DEPS)
	@echo Root location of Curry system: $(CURRYROOT)
	@if [ ! -d "$(CURRYROOT)" ] ; then echo "Error: not a valid directory!" ; exit 1; fi
	@export CURRYPATH="";						\
	for i in `ls vendor`; do 					\
		export CURRYPATH="$$CURRYPATH:`pwd`/vendor/$$i/src"; 	\
	done; 								\
	echo "Set CURRYPATH to $$CURRYPATH"; 				\
	cd src && $(CURRY) --nocypm $(REPL_OPTS) :l CPM.Main :save :quit
	mkdir -p $(dir $(TOOL))
	rm -f $(TOOL)
	cd $(dir $(TOOL)) && ln -s $(CURDIR)/src/CPM.Main $(notdir $(TOOL))
	@echo Tool installed into: $(TOOL)
	@echo Please add \"$(dir $(TOOL))\" to your path!

# Create the ConfigPackage (which is usually created by `cypm install`)
src/CPM/ConfigPackage.curry: Makefile
	@echo "module CPM.ConfigPackage where" > $@
	@echo "packagePath :: String" >> $@
	@echo "packagePath = \"$(CURDIR)\"" >> $@
	@echo "packageVersion :: String" >> $@
	@echo "packageVersion = \"3.1.0\"" >> $@
	@echo "Curry configuration module '$@' written."

# Generate pure Curry module CPM.Repository.Select with CurryPP:
src/CPM/Repository/Select.curry: src/CPM/Repository/Select.curry.pp
ifeq ($(CURRYPP),)
	touch $@ # do not make since 'currypp' is missing
else
	rm -f $@ && cd src/CPM/Repository && ln -s Select.curry.pp Select.curry
	cd src && $(CURRY) $(REPL_OPTS) :load CPM.Repository.Select :quit
	rm $@ && mv src/CPM/Repository/Select.curry.CURRYPP $@
endif

.PHONY: buildperf
buildperf: fetchdeps
	@export CURRYPATH="";						\
	for i in `ls vendor`; do 					\
		export CURRYPATH="$$CURRYPATH:`pwd`/vendor/$$i/src"; 	\
	done; 								\
	echo "Set CURRYPATH to $$CURRYPATH"; 				\
	cd src && $(CURRY) $(REPL_OPTS) :l CPM.PerformanceTest :save :quit

.PHONY: clean
clean:
	rm -Rf vendor
	rm -Rf src/.curry

.PHONY: fetchdeps
fetchdeps:
	./fetch-dependencies.sh

.PHONY: test
test: fetchdeps
	@export CURRYPATH="";						\
	for i in `ls vendor`; do					\
		export CURRYPATH="$$CURRYPATH:`pwd`/vendor/$$i/src";	\
	done;								\
	if [ ! -x "$(CURRYCHECK)" ] ; then \
	  echo "Executable 'curry-check' is not installed!" && echo "To run the tests, install it by > cypm install currycheck" ; \
	else \
	  cd src && $(CURRYCHECK) CPM.Package CPM.Resolution CPM.LookupSet ; fi

.PHONY: doc
doc: fetchdeps
	@export CURRYPATH="";						\
	for i in `ls vendor`; do					\
		export CURRYPATH="$$CURRYPATH:`pwd`/vendor/$$i/src";	\
	done;								\
	export CURRYPATH="$$CURRYPATH:`pwd`/src"; \
	$(CURRY) doc cdoc CPM.Main

.PHONY: cloc
cloc:
	cloc --force-lang=Haskell,curry --exclude-ext=hs  --exclude-lang=HTML,CSS \
		--not-match-f='PUBLIC' --by-file src/CPM

.PHONY: manual
manual:
	pdflatex -output-directory=docs docs/manual.tex
