+# Makefile for the micro-crypt project
+# author: Daniel Otte
+
+BLOCK_CIPHERS :=
+STREAM_CIPHERS :=
+HASHES :=
+MACS :=
+PRNGS :=
+
+# we use the gnu make standard library
+include gmsl
+include avr-makefile.inc
+include mkfiles/*.mk
+
+ALGORITHMS = $(BLOCK_CIPHERS) $(STREAM_CIPHERS) $(HASHES) $(PRNGS) $(MACS)
+ALGORITHMS_OBJ = $(patsubst %,%_OBJ, $(ALGORITHMS))
+define OBJinBINDIR_TEMPLATE
+$(1) = $(2)
+endef
+$(foreach a, $(ALGORITHMS_OBJ), $(eval $(call OBJinBINDIR_TEMPLATE, $(a), $(patsubst %.o,$(BIN_DIR)%.o,$($(a))))))
+ALGORITHMS_TEST_BIN = $(patsubst %,%_TEST_BIN, $(ALGORITHMS))
+$(foreach a, $(ALGORITHMS_TEST_BIN), $(eval $(call OBJinBINDIR_TEMPLATE, $(a), $(patsubst %.o,$(BIN_DIR)%.o,$($(a))))))
+#ALGORITHMS_TEST_BIN_MAIN = $(foreach a, $(ALGORITHMS_TEST_BIN), $(firstword $($(a))))
+#ALGORITHMS_TEST_BIN_MAIN_ELF = $(patsubst $(BIN_DIR)%.o, $(TESTBIN_DIR)%.elf, $(ALGORITHMS_TEST_BIN_MAIN))
+#ALGORITHMS_TEST_BIN_MAIN_HEX = $(patsubst $(BIN_DIR)%.o, $(TESTBIN_DIR)%.hex, $(ALGORITHMS_TEST_BIN_MAIN))
+
+
+ALGORITHMS_TEST_BIN_IMM = $(foreach a, $(ALGORITHMS_TEST_BIN), $($(a)))
+ALGORITHMS_NESSIE_TEST = $(patsubst %,%_NESSIE_TEST, $(ALGORITHMS))
+ALGORITHMS_PERFORMANCE_TEST = $(patsubst %,%_PERORMANCE_TEST, $(ALGORITHMS))
+
+ALGORITHMS_LC = $(call lc,$(ALGORITHMS))
+
+ALGORITHMS_TEST_TARGET_ELF = $(patsubst %, $(TESTBIN_DIR)main-%-test.elf, $(ALGORITHMS_LC))
+ALGORITHMS_TEST_TARGET_HEX = $(patsubst %, $(TESTBIN_DIR)main-%-test.hex, $(ALGORITHMS_LC))
+
+
+#-------------------------------------------------------------------------------
+
+all: $(foreach algo, $(ALGORITHMS), $(algo)_OBJ)
+
+#-------------------------------------------------------------------------------
+
+define BLA_TEMPLATE2
+$(2): $(3)
+ @echo "[gcc]: $$@"
+# echo $$^
+ @$(CC) $(CFLAGS) $(LDFLAGS)$(patsubst %.elf,%.map,$(2)) -o \
+ $(2) \
+ $(3) \
+ $(LIBS)
+endef
+
+#$(foreach algo, $(ALGORITHMS), $(eval $(call BLA_TEMPLATE2, $(algo), $(patsubst $(BIN_DIR)%.o,$(TESTBIN_DIR)%.elf,$(firstword $($(algo)_TEST_BIN))), $(patsubst %.o,%.o,$($(algo)_TEST_BIN)) )))
+$(foreach algo, $(ALGORITHMS), $(eval $(call BLA_TEMPLATE2, $(algo), $(TESTBIN_DIR)main-$(call lc,$(algo))-test.elf, $(patsubst %.o,%.o,$($(algo)_TEST_BIN)) )))
+
+#-------------------------------------------------------------------------------
+.PHONY: help
+help: info
+
+info:
+ @echo "infos on micro-crypt:"
+ @echo " block ciphers:"
+ @echo " $(BLOCK_CIPHERS)"
+ @echo " stream ciphers:"
+ @echo " $(STREAM_CIPHERS)"
+ @echo " hash functions:"
+ @echo " $(HASHES)"
+ @echo " MAC functions:"
+ @echo " $(MACS)"
+ @echo " PRNG functions:"
+ @echo " $(PRNGS)"
+ @echo " ALGORITHMS_TEST_BIN:"
+ @echo " $(ALGORITHMS_TEST_BIN)"
+ @echo " ALGORITHMS_TEST_BIN_MAIN:"
+ @echo " $(ALGORITHMS_TEST_BIN_MAIN)"
+ @echo " ALGORITHMS_TEST_BIN_MAIN_ELF:"
+ @echo " $(ALGORITHMS_TEST_BIN_MAIN_ELF)"
+ @echo " ALGORITHMS_TEST_BIN_MAIN_HEX:"
+ @echo " $(ALGORITHMS_TEST_BIN_MAIN_HEX)"
+ @echo " ALGORITHMS_TEST_TARGET_ELF:"
+ @echo " $(ALGORITHMS_TEST_TARGET_ELF)"
+
+
+$(BIN_DIR)%.o: %.c
+ @echo "[gcc]: $@"
+ @$(CC) $(CFLAGS) -c -o $@ $<
+
+$(BIN_DIR)%.o: %.S
+ @echo "[as] : $@"
+ @$(CC) $(ASFLAGS) -c -o $@ $<
+
+%.o: %.c
+ @echo "[gcc]: $@"
+ @$(CC) $(CFLAGS) -c -o $@ $<
+
+%.o: %.S
+ @echo "[as] : $@"
+ @$(CC) $(ASFLAGS) -c -o $@ $<
+
+
+.PHONY: cores
+cores: $(ALGORITHMS_OBJ)
+
+.PHONY: blockciphers
+blockciphers: $(patsubst %, %_OBJ, $(BLOCK_CIPHERS))