.PHONY: flint install clean re dir re_all all test release docs docker
.PHONY: darwin_386 darwin_amd64
.PHONY: linux_arm6 linux_arm7 linux_arm64 linux_386 linux_amd64 linux_mips linux_mips64
.PHONY: windows_386 windows_amd64
.PHONY: freebsd_386 freebsd_amd64 freebsd_arm6 freebsd_arm7
.PHONY: openbsd_386 open_amd64 open_arm6 open_arm7
.PHONY: netbsd_386 net_amd64 net_arm6 net_arm7

NAME = flint
DIST_DIR = dist
REPO="github.com/bloom42/flint"
VERSION := $(shell cat version/version.go| grep "\sVersion" | cut -d '"' -f2)
DOCKER_IMAGE = "bloom42/$(NAME)"

define checksums
	echo $$(openssl sha512 $(1) | cut -d " " -f2) $$(echo $(1) | rev | cut -d "/" -f1 | rev) >> $(2)/$(3)
endef

define build_for_os_arch
	mkdir -p $(DIST_DIR)/$(1)_$(2)$(4)/$(VERSION)
	GOARM=$(4) GOOS=$(1) GOARCH=$(2) CGO_ENABLED=0 go build -a -installsuffix cgo \
		 -ldflags "-X $(REPO)/version.UTCBuildTime=`TZ=UTC date -u '+%Y-%m-%dT%H:%M:%SZ'` \
		 -X $(REPO)/version.GitCommit=`git rev-parse HEAD` \
		 -X $(REPO)/version.GoVersion=`go version | cut -d' ' -f 3 | cut -c3-`" \
		 -o $(DIST_DIR)/$(1)_$(2)$(4)/$(VERSION)/$(NAME)$(3)
	@# binary checksums
	$(call checksums,$(DIST_DIR)/$(1)_$(2)$(4)/$(VERSION)/$(NAME)$(3),$(DIST_DIR)/$(1)_$(2)$(4)/$(VERSION),sha512sum.txt)

	zip -j $(DIST_DIR)/$(NAME)_$(VERSION)_$(1)_$(2)$(4).zip $(DIST_DIR)/$(1)_$(2)$(4)/$(VERSION)/$(NAME)$(3) \
		$(DIST_DIR)/$(1)_$(2)$(4)/$(VERSION)/sha512sum.txt

	@#archive checksums
	$(call checksums,$(DIST_DIR)/$(NAME)_$(VERSION)_$(1)_$(2)$(4).zip,dist,$(NAME)_$(VERSION)_sha512sums.txt)
endef


$(NAME): dir
	CGO_ENABLED=0 go build -a -installsuffix cgo \
		 -ldflags "-X $(REPO)/version.UTCBuildTime=`TZ=UTC date -u '+%Y-%m-%dT%H:%M:%SZ'` \
		 -X $(REPO)/version.GitCommit=`git rev-parse HEAD` \
		 -X $(REPO)/version.GoVersion=`go version | cut -d' ' -f 3 | cut -c3-`" \
		 -o $(DIST_DIR)/$(NAME)

test:
	go vet $(go list ./... | grep -v /vendor/)
	go test -v -race ./...
	flint

install:
	CGO_ENABLED=0 go install -a -installsuffix cgo \
		 -ldflags "-X $(REPO)/version.UTCBuildTime=`TZ=UTC date -u '+%Y-%m-%dT%H:%M:%SZ'` \
		 -X $(REPO)/version.GitCommit=`git rev-parse HEAD` \
		 -X $(REPO)/version.GoVersion=`go version | cut -d' ' -f 3 | cut -c3-`"

clean:
	rm -rf $(NAME) $(DIST_DIR)

re: clean $(NAME)

dir:
	mkdir -p $(DIST_DIR)

re_all: clean all

all: darwin_386 darwin_amd64 linux_arm6 linux_arm7 linux_arm64 linux_386 linux_amd64 windows_386 windows_amd64 freebsd_386 freebsd_amd64 openbsd_386 openbsd_amd64 netbsd_386 netbsd_amd64

release: clean
	git tag v$(VERSION)
	git push origin v$(VERSION)

docs:
	cd _docs && rm -rf site && mkdocs build

docker:
	docker build -t $(DOCKER_IMAGE):$(VERSION) -t $(DOCKER_IMAGE):latest .

darwin_386:
	$(call build_for_os_arch,darwin,386,)

darwin_amd64:
	$(call build_for_os_arch,darwin,amd64,)

linux_arm6:
	$(call build_for_os_arch,linux,arm,,6)

linux_arm7:
	$(call build_for_os_arch,linux,arm,,7)

linux_arm64:
	$(call build_for_os_arch,linux,arm64,)

linux_386:
	$(call build_for_os_arch,linux,386,)

linux_amd64:
	$(call build_for_os_arch,linux,amd64,)

linux_mips:
	$(call build_for_os_arch,linux,mips,)

linux_mips64:
	$(call build_for_os_arch,linux,mips64,)

windows_386:
	$(call build_for_os_arch,windows,386,.exe)

windows_amd64:
	$(call build_for_os_arch,windows,amd64,.exe)

freebsd_386:
	$(call build_for_os_arch,freebsd,386,)

freebsd_amd64:
	$(call build_for_os_arch,freebsd,amd64,)

freebsd_arm6:
	$(call build_for_os_arch,freebsd,arm,,6)

freebsd_arm7:
	$(call build_for_os_arch,freebsd,arm,,7)

openbsd_386:
	$(call build_for_os_arch,openbsd,386,)

openbsd_amd64:
	$(call build_for_os_arch,openbsd,amd64,)

openbsd_arm6:
	$(call build_for_os_arch,openbsd,arm,,6)

openbsd_arm7:
	$(call build_for_os_arch,openbsd,arm,,7)

netbsd_386:
	$(call build_for_os_arch,netbsd,386,)

netbsd_amd64:
	$(call build_for_os_arch,netbsd,amd64,)

netbsd_arm6:
	$(call build_for_os_arch,netbsd,arm,,6)

netbsd_arm7:
	$(call build_for_os_arch,netbsd,arm,,7)
