# Jarl build and install. # # make build bin/jarld and bin/jarl (and their bash completion) # 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, bash completion, systemd units, # sysusers/tmpfiles files and an example /etc/jarl/jarl.yaml # make deb Debian packages in dist/ (DEB_ARCH=arm64 for another # architecture): jarl (the server) and jarl-cli (the CLI, # which jarl depends on); 'sudo apt install ./dist/jarl*_amd64.deb' # make dist static binaries for linux/amd64 and linux/arm64 in dist/ # make cli-dist the CLI alone for Linux, macOS and Windows in dist/ # (jarl-cli---[.exe]) 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 # bash-completion also looks in /usr/local/share (XDG_DATA_DIRS). BASHCOMPDIR ?= $(PREFIX)/share/bash-completion/completions UNITDIR ?= /etc/systemd/system SYSUSERSDIR ?= /usr/lib/sysusers.d TMPFILESDIR ?= /usr/lib/tmpfiles.d DESTDIR ?= # The binaries install-files copies (make deb points these at other # architectures' builds). JARLD_BIN ?= bin/jarld JARL_BIN ?= bin/jarl # make deb: the package's architecture (Debian name) and version. DEB_ARCH ?= $(shell dpkg --print-architecture 2>/dev/null || go env GOARCH) DEB_VERSION ?= $(subst -,~,$(VERSION)) .PHONY: all build completion test vet e2e install install-files uninstall deb dist cli-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 $(MAKE) --no-print-directory completion # Bash completion scripts, generated by the binaries themselves. completion: @mkdir -p bin/completion bin/jarl completion bash > bin/completion/jarl bin/jarld completion bash > bin/completion/jarld 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-files @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), and turn on the daily" @echo "database backup: systemctl enable --now jarl-backup.timer" # Everything but /etc/jarl/jarl.yaml (shared by install and deb). install-files: install -D -m 0755 $(JARLD_BIN) $(DESTDIR)$(BINDIR)/jarld install -D -m 0755 $(JARL_BIN) $(DESTDIR)$(BINDIR)/jarl install -D -m 0644 bin/completion/jarl $(DESTDIR)$(BASHCOMPDIR)/jarl install -D -m 0644 bin/completion/jarld $(DESTDIR)$(BASHCOMPDIR)/jarld for u in jarl.service jarl-backup.service jarl-backup.timer; do \ install -D -m 0644 deploy/systemd/$$u $(DESTDIR)$(UNITDIR)/$$u && \ sed -i 's#/usr/local/bin/jarld#$(BINDIR)/jarld#; s#/usr/local/share/doc/jarl#$(DOCDIR)#' $(DESTDIR)$(UNITDIR)/$$u || exit 1; \ done 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 LICENSE $(DESTDIR)$(DOCDIR)/LICENSE 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/ uninstall: rm -f $(DESTDIR)$(BINDIR)/jarld $(DESTDIR)$(BINDIR)/jarl $(DESTDIR)$(UNITDIR)/jarl.service \ $(DESTDIR)$(UNITDIR)/jarl-backup.service $(DESTDIR)$(UNITDIR)/jarl-backup.timer \ $(DESTDIR)$(BASHCOMPDIR)/jarl $(DESTDIR)$(BASHCOMPDIR)/jarld \ $(DESTDIR)$(SYSUSERSDIR)/jarl.conf $(DESTDIR)$(TMPFILESDIR)/jarl.conf rm -rf $(DESTDIR)$(DOCDIR) @echo "Kept /etc/jarl, /var/lib/jarl, /var/backups/jarl and the files in /etc/bind/jarl and /var/lib/bind/jarl." # A Debian package, built with dpkg-deb (no root needed). The package's # scripts are in deploy/debian; scripts/mkdeb.sh explains the layout. deb: build DEB_ARCH='$(DEB_ARCH)' DEB_VERSION='$(DEB_VERSION)' VERSION='$(VERSION)' \ LDFLAGS='$(LDFLAGS)' GOFLAGS='$(GOFLAGS)' scripts/mkdeb.sh dist: build 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 LICENSE docs deploy contrib bin/completion dist/jarl-$(VERSION)-linux-$$arch/ && \ tar -C dist -czf dist/jarl-$(VERSION)-linux-$$arch.tar.gz jarl-$(VERSION)-linux-$$arch || exit 1; \ done # The platforms cli-dist builds the CLI for. CLI_PLATFORMS ?= linux/amd64 linux/arm64 darwin/amd64 darwin/arm64 windows/amd64 windows/arm64 cli-dist: @mkdir -p dist for p in $(CLI_PLATFORMS); do \ os=$${p%/*} arch=$${p#*/} ext=; [ $$os = windows ] && ext=.exe; \ GOOS=$$os GOARCH=$$arch go build $(GOFLAGS) -ldflags '$(LDFLAGS)' -o dist/jarl-cli-$(VERSION)-$$os-$$arch$$ext ./cmd/jarl || exit 1; \ done clean: rm -rf bin dist