Skip to content

Instantly share code, notes, and snippets.

Created Jan 9, 2018
What would you like to do?
golang Makefile template
.PHONY: all
all: build
# Package and name are determined from the directory layout
PACKAGE := $(shell go list 2>/dev/null)
NAME := $(shell basename ${PACKAGE})
# Version is implied through signed git tags.
# If the current branch is not exactly a signed tag, the current branch is used instead.
VERSION := $(shell git describe --exact-match 2>/dev/null || git symbolic-ref -q --short HEAD)
CURRENT_DIR = $(shell pwd)
BUILD_DIR_LINK = $(shell readlink ${BUILD_DIR})
GO_SOURCES := $(shell go list -f '{{join .GoFiles " "}}')
GO_TEST_SOURCES := $(shell go list -f '{{join .TestGoFiles " "}}')
GOHOSTOS := $(shell go env GOHOSTOS 2>/dev/null)
GOHOSTARCH := $(shell go env GOHOSTARCH 2>/dev/null)
BUILD_OPTS := -ldflags '-w -X main.Version=$(VERSION)' -a
ifeq ($(BUILD_QUIET),1)
Q = @
Q =
.PHONY: build
build: lint vet test $(NAME)
$(NAME): $(GO_SOURCES) vendor rice
$(Q)go build $(BUILD_OPTS) -o $(NAME) $(PACKAGE)
.PHONY: install
install: $(GO_SOURCES) vendor rice
$(Q)go install $(BUILD_OPTS) $(PACKAGE)
.PHONY: link
if [ "$${BUILD_DIR_LINK}" != "$${CURRENT_DIR}" ]; then \
echo "Fixing symlinks for build"; \
rm -f $${BUILD_DIR}; \
mkdir -p $(shell dirname ${BUILD_DIR}); \
ln -s $${CURRENT_DIR} $${BUILD_DIR}; \
GODEP := ${GOPATH}/bin/dep
GOLINT := ${GOPATH}/bin/golint
GOVET := $(shell go env GOTOOLDIR)/vet
GORICE := ${GOPATH}/bin/rice
$(GODEP) : ; $(Q)go get
$(GOLINT) : ; $(Q)go get
$(GOVET) : ; $(Q)go get
$(GORICE) : ; $(Q)go get
# Just make this every time rather than tracking the dependencies....
.PHONY: rice
rice: $(GORICE)
# $(Q)cd cmd && rice embed-go
vendor: $(GODEP) Gopkg.toml Gopkg.lock
$(Q)cd $(BUILD_DIR) && $(GODEP) ensure
$(Q)touch vendor
.PHONY: fmt
$(Q)cd $(BUILD_DIR) && go fmt ./...
.PHONY: lint
lint: $(GOLINT)
$(Q)cd $(BUILD_DIR) && $(GOLINT) $$(cd $(BUILD_DIR) && go list ./...)
.PHONY: vet
vet: vendor $(GOVET)
$(Q)cd $(BUILD_DIR) && \
for src in $(GO_SOURCES) $(GO_TEST_SOURCES); do \
$(GOVET) -all=true $$src; \
.PHONY: test
test: vendor
$(Q)cd $(BUILD_DIR) && go test -v -timeout 30s -parallel=4 ./...
.PHONY: testacc
testacc: vendor
$(Q)cd $(BUILD_DIR) && TF_ACC=1 go test -v -timeout 10m ./...
.PHONY: clean
rm -f $(NAME)*
.PHONY: clean-all
clean-all: clean
rm -fr vendor/
rm -fr ${GOPATH}/bin/$(NAME)
.PHONY: release-artifacts
release-artifacts: $(NAME)_darwin_amd64 $(NAME)_darwin_amd64.asc $(NAME)_linux_amd64 $(NAME)_linux_amd64.asc
$(NAME)_linux_amd64: vendor test $(GO_SOURCES) rice
$(Q)GOOS=linux GOARCH=amd64 go build $(BUILD_OPTS) -o $(NAME)_linux_amd64 $(PACKAGE)
$(NAME)_darwin_amd64: vendor test $(GO_SOURCES) rice
$(Q)GOOS=darwin GOARCH=amd64 go build $(BUILD_OPTS) -o $(NAME)_darwin_amd64 $(PACKAGE)
%_amd64.asc: %_amd64
$(Q)gpg --armor --output $@ --detach-sig $<
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment