.DEFAULT_GOAL := all
-include config.mk

ifeq ($(wildcard config.mk),)
$(error Run ./configure first)
endif

PREFIX ?= /usr/local
BINDIR ?= $(PREFIX)/bin
LIBDIR ?= $(PREFIX)/lib
INCLUDEDIR ?= $(PREFIX)/include/ensifer
DATADIR ?= $(PREFIX)/share/ensifer
DOCDIR ?= $(PREFIX)/share/doc/ensifer
MANDIR ?= $(PREFIX)/share/man

BUILD = build
OBJDIR = $(BUILD)/obj
LIBDIR_BUILD = $(BUILD)/lib
BINDIR_BUILD = $(BUILD)/bin
CORE_OBJS = $(OBJDIR)/enfilade.o $(OBJDIR)/tumbler.o
S7_OBJS = $(OBJDIR)/enfilade_s7.o $(CORE_OBJS)

.PHONY: all clean distclean check test install uninstall version

version:
	@printf 'ensifer version %s\n' '$(VERSION)'

all: $(LIBDIR_BUILD)/libensifer.a $(LIBDIR_BUILD)/enfilade.so $(BINDIR_BUILD)/logan

$(OBJDIR) $(LIBDIR_BUILD) $(BINDIR_BUILD):
	@mkdir -p $@

$(OBJDIR)/%.o: src/%.c | $(OBJDIR)
	$(CC) $(CPPFLAGS) -Iinc $(CFLAGS) -fPIC -c $< -o $@

$(OBJDIR)/s7.o: src/s7.c inc/s7.h | $(OBJDIR)
	$(CC) $(CPPFLAGS) $(S7_CPPFLAGS) -Iinc $(CFLAGS) -w -c $< -o $@

$(LIBDIR_BUILD)/libensifer.a: $(CORE_OBJS) | $(LIBDIR_BUILD)
	$(AR) rcs $@ $(CORE_OBJS)

$(LIBDIR_BUILD)/enfilade.so: $(S7_OBJS) | $(LIBDIR_BUILD)
	$(CC) -shared $(LDFLAGS) -o $@ $(S7_OBJS) -lm

$(BINDIR_BUILD)/logan: src/logan.c $(OBJDIR)/s7.o $(S7_OBJS) inc/enfilade_s7.h | $(BINDIR_BUILD)
	$(CC) $(CPPFLAGS) $(S7_CPPFLAGS) -Iinc $(CFLAGS) $(LDFLAGS) -o $@ \
		src/logan.c $(OBJDIR)/s7.o $(S7_OBJS) -lm $(S7_LIBS)

$(BUILD)/tumbler-test: test/tumbler-test.c $(OBJDIR)/tumbler.o | $(BUILD)
	$(CC) $(CPPFLAGS) -Iinc $(CFLAGS) $(LDFLAGS) -o $@ $^

$(BUILD)/enfilade-test: test/enfilade-test.c $(CORE_OBJS) | $(BUILD)
	$(CC) $(CPPFLAGS) -Iinc $(CFLAGS) $(LDFLAGS) -o $@ $^

$(BUILD)/enfload: test/enfload.c $(OBJDIR)/s7.o $(S7_OBJS) inc/enfilade_s7.h | $(BUILD)
	$(CC) $(CPPFLAGS) $(S7_CPPFLAGS) -Iinc $(CFLAGS) $(LDFLAGS) -o $@ \
		test/enfload.c $(OBJDIR)/s7.o $(S7_OBJS) -lm $(S7_LIBS)

$(BUILD):
	@mkdir -p $@

check test: $(BUILD)/tumbler-test $(BUILD)/enfilade-test $(BUILD)/enfload
	$(BUILD)/tumbler-test
	$(BUILD)/enfilade-test
	$(BUILD)/enfload

install: all
	$(INSTALL) -d $(DESTDIR)$(BINDIR) $(DESTDIR)$(LIBDIR) $(DESTDIR)$(INCLUDEDIR) \
		$(DESTDIR)$(DATADIR)/scheme $(DESTDIR)$(DOCDIR) $(DESTDIR)$(MANDIR)/man3 $(DESTDIR)$(MANDIR)/man7
	$(INSTALL) -m 755 $(BINDIR_BUILD)/logan $(DESTDIR)$(BINDIR)/logan
	$(INSTALL) -m 644 $(LIBDIR_BUILD)/libensifer.a $(DESTDIR)$(LIBDIR)/libensifer.a
	$(INSTALL) -m 755 $(LIBDIR_BUILD)/enfilade.so $(DESTDIR)$(LIBDIR)/enfilade.so
	$(INSTALL) -m 644 inc/enfilade.h inc/tumbler.h inc/s7.h inc/enfilade_s7.h $(DESTDIR)$(INCLUDEDIR)/
	$(INSTALL) -m 644 scheme/enf.scm scheme/cload.scm scheme/libc.scm scheme/libdl.scm $(DESTDIR)$(DATADIR)/scheme/
	$(INSTALL) -m 644 README.md doc/USAGE $(DESTDIR)$(DOCDIR)/
	$(INSTALL) -m 644 doc/enfilade.3 doc/tumbler.3 $(DESTDIR)$(MANDIR)/man3/
	$(INSTALL) -m 644 doc/enfilade-s7.7 doc/ensifer.7 doc/tumbler-s7.7 $(DESTDIR)$(MANDIR)/man7/

uninstall:
	rm -f $(DESTDIR)$(BINDIR)/logan $(DESTDIR)$(LIBDIR)/libensifer.a $(DESTDIR)$(LIBDIR)/enfilade.so
	rm -f $(DESTDIR)$(INCLUDEDIR)/enfilade.h $(DESTDIR)$(INCLUDEDIR)/tumbler.h $(DESTDIR)$(INCLUDEDIR)/s7.h $(DESTDIR)$(INCLUDEDIR)/enfilade_s7.h
	rm -f $(DESTDIR)$(MANDIR)/man3/enfilade.3 $(DESTDIR)$(MANDIR)/man3/tumbler.3
	rm -f $(DESTDIR)$(MANDIR)/man7/enfilade-s7.7 $(DESTDIR)$(MANDIR)/man7/ensifer.7 $(DESTDIR)$(MANDIR)/man7/tumbler-s7.7
	rm -rf $(DESTDIR)$(DATADIR) $(DESTDIR)$(DOCDIR)

clean:
	rm -rf $(BUILD)

distclean: clean
	rm -f config.mk config.h config.log
