# Jarl build and install.
#
#   make              build bin/jarld and bin/jarl
#   make test         unit tests (integration tests run when BIND is found;
#                     set JARL_BIND_ROOT, see docs/development.md)
#   make e2e          end-to-end test against a real named (scripts/e2e.sh)
#   sudo make install install binaries, systemd unit, sysusers/tmpfiles
#                     files and an example /etc/jarl/jarl.yaml
#   make dist         static binaries for linux/amd64 and linux/arm64 in dist/

VERSION ?= $(shell cat VERSION 2>/dev/null || echo 0.0.0-dev)
LDFLAGS := -s -w -X jarl/internal/version.Version=$(VERSION)
GOFLAGS := -trimpath
export CGO_ENABLED := 0

PREFIX     ?= /usr/local
BINDIR     ?= $(PREFIX)/bin
DOCDIR     ?= $(PREFIX)/share/doc/jarl
UNITDIR    ?= /etc/systemd/system
SYSUSERSDIR ?= /usr/lib/sysusers.d
TMPFILESDIR ?= /usr/lib/tmpfiles.d
DESTDIR    ?=

.PHONY: all build test vet e2e install uninstall dist clean

all: build

build:
	go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o bin/jarld ./cmd/jarld
	go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o bin/jarl ./cmd/jarl

vet:
	go vet ./...
	@test -z "$$(gofmt -l cmd internal)" || { echo "gofmt needed:"; gofmt -l cmd internal; exit 1; }

test: vet
	go test ./...

e2e: build
	scripts/e2e.sh

install: build
	install -D -m 0755 bin/jarld $(DESTDIR)$(BINDIR)/jarld
	install -D -m 0755 bin/jarl $(DESTDIR)$(BINDIR)/jarl
	install -D -m 0644 deploy/systemd/jarl.service $(DESTDIR)$(UNITDIR)/jarl.service
	sed -i 's#/usr/local/bin/jarld#$(BINDIR)/jarld#; s#/usr/local/share/doc/jarl#$(DOCDIR)#' $(DESTDIR)$(UNITDIR)/jarl.service
	install -D -m 0644 deploy/sysusers.d/jarl.conf $(DESTDIR)$(SYSUSERSDIR)/jarl.conf
	install -D -m 0644 deploy/tmpfiles.d/jarl.conf $(DESTDIR)$(TMPFILESDIR)/jarl.conf
	install -D -m 0644 README.md $(DESTDIR)$(DOCDIR)/README.md
	install -D -m 0644 CHANGELOG.md $(DESTDIR)$(DOCDIR)/CHANGELOG.md
	install -d $(DESTDIR)$(DOCDIR)/docs $(DESTDIR)$(DOCDIR)/contrib/acme.sh $(DESTDIR)$(DOCDIR)/contrib/lego
	install -m 0644 docs/*.md $(DESTDIR)$(DOCDIR)/docs/
	install -m 0644 contrib/acme.sh/dns_jarl.sh $(DESTDIR)$(DOCDIR)/contrib/acme.sh/
	install -m 0755 contrib/lego/jarl-lego.sh $(DESTDIR)$(DOCDIR)/contrib/lego/
	@if [ ! -e $(DESTDIR)/etc/jarl/jarl.yaml ]; then \
		install -d -m 0750 $(DESTDIR)/etc/jarl; \
		bin/jarld config --example > $(DESTDIR)/etc/jarl/jarl.yaml; \
		chmod 0640 $(DESTDIR)/etc/jarl/jarl.yaml; \
		echo "wrote $(DESTDIR)/etc/jarl/jarl.yaml"; \
	fi
	@echo
	@echo "Next (as root): systemd-sysusers jarl.conf && systemd-tmpfiles --create jarl.conf"
	@echo "                chgrp jarl /etc/jarl /etc/jarl/jarl.yaml && systemctl daemon-reload"
	@echo "Then follow docs/install.md (init, import, adopt, start)."

uninstall:
	rm -f $(DESTDIR)$(BINDIR)/jarld $(DESTDIR)$(BINDIR)/jarl $(DESTDIR)$(UNITDIR)/jarl.service \
		$(DESTDIR)$(SYSUSERSDIR)/jarl.conf $(DESTDIR)$(TMPFILESDIR)/jarl.conf
	rm -rf $(DESTDIR)$(DOCDIR)
	@echo "Kept /etc/jarl, /var/lib/jarl and the files in /etc/bind/jarl and /var/lib/bind/jarl."

dist:
	for arch in amd64 arm64; do \
		GOOS=linux GOARCH=$$arch go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o dist/jarl-$(VERSION)-linux-$$arch/jarld ./cmd/jarld && \
		GOOS=linux GOARCH=$$arch go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o dist/jarl-$(VERSION)-linux-$$arch/jarl ./cmd/jarl && \
		cp -r README.md CHANGELOG.md docs deploy contrib dist/jarl-$(VERSION)-linux-$$arch/ && \
		tar -C dist -czf dist/jarl-$(VERSION)-linux-$$arch.tar.gz jarl-$(VERSION)-linux-$$arch || exit 1; \
	done

clean:
	rm -rf bin dist
