# Hand ported BSDmakefile 

.PHONY: clean
HOST_PLATFORM := ${MACHINE_ARCH}
HOST_OS := ${MACHINE_OS}

PLATFORMS_64 := arm64 aarch64 amd64 i86pc loongarch64 mips64 mips64el ppc64 ppc64le riscv64 s390x sparc sparc4v sparc64 x86_64
PLATFORMS_32 := armv7l i386 i686 mips mipsel

### override these for cross-building:
PLATFORM ?= ${MACHINE_ARCH}
.for P in ${PLATFORMS_64}
.if ${P} == ${PLATFORM}
PLATFORM_SIZE ?= 64
.endif
.endfor

.for P in ${PLATFORMS_32}
.if ${P} == ${PLATFORM}
PLATFORM_SIZE ?= 32
.endif
.endfor

.ifndef PLATFORM_SIZE
.error Set PLATFORM_SIZE to 32 or 64 and try again
.endif

.if ${HOST_PLATFORM} == {PLATFORM}
CC_MARCH ?= native
# Default to "march=native -mtune=native" when not cross-building
# https://lemire.me/blog/2018/07/25/it-is-more-complicated-than-i-thought-mtune-march-in-gcc/
.endif
CC_MTUNE ?= ${CC_MARCH}

SEC_CFLAGS := -Wformat -Werror=format-security -D_FORTIFY_SOURCE=2 -fstack-protector-strong
BASE_CFLAGS := -fpie -fPIC -Wall -Wextra -pedantic -O2 -fwrapv -DGETRANDOM -Werror
BASE_CFLAGS+=-DPLATFORM=${PLATFORM} -DPLATFORM_SIZE=${PLATFORM_SIZE}
BASE_CFLAGS+=${SEC_CFLAGS}
# XXX refactor into bmake dialect
#BASE_CFLAGS+=$(if $(strip $(CC_MARCH)),-march=$(CC_MARCH) -mtune=$(CC_MTUNE),)

.for H in ${HOST_OS} OpenBSD DragonFly Darwin
.if ${H} == ${HOST_OS} 
BASE_CFLAGS+=-D__${HOST_OS}__
.endif
.endfor

LDFLAGS :=

.if ${HOST_OS} == Linux
LDFLAGS+=-Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now
LDFLAGS+=-Wl,-Bsymbolic-functions
LDFLAGS+=-Wl,--reduce-memory-overheads -Wl,--no-keep-memory
.endif

.if ${CC} == clang
BASE_CFLAGS+=-Wno-unused-command-line-argument
.endif

.if ${CC} == gcc
BASE_CFLAGS+=
.endif

.if ${CC} == emcc
BASE_CFLAGS+=-Wno-unused-command-line-argument
LDFLAGS=-s SIDE_MODULE=1
.endif

.ifdef WINDOWS
.if ${WINDOWS} == 1
BASE_CFLAGS :=-Wall -Wextra -pedantic -O2 -fwrapv -D__Windows__
HIGHCTIDH_PORTABLE ?=1
BASE_CFLAGS+=-DPLATFORM=${PLATFORM} -DPLATFORM_SIZE=${PLATFORM_SIZE}
.if ${CC} == x86_64-w64-mingw32-gcc
BASE_CFLAGS+=-fpie -fPIC
CFLAGS = ${BASE_CFLAGS}
.endif
.if ${CC} clang
HIGHCTIDH_PORTABLE ?=1
BASE_CFLAGS+=-DPLATFORM=${PLATFORM} -DPLATFORM_SIZE=${PLATFORM_SIZE}
CFLAGS = ${BASE_CFLAGS} -Wno-unused-command-line-argument
LDFLAGS = -LAdvapi32.dll
.endif
.endif
.endif

# Default to using fiat crypto, safe and portable but slow backend
HIGHCTIDH_PORTABLE ?= 1
.ifdef HIGHCTIDH_PORTABLE
.if ${HIGHCTIDH_PORTABLE} == 1
BASE_CFLAGS += -DHIGHCTIDH_PORTABLE=1
libhighctidh_511_OBJS := fp2fiat511.o fiat_p511.o
libhighctidh_512_OBJS := fp2fiat512.o fiat_p512.o
libhighctidh_1024_OBJS := fp2fiat1024.o fiat_p1024.o
libhighctidh_2048_OBJS := fp2fiat2048.o fiat_p2048.o
.else
BASE_CFLAGS += -DHIGHCTIDH_PORTABLE=0
.if ${PLATFORM} == amd64
ASM_PLATFORM := x86_64
.elif ${PLATFORM} == arm64
ASM_PLATFORM := aarch64
.else
ASM_PLATFORM := ${PLATFORM}
.endif
.if ${ASM_PLATFORM} == aarch64
ASFLAGS := -march=armv8-a+sve2
.endif
libhighctidh_511_OBJS := uintbig511.o fp511.o
libhighctidh_512_OBJS := uintbig512.o fp512.o
libhighctidh_1024_OBJS := uintbig1024.o fp1024.o
libhighctidh_2048_OBJS := uintbig2048.o fp2048.o
.endif
.endif


.for P in arm64 aarch64
.if ${P} == ${PLATFORM}
CFLAGS+= ${BASE_CFLAGS}
.endif
.endfor

.if ${PLATFORM} == armv7l
CFLAGS+= ${BASE_CFLAGS} -D__ARM32__
.if ${CC} == clang
CFLAGS+= -fforce-enable-int128
.endif
.endif

.if ${PLATFORM} == loongarch64
CFLAGS+= ${BASE_CFLAGS}
.endif

.if ${PLATFORM} == mips
CFLAGS+= ${BASE_CFLAGS} -D__MIPS__
.if ${CC} == clang
CFLAGS+= -fforce-enable-int128
.endif
.endif

.if ${PLATFORM} == mips64
CFLAGS+= ${BASE_CFLAGS} -D__MIPS64__
.endif

.if ${PLATFORM} == mips64el
CFLAGS+= ${BASE_CFLAGS} -D__MIPS64el__
.endif

