DEFS    = -DAUTHENTICATION
CC      = gcc
CFLAGS  = -std=c99 -Wall -Wextra -O2 $(DEFS)
LDFLAGS =

AMIGA_DEBUG  = -DNDEBUG -DNOPOOL
# AMIGA_DEBUG  = -DDEBUG -DTDEBUG=3 -DNOPOOL
AMIGA_CC     = vc +aos68k -c99 -O1 -dontwarn=153,129 $(AMIGA_DEBUG) -D__amigaos__ $(DEFS) -I${VBCC}targets/m68k-amigaos/roadshow_netinclude_h
AMIGA_AS     = vasmm68k_mot -quiet -m68000 -align -phxass -no-opt -x $(AMIGA_DEBUG) -I${VBCC}targets/m68k-amigaos/include_i

help:
	@echo "all ........... builds fizz-serve, fizz-mount, fizz-test"
	@echo "install ....... installs fizz, fizz-serve, fizz-mount to /usr/local/bin"
	@echo "amiga ......... builds fizz, the unified amiga client/server"
	@echo "test-client ... runs the client test suite"
	@echo "test .......... runs the client-server test suite (POSIX+FUSE)"
	@echo "test-remote ... runs the client-server test suite against"
	@echo "                remote server on HOST=$(HOST) PORT=$(PORT)"

all: fizz-serve fizz-mount fizz-test

# unix gets two separate binaries, because if FUSE is not available,
# the server might still be used
fizz-serve: server.c argparse.c argparse.h fizz-protocol.h fizz-blake2s.h fizz-auth.h fizz-server-auth.h fizz-version.h
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ server.c argparse.c -lpthread

fizz-mount: client.c argparse.c argparse.h fizz-protocol.h fizz-blake2s.h fizz-auth.h fizz-version.h
	$(CC) $(CFLAGS) $(LDFLAGS) -o $@ client.c argparse.c $(shell pkg-config --cflags --libs fuse3) -lpthread

fizz-test: fizz-test.c
	$(CC) $(CFLAGS) -o $@ fizz-test.c

fizz-test-amiga: fizz-test.c
	$(AMIGA_CC) fizz-test.c -o fizz-test-amiga -lamiga
	
amiga-comparetree: amiga-comparetree.c
	$(AMIGA_CC) amiga-comparetree.c -o amiga-comparetree -lamiga

kprintf.o: kprintf.asm
	$(AMIGA_AS) -Fhunk kprintf.asm -o kprintf.o
speck64be.o: speck64be.asm
	$(AMIGA_AS) -Fhunk speck64be.asm -o speck64be.o

# Amiga unified binary: mount and serve subcommands in one executable.
fizz: amiga-main.c amiga-client.c amiga-server.c amiga-util.c kprintf.o speck64be.o fizz-protocol.h fizz-blake2s.h fizz-auth.h fizz-server-auth.h debug.h fizz-version.h
	$(AMIGA_CC) amiga-main.c amiga-client.c amiga-server.c amiga-util.c kprintf.o speck64be.o -o $@ -lamiga

amiga: fizz fizz-test-amiga amiga-comparetree

install-amiga: fizz
	copy fizz c:

install: fizz-posix fizz-mount fizz-serve
	install fizz-posix /usr/local/bin/fizz
	install fizz-mount fizz-serve /usr/local/bin/

clean:
	rm -f fizz-serve fizz-mount fizz kprintf.o fizz-test fizz-test-amiga amiga-util.o
	
release: fizz
	
release-clean: fizz
	rm -Rf *.o .hg .hgignore .hgtags DESIGN SECURITY TODO GOTCHAS

test: fizz-serve fizz-mount
	@lua5.3 tests/run.lua 2>&1 | tee tests/last_run.log; exit $${PIPESTATUS[0]}

# Run tests against an already-running remote server (e.g. on Amiga).
# Usage: make test-remote HOST=192.168.1.x [PORT=17711]
HOST ?= a3000
PORT ?= 17712
test-remote: fizz-mount
	@test -n "$(HOST)" || { echo "Usage: make test-remote HOST=x.x.x.x [PORT=17711]"; exit 1; }
	@lua5.3 tests/run.lua --remote "$(HOST):$(PORT)" 2>&1 | tee tests/last_run.log; exit $${PIPESTATUS[0]}

test-client: fizz-test
	./fizz-test test-mount

test-clean:
	@sh tests/clean.sh

showdiff:
	hg extdiff -p kdiff3

.PHONY: all clean amiga test test-remote test-clean test-client help install install-amiga showdiff release release-clean


