CC      ?= gcc
CFLAGS  ?= -O2 -g -Wall -Wextra -Wno-format-truncation
FUSE_CFLAGS := $(shell pkg-config --cflags fuse3 2>/dev/null)
FUSE_LIBS   := $(shell pkg-config --libs fuse3 2>/dev/null || echo -lfuse3)
PREFIX  ?= /usr/local
BINDIR  ?= $(PREFIX)/bin

PROGS = umsdosfs umsls umscat umscp umsfsck umsstat umstar

all: $(PROGS)
	$(MAKE) -C doc

mkversion: src/mkversion.c
	$(CC) $(CFLAGS) -o $@ $<

src/version.h: mkversion
	./mkversion manifest.uuid manifest VERSION > src/version.h

umsdos.o: src/umsdos.c src/umsdos.h src/ums_compat.h src/ums_dcache.h src/version.h
	$(CC) $(CFLAGS) -c -o $@ src/umsdos.c

ums_compat.o: src/ums_compat.c src/umsdos.h src/ums_compat.h
	$(CC) $(CFLAGS) -c -o $@ src/ums_compat.c

ums_dcache.o: src/ums_dcache.c src/ums_dcache.h src/umsdos.h src/ums_compat.h
	$(CC) $(CFLAGS) -c -o $@ src/ums_dcache.c

LIBOBJ = umsdos.o ums_compat.o ums_dcache.o

umsdosfs: src/umsdosfs.c $(LIBOBJ)
	$(CC) $(CFLAGS) $(FUSE_CFLAGS) -o $@ src/umsdosfs.c $(LIBOBJ) $(FUSE_LIBS) -lpthread

umstool.o: src/umstool.c src/umstool.h src/umsdos.h
	$(CC) $(CFLAGS) -c -o $@ src/umstool.c

umsquote.o: src/umsquote.c src/umsquote.h
	$(CC) $(CFLAGS) -c -o $@ src/umsquote.c

umsundo.o: src/umsundo.c src/umsundo.h src/umsdos.h
	$(CC) $(CFLAGS) -c -o $@ src/umsundo.c

umsls umscat umscp umsstat umstar: %: src/%.c umstool.o umsquote.o $(LIBOBJ)
	$(CC) $(CFLAGS) -o $@ $< umstool.o umsquote.o $(LIBOBJ)

umsfsck: src/umsfsck.c src/umsundo.h umstool.o umsquote.o umsundo.o $(LIBOBJ)
	$(CC) $(CFLAGS) -o $@ src/umsfsck.c umstool.o umsquote.o umsundo.o $(LIBOBJ)

test: all
	./tests/run_tests.sh

# the concurrency stress test alone, long mode
test-long: all
	STRESS_LONG=1 ./tests/stress_test.sh

install: all
	install -d $(DESTDIR)$(BINDIR)
	install -m 755 $(PROGS) $(DESTDIR)$(BINDIR)
	ln -s umsfsck $(DESTDIR)$(BINDIR)/fsck.umsdos
	$(MAKE) -C doc install

uninstall:
	$(RM) $(addprefix $(DESTDIR)$(BINDIR)/,$(PROGS)) $(DESTDIR)$(BINDIR)/fsck.umsdos
	$(MAKE) -C doc uninstall
	rmdir -p --ignore-fail-on-non-empty $(DESTDIR)$(BINDIR)

clean:
	$(RM) *.o mkversion src/version.h $(PROGS)
	$(MAKE) -C doc clean

.PHONY: all clean test test-long install uninstall