.if ${PLATFORM} == ppc64le
CFLAGS+= ${BASE_CFLAGS}
.endif

.if ${PLATFORM} == ppc64
CFLAGS+= ${BASE_CFLAGS}
.endif

.if ${PLATFORM} == riscv64
CFLAGS+= ${BASE_CFLAGS} -D__riscv
.endif

.if ${PLATFORM} == s390x
CFLAGS+= ${BASE_CFLAGS} -D__s390x__
.if ${CC} == clang
CFLAGS+= -march=z10 -mtune=z10
.endif
.endif

.if ${HOST_OS} == SunOS
.for P in sparc sun4u sun4v sparc64 i86pc i386 
.if ${P} == ${PLATFORM}
BASE_CFLAGS+=${SEC_CFLAGS}
CFLAGS+=${BASE_CFLAGS} -m64 -D__sun
LDFLAGS+=${LDFLAGS}
.if ${PLATFORM} == i86pc
CFLAGS+=-D__i86pc__
.if ${CC} == gcc
CFLAGS+=-mimpure-text -Wno-attributes
.endif
.endif
.if ${PLATFORM} == i386
CFLAGS+=-D__i386__
.if ${CC} == gcc
CFLAGS+=-mimpure-text
.endif
.endif
.for P in sparc sun4u sun4v sparc64
.if ${P} == ${PLATFORM}
CFLAGS+=-DHIGHCTIDH_PORTABLE=1 -D__sun4v__
.if ${CC} == gcc
CFLAGS+=-mcpu=native -mtune=native -D_REENTRANT
.endif
.endif
.endif
.endfor
.endif

.if ${PLATFORM} == unknown
CFLAGS+= ${BASE_CFLAGS}
.endif

.if ${HOST_OS} != SunOS
.for P in amd64 x86_64 i386 i686
.if ${P} == ${PLATFORM}
.if ${PLATFORM_SIZE} == 32
CFLAGS+= ${BASE_CFLAGS} -D__i386__
.if ${CC} == clang
CFLAGS+= -fforce-enable-int128
.endif
.else
CFLAGS+= ${BASE_CFLAGS} -D__x86_64__
.endif
.endif
.endfor
.endif

CC += ${CFLAGS} ${LDFLAGS}
SCC ?= ${CC} ${CFLAGS} ${LDFLAGS}

default: libhighctidh.so

all: default timecop generic 511 512 1024 2048

generic: testrandom.out

511: costpoly511.out checkct511untuned bench511untuned test511.out \
checkct511mults bench511mults \
checkct511cycles bench511cycles \
ubench511 umults511

512: costpoly512.out checkct512untuned bench512untuned test512.out \
checkct512mults bench512mults \
checkct512cycles bench512cycles \
ubench512 umults512

1024: costpoly1024.out checkct1024untuned bench1024untuned test1024.out \
checkct1024mults bench1024mults \
checkct1024cycles bench1024cycles \
ubench1024 umults1024

2048: costpoly2048.out checkct2048untuned bench2048untuned test2048.out \
checkct2048mults bench2048mults \
checkct2048cycles bench2048cycles \
ubench2048 umults2048

timecop: \
checkct511untuned checkct511mults checkct511cycles \
checkct512untuned checkct512mults checkct512cycles \
checkct1024untuned checkct1024mults checkct1024cycles \
checkct2048untuned checkct2048mults checkct2048cycles \

	valgrind ./checkct511untuned
	valgrind ./checkct511mults
	valgrind ./checkct511cycles
	valgrind ./checkct512untuned
	valgrind ./checkct512mults
	valgrind ./checkct512cycles
	valgrind ./checkct1024untuned
	valgrind ./checkct1024mults
	valgrind ./checkct1024cycles
	valgrind ./checkct2048untuned
	valgrind ./checkct2048mults
	valgrind ./checkct2048cycles

# ----- benchmarks:

checkct511cycles: checkct.c \
libhighctidh_511.a libhighctidh_base.a libhighctidh_tunecycles511.a libtest.a
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o checkct511cycles checkct.c \
		libhighctidh_511.a libhighctidh_base.a libhighctidh_tunecycles511.a libtest.a

checkct512cycles: checkct.c \
libhighctidh_512.a libhighctidh_base.a libhighctidh_tunecycles512.a libtest.a
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o checkct512cycles checkct.c \
		libhighctidh_512.a libhighctidh_base.a libhighctidh_tunecycles512.a libtest.a

checkct1024cycles: checkct.c \
libhighctidh_1024.a libhighctidh_base.a libhighctidh_tunecycles1024.a libtest.a
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o checkct1024cycles checkct.c \
		libhighctidh_1024.a libhighctidh_base.a libhighctidh_tunecycles1024.a libtest.a

checkct2048cycles: checkct.c \
libhighctidh_2048.a libhighctidh_base.a libhighctidh_tunecycles2048.a libtest.a
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o checkct2048cycles checkct.c \
		libhighctidh_2048.a libhighctidh_base.a libhighctidh_tunecycles2048.a libtest.a

checkct511mults: checkct.c \
libhighctidh_511.a libhighctidh_base.a libtest.a
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o checkct511mults checkct.c \
		libhighctidh_511.a libhighctidh_base.a libtest.a

checkct512mults: checkct.c \
libhighctidh_512.a libhighctidh_base.a libtest.a
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o checkct512mults checkct.c \
		libhighctidh_512.a libhighctidh_base.a libtest.a

checkct1024mults: checkct.c \
libhighctidh_1024.a libhighctidh_base.a libtest.a
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o checkct1024mults checkct.c \
		libhighctidh_1024.a libhighctidh_base.a libtest.a

checkct2048mults: checkct.c \
libhighctidh_2048.a libhighctidh_base.a libtest.a
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o checkct2048mults checkct.c \
		libhighctidh_2048.a libhighctidh_base.a libtest.a

checkct511untuned: checkct.c \
libhighctidh_511.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o checkct511untuned checkct.c \
		libhighctidh_511.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

