CC = g++
CFLAGS = -Wall -Wshadow
EXENAME = monad
CCMONAD = ccmonad
OBJS = $(EXENAME).o help.o util.o monad_shared.o
CCOBJS = $(CCMONAD).o util.o monad_shared.o
IDFILE = .monadid
OPTIMIZE = off

ifeq ($(strip $(OPTIMIZE)),on)
CFLAGS += -O2 -DOPTIMIZE
else ifeq ($(strip $(OPTIMIZE)),off)
CFLAGS += -g -O0
else
$(warning Invalid value specified for OPTIMIZE. Should be on or off)
CFLAGS += -g -O0
endif

LIBS:=
IS_LIBRT:=$(shell echo "int main(){}" | g++ -o /dev/null -x c++ - -lrt &>/dev/null ; echo $$?)
IS_LIBPNG:=$(shell echo "int main(){}" | g++ -o /dev/null -x c++ - -lpng &>/dev/null ; echo $$?)
ifeq ($(IS_LIBRT),0)
LIBS+= -lrt
endif
ifeq ($(IS_LIBPNG),0)
LIBS+= -lpng 
endif

all: $(EXENAME) $(CCMONAD) $(IDFILE)

$(IDFILE): $(OBJS)
	echo -e '$(EXENAME) identification file\n'\
'This file is used for $(EXENAME) directory identification\n'\
'Built by' `whoami` 'on' `hostname`'\n'\
'Build Date:' `date`> $(IDFILE)

$(EXENAME): $(OBJS) $(IDFILE)
	$(CC) $(CFLAGS) $(LIBS) $(OBJS) -o $@

$(CCMONAD): $(CCOBJS) $(IDFILE)
	$(CC) $(CFLAGS) $(LIBS) $(CCOBJS) -o $@

help.o: help.cpp $(wildcard *.h) README.cgo README_config.cgo README_tests.cgo LICENSE.cgo quotes.cga

CONVERT_TXT_TO_CGO=sed -e 's/"/\\"/g' -e 's/^/    << "/' -e 's/$$/" << endl/'
CONVERT_TXT_TO_CGA=sed -e 's/"/\\"/g' -e 's/^/"/' -e 's/$$/",/'

%.cgo: %.txt
	$(CONVERT_TXT_TO_CGO) $(@:.cgo=.txt) > $@

%.cga: %.txt
	$(CONVERT_TXT_TO_CGA) $(@:.cga=.txt) > $@

%.o : %.cpp $(wildcard *.h)
	$(CC) $(CFLAGS) -c $(@:.o=.cpp) -o $@

.PHONY: clean
clean:
	rm -f $(wildcard *.o) $(wildcard *.cgo) $(wildcard *.cga) $(EXENAME) $(CCMONAD) $(IDFILE) $(wildcard $(EXENAME)$(EXENAME)*)

.PHONY: clean.sh
clean.sh: $(EXENAME)
	./clean.sh