-include config.mk

CC       ?= gcc
SRC_ROOT = .
BIN_DIR  = bin

EXCLUDE_DIRS = ./euler ./mcu
EXCLUDE_EXPR := $(foreach d,$(EXCLUDE_DIRS),-path $(d) -prune -o)

C_SRC := $(shell find $(SRC_ROOT) $(EXCLUDE_EXPR) -type f -name '*.c' -print)
C_TARGETS = $(patsubst %.c,$(BIN_DIR)/%,$(notdir $(C_SRC)))

UNAME_M := $(shell uname -m)

ifeq ($(UNAME_M),aarch64)
	GCC_TARGET = -march=armv8-a
else ifeq ($(UNAME_M),arm64)
	GCC_TARGET = -march=armv8-a
else ifeq ($(UNAME_M),armv7l)
	GCC_TARGET = -march=armv7-a
else ifeq ($(UNAME_M),x86_64)
	GCC_TARGET = -march=x86-64
else
	$(error Unsupported architecture: $(UNAME_M))
endif

X11_HEADER := /usr/local/include/X11/Xlib.h
HAVE_X11  := $(if $(wildcard $(X11_HEADER)),1,0)

STD_FLAG := $(shell echo "int main(){}" | $(CC) -x c -std=c23 -o /dev/null - 2>/dev/null && echo -std=c23 || echo -std=c2x)

CFLAGS = -O2 -Wall -Wextra -s $(STD_FLAG) $(GCC_TARGET) -D_GNU_SOURCE

all: $(C_TARGETS)

$(BIN_DIR)/%:
	@mkdir -p $(BIN_DIR)
	@SRC=$(filter %/$*.c,$(C_SRC)); \
	LIBS="$(LIBS_$*)"; \
	CFLAGS_PER_FILE="$(CFLAGS_$*)"; \
	if [ "$(HAVE_X11)" -eq 0 ] && grep -q "<X11/Xlib.h" "$$SRC"; then \
		echo "Skipping $* (X11 not available)"; \
	else \
		echo "Building $*"; \
		$(CC) $(CFLAGS) $$CFLAGS_PER_FILE $$SRC -o $@ $$LIBS; \
	fi

clean:
	rm -f $(BIN_DIR)/*