checkct512untuned: checkct.c \
libhighctidh_512.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o checkct512untuned checkct.c \
		libhighctidh_512.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

checkct1024untuned: checkct.c \
libhighctidh_1024.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o checkct1024untuned checkct.c \
		libhighctidh_1024.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

checkct2048untuned: checkct.c \
libhighctidh_2048.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o checkct2048untuned checkct.c \
		libhighctidh_2048.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

bench511cycles: bench.c \
libhighctidh_511.a libhighctidh_base.a libhighctidh_tunecycles511.a libtest.a
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o bench511cycles bench.c \
		libhighctidh_511.a libhighctidh_base.a libhighctidh_tunecycles511.a libtest.a

bench512cycles: bench.c \
libhighctidh_512.a libhighctidh_base.a libhighctidh_tunecycles512.a libtest.a
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o bench512cycles bench.c \
		libhighctidh_512.a libhighctidh_base.a libhighctidh_tunecycles512.a libtest.a

bench1024cycles: bench.c \
libhighctidh_1024.a libhighctidh_base.a libhighctidh_tunecycles1024.a libtest.a
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o bench1024cycles bench.c \
		libhighctidh_1024.a libhighctidh_base.a libhighctidh_tunecycles1024.a libtest.a

bench2048cycles: bench.c \
libhighctidh_2048.a libhighctidh_base.a libhighctidh_tunecycles2048.a libtest.a
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o bench2048cycles bench.c \
		libhighctidh_2048.a libhighctidh_base.a libhighctidh_tunecycles2048.a libtest.a

bench511mults: bench.c \
libhighctidh_511.a libhighctidh_base.a libtest.a
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o bench511mults bench.c \
		libhighctidh_511.a libhighctidh_base.a libtest.a

bench512mults: bench.c \
libhighctidh_512.a libhighctidh_base.a libtest.a
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o bench512mults bench.c \
		libhighctidh_512.a libhighctidh_base.a libtest.a

bench1024mults: bench.c \
libhighctidh_1024.a libhighctidh_base.a libtest.a
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o bench1024mults bench.c \
		libhighctidh_1024.a libhighctidh_base.a libtest.a

bench2048mults: bench.c \
libhighctidh_2048.a libhighctidh_base.a libtest.a
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o bench2048mults bench.c \
		libhighctidh_2048.a libhighctidh_base.a libtest.a

bench511untuned: bench.c \
libhighctidh_511.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o bench511untuned bench.c \
		libhighctidh_511.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

bench512untuned: bench.c \
libhighctidh_512.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o bench512untuned bench.c \
		libhighctidh_512.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

bench1024untuned: bench.c \
libhighctidh_1024.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o bench1024untuned bench.c \
		libhighctidh_1024.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

bench2048untuned: bench.c \
libhighctidh_2048.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o bench2048untuned bench.c \
		libhighctidh_2048.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

# ----- uintbig tests require HIGHCTIDH_PORTABLE=0 and never run automatically:

testuintbig511: test.c uintbig511_${ASM_PLATFORM}.S
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-DTEST_UINTBIG \
		-o $@ test.c uintbig511_${ASM_PLATFORM}.S

testuintbig512: test.c uintbig512_${ASM_PLATFORM}.S
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-DTEST_UINTBIG \
		-o $@ test.c uintbig512_${ASM_PLATFORM}.S

testuintbig1024: test.c uintbig1024_${ASM_PLATFORM}.S
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-DTEST_UINTBIG \
		-o $@ test.c uintbig1024_${ASM_PLATFORM}.S

testuintbig2048: test.c uintbig2048_${ASM_PLATFORM}.S
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-DTEST_UINTBIG \
		-o $@ test.c uintbig2048_${ASM_PLATFORM}.S

# ----- tests run automatically:

testrandom.out: testrandom
	[ -f testrandom.time ] && cat testrandom.time || :
	time ./testrandom > testrandom.out
	cmp testrandom.out testrandom.exp

testrandom: testrandom.o libhighctidh_base.a libtest.a
	${CC} -o testrandom testrandom.o libhighctidh_base.a libtest.a

testrandom.o: testrandom.c random.h BSDmakefile
	${CC} -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c testrandom.c

test511: test.c \
libhighctidh_511.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o test511 test.c \
		libhighctidh_511.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

test512: test.c \
libhighctidh_512.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o test512 test.c \
		libhighctidh_512.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

test1024: test.c \
libhighctidh_1024.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o test1024 test.c \
		libhighctidh_1024.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

test2048: test.c \
libhighctidh_2048.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o test2048 test.c \
		libhighctidh_2048.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

test511.out: test511 test511.exp
	[ -f test511.time ] && cat test511.time || :
	time ./test511 > test511.out
	cmp test511.out test511.exp

test512.out: test512 test512.exp
	[ -f test512.time ] && cat test512.time || :
	time ./test512 > test512.out
	cmp test512.out test512.exp

test1024.out: test1024 test1024.exp
	[ -f test1024.time ] && cat test1024.time || :
	time ./test1024 > test1024.out
	cmp test1024.out test1024.exp

test2048.out: test2048 test2048.exp
	[ -f test2048.time ] && cat test2048.time || :
	time ./test2048 > test2048.out
	cmp test2048.out test2048.exp

# ----- microbenchmarks (some run automatically):

costpoly511.out: costpoly511
	./costpoly511 > costpoly511.out
	cmp costpoly511.out costpoly.py

costpoly512.out: costpoly512
	./costpoly512 > costpoly512.out
	cmp costpoly512.out costpoly.py

costpoly1024.out: costpoly1024
	./costpoly1024 > costpoly1024.out
	cmp costpoly1024.out costpoly.py

costpoly2048.out: costpoly2048
	./costpoly2048 > costpoly2048.out
	cmp costpoly2048.out costpoly.py

costpoly511: costpoly.c \
libhighctidh_511.a libhighctidh_base.a libtest.a
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o costpoly511 costpoly.c \
		libhighctidh_511.a libhighctidh_base.a libtest.a

