CC = clang AXL_SOURCES = $(filter-out main.c %_test.c, $(wildcard *.c)) TEST_EXES = $(patsubst %.c,%.exe,$(wildcard *_test.c)) TEST_CFLAGS = -Wall -Wextra -Werror -pedantic -std=c17 -static -Oz -fsigned-char MINIMAL_CFLAGS = -nostdlib -ffreestanding -fno-builtin -mno-stack-arg-probe \ -fno-stack-protector -fno-unwind-tables -fno-exceptions -fno-rtti \ -fno-asynchronous-unwind-tables -fno-ident LDFLAGS = -fuse-ld=lld -static \ -Wl,/SUBSYSTEM:CONSOLE \ -Wl,/ENTRY:_start \ -Wl,/OPT:NOICF \ -Wl,/OPT:NOREF \ -Wl,/NODEFAULTLIB \ -Wl,/MERGE:.rdata=.text LIBS = -lkernel32 SOURCES = $(AXL_SOURCES) main.c TARGET = prog.exe all: clean $(TARGET) %_test.exe: %_test.c $(CC) $(TEST_CFLAGS) $(AXL_SOURCES) $< -o $@ test: clean $(TEST_EXES) @echo "=== Running tests ===" @for %%i in ($(TEST_EXES)) do (echo ---- %%i ---- && %%i || exit /b 1) $(TARGET): $(SOURCES) $(CC) $(TEST_CFLAGS) $(MINIMAL_CFLAGS) $^ -o $@ $(LDFLAGS) $(LIBS) clean: -del /q *.exe *.o 2>nul .PHONY: all clean test