.PHONY: nacllib clean

HACL_HOME ?= ../..

#
# Compilation flags
#
CCOPTS = -Ofast -march=native -mtune=native -m64 -fwrapv -fomit-frame-pointer -funroll-loops
CCOPTS32 = -Ofast -mtune=generic -m32 -fwrapv -fomit-frame-pointer -funroll-loops

ifeq ($(SNAPSHOT_DIR),snapshots/hacl-c-compcert)
  LIBFLAGS=$(CCOPTS) $(CFLAGS)
  LIBFLAGS32=$(CCOPTS32) $(CFLAGS)
  OTHER=FStar.c -shared
else
  LIBFLAGS=$(CCOPTS) -fPIC
  LIBFLAGS32=$(CCOPTS32) -fPIC -DKRML_NOUINT128 -Wno-unused-function
  OTHER=-shared
endif

#
# Files
#

FILES = Hacl_Salsa20.c Hacl_Salsa20.h Hacl_Chacha20.c Hacl_Chacha20.h Hacl_Poly1305_64.c Hacl_Poly1305_64.h AEAD_Poly1305_64.c AEAD_Poly1305_64.h Hacl_SHA2_512.c Hacl_SHA2_512.h Hacl_Ed25519.c Hacl_Ed25519.h Hacl_Curve25519.c Hacl_Curve25519.h Hacl_Chacha20Poly1305.c Hacl_Chacha20Poly1305.h Hacl_Policies.c Hacl_Policies.h NaCl.c NaCl.h
TWEETNACL_HOME ?= $(HACL_HOME)/other_providers/tweetnacl

#
# Library (64 bits)
#

libhacl.so: $(FILES)
	$(CC) $(LIBFLAGS) \
	  Hacl_Salsa20.c -c -o Hacl_Salsa20.o
	$(CC) $(LIBFLAGS) \
	  Hacl_Chacha20.c -c -o Hacl_Chacha20.o
	$(CC) $(LIBFLAGS) \
	  Hacl_Poly1305_64.c -c -o Hacl_Poly1305_64.o
	$(CC) $(LIBFLAGS) \
	  AEAD_Poly1305_64.c -c -o AEAD_Poly1305_64.o
	$(CC) $(LIBFLAGS) \
	  Hacl_SHA2_512.c -c -o Hacl_SHA2_512.o
	$(CC) $(LIBFLAGS) \
	  Hacl_Ed25519.c -c -o Hacl_Ed25519.o
	$(CC) $(LIBFLAGS) \
	  Hacl_Curve25519.c -c -o Hacl_Curve25519.o
	$(CC) $(LIBFLAGS) \
	  Hacl_Chacha20Poly1305.c -c -o Hacl_Chacha20Poly1305.o
	$(CC) $(OTHER) $(LIBFLAGS) -I . -Wall \
	  hacl_test_utils.c \
	  Hacl_Salsa20.o Hacl_Poly1305_64.o Hacl_Chacha20.o AEAD_Poly1305_64.o Hacl_Chacha20Poly1305.o Hacl_SHA2_512.o Hacl_Ed25519.o Hacl_Curve25519.o kremlib.c Hacl_Policies.c NaCl.c randombytes.c haclnacl.c \
	  -o libhacl.so


#
# Library (64 bits), static
#

libhacl.a: $(FILES)
	$(CC) $(LIBFLAGS) \
	  Hacl_Salsa20.c -c -o Hacl_Salsa20.o
	$(CC) $(LIBFLAGS) \
	  Hacl_Chacha20.c -c -o Hacl_Chacha20.o
	$(CC) $(LIBFLAGS) \
	  Hacl_Poly1305_64.c -c -o Hacl_Poly1305_64.o
	$(CC) $(LIBFLAGS) \
	  AEAD_Poly1305_64.c -c -o AEAD_Poly1305_64.o
	$(CC) $(LIBFLAGS) \
	  Hacl_SHA2_512.c -c -o Hacl_SHA2_512.o
	$(CC) $(LIBFLAGS) \
	  Hacl_Ed25519.c -c -o Hacl_Ed25519.o
	$(CC) $(LIBFLAGS) \
	  Hacl_Curve25519.c -c -o Hacl_Curve25519.o
	$(CC) $(LIBFLAGS) \
	  Hacl_Chacha20Poly1305.c -c -o Hacl_Chacha20Poly1305.o
	$(CC) $(OTHER) $(LIBFLAGS) -I . -Wall \
	  hacl_test_utils.c \
	  Hacl_Salsa20.o Hacl_Poly1305_64.o Hacl_Chacha20.o AEAD_Poly1305_64.o Hacl_Chacha20Poly1305.o Hacl_SHA2_512.o Hacl_Ed25519.o Hacl_Curve25519.o kremlib.c Hacl_Policies.c NaCl.c randombytes.c haclnacl.c \
	  -o libhacl.a