costpoly512: costpoly.c \
libhighctidh_512.a libhighctidh_base.a libtest.a
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o costpoly512 costpoly.c \
		libhighctidh_512.a libhighctidh_base.a libtest.a

costpoly1024: costpoly.c \
libhighctidh_1024.a libhighctidh_base.a libtest.a
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o costpoly1024 costpoly.c \
		libhighctidh_1024.a libhighctidh_base.a libtest.a

costpoly2048: costpoly.c \
libhighctidh_2048.a libhighctidh_base.a libtest.a
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o costpoly2048 costpoly.c \
		libhighctidh_2048.a libhighctidh_base.a libtest.a

umults511: umults.c \
libhighctidh_511.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o umults511 umults.c \
		libhighctidh_511.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

umults512: umults.c \
libhighctidh_512.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o umults512 umults.c \
		libhighctidh_512.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

umults1024: umults.c \
libhighctidh_1024.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o umults1024 umults.c \
		libhighctidh_1024.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

umults2048: umults.c \
libhighctidh_2048.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o umults2048 umults.c \
		libhighctidh_2048.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

ubench511: ubench.c \
libhighctidh_511.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o ubench511 ubench.c \
		libhighctidh_511.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

ubench512: ubench.c \
libhighctidh_512.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o ubench512 ubench.c \
		libhighctidh_512.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

ubench1024: ubench.c \
libhighctidh_1024.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o ubench1024 ubench.c \
		libhighctidh_1024.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

ubench2048: ubench.c \
libhighctidh_2048.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o ubench2048 ubench.c \
		libhighctidh_2048.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

# ----- libhighctidh_tunecycles:

libhighctidh_tunecycles511.a: steps_tunecycles511.o BSDmakefile
	${AR} crs libhighctidh_tunecycles511.a steps_tunecycles511.o

libhighctidh_tunecycles512.a: steps_tunecycles512.o BSDmakefile
	${AR} crs libhighctidh_tunecycles512.a steps_tunecycles512.o

libhighctidh_tunecycles1024.a: steps_tunecycles1024.o BSDmakefile
	${AR} crs libhighctidh_tunecycles1024.a steps_tunecycles1024.o

libhighctidh_tunecycles2048.a: steps_tunecycles2048.o BSDmakefile
	${AR} crs libhighctidh_tunecycles2048.a steps_tunecycles2048.o

steps_tunecycles511.o: steps_tunecycles511.c steps.h BSDmakefile
	${CC} -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c steps_tunecycles511.c

steps_tunecycles512.o: steps_tunecycles512.c steps.h BSDmakefile
	${CC} -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c steps_tunecycles512.c

steps_tunecycles1024.o: steps_tunecycles1024.c steps.h BSDmakefile
	${CC} -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c steps_tunecycles1024.c

steps_tunecycles2048.o: steps_tunecycles2048.c steps.h BSDmakefile
	${CC} -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c steps_tunecycles2048.c

steps_tunecycles511.c: tunecycles511.out tune2c BSDmakefile
	./tune2c < tunecycles511.out > steps_tunecycles511.c

steps_tunecycles512.c: tunecycles512.out tune2c BSDmakefile
	./tune2c < tunecycles512.out > steps_tunecycles512.c

steps_tunecycles1024.c: tunecycles1024.out tune2c BSDmakefile
	./tune2c < tunecycles1024.out > steps_tunecycles1024.c

steps_tunecycles2048.c: tunecycles2048.out tune2c BSDmakefile
	./tune2c < tunecycles2048.out > steps_tunecycles2048.c

tunecycles511.out: tunecycles511 BSDmakefile
	[ -f tunecycles511.time ] && cat tunecycles511.time || :
	time ./tunecycles511 > tunecycles511.out

tunecycles512.out: tunecycles512 BSDmakefile
	[ -f tunecycles512.time ] && cat tunecycles512.time || :
	time ./tunecycles512 > tunecycles512.out

tunecycles1024.out: tunecycles1024 BSDmakefile
	[ -f tunecycles1024.time ] && cat tunecycles1024.time || :
	time ./tunecycles1024 > tunecycles1024.out

tunecycles2048.out: tunecycles2048 BSDmakefile
	[ -f tunecycles2048.time ] && cat tunecycles2048.time || :
	time ./tunecycles2048 > tunecycles2048.out

tunecycles511: tunecycles.c \
libhighctidh_511.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o tunecycles511 tunecycles.c \
		libhighctidh_511.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

tunecycles512: tunecycles.c \
libhighctidh_512.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o tunecycles512 tunecycles.c \
		libhighctidh_512.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

tunecycles1024: tunecycles.c \
libhighctidh_1024.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o tunecycles1024 tunecycles.c \
		libhighctidh_1024.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

tunecycles2048: tunecycles.c \
libhighctidh_2048.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o tunecycles2048 tunecycles.c \
		libhighctidh_2048.a libhighctidh_base.a libhighctidh_untuned.a libtest.a

# ----- libhighctidh_{511,512,1024,2048}, size-dependent functions:

libhighctidh_511.a: ${libhighctidh_511_OBJS} fp_inv511.o fp_sqrt511.o primes511.o poly511.o mont511.o elligator511.o skgen511.o validate511.o csidh511.o BSDmakefile
	${AR} crs libhighctidh_511.a ${libhighctidh_511_OBJS} fp_inv511.o fp_sqrt511.o primes511.o poly511.o mont511.o elligator511.o skgen511.o validate511.o csidh511.o

libhighctidh_512.a: ${libhighctidh_512_OBJS} fp_inv512.o fp_sqrt512.o primes512.o poly512.o mont512.o elligator512.o skgen512.o validate512.o csidh512.o BSDmakefile
	${AR} crs libhighctidh_512.a ${libhighctidh_512_OBJS} fp_inv512.o fp_sqrt512.o primes512.o poly512.o mont512.o elligator512.o skgen512.o validate512.o csidh512.o

