CC=clang

CFLAGS=-std=c99 -Wextra -pedantic -g -O0

CC_OPENMP=gcc # no OpenMP in our clang
CFLAGS_OPENMP=$(CFLAGS) -fopenmp

TARGETS=approximate-pi linked-list mandelbrot threads circular-buffer structs \
				ncurses-pong bit-fuckery bit-fuckery2 checkcheck multibrot bloom \
				wo-lernen lua-foo binsearch test-inline-assembly \
				uiowa-threads-example uiowa-threads-my-example \
				mtrace-test av-variance undefined-behaviour \
				multibrot-openmp hello-openmp mandelbrot-openmp \
				positional-format-strings
EXTRAS=mandelbrot.bmp multibrot.png test-inline-assembly.s \
				mtrace-test.trace mtrace-test.txt multibrot-openmp.png
VERYEXTRAS=cppcheck.txt macros.txt tags

.PHONY: all
all: $(TARGETS)

.PHONY: really-all
really-all: all $(EXTRAS)

.PHONY: clean
clean:
	rm -f $(TARGETS) $(EXTRAS) $(VERYEXTRAS) *.o *~

.PHONY: cppcheck
cppcheck: cppcheck.txt

cppcheck.txt: *.c *.h
	cppcheck . 2> $@
	cat $@

tags: *.c
	ctags -R .

.PHONY: uncrustify
uncrustify:
	uncrustify -c uncrustify.cfg --no-backup *.c

mandelbrot: mandelbrot.c
	$(CC) $(CFLAGS) $(shell sdl-config --cflags) -o $@ $< $(shell sdl-config --libs) -lm

mandelbrot.bmp: mandelbrot
	./mandelbrot

threads: threads.c
	$(CC) $(CFLAGS) -o $@ $< -pthread

ncurses-pong: ncurses-pong.c
	$(CC) $(CFLAGS) -o $@ $< -lncurses

checkcheck: checkcheck.c
	$(CC) $(CFLAGS) -o $@ $< -lcheck

multibrot: multibrot.c
	$(CC) $(CFLAGS) -o $@ $< -lm -lpng -pthread

multibrot.png: multibrot
	./multibrot -j2

multibrot-openmp.png: multibrot-openmp
	time ./multibrot-openmp

lua-foo: lua-foo.c
	$(CC) $(CFLAGS) -o $@ $< -llua -lm

test-inline-assembly: test-inline-assembly.c
	$(CC) -Wall -o $@ $<

test-inline-assembly.s: test-inline-assembly.c
	$(CC) -Wall -S -o $@ $<

mtrace-test.trace: mtrace-test
	MALLOC_TRACE=$@ ./mtrace-test

mtrace-test.txt: mtrace-test.trace
	-mtrace mtrace-test mtrace-test.trace > mtrace-test.txt

uiowa-threads-example: uiowa-threads.o uiowa-threads-example.c
	$(CC) $(CFLAGS) -o $@ $^

uiowa-threads-my-example: uiowa-threads.o uiowa-threads-my-example.c
	$(CC) $(CFLAGS) -o $@ $^

av-variance: av-variance.c
	$(CC) $(CFLAGS) -o $@ $< -lm

hello-openmp: hello-openmp.c
	$(CC_OPENMP) $(CFLAGS_OPENMP) -o $@ $<

multibrot-openmp: multibrot-openmp.c
	$(CC_OPENMP) $(CFLAGS_OPENMP) -o $@ $< -lm -lpng

mandelbrot-openmp: mandelbrot-openmp.c
	$(CC_OPENMP) $(CFLAGS_OPENMP) $(shell sdl-config --cflags) -o $@ $< $(shell sdl-config --libs) -lm

macros.txt:
	$(CC) -dM -E -x c /dev/null > $@