# MAKEFILE FOR MICROSOFT VISUAL C++
SRC       = .
OS        = win64_vc
#
CC        = CL
RC        = RC
LINK      = LINK
#
CFLAGS    = /nologo /W3 /O2 /Ox /D "NDEBUG" -I$(SRC)
#
DEFS      = -DWIN64  -DASM -D_CRT_SECURE_NO_WARNINGS
#
ALGO      = mars
CIPHER    = cipher
TESTVK    = testvk
TESTVT    = testvt
BENCH     = bench
TEST      = test
DIFF      = comp
RM        = del
#
ALIBS     = LIBCMT.LIB $(ALGO).LIB
DLIBS     = LIBCMT.LIB
#
LINKA     = $(LINK) $(ALIBS) /NOLOGO /RELEASE /SUBSYSTEM:CONSOLE /MACHINE:X64
#
all: $(TESTVK) $(TESTVT) $(CIPHER) $(BENCH) $(TEST)
#

$(TESTVK): $@.obj $(ALGO).lib
	@echo Building $@
	@$(LINKA) /OUT:$@.exe $@.obj

$(TESTVK).obj:  $(SRC)\$(TESTVK).c  $(SRC)\$(ALGO).h
	@$(CC) $(CFLAGS) $(DEFS) /Fo$@ /c $(SRC)\$(TESTVK).c

$(TESTVT): $(TESTVT).obj $(ALGO).lib
	@echo Building $@
	@$(LINKA) /OUT:$@.exe $@.obj

$(TESTVT).obj:  $(SRC)\$(TESTVT).c  $(SRC)\$(ALGO).h
	@$(CC) $(CFLAGS) $(DEFS) /Fo$@ /c $(SRC)\$(TESTVT).c

$(BENCH): $@.obj $(ALGO).lib
	@echo Building $@
	@$(LINKA) /OUT:$@.exe $@.obj

$(BENCH).obj: $(SRC)\$(BENCH).c $(SRC)\$(ALGO).h
	@$(CC) $(CFLAGS) $(DEFS) /Fo$@ /c $(SRC)\$(BENCH).c

$(CIPHER): $@.obj $(ALGO).lib
	@echo Building $@
	@$(LINKA) /OUT:$@.exe $@.obj

$(CIPHER).obj: $(SRC)\$(CIPHER).c  $(SRC)\$(ALGO).h
	@$(CC) $(CFLAGS) $(DEFS) /Fo$@ /c $(SRC)\$(CIPHER).c

$(TEST): $(CIPHER)
	@echo Testing  $(ALGO)...
	@echo Electronic Code Book (ECB) Mode
	@.\$(CIPHER) -m ecb -k sesam -q $(SRC)\test.txt test.ecb
	@.\$(CIPHER) -d -m ecb -k sesam -q test.ecb test.out
	@$(DIFF) $(SRC)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ecb
	@echo Cipher Block Chaining (CBC) Mode
	@.\$(CIPHER) -m cbc -k sesam -q $(SRC)\test.txt test.cbc
	@.\$(CIPHER) -d -m cbc -k sesam -q test.cbc test.out
	@$(DIFF) $(SRC)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cbc
	@echo 8 Bit Output Feedback (OFB) Mode
	@.\$(CIPHER) -m ofb -k sesam -q $(SRC)\test.txt test.ofb
	@.\$(CIPHER) -d -m ofb -k sesam -q test.ofb test.out
	@$(DIFF) $(SRC)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.ofb
	@echo 8 Bit Cipher Feedback (CFB) Mode
	@.\$(CIPHER) -m cfb -k sesam -q $(SRC)\test.txt test.cfb
	@.\$(CIPHER) -d -m cfb -k sesam -q test.cfb test.out
	@$(DIFF) $(SRC)\test.txt test.out
	@$(RM) test.out
	@$(RM) test.cfb
	@echo Build successful :-)

#
clean:
	@if exist *.map $(RM) *.map
	@if exist *.obj $(RM) *.obj
	@if exist *.res $(RM) *.res
	@if exist *.exp $(RM) *.exp
	@if exist *.exe $(RM) *.exe
	@if exist *.zip $(RM) *.zip

zip:
	@zip -X $(ALGO)_$(OS).zip *.*

