NAME = shaser
GO ?= go
PREFIX ?= /usr/local
DESTDIR ?=
BUILD_DIR ?= build
INSTALL ?= install
RM ?= rm -f
R2PM_PREFIX ?= $(shell r2pm -H R2PM_PREFIX 2>/dev/null)
R2PM_BINDIR ?= $(shell r2pm -H R2PM_BINDIR 2>/dev/null)

UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Darwin)
LIB_EXT = dylib
else
LIB_EXT = so
endif

BINDIR = $(PREFIX)/bin
LIBDIR = $(PREFIX)/lib
INCLUDEDIR = $(PREFIX)/include

BIN = $(BUILD_DIR)/$(NAME)
LIB = $(BUILD_DIR)/lib$(NAME).$(LIB_EXT)
PUBLIC_HEADER = capi/$(NAME).h
BUILD_STAMP = $(BUILD_DIR)/.dir

.PHONY: all build cli capi test vet check install uninstall check-r2pm user-install user-uninstall clean

all: build capi

build: cli

cli: $(BIN)

capi: $(LIB)

$(BUILD_STAMP):
	mkdir -p $(BUILD_DIR)
	touch $(BUILD_STAMP)

$(BIN): go.mod $(shell find cmd internal -type f -name '*.go') | $(BUILD_STAMP)
	$(GO) build -o $(BIN) ./cmd/$(NAME)

$(LIB): go.mod $(shell find capi internal -type f) | $(BUILD_STAMP)
	$(GO) build -tags capi -buildmode=c-shared -o $(LIB) ./capi

test:
	$(GO) test ./...
	$(GO) test -tags capi ./...

vet:
	$(GO) vet ./...
	$(GO) vet -tags capi ./capi

check: test vet

install: all
	$(INSTALL) -d "$(DESTDIR)$(BINDIR)" "$(DESTDIR)$(LIBDIR)" "$(DESTDIR)$(INCLUDEDIR)"
	$(INSTALL) -m 755 "$(BIN)" "$(DESTDIR)$(BINDIR)/$(NAME)"
	$(INSTALL) -m 755 "$(LIB)" "$(DESTDIR)$(LIBDIR)/lib$(NAME).$(LIB_EXT)"
	$(INSTALL) -m 644 "$(PUBLIC_HEADER)" "$(DESTDIR)$(INCLUDEDIR)/$(NAME).h"

uninstall:
	$(RM) "$(DESTDIR)$(BINDIR)/$(NAME)"
	$(RM) "$(DESTDIR)$(LIBDIR)/lib$(NAME).$(LIB_EXT)"
	$(RM) "$(DESTDIR)$(INCLUDEDIR)/$(NAME).h"

check-r2pm:
	@test -n "$(R2PM_PREFIX)" || (echo "r2pm -H R2PM_PREFIX returned an empty path" >&2; exit 1)
	@test -n "$(R2PM_BINDIR)" || (echo "r2pm -H R2PM_BINDIR returned an empty path" >&2; exit 1)

user-install: all check-r2pm
	$(INSTALL) -d "$(DESTDIR)$(R2PM_BINDIR)" "$(DESTDIR)$(R2PM_PREFIX)/lib" "$(DESTDIR)$(R2PM_PREFIX)/include"
	$(INSTALL) -m 755 "$(BIN)" "$(DESTDIR)$(R2PM_BINDIR)/$(NAME)"
	$(INSTALL) -m 755 "$(LIB)" "$(DESTDIR)$(R2PM_PREFIX)/lib/lib$(NAME).$(LIB_EXT)"
	$(INSTALL) -m 644 "$(PUBLIC_HEADER)" "$(DESTDIR)$(R2PM_PREFIX)/include/$(NAME).h"

user-uninstall: check-r2pm
	$(RM) "$(DESTDIR)$(R2PM_BINDIR)/$(NAME)"
	$(RM) "$(DESTDIR)$(R2PM_PREFIX)/lib/lib$(NAME).$(LIB_EXT)"
	$(RM) "$(DESTDIR)$(R2PM_PREFIX)/include/$(NAME).h"

clean:
	$(RM) -r $(BUILD_DIR)
