# Directories
SRC_DIR := src
OBJ_DIR := objs

# Common flags
CFLAGS_COMMON  := -Wall -Werror -pthread
CFLAGS_RELEASE := -O3 -g0
CFLAGS_DEBUG   := -O0 -g
DEFINES        := -DGETRANDOM -DARG_REPLACE_GETOPT=0

LDFLAGS_COMMON := -lm
LDFLAGS_RELEASE := -s

# Default build flags (can be overridden from the command line)
CFLAGS  ?= $(CFLAGS_COMMON) $(CFLAGS_RELEASE) $(DEFINES)
LDFLAGS ?= $(LDFLAGS_COMMON) $(LDFLAGS_RELEASE)

# Source lists
LIB_SOURCES := \
	argtable3.c \
	base64.c \
	binhex.c \
	curve25519.c \
	inexact.c \
	norx_inexact.c \
	sha3.c \
	tests.c \
	readpassphrase.c \
	randombytes.c \
	chacha20_drng.c \
	blake2.c

ARGON2_SOURCES := \
	argon2.c \
	argon2-core.c \
	argon2-thread.c \
	argon2-encoding.c \
	argon2-impl-select.c \
	argon2-arch.c

MAIN_SOURCE := main.c

# Derived paths
LIB_SRCS     := $(addprefix $(SRC_DIR)/,$(LIB_SOURCES))
LIB_OBJS     := $(addprefix $(OBJ_DIR)/,$(LIB_SOURCES:.c=.o))
ARGON2_SRCS  := $(addprefix $(SRC_DIR)/,$(ARGON2_SOURCES))
MAIN_SRC     := $(addprefix $(SRC_DIR)/,$(MAIN_SOURCE))

# Phony targets
.PHONY: all default release debug clean

# Default target
all: inexact
default: inexact
release: inexact

# Debug build: override flags for this target only
debug: CFLAGS  := $(CFLAGS_COMMON) $(CFLAGS_DEBUG) $(DEFINES)
debug: LDFLAGS := $(LDFLAGS_COMMON)
debug: inexact

# Link final binary
inexact: $(LIB_OBJS) $(ARGON2_SRCS) $(MAIN_SRC)
	$(CC) $(CFLAGS) $(ARGON2_SRCS) $(MAIN_SRC) $(LIB_OBJS) -o $@ $(LDFLAGS)

# Ensure object directory exists
$(OBJ_DIR):
	mkdir -p $(OBJ_DIR)

# Generic rule to build objects from src/*.c into objs/*.o
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c | $(OBJ_DIR)
	$(CC) $(CFLAGS) -c $< -o $@

# Cleanup
clean:
	-$(RM) $(LIB_OBJS)
	-$(RM) inexact inexact.exe