libhighctidh_1024.a: ${libhighctidh_1024_OBJS} fp_inv1024.o fp_sqrt1024.o primes1024.o poly1024.o mont1024.o elligator1024.o skgen1024.o validate1024.o csidh1024.o BSDmakefile
	${AR} crs libhighctidh_1024.a ${libhighctidh_1024_OBJS} fp_inv1024.o fp_sqrt1024.o primes1024.o poly1024.o mont1024.o elligator1024.o skgen1024.o validate1024.o csidh1024.o

libhighctidh_2048.a: ${libhighctidh_2048_OBJS} fp_inv2048.o fp_sqrt2048.o primes2048.o poly2048.o mont2048.o elligator2048.o skgen2048.o validate2048.o csidh2048.o BSDmakefile
	${AR} crs libhighctidh_2048.a ${libhighctidh_2048_OBJS} fp_inv2048.o fp_sqrt2048.o primes2048.o poly2048.o mont2048.o elligator2048.o skgen2048.o validate2048.o csidh2048.o

libhighctidh.a: crypto_classify.o crypto_declassify.o randombytes.o random.o int32_sort.o steps.o steps_untuned.o csidh511.o elligator511.o fiat_p511.o fp2fiat511.o fp_inv511.o fp_sqrt511.o mont511.o poly511.o primes511.o skgen511.o validate511.o csidh512.o elligator512.o fiat_p512.o fp2fiat512.o fp_inv512.o fp_sqrt512.o mont512.o poly512.o primes512.o skgen512.o validate512.o csidh1024.o elligator1024.o fiat_p1024.o fp2fiat1024.o fp_inv1024.o fp_sqrt1024.o mont1024.o poly1024.o primes1024.o skgen1024.o validate1024.o csidh2048.o elligator2048.o fiat_p2048.o fp2fiat2048.o fp_inv2048.o fp_sqrt2048.o mont2048.o poly2048.o primes2048.o skgen2048.o validate2048.o
	${AR} rcs libhighctidh.a $^

csidh511.o: csidh.c naidne.h csidh.h cgo.h binding511.h binding512.h binding1024.h binding2048.h uintbig.h uintbig_namespace.h annotations.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont.h proj.h mont_namespace.h primes.h primes_namespace.h csidh_namespace.h int64mask.h elligator.h elligator_namespace.h random.h random_namespace.h BSDmakefile
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o csidh511.o -c csidh.c

csidh512.o: csidh.c naidne.h csidh.h cgo.h binding511.h binding512.h binding1024.h binding2048.h uintbig.h uintbig_namespace.h annotations.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont.h proj.h mont_namespace.h primes.h primes_namespace.h csidh_namespace.h int64mask.h elligator.h elligator_namespace.h random.h random_namespace.h BSDmakefile
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o csidh512.o -c csidh.c

csidh1024.o: csidh.c naidne.h csidh.h cgo.h binding511.h binding512.h binding1024.h binding2048.h uintbig.h uintbig_namespace.h annotations.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont.h proj.h mont_namespace.h primes.h primes_namespace.h csidh_namespace.h int64mask.h elligator.h elligator_namespace.h random.h random_namespace.h BSDmakefile
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o csidh1024.o -c csidh.c

csidh2048.o: csidh.c naidne.h csidh.h cgo.h binding511.h binding512.h binding1024.h binding2048.h uintbig.h uintbig_namespace.h annotations.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont.h proj.h mont_namespace.h primes.h primes_namespace.h csidh_namespace.h int64mask.h elligator.h elligator_namespace.h random.h random_namespace.h BSDmakefile
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o csidh2048.o -c csidh.c

validate511.o: validate.c csidh.h cgo.h binding511.h binding512.h binding1024.h binding2048.h naidne.h uintbig.h uintbig_namespace.h annotations.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont.h proj.h mont_namespace.h primes.h primes_namespace.h csidh_namespace.h BSDmakefile
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o validate511.o -c validate.c

validate512.o: validate.c csidh.h cgo.h binding511.h binding512.h binding1024.h binding2048.h naidne.h uintbig.h uintbig_namespace.h annotations.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont.h proj.h mont_namespace.h primes.h primes_namespace.h csidh_namespace.h BSDmakefile
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o validate512.o -c validate.c

validate1024.o: validate.c csidh.h cgo.h binding511.h binding512.h binding1024.h binding2048.h naidne.h uintbig.h uintbig_namespace.h annotations.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont.h proj.h mont_namespace.h primes.h primes_namespace.h csidh_namespace.h BSDmakefile
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o validate1024.o -c validate.c

validate2048.o: validate.c csidh.h cgo.h binding511.h binding512.h binding1024.h binding2048.h naidne.h uintbig.h uintbig_namespace.h annotations.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont.h proj.h mont_namespace.h primes.h primes_namespace.h csidh_namespace.h BSDmakefile
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o validate2048.o -c validate.c

skgen511.o: skgen.c csidh.h cgo.h binding511.h binding512.h binding1024.h binding2048.h naidne.h uintbig.h uintbig_namespace.h annotations.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont.h proj.h mont_namespace.h primes.h primes_namespace.h csidh_namespace.h random.h random_namespace.h BSDmakefile
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o skgen511.o -c skgen.c

skgen512.o: skgen.c csidh.h cgo.h binding511.h binding512.h binding1024.h binding2048.h naidne.h uintbig.h uintbig_namespace.h annotations.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont.h proj.h mont_namespace.h primes.h primes_namespace.h csidh_namespace.h random.h random_namespace.h BSDmakefile
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o skgen512.o -c skgen.c

skgen1024.o: skgen.c csidh.h cgo.h binding511.h binding512.h binding1024.h binding2048.h naidne.h uintbig.h uintbig_namespace.h annotations.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont.h proj.h mont_namespace.h primes.h primes_namespace.h csidh_namespace.h random.h random_namespace.h BSDmakefile
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o skgen1024.o -c skgen.c

skgen2048.o: skgen.c csidh.h cgo.h binding511.h binding512.h binding1024.h binding2048.h naidne.h uintbig.h uintbig_namespace.h annotations.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont.h proj.h mont_namespace.h primes.h primes_namespace.h csidh_namespace.h random.h random_namespace.h BSDmakefile
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o skgen2048.o -c skgen.c

