
# Simple bulk build for all OpenMP C programs in this folder
# Usage:
#   make          # builds all executables into ./bin
#   make clean    # removes ./bin and intermediate files
#
# Customize compiler / flags via environment, e.g.:
#   make CC=clang CFLAGS='-O3 -fopenmp -march=native'

# Compiler and flags (override from env if you like)
CC      ?= gcc
CSTD    ?= -std=c11
OMPFLAG ?= -fopenmp
CFLAGS  ?= -O3 $(CSTD) $(OMPFLAG) -Wall -Wextra -Wno-uninitialized -Wno-unused-parameter
LDFLAGS ?=
LDLIBS  ?= -lm

# --- Graphics (gfx.h/gfx.c) detection ---
GFXSRC   ?= gfx.c
GFXFLAGS ?= -lX11
# Programs known to require gfx.h
GFX_PROG_NAMES := omp-mandelbrot omp-mandelbrot2
GFX_PROGS := $(addprefix bin/,$(GFX_PROG_NAMES))

# Sources = all .c files in this directory
#SRCS := $(wildcard *.c)
SRCS := $(filter-out $(GFXSRC),$(wildcard *.c))
# All programs if we compiled each source with the generic rule
ALL_PROGS := $(patsubst %.c,bin/%,$(SRCS))

# Detect presence of gfx.c
ifeq ($(wildcard $(GFXSRC)),)
  HAVE_GFX := 0
else
  HAVE_GFX := 1
endif

# Final list of programs to build:
# - If gfx.c is present, include everything
# - Otherwise, exclude gfx-based programs so 'make' still succeeds
ifeq ($(HAVE_GFX),1)
  PROGS := $(ALL_PROGS)
else
  PROGS := $(filter-out $(GFX_PROGS),$(ALL_PROGS))
endif

# Default target
.PHONY: all
all: $(BINDIR) $(PROGS)
ifeq ($(HAVE_GFX),0)
	@echo "Note: $(GFXSRC) not found -> skipping: $(GFX_PROG_NAMES)"
	@echo "      Drop $(GFXSRC) next to the sources and 'sudo dnf install libX11-devel' to enable."
endif

# Executable directory
BINDIR := bin
$(BINDIR):
	mkdir -p $(BINDIR)

# Generic build rule
$(BINDIR)/%: %.c | $(BINDIR)
	$(CC) $(CFLAGS) $< -o $@ $(LDFLAGS) $(LDLIBS)

# --- Special rules for gfx-based programs (override generic) ---
ifeq ($(HAVE_GFX),1)
$(BINDIR)/omp-mandelbrot: omp-mandelbrot.c $(GFXSRC) | $(BINDIR)
	$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS) $(LDLIBS) $(GFXFLAGS)

$(BINDIR)/omp-mandelbrot2: omp-mandelbrot2.c $(GFXSRC) | $(BINDIR)
	$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS) $(LDLIBS) $(GFXFLAGS)

$(BINDIR)/omp-mandelbrot-unordered: omp-mandelbrot-unordered.c $(GFXSRC) | $(BINDIR)
	$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS) $(LDLIBS) $(GFXFLAGS)
endif

# Convenience: list programs
.PHONY: list
list:
	@echo "Programs to build:"
	@for p in $(PROGS); do echo "  $$p"; done
ifeq ($(HAVE_GFX),0)
	@echo ""
	@echo "Skipped (missing $(GFXSRC)):"
	@for n in $(GFX_PROG_NAMES); do echo "  bin/$$n"; done
endif

# Clean targets
.PHONY: clean distclean
clean:
	$(RM) -r $(BINDIR)
	$(RM) *.o

distclean: clean
	$(RM) -r .cache

# Print variables (debug)
.PHONY: vars
vars:
	@echo "CC=$(CC)"
	@echo "CFLAGS=$(CFLAGS)"
	@echo "LDFLAGS=$(LDFLAGS)"
	@echo "LDLIBS=$(LDLIBS)"
	@echo "SRCS=$(SRCS)"
	@echo "ALL_PROGS=$(ALL_PROGS)"
	@echo "PROGS=$(PROGS)"
	@echo "HAVE_GFX=$(HAVE_GFX)"
	@echo "GFXSRC=$(GFXSRC)"
