MKDIR = if not exist $1 mkdir $1
RMDIR = if exist $1 rd /S /Q $1

CRYSTAL := ../bin/crystal# Crystal compiler to use
O := .build# Output directory

BUILDABLE_SOURCES := $(wildcard *.cr llvm/*.cr compiler/*.cr)
NONLINK_SOURCES := $(wildcard sdl/*.cr)

BUILDABLE_BINARIES := $(patsubst %.cr,$(O)/%.exe,$(BUILDABLE_SOURCES))
NONLINK_BINARIES := $(patsubst %.cr,$(O)/%.obj,$(NONLINK_SOURCES))

.PHONY: all
all: build

.PHONY: build
build: $(BUILDABLE_BINARIES) $(NONLINK_BINARIES) ## Build sample binaries

$(O)/%.exe: %.cr
	$(call MKDIR,"$(dir $@)")
	$(CRYSTAL) build "$<" -o "$@"

$(O)/%.obj: %.cr
	$(call MKDIR,"$(dir $@)")
	$(CRYSTAL) build --cross-compile "$<" -o "$(patsubst %.obj,%,$@)"

.PHONY: clean
clean: ## Remove build artifacts
	$(call RMDIR,"$(O)")

.PHONY: help
help: ## Show this help
	@setlocal EnableDelayedExpansion &\
	echo. &\
	echo targets: &\
	(for /F "usebackq tokens=1* delims=:" %%g in ($(MAKEFILE_LIST)) do (\
		if not "%%h" == "" (\
			set "_line=%%g                " &\
			set "_rest=%%h" &\
			set "_comment=!_rest:* ## =!" &\
			if not "!_comment!" == "!_rest!"\
				if "!_line:_rest=!" == "!_line!"\
					echo   !_line:~0,16!!_comment!\
		)\
	)) &\
	echo. &\
	echo optional variables: &\
	(for /F "usebackq tokens=1,3 delims=?#" %%g in ($(MAKEFILE_LIST)) do (\
		if not "%%h" == "" (\
			set "_var=%%g              " &\
			echo   !_var:~0,14! %%h\
		)\
	)) &\
	echo. &\
	echo recipes: &\
	(for /F "usebackq tokens=* delims=" %%g in ($(MAKEFILE_LIST)) do (\
		set "_line=%%g" &\
		if "!_line:~0,7!" == "##   $$ " (\
			echo !_name! &\
			echo  !_line:~2!\
		) else if "!_line:~0,3!" == "## "\
			set "_name=  !_line:~3!"\
	))
