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)