#
# Library (32 bits)
#

libhacl32.so: $(FILES)
	$(CC) $(LIBFLAGS32) \
	  FStar.c -c -o FStar.o
	$(CC) $(LIBFLAGS32) \
	  Hacl_Salsa20.c -c -o Hacl_Salsa20.o
	$(CC) $(LIBFLAGS32) \
	  Hacl_Chacha20.c -c -o Hacl_Chacha20.o
	$(CC) $(LIBFLAGS32) \
	  Hacl_Poly1305_64.c -c -o Hacl_Poly1305_64.o
	$(CC) $(LIBFLAGS32) \
	  AEAD_Poly1305_64.c -c -o AEAD_Poly1305_64.o
	$(CC) $(LIBFLAGS32) \
	  Hacl_SHA2_512.c -c -o Hacl_SHA2_512.o
	$(CC) $(LIBFLAGS32) \
	  Hacl_Ed25519.c -c -o Hacl_Ed25519.o
	$(CC) $(LIBFLAGS32) \
	  Hacl_Curve25519.c -c -o Hacl_Curve25519.o
	$(CC) $(LIBFLAGS32) \
	  Hacl_Chacha20Poly1305.c -c -o Hacl_Chacha20Poly1305.o
	$(CC) -shared  $(LIBFLAGS32) -I . -Wall \
	  hacl_test_utils.c \
	  FStar.o Hacl_Salsa20.o Hacl_Poly1305_64.o Hacl_Chacha20.o AEAD_Poly1305_64.o Hacl_Chacha20Poly1305.o Hacl_SHA2_512.o Hacl_Ed25519.o Hacl_Curve25519.o kremlib.c Hacl_Policies.c NaCl.c randombytes.c haclnacl.c \
	  -o libhacl32.so

#
# Library (32 bits), static
#

libhacl32.a: $(FILES)
	$(CC) $(LIBFLAGS32) \
	  FStar.c -c -o FStar.o
	$(CC) $(LIBFLAGS32) \
	  Hacl_Salsa20.c -c -o Hacl_Salsa20.o
	$(CC) $(LIBFLAGS32) \
	  Hacl_Chacha20.c -c -o Hacl_Chacha20.o
	$(CC) $(LIBFLAGS32) \
	  Hacl_Poly1305_64.c -c -o Hacl_Poly1305_64.o
	$(CC) $(LIBFLAGS32) \
	  AEAD_Poly1305_64.c -c -o AEAD_Poly1305_64.o
	$(CC) $(LIBFLAGS32) \
	  Hacl_SHA2_512.c -c -o Hacl_SHA2_512.o
	$(CC) $(LIBFLAGS32) \
	  Hacl_Ed25519.c -c -o Hacl_Ed25519.o
	$(CC) $(LIBFLAGS32) \
	  Hacl_Curve25519.c -c -o Hacl_Curve25519.o
	$(CC) $(LIBFLAGS32) \
	  Hacl_Chacha20Poly1305.c -c -o Hacl_Chacha20Poly1305.o
	$(CC) -shared  $(LIBFLAGS32) -I . -Wall \
	  hacl_test_utils.c \
	  FStar.o Hacl_Salsa20.o Hacl_Poly1305_64.o Hacl_Chacha20.o AEAD_Poly1305_64.o Hacl_Chacha20Poly1305.o Hacl_SHA2_512.o Hacl_Ed25519.o Hacl_Curve25519.o kremlib.c Hacl_Policies.c NaCl.c randombytes.c haclnacl.c \
	  -o libhacl32.a

unit-tests: libhacl.so
	$(CC) $(CCOPTS) \
	-I . -I ../snapshots/kremlib -I  -I $(TWEETNACL_HOME) \
	$(TWEETNACL_HOME)/tweetnacl.c hacl_test_utils.c \
	unit_tests.c libhacl.so -o unit_tests.exe
	LD_LIBRARY_PATH=. DYLD_LIBRARY_PATH=. ./unit_tests.exe

unit-tests32: libhacl32.so
	$(CC) $(CCOPTS32) \
	-I . -I ../snapshots/kremlib -I  -I $(TWEETNACL_HOME) \
	$(TWEETNACL_HOME)/tweetnacl.c hacl_test_utils.c \
	unit_tests.c libhacl32.so -o unit_tests32.exe
LD_LIBRARY_PATH=. DYLD_LIBRARY_PATH=. ./unit_tests32.exe

clean:
	rm -rf *~ *.exe *.out *.o *.so *.a
