all: KeccakReference KeccakOptimized32 KeccakOptimized64

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/mainOptimized.c \
    Sources/timing.c

SOURCES_OPTIMIZED_32 = \
    $(SOURCES_OPTIMIZED) \
    Sources/KeccakPermutationOptimized32.c

SOURCES_OPTIMIZED_64 = \
    $(SOURCES_OPTIMIZED) \
    Sources/KeccakPermutationOptimized64.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 \
    Sources/brg_endian.h \
    Sources/KeccakPermutationOptimized.macros

HEADERS_OPTIMIZED_32 = \
    $(HEADERS_OPTIMIZED) \
    Sources/KeccakOpt32-settings.h \
    Sources/KeccakF-1600-32.macros

HEADERS_OPTIMIZED_64 = \
    $(HEADERS_OPTIMIZED) \
    Sources/KeccakOpt64-settings.h \
    Sources/KeccakF-1600-64.macros \
    Sources/KeccakF-1600-simd64.macros \
    Sources/KeccakF-1600-simd128.macros

BINDIR_REFERENCE = bin/reference

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

BINDIR_OPTIMIZED_32 = bin/optimized32

$(BINDIR_OPTIMIZED_32):
	mkdir -p $(BINDIR_OPTIMIZED_32)

BINDIR_OPTIMIZED_64 = bin/optimized64

$(BINDIR_OPTIMIZED_64):
	mkdir -p $(BINDIR_OPTIMIZED_64)

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

OBJECTS_OPTIMIZED_32 = $(addprefix $(BINDIR_OPTIMIZED_32)/, $(notdir $(patsubst %.c,%.o,$(SOURCES_OPTIMIZED_32))))

OBJECTS_OPTIMIZED_64 = $(addprefix $(BINDIR_OPTIMIZED_64)/, $(notdir $(patsubst %.c,%.o,$(SOURCES_OPTIMIZED_64))))

CC = gcc
#CC = icc

CFLAGS_REFERENCE = -DKeccakReference

CFLAGS_OPTIMIZED_32 = -fomit-frame-pointer -O3 -g0 -march=nocona -m32
#CFLAGS_OPTIMIZED_32 = -m32 -O3 -static

CFLAGS_OPTIMIZED_64 = -fomit-frame-pointer -O3 -g0 -march=nocona
#CFLAGS_OPTIMIZED_64 = -fomit-frame-pointer -O3 -g0 -march=barcelona -m32
#CFLAGS_OPTIMIZED_64 = -m64 -O3 -static

VPATH = Sources

INCLUDES = -ISources

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

$(BINDIR_OPTIMIZED_32)/%.o:%.c $(HEADERS_OPTIMIZED_32)
	$(CC) $(INCLUDES) $(CFLAGS_OPTIMIZED_32) -c $< -o $@

$(BINDIR_OPTIMIZED_64)/%.o:%.c $(HEADERS_OPTIMIZED_64)
	$(CC) $(INCLUDES) $(CFLAGS_OPTIMIZED_64) -c $< -o $@

.PHONY: KeccakReference KeccakOptimized32 KeccakOptimized64

KeccakReference: bin/KeccakReference

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

KeccakOptimized32: bin/KeccakOptimized32

bin/KeccakOptimized32:  $(BINDIR_OPTIMIZED_32) $(OBJECTS_OPTIMIZED_32)  $(HEADERS_OPTIMIZED_32)
	$(CC) $(CFLAGS_OPTIMIZED_32) -o $@ $(OBJECTS_OPTIMIZED_32)

KeccakOptimized64: bin/KeccakOptimized64

bin/KeccakOptimized64:  $(BINDIR_OPTIMIZED_64) $(OBJECTS_OPTIMIZED_64)  $(HEADERS_OPTIMIZED_64)
	$(CC) $(CFLAGS_OPTIMIZED_64) -o $@ $(OBJECTS_OPTIMIZED_64)

.PHONY: clean

clean:
	rm -rf bin/

.PHONY: eBASH

eBASH:
	$(MAKE) -C eBash eBASH