elligator511.o: elligator.c crypto_declassify.h cgo.h binding511.h binding512.h binding1024.h binding2048.h crypto_declassify_namespace.h elligator.h proj.h fp.h fp_namespace.h uintbig.h uintbig_namespace.h annotations.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h elligator_namespace.h BSDmakefile
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o elligator511.o -c elligator.c

elligator512.o: elligator.c crypto_declassify.h cgo.h binding511.h binding512.h binding1024.h binding2048.h crypto_declassify_namespace.h elligator.h proj.h fp.h fp_namespace.h uintbig.h uintbig_namespace.h annotations.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h elligator_namespace.h BSDmakefile
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o elligator512.o -c elligator.c

elligator1024.o: elligator.c crypto_declassify.h cgo.h binding511.h binding512.h binding1024.h binding2048.h crypto_declassify_namespace.h elligator.h proj.h fp.h fp_namespace.h uintbig.h uintbig_namespace.h annotations.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h elligator_namespace.h BSDmakefile
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o elligator1024.o -c elligator.c

elligator2048.o: elligator.c crypto_declassify.h cgo.h binding511.h binding512.h binding1024.h binding2048.h crypto_declassify_namespace.h elligator.h proj.h fp.h fp_namespace.h uintbig.h uintbig_namespace.h annotations.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h elligator_namespace.h BSDmakefile
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o elligator2048.o -c elligator.c

mont511.o: mont.c steps.h cgo.h binding511.h binding512.h binding1024.h binding2048.h steps_namespace.h mont.h uintbig.h uintbig_namespace.h annotations.h proj.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont_namespace.h poly.h poly_namespace.h int64mask.h BSDmakefile
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o mont511.o -c mont.c

mont512.o: mont.c steps.h cgo.h binding511.h binding512.h binding1024.h binding2048.h steps_namespace.h mont.h uintbig.h uintbig_namespace.h annotations.h proj.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont_namespace.h poly.h poly_namespace.h int64mask.h BSDmakefile
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o mont512.o -c mont.c

mont1024.o: mont.c steps.h cgo.h binding511.h binding512.h binding1024.h binding2048.h steps_namespace.h mont.h uintbig.h uintbig_namespace.h annotations.h proj.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont_namespace.h poly.h poly_namespace.h int64mask.h BSDmakefile
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o mont1024.o -c mont.c

mont2048.o: mont.c steps.h cgo.h binding511.h binding512.h binding1024.h binding2048.h steps_namespace.h mont.h uintbig.h uintbig_namespace.h annotations.h proj.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont_namespace.h poly.h poly_namespace.h int64mask.h BSDmakefile
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o mont2048.o -c mont.c

poly511.o: poly.c mont.h uintbig.h uintbig_namespace.h cgo.h binding511.h binding512.h binding1024.h binding2048.h annotations.h proj.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont_namespace.h poly.h poly_namespace.h BSDmakefile
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o poly511.o -c poly.c

poly512.o: poly.c mont.h uintbig.h uintbig_namespace.h cgo.h binding511.h binding512.h binding1024.h binding2048.h annotations.h proj.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont_namespace.h poly.h poly_namespace.h BSDmakefile
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o poly512.o -c poly.c

poly1024.o: poly.c mont.h uintbig.h uintbig_namespace.h cgo.h binding511.h binding512.h binding1024.h binding2048.h annotations.h proj.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont_namespace.h poly.h poly_namespace.h BSDmakefile
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o poly1024.o -c poly.c

poly2048.o: poly.c mont.h uintbig.h uintbig_namespace.h cgo.h binding511.h binding512.h binding1024.h binding2048.h annotations.h proj.h fp.h fp_namespace.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h mont_namespace.h poly.h poly_namespace.h BSDmakefile
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o poly2048.o -c poly.c

fp_inv511.o: fp_inv511.c fp.h fp_namespace.h uintbig.h uintbig_namespace.h cgo.h binding511.h binding512.h binding1024.h binding2048.h annotations.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h BSDmakefile
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c fp_inv511.c

fp_inv512.o: fp_inv512.c fp.h fp_namespace.h uintbig.h uintbig_namespace.h cgo.h binding511.h binding512.h binding1024.h binding2048.h annotations.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h BSDmakefile
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c fp_inv512.c

fp_inv1024.o: fp_inv1024.c fp.h fp_namespace.h uintbig.h uintbig_namespace.h cgo.h binding511.h binding512.h binding1024.h binding2048.h annotations.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h BSDmakefile
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c fp_inv1024.c

fp_inv2048.o: fp_inv2048.c fp.h fp_namespace.h uintbig.h uintbig_namespace.h cgo.h binding511.h binding512.h binding1024.h binding2048.h annotations.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h BSDmakefile
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c fp_inv2048.c

fp_sqrt511.o: fp_sqrt511.c fp.h fp_namespace.h uintbig.h uintbig_namespace.h cgo.h binding511.h binding512.h binding1024.h binding2048.h annotations.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h BSDmakefile
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c fp_sqrt511.c

fp_sqrt512.o: fp_sqrt512.c fp.h fp_namespace.h uintbig.h uintbig_namespace.h cgo.h binding511.h binding512.h binding1024.h binding2048.h annotations.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h BSDmakefile
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c fp_sqrt512.c

fp_sqrt1024.o: fp_sqrt1024.c fp.h fp_namespace.h uintbig.h uintbig_namespace.h cgo.h binding511.h binding512.h binding1024.h binding2048.h annotations.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h BSDmakefile
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c fp_sqrt1024.c

fp_sqrt2048.o: fp_sqrt2048.c fp.h fp_namespace.h uintbig.h uintbig_namespace.h cgo.h binding511.h binding512.h binding1024.h binding2048.h annotations.h fiat_p511.h fiat_p512.h fiat_p1024.h fiat_p2048.h randombytes.h crypto_declassify.h crypto_declassify_namespace.h BSDmakefile
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c fp_sqrt2048.c

