####  Makefile for compilation using GNU GCC or clang  ####

OPT=-O3     # Optimization option by default
COMPILER=arm-none-eabi-gcc
OS=__LINUX__
ARCHITECTURE=_ARM_


ADDITIONAL_SETTINGS= -fwrapv -fomit-frame-pointer -march=armv7-m 
USE_GENERIC=-D _GENERIC_
ARM_SETTING=-lrt
USE_ENDOMORPHISMS=-D USE_ENDO


ifeq "$(SERIAL_PUSH)" "TRUE"
    USE_SERIAL_PUSH=-D PUSH_SET
endif

ifeq "$(DISABLE_FIXED_MUL)" "TRUE"
    NOT_USE_FIXED_MUL=-D _DISABLE_FIXED_MUL_
endif

ifeq "$(DISABLE_DOUBLE_MUL)" "TRUE"
    NOT_USE_DOUBLE_MUL=-D _DISABLE_DOUBLE_MUL_
endif

cc=$(COMPILER)
CFLAGS=-c $(OPT) $(ADDITIONAL_SETTINGS) $(SIMD) -D $(ARCHITECTURE) -D $(OS) $(USE_AVX) $(USE_AVX2) $(USE_ASM) $(USE_GENERIC) $(USE_ENDOMORPHISMS) $(USE_SERIAL_PUSH) $(NOT_USE_FIXED_MUL) $(NOT_USE_DOUBLE_MUL)
LDFLAGS=
OBJECTS=FourQ.o eccp2.o eccp2_no_endo.o eccp2_core.o
OBJECTS_ALL=$(OBJECTS)

LibFourQ: $(OBJECTS_ALL)
	$(COMPILER) -o LibFourQ $(OBJECTS_ALL) $(ARM_SETTING)

FourQ.o: FourQ.c FourQ_internal.h
	$(COMPILER) $(CFLAGS) FourQ.c

eccp2_core.o: eccp2_core.c FourQ_internal.h AMD64/fp_x64.h
	$(COMPILER) $(CFLAGS) eccp2_core.c

eccp2.o: eccp2.c FourQ_internal.h
	$(COMPILER) $(CFLAGS) eccp2.c

eccp2_no_endo.o: eccp2_no_endo.c FourQ_internal.h
	$(COMPILER) $(CFLAGS) eccp2_no_endo.c
    
consts.o: AMD64/consts.c
	$(COMPILER) $(CFLAGS) AMD64/consts.c
	
fp2_1271.o: AMD64/fp2_1271.S
	$(COMPILER) $(CFLAGS) AMD64/fp2_1271.S

.PHONY: clean

clean:
	rm -f ecc_test fp2_1271.o fp2_1271_AVX2.o $(OBJECTS_ALL)

