code := $(wildcard src/*)
test_directories := $(wildcard tests/*)
test_targets := $(addsuffix /pass,$(test_directories))
existing_passes := $(wildcard tests/*/pass)
out_files := $(wildcard tests/*/*.out)
out_files += $(wildcard tests/*/out.*)

.PHONY: help build run test clean

help: # Show help for each of the commented Makefile recipes.
	@grep -E '^[a-zA-Z0-9 -]+:.*#'  Makefile | sort | while read -r l; \
	do printf "\033[1;32m$$(echo $$l | cut -f 1 -d':')\033[00m:$$(echo $$l | cut -f 2- -d'#')\n"; done

tests/%/pass: $(code)
	cd $(patsubst %/pass,%/,$@) && $(MAKE)

build: $(code) # Builds your code alone (does not build not any unit tests).
	cd src && $(MAKE)

run: build # Runs your compiled main code (does not pass any args or std-io).
	./target/main.out

test: $(test_targets) # Runs test code, generating score logfiles. To run past failing tests, use: `make test --keep-going`
	@#$(MAKE) grade

clean: # Cleans up all the generated logfiles and outfiles.
	@rm -f $(test_targets)
	@rm -f $(out_files)
	@rm -rf .mypy_cache __pycache__ *.out *.o *.hi .gdb_history
	@rm -rf build/*
	@rm -rf target/*
	@rm -rf .admin_files/.mypy_cache .admin_files/__pycache__ .admin_files/*.hi .admin_files/*.o
	@rm -rf */.mypy_cache */__pycache__ */*.out */*.o */*.hi
	@rm -rf */*/.mypy_cache */*/__pycache__ */*/*.out */*/*.o */*/*.hi */*/.gdb_history