primes511.o: primes511.c primes.h primes_namespace.h cgo.h binding511.h binding512.h binding1024.h binding2048.h BSDmakefile
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c primes511.c

primes512.o: primes512.c primes.h primes_namespace.h cgo.h binding511.h binding512.h binding1024.h binding2048.h BSDmakefile
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c primes512.c

primes1024.o: primes1024.c primes.h primes_namespace.h cgo.h binding511.h binding512.h binding1024.h binding2048.h BSDmakefile
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c primes1024.c

primes2048.o: primes2048.c primes.h primes_namespace.h cgo.h binding511.h binding512.h binding1024.h binding2048.h BSDmakefile
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c primes2048.c

fp511.o: fp511_${ASM_PLATFORM}.S fp_const_le_511.s fp.h fp_namespace.h uintbig.h uintbig_namespace.h BSDmakefile
	${SCC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o $@ -c $<

fp512.o: fp512_${ASM_PLATFORM}.S fp_const_le_512.s fp.h fp_namespace.h uintbig.h uintbig_namespace.h BSDmakefile
	${SCC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o $@ -c $<

fp1024.o: fp1024_${ASM_PLATFORM}.S fp_const_le_1024.s fp.h fp_namespace.h uintbig.h uintbig_namespace.h BSDmakefile
	${SCC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		${ASFLAGS} \
		-o $@ -c $<

fp2048.o: fp2048_${ASM_PLATFORM}.S fp_const_le_2048.s fp.h fp_namespace.h uintbig.h uintbig_namespace.h BSDmakefile
	${SCC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		${ASFLAGS} \
		-o $@ -c $<

uintbig511.o: uintbig511_${ASM_PLATFORM}.S uintbig_const_le_511.s uintbig.h uintbig_namespace.h BSDmakefile
	${SCC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o $@ -c $<

uintbig512.o: uintbig512_${ASM_PLATFORM}.S uintbig_const_le_512.s uintbig.h uintbig_namespace.h BSDmakefile
	${SCC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o $@ -c $<

uintbig1024.o: uintbig1024_${ASM_PLATFORM}.S uintbig_const_le_1024.s uintbig.h uintbig_namespace.h BSDmakefile
	${SCC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o $@ -c $<

uintbig2048.o: uintbig2048_${ASM_PLATFORM}.S uintbig_const_le_2048.s uintbig.h uintbig_namespace.h BSDmakefile
	${SCC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-o $@ -c $<

fiat_p511.o: fiat_p511.c fiat_p511.h
	${SCC} -c fiat_p511.c -o fiat_p511.o

fiat_p512.o: fiat_p512.c fiat_p512.h
	${SCC} -c fiat_p512.c -o fiat_p512.o

fiat_p1024.o: fiat_p1024.c fiat_p1024.h
	${SCC} -c fiat_p1024.c -o fiat_p1024.o

fiat_p2048.o: fiat_p2048.c fiat_p2048.h
	${SCC} -c fiat_p2048.c -o fiat_p2048.o

fp2fiat511.o: fp2fiat.c fiat_p511.h fiat_p511.o fp.h fp_namespace.h uintbig.h uintbig_namespace.h BSDmakefile
	${SCC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
	-c fp2fiat.c -o fp2fiat511.o

fp2fiat512.o: fp2fiat.c fiat_p512.h fiat_p512.o fp.h fp_namespace.h uintbig.h uintbig_namespace.h BSDmakefile
	${SCC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
	-c fp2fiat.c -o fp2fiat512.o

fp2fiat1024.o: fp2fiat.c fiat_p1024.h fiat_p1024.o fp.h fp_namespace.h uintbig.h uintbig_namespace.h BSDmakefile
	${SCC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
	-c fp2fiat.c -o fp2fiat1024.o

fp2fiat2048.o: fp2fiat.c fiat_p2048.h fiat_p2048.o fp.h fp_namespace.h uintbig.h uintbig_namespace.h BSDmakefile
	${SCC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' \
	-c fp2fiat.c -o fp2fiat2048.o

# ----- libhighctidh_untuned, size-independent but normally replaced by tuned functions:

libhighctidh_untuned.a: steps_untuned.o BSDmakefile
	${AR} crs libhighctidh_untuned.a steps_untuned.o

steps_untuned.o: steps_untuned.c steps.h BSDmakefile
	${CC} -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c steps_untuned.c

# ----- libhighctidh_base, size-independent functions:

libhighctidh_base.a: steps.o random.o BSDmakefile
	${AR} crs libhighctidh_base.a steps.o random.o

steps.o: steps.c steps.h BSDmakefile
	${CC} -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c steps.c

random.o: random.c random.h int32_sort.h randombytes.h BSDmakefile
	${CC} -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c random.c

# ----- functions that libhighctidh wants from a core crypto library:

libtest.a: crypto_classify.o crypto_declassify.o randombytes.o int32_sort.o BSDmakefile
	${AR} crs libtest.a crypto_classify.o crypto_declassify.o randombytes.o int32_sort.o

randombytes.o: randombytes.c randombytes.h BSDmakefile
	${CC} -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c randombytes.c

int32_sort.o: int32_sort.c int32_sort.h BSDmakefile
	${CC} -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c int32_sort.c

crypto_declassify.o: crypto_declassify.c crypto_declassify.h BSDmakefile
	${CC} -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c crypto_declassify.c

crypto_classify.o: crypto_classify.c crypto_classify.h BSDmakefile
	${CC} -D'NAMESPACEGENERIC(x)=highctidh_##x' \
		-c crypto_classify.c


# ----- shared library targets for libhighctidh_*.so:


libhighctidh_511.so: libhighctidh_511.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
		${SCC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' -shared -o libhighctidh_511.so ${libhighctidh_511_OBJS} fp_inv511.o fp_sqrt511.o primes511.o poly511.o mont511.o elligator511.o skgen511.o validate511.o steps.o random.o crypto_classify.o crypto_declassify.o randombytes.o int32_sort.o  steps_untuned.o csidh511.o


test511-dyn: test511 libhighctidh_511.so
		${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' -o test511-dyn test.c -l highctidh_511 -L .


libhighctidh_512.so: libhighctidh_512.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
		${SCC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' -shared -o libhighctidh_512.so ${libhighctidh_512_OBJS} fp_inv512.o fp_sqrt512.o primes512.o poly512.o mont512.o elligator512.o skgen512.o validate512.o steps.o random.o crypto_classify.o crypto_declassify.o randombytes.o int32_sort.o  steps_untuned.o csidh512.o


test512-dyn: test512 libhighctidh_512.so
		${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' -o test512-dyn test.c -l highctidh_512 -L .


libhighctidh_1024.so: libhighctidh_1024.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
		${SCC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' -shared -o libhighctidh_1024.so ${libhighctidh_1024_OBJS} fp_inv1024.o fp_sqrt1024.o primes1024.o poly1024.o mont1024.o elligator1024.o skgen1024.o validate1024.o steps.o random.o crypto_classify.o crypto_declassify.o randombytes.o int32_sort.o  steps_untuned.o csidh1024.o


test1024-dyn: test1024 libhighctidh_1024.so
		${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' -o test1024-dyn test.c -l highctidh_1024 -L .


libhighctidh_2048.so: libhighctidh_2048.a libhighctidh_base.a libhighctidh_untuned.a libtest.a
		${SCC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' -shared -o libhighctidh_2048.so ${libhighctidh_2048_OBJS} fp_inv2048.o fp_sqrt2048.o primes2048.o poly2048.o mont2048.o elligator2048.o skgen2048.o validate2048.o steps.o random.o crypto_classify.o crypto_declassify.o randombytes.o int32_sort.o  steps_untuned.o csidh2048.o


test2048-dyn: test2048 libhighctidh_2048.so
		${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' -D'NAMESPACEGENERIC(x)=highctidh_##x' -o test2048-dyn test.c -l highctidh_2048 -L .


libhighctidh.so: libhighctidh_511.so libhighctidh_512.so libhighctidh_1024.so libhighctidh_2048.so
		ls -l libhighctidh_*.so

# This produces wasm as a shared library module
highctidh.wasm: libhighctidh.so
	export LDFLAGS="-s SIDE_MODULE=1"
	${CC} -v --no-entry -O1 *.o -o dist/highctidh.wasm
	ls -al dist/highctidh.wasm

setup-examples: csidh.h
		-mkdir -p libhighctidh
		-cp csidh.h libhighctidh/

example511: setup-examples libhighctidh_511.so
	${CC} -DBITS=511 -D'NAMESPACEBITS(x)=highctidh_511_##x' \
	-D'NAMESPACEGENERIC(x)=highctidh_##x' -o example-ctidh511 example-ctidh.c \
	-L. -I. -l highctidh_511

example512: setup-examples libhighctidh_512.so
	${CC} -DBITS=512 -D'NAMESPACEBITS(x)=highctidh_512_##x' \
	-D'NAMESPACEGENERIC(x)=highctidh_##x' -o example-ctidh512 example-ctidh.c \
	-L. -I. -l highctidh_512

example1024: setup-examples libhighctidh_1024.so
	${CC} -DBITS=1024 -D'NAMESPACEBITS(x)=highctidh_1024_##x' \
	-D'NAMESPACEGENERIC(x)=highctidh_##x' -o example-ctidh1024 example-ctidh.c \
	-L. -I. -l highctidh_1024

example2048: setup-examples libhighctidh_2048.so
	${CC} -DBITS=2048 -D'NAMESPACEBITS(x)=highctidh_2048_##x' \
	-D'NAMESPACEGENERIC(x)=highctidh_##x' -o example-ctidh2048 example-ctidh.c \
	-L. -I. -l highctidh_2048

examples: example511 example512 example1024 example2048
		ls -l example-ctidh511 example-ctidh512 example-ctidh1024 example-ctidh2048

examples-static: examples_static.c libhighctidh.a *.h
	${CC} -static -Wall -Werror -Wpedantic examples_static.c -Wl,-Bstatic -L. -l:libhighctidh.a -o examples-static

test: clean libhighctidh.so testrandom test511 test512 test1024 test2048
		./test.sh

DESTDIR ?= /usr/local
install: libhighctidh.so libhighctidh.a
		install -d ${DESTDIR}/include/libhighctidh/
		install -d ${DESTDIR}/lib/
		install -v *.h ${DESTDIR}/include/libhighctidh/
		install -v libhighctidh_*.so ${DESTDIR}/lib/
		install -v libhighctidh.a ${DESTDIR}/lib/


clean:
		-rm -f *.a *.o *.out *.so
		-rm -f bench1024cycles bench1024mults bench1024untuned bench2048cycles bench2048mults bench2048untuned bench511cycles bench511mults bench511untuned bench512cycles bench512mults bench512untuned
		-rm -f checkct1024cycles checkct1024mults checkct1024untuned checkct2048cycles checkct2048mults checkct2048untuned checkct511cycles checkct511mults checkct511untuned checkct512cycles checkct512mults checkct512untuned costpoly1024 costpoly2048 costpoly511 example-ctidh1024 example-ctidh2048
		-rm -f example-ctidh511 example-ctidh512 test1024 test2048 test511 test511 test512 test512-dyn test*-dyn testrandom testuintbig1024 testuintbig2048 testuintbig511 testuintbig512 tunecycles1024 tunecycles2048 tunecycles511 tunecycles512 ubench1024 ubench2048 ubench511 ubench512 umults1024 umults2048 umults511 umults512
		-rm -rf UNKNOWN.egg-info/ __pycache__/
		-rm -rf build/ deb_dist/ dist/
		-rm -rf highctidh.egg-info/ highctidh/__pycache__/
		-rm -rf tests/__pycache__/
		-rm -rf docker_build_output/
		-rm -rf libhighctidh/
		-rm -rf examples-static
		-rm -rf highctidh-*.tar.gz
