all: KeccakReference KeccakOptimized

SOURCES_COMMON = \
    Sources/genKAT.c \
    Sources/KeccakSponge.c

SOURCES_REFERENCE = \
    $(SOURCES_COMMON) \
    Sources/displayIntermediateValues.c \
    Sources/KeccakPermutationReference.c \
    Sources/mainReference.c

SOURCES_OPTIMIZED = \
    $(SOURCES_COMMON) \
    Sources/KeccakPermutationOptimized.c \
    Sources/mainOptimized.c \
    Sources/timing.c

HEADERS_COMMON = \
    Sources/KeccakNISTInterface.h \
    Sources/KeccakPermutationInterface.h

HEADERS_REFERENCE = \
    $(HEADERS_COMMON) \
    Sources/displayIntermediateValues.h \
    Sources/KeccakPermutationReference.h

HEADERS_OPTIMIZED = \
    $(HEADERS_COMMON) \
    Sources/timing.h

BINDIR_REFERENCE = bin/reference

$(BINDIR_REFERENCE):
	mkdir -p $(BINDIR_REFERENCE)

BINDIR_OPTIMIZED = bin/optimized

$(BINDIR_OPTIMIZED):
	mkdir -p $(BINDIR_OPTIMIZED)

OBJECTS_REFERENCE = $(addprefix $(BINDIR_REFERENCE)/, $(notdir $(patsubst %.c,%.o,$(SOURCES_REFERENCE))))

OBJECTS_OPTIMIZED = $(addprefix $(BINDIR_OPTIMIZED)/, $(notdir $(patsubst %.c,%.o,$(SOURCES_OPTIMIZED))))

CFLAGS_REFERENCE =

CFLAGS_OPTIMIZED = -save-temps -O3 -g0 -march=nocona

VPATH = Sources

INCLUDES = -ISources

$(BINDIR_REFERENCE)/%.o:%.c $(HEADERS_REFERENCE)
	$(CC) $(INCLUDES) $(CFLAGS_REFERENCE) -c $< -o $@

$(BINDIR_OPTIMIZED)/%.o:%.c $(HEADERS_OPTIMIZED)
	$(CC) $(INCLUDES) $(CFLAGS_OPTIMIZED) -c $< -o $@

.PHONY: KeccakReference KeccakOptimized

KeccakReference: bin/KeccakReference

bin/KeccakReference:  $(BINDIR_REFERENCE) $(OBJECTS_REFERENCE)  $(HEADERS_REFERENCE)
	$(CC) $(CFLAGS_REFERENCE) -o $@ $(OBJECTS_REFERENCE)

KeccakOptimized: bin/KeccakOptimized

bin/KeccakOptimized:  $(BINDIR_OPTIMIZED) $(OBJECTS_OPTIMIZED)  $(HEADERS_OPTIMIZED)
	$(CC) $(CFLAGS_OPTIMIZED) -o $@ $(OBJECTS_OPTIMIZED)

clean:
	rm -rf bin/
