SRC_DIR         := src
BUILD_DIR       := build

SRC             := $(shell find $(SRC_DIR) -name '*.c')

OBJ             := $(SRC:$(SRC_DIR)/%.c=$(BUILD_DIR)/%.o)
DEP             := $(OBJ:.o=.d)

LC_ALL          := C
CC              ?= gcc
LD              := $(CC)
PKG_CONFIG      ?= pkg-config
CCACHE          ?= ccache
RM              ?= rm -f
STD             := gnu23

DEBUG           ?= 1
STATIC          ?= 0
PKGS            := iup
TOOLS           := $(CC) $(LD) $(PKG_CONFIG) $(CCACHE)

CPPFLAGS         = -I$(SRC_DIR) $(shell $(PKG_CONFIG) --cflags $(PKGS) 2>/dev/null)
CFLAGS          := -std=$(STD) -Werror -Wextra -Wall -MMD -MP
LDLIBS           = $(shell $(PKG_CONFIG) --libs $(PKGS) 2>/dev/null)
LDFLAGS         ?=

TARGET          := docman

ifeq ($(STATIC),1)
	LDFLAGS += -static
	LDLIBS   = $(shell $(PKG_CONFIG) --static --libs $(PKGS) 2>/dev/null || $(PKG_CONFIG) --libs $(PKGS) 2>/dev/null)
else
	LDLIBS   = $(shell $(PKG_CONFIG) --libs $(PKGS) 2>/dev/null)
endif

ifeq ($(DEBUG),1)
	CFLAGS  += -g -DDEBUG
	LDFLAGS   += -g
else
	CFLAGS  += -O2 -DNDEBUG
endif

.DELETE_ON_ERROR:
.PHONY: all check-tools check-libs clean format
all: $(TARGET)

$(OBJ): | check-libs

$(TARGET): $(OBJ)
	$(LD) $^ -o $@ $(LDFLAGS) $(LDLIBS)

$(BUILD_DIR)/%.o: $(SRC_DIR)/%.c
	mkdir -p $(dir $@)
	$(CCACHE) $(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@

check-tools:
	@for t in $(TOOLS); do \
		if path=$$(command -v $$t); then \
			printf "Found tool: %-12s %s\n" "$$t" "$$path"; \
		else \
			printf "Error: missing tool %-12s\n" "$$t"; \
			exit 1; \
		fi; \
	done
	@echo "All required tools found"

check-libs: check-tools
	@for lib in $(PKGS); do \
		if $(PKG_CONFIG) --exists $$lib; then \
			ver=$$($(PKG_CONFIG) --modversion $$lib); \
			printf "Found library: %-12s %s\n" "$$lib" "$$ver"; \
		else \
			printf "Error: library  %-12s not found\n" "$$lib"; \
			exit 1; \
		fi; \
	done
	@echo "All required libraries found. Building"

clean:
	$(RM) -r $(BUILD_DIR) $(TARGET) perf.data* massif.out*

format:
	@if command -v indent >/dev/null 2>&1; then \
		find $(SRC_DIR) -type f \( -name '*.c' -o -name '*.h' \) \
			-exec sh -c 'tmp=$$(mktemp) || tmp=/tmp/indent.$$$$; \
					indent -gnu "$$1" -o "$$tmp" && mv "$$tmp" "$$1"' _ {} \; ; \
	else \
		printf "GNU indent missing, cannot format code\n"; \
		exit 1; \
	fi


-include $(DEP)

