diff --git a/Makefile b/Makefile index df86b27..072d9e3 100644 --- a/Makefile +++ b/Makefile @@ -1,54 +1,77 @@ -CFLAGS=-Wall -Werror -pthread -O3 -g0 -CFLAGS += -DGETRANDOM -DARG_REPLACE_GETOPT=0 -LDFLAGS=-lm -s +# 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: CFLAGS=-Wall -Werror -pthread -O0 -g -debug: CFLAGS += -DGETRANDOM -DARG_REPLACE_GETOPT=0 -debug: LDFLAGS=-lm +# Debug build: override flags for this target only +debug: CFLAGS := $(CFLAGS_COMMON) $(CFLAGS_DEBUG) $(DEFINES) +debug: LDFLAGS := $(LDFLAGS_COMMON) debug: inexact -argtable3.o: src/argtable3.c - mkdir -p objs - $(CC) $(CFLAGS) -c src/argtable3.c -o objs/argtable3.o +# Link final binary +inexact: $(LIB_OBJS) $(ARGON2_SRCS) $(MAIN_SRC) + $(CC) $(CFLAGS) $(ARGON2_SRCS) $(MAIN_SRC) $(LIB_OBJS) -o $@ $(LDFLAGS) -base64.o: src/base64.c - $(CC) $(CFLAGS) -c src/base64.c -o objs/base64.o +# Ensure object directory exists +$(OBJ_DIR): + mkdir -p $(OBJ_DIR) -binhex.o: src/binhex.c - $(CC) $(CFLAGS) -c src/binhex.c -o objs/binhex.o - -curve25519.o: src/curve25519.c - $(CC) $(CFLAGS) -c src/curve25519.c -o objs/curve25519.o - -inexact.o: src/inexact.c - $(CC) $(CFLAGS) -c src/inexact.c -o objs/inexact.o - -norx_inexact.o: src/norx_inexact.c - $(CC) $(CFLAGS) -c src/norx_inexact.c -o objs/norx_inexact.o - -sha3.o: src/sha3.c - $(CC) $(CFLAGS) -c src/sha3.c -o objs/sha3.o - -tests.o: src/tests.c - $(CC) $(CFLAGS) -c src/tests.c -o objs/tests.o - -readpassphrase.o: src/readpassphrase.c - $(CC) $(CFLAGS) -c src/readpassphrase.c -o objs/readpassphrase.o - -randombytes.o: src/randombytes.c - $(CC) $(CFLAGS) -c src/randombytes.c -o objs/randombytes.o - -chacha20_drng.o: src/chacha20_drng.c - $(CC) $(CFLAGS) -c src/chacha20_drng.c -o objs/chacha20_drng.o - -blake2.o: src/blake2.c - $(CC) $(CFLAGS) -c src/blake2.c -o objs/blake2.o - -inexact: src/main.c argtable3.o base64.o binhex.o curve25519.o inexact.o norx_inexact.o sha3.o tests.o readpassphrase.o chacha20_drng.o randombytes.o blake2.o - $(CC) $(CFLAGS) src/argon2.c src/argon2-core.c src/argon2-thread.c src/argon2-encoding.c src/argon2-impl-select.c src/argon2-arch.c src/main.c objs/argtable3.o objs/base64.o objs/binhex.o objs/curve25519.o objs/inexact.o objs/norx_inexact.o objs/sha3.o objs/tests.o objs/readpassphrase.o objs/randombytes.o objs/chacha20_drng.o objs/blake2.o -o inexact $(LDFLAGS) +# 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 objs/*.o - -rm -f inexact inexact.exe + -$(RM) $(LIB_OBJS) + -$(RM) inexact inexact.exe