source = violet.c

ifeq ($(OSTYPE),cygwin)
# Note that MingW produced executables will not pass tests due to end
# of line differences, which is why we are still using gcc on cygwin.
#
# Also, MingW appears to have strange behavior with pipes.
# https://github.com/mintty/mintty/issues/56
eext = .exe

# Address sanitizer is not supported on cygwin.
# https://clang.llvm.org/docs/AddressSanitizer.html#supported-platforms
test_targets = \
	test_passed.gcc90 \
	test_passed.gcc99 \
	test_passed.gcc11 \
	test_passed.clang90 \
	test_passed.clang99 \
	test_passed.clang11
else
eext =
test_targets = \
	test_passed.gcc90 \
	test_passed.gcc99 \
	test_passed.gcc11 \
	test_passed.clang90 \
	test_passed.clang99 \
	test_passed.clang11 \
	test_passed.asan
endif
cflags = -pedantic -O3 -Wall -Werror

test: $(test_targets)
	@echo "All OK"

test_passed.gcc90: violet_gcc90$(eext) test.sh
	./test.sh $<
	touch $@

test_passed.gcc99: violet_gcc99$(eext) test.sh
	./test.sh $<
	touch $@

test_passed.gcc11: violet_gcc11$(eext) test.sh
	./test.sh $<
	touch $@

test_passed.clang90: violet_clang90$(eext) test.sh
	./test.sh $<
	touch $@

test_passed.clang99: violet_clang99$(eext) test.sh
	./test.sh $<
	touch $@

test_passed.clang11: violet_clang11$(eext) test.sh
	./test.sh $<
	touch $@

test_passed.asan: violet_asan$(eext) test.sh
	./test.sh $<
	touch $@

violet_gcc90$(eext): $(source)
	gcc -std=c90 $(cflags) $< -o $@

violet_gcc99$(eext): $(source)
	gcc -std=c99 $(cflags) $< -o $@

violet_gcc11$(eext): $(source)
	gcc -std=c11 $(cflags) $< -o $@

violet_clang90$(eext): $(source)
	clang -std=c90 $(cflags) $< -o $@

violet_clang99$(eext): $(source)
	clang -std=c99 $(cflags) $< -o $@

violet_clang11$(eext): $(source)
	clang -std=c11 $(cflags) $< -o $@

violet_asan$(eext): $(source)
	clang -g -fsanitize=address $(cflags) $< -o $@

reassemble$(eext): reassemble.cc
	g++ $(cflags) $< -o $@


clean:
	-rm -f violet_gcc90$(eext) violet_gcc99$(eext) violet_gcc11$(eext) violet_clang90$(eext) violet_clang99$(eext) violet_clang11$(eext) violet_asan$(eext) reassemble$(eext) test_passed.*

backup:
	-rm -f backup.tar.gz
	tar cf backup.tar *.c *.cc *.pl *.rb *.sh test_*.txt *.log Makefile ioccc/* edit.html
	gzip -9 backup.tar
