# Makefile for LinuxCNC Tool Database C Programs

CC = gcc
CFLAGS = -Wall -Wextra -O2 -pthread

# Static linking configuration
# NOTE:
#   - The daemon (db_tool) is ALWAYS statically linked for portability
#   - GTK3 apps use dynamic linking by default (static GTK3 libs rarely available)
#   - To force static GTK linking: make STATIC_GTK=1 (requires static GTK libs)

# Daemon always uses static linking
DAEMON_LDFLAGS = -static -pthread -lm

# GTK apps default to dynamic linking (more compatible)
STATIC_GTK ?= 0

ifeq ($(STATIC_GTK),1)
    # Try static linking for GTK (may fail if static libs not available)
    GTK_LDFLAGS = -static -pthread -lm
    GTK_CFLAGS = $(shell pkg-config --cflags gtk+-3.0 2>/dev/null || echo "")
    GTK_LIBS = $(shell pkg-config --libs --static gtk+-3.0 2>/dev/null || echo "-lgtk-3 -lgdk-3 -lglib-2.0")
else
    # Dynamic linking for GTK (recommended)
    GTK_LDFLAGS = -pthread -lm
    GTK_CFLAGS = $(shell pkg-config --cflags gtk+-3.0 2>/dev/null || echo "")
    GTK_LIBS = $(shell pkg-config --libs gtk+-3.0 2>/dev/null || echo "-lgtk-3 -lgdk-3 -lglib-2.0")
endif

# Legacy STATIC variable for backwards compatibility
ifdef STATIC
    STATIC_GTK = $(STATIC)
endif

TARGET = db_tool
MONITOR = db_tool_monitor
MANAGER = db_tool_manager

.PHONY: all clean test help static dynamic

# Build all three programs by default
all: $(TARGET) $(MONITOR) $(MANAGER)
	@echo ""
	@echo "========================================="
	@echo "Build complete!"
	@echo "  - Daemon (db_tool): STATIC linking"
	@if [ "$(STATIC_GTK)" = "1" ]; then \
		echo "  - GUI apps: STATIC linking (experimental)"; \
	else \
		echo "  - GUI apps: DYNAMIC linking (recommended)"; \
	fi
	@echo "========================================="
	@echo ""
	@echo "Verify static linking:"
	@echo "  file $(TARGET)     # Should show 'statically linked'"
	@echo "  ldd $(TARGET)      # Should say 'not a dynamic executable'"
	@echo ""

# Convenience targets
all-static:
	$(MAKE) STATIC_GTK=1

all-dynamic:
	$(MAKE) STATIC_GTK=0

help:
	@echo "LinuxCNC Tool Database - Build Options"
	@echo ""
	@echo "Targets:"
	@echo "  make              - Build all (daemon static, GUI dynamic)"
	@echo "  make all-static   - Build all with static linking (needs static GTK libs)"
	@echo "  make all-dynamic  - Build all with dynamic linking"
	@echo "  make clean        - Remove all binaries"
	@echo "  make install      - Install to /usr/local/bin"
	@echo "  make test         - Run standalone test"
	@echo ""
	@echo "Options:"
	@echo "  STATIC_GTK=1      - Enable static linking for GTK apps (needs static libs)"
	@echo "  STATIC_GTK=0      - Use dynamic linking for GTK apps (default, recommended)"
	@echo ""
	@echo "Examples:"
	@echo "  make                    - Normal build (daemon static, GUI dynamic)"
	@echo "  make STATIC_GTK=1       - Try to build everything static"
	@echo "  make clean all          - Clean rebuild"
	@echo ""
	@echo "Note: The daemon (db_tool) is ALWAYS statically linked."
	@echo "      GTK apps default to dynamic linking (static GTK libs rare)."

# Build db_tool (main daemon) - ALWAYS with static linking
$(TARGET): db_tool.c
	@echo "Building $(TARGET) (daemon) with STATIC linking..."
	$(CC) $(CFLAGS) -o $(TARGET) db_tool.c $(DAEMON_LDFLAGS)
	@echo "  -> $(TARGET) built successfully (statically linked)"

# Build db_tool_monitor (unified GUI with viewing and editing)
# This now builds db_tool_manager.c but outputs as db_tool_monitor for compatibility
$(MONITOR): db_tool_manager.c
	@if pkg-config --exists gtk+-3.0; then \
		if [ "$(STATIC_GTK)" = "1" ]; then \
			echo "Building $(MONITOR) (GUI) with STATIC linking..."; \
		else \
			echo "Building $(MONITOR) (GUI) with DYNAMIC linking..."; \
		fi; \
		$(CC) $(CFLAGS) $(GTK_CFLAGS) -o $(MONITOR) db_tool_manager.c $(GTK_LIBS) $(GTK_LDFLAGS); \
		echo "  -> $(MONITOR) built successfully"; \
	else \
		echo "WARNING: GTK3 not found. Skipping GUI build."; \
		echo "Install GTK3: sudo apt-get install libgtk-3-dev"; \
	fi

# Build standalone db_tool_manager (same as monitor, just different name)
$(MANAGER): db_tool_manager.c
	@if pkg-config --exists gtk+-3.0; then \
		if [ "$(STATIC_GTK)" = "1" ]; then \
			echo "Building $(MANAGER) (GUI) with STATIC linking..."; \
		else \
			echo "Building $(MANAGER) (GUI) with DYNAMIC linking..."; \
		fi; \
		$(CC) $(CFLAGS) $(GTK_CFLAGS) -o $(MANAGER) db_tool_manager.c $(GTK_LIBS) $(GTK_LDFLAGS); \
		echo "  -> $(MANAGER) built successfully"; \
	else \
		echo "WARNING: GTK3 not found. Skipping GUI build."; \
		echo "Install GTK3: sudo apt-get install libgtk-3-dev"; \
	fi

clean:
	rm -f $(TARGET) $(MONITOR) $(MANAGER) /tmp/db_tool_file /tmp/db_c_test_file

# Test the program standalone (without LinuxCNC)
test: $(TARGET)
	@echo "Testing db_tool standalone..."
	@echo "Type commands: g (get), p T10 P110 Z1.5 (put), l T10 P0 (load), u T0 P110 (unload)"
	@echo "Press Ctrl-C to exit"
	./$(TARGET) --period 0.1 /tmp/db_c_test_file

install: $(TARGET) $(MONITOR) $(MANAGER)
	@echo "Installing to /usr/local/bin/..."
	sudo cp $(TARGET) /usr/local/bin/
	sudo cp $(MONITOR) /usr/local/bin/
	sudo cp $(MANAGER) /usr/local/bin/
	sudo chmod 755 /usr/local/bin/$(TARGET)
	sudo chmod 755 /usr/local/bin/$(MONITOR)
	sudo chmod 755 /usr/local/bin/$(MANAGER)
	@echo ""
	@echo "Installation complete!"
	@echo "  - /usr/local/bin/$(TARGET) (LinuxCNC daemon)"
	@echo "  - /usr/local/bin/$(MONITOR) (read-only monitor)"
	@echo "  - /usr/local/bin/$(MANAGER) (full editor GUI)"
	@echo ""
	@echo "Now configure your LinuxCNC INI file:"
	@echo "  [EMCIO]"
	@echo "  DB_PROGRAM = db_tool /path/to/your/tool_database.dat"
	@echo ""
	@echo "The GUI will launch automatically when LinuxCNC starts."
