# default directories and paths
DESTDIR :=
PREFIX  := /usr/local
BINDIR  := $(PREFIX)/bin
DATADIR := $(PREFIX)/share
MANDIR  := $(DATADIR)/man

# compiler
CC      ?= clang

# linker flags and optional additional libraries if required
LDFLAGS +=
LIBS    += -lm

#common objects
COMMON   = ansi.o util.o hash.o stat.o fs.o opts.o conout.o

#optional flags
OPTIONAL_CFLAGS  :=
OPTIONAL_LDFLAGS :=

#objects
OBJ_C = $(COMMON) main.o lexer.o parser.o code.o ast.o ir.o ftepp.o utf8.o correct.o fold.o intrin.o
OBJ_P = $(COMMON) pak.o
OBJ_T = $(COMMON) test.o
OBJ_X = $(COMMON) exec.o

#gource flags
GOURCEFLAGS =                 \
    --date-format "%d %B, %Y" \
    --seconds-per-day 0.01    \
    --auto-skip-seconds 1     \
    --title "GMQCC"           \
    --key                     \
    --camera-mode overview    \
    --highlight-all-users     \
    --file-idle-time 0        \
    --hide progress,mouse     \
    --stop-at-end             \
    --max-files 99999999999   \
    --max-file-lag 0.000001   \
    --bloom-multiplier 1.3    \
    --logo doc/html/gmqcc.png \
    -1280x720

#ffmpeg flags for gource
FFMPEGFLAGS=                  \
    -y                        \
    -r 60                     \
    -f image2pipe             \
    -vcodec ppm               \
    -i -                      \
    -vcodec libx264           \
    -preset ultrafast         \
    -crf 1                    \
    -threads 0                \
    -bf 0

#splint flags
SPLINTFLAGS =                 \
    -preproc                  \
    -redef                    \
    -noeffect                 \
    -nullderef                \
    -usedef                   \
    -type                     \
    -mustfreeonly             \
    -nullstate                \
    -varuse                   \
    -mustfreefresh            \
    -compdestroy              \
    -compmempass              \
    -nullpass                 \
    -onlytrans                \
    -predboolint              \
    -boolops                  \
    -incondefs                \
    -macroredef               \
    -retvalint                \
    -nullret                  \
    -predboolothers           \
    -globstate                \
    -dependenttrans           \
    -branchstate              \
    -compdef                  \
    -temptrans                \
    -usereleased              \
    -warnposix                \
    +charindex                \
    -kepttrans                \
    -unqualifiedtrans         \
    +matchanyintegral         \
    +voidabstract             \
    -nullassign               \
    -unrecog                  \
    -casebreak                \
    -retvalbool               \
    -retvalother              \
    -mayaliasunique           \
    -realcompare              \
    -observertrans            \
    -abstract                 \
    -statictrans              \
    -castfcnptr

#always the right rule
default: all

#uninstall rule
uninstall:
	rm -f $(DESTDIR)$(BINDIR)/gmqcc
	rm -f $(DESTDIR)$(BINDIR)/qcvm
	rm -f $(DESTDIR)$(BINDIR)/gmqpak
	rm -f $(DESTDIR)$(MANDIR)/man1/doc/gmqcc.1
	rm -f $(DESTDIR)$(MANDIR)/man1/doc/qcvm.1
	rm -f $(DESTDIR)$(MANDIR)/man1/doc/gmqpak.1

#style rule
STYLE_MATCH = \( -name '*.[ch]' -or -name '*.def' -or -name '*.qc' \)

style:
	find . -type f $(STYLE_MATCH) -exec sed -i 's/ *$$//' '{}' ';'
	find . -type f $(STYLE_MATCH) -exec sed -i -e '$$a\' '{}' ';'
	find . -type f $(STYLE_MATCH) -exec sed -i 's/\t/    /g' '{}' ';'

splint:
	@splint $(SPLINTFLAGS) *.c *.h

gource:
	@gource $(GOURCEFLAGS)

gource-record:
	@gource $(GOURCEFLAGS) -o - | ffmpeg $(FFMPEGFLAGS) gource.mp4