Skip to content

Instantly share code, notes, and snippets.

@Lexty
Last active May 12, 2016 11:22
Show Gist options
  • Save Lexty/d665212030ddf7759eabbb56aaff8683 to your computer and use it in GitHub Desktop.
Save Lexty/d665212030ddf7759eabbb56aaff8683 to your computer and use it in GitHub Desktop.
Makefile for golang projects
FROM golang:1.6.2
MAINTAINER Alexandr Medvedev <[email protected]>
RUN go get github.com/golang/lint/golint
ADD . /go/src/github.com/user/project
RUN cd /go/src/github.com/user/project && go get ./...
# Targets
# all: Builds the code
# build: Builds the code
# gofmt: Formats the source files
# govet: Examines the source code with Vet
# golint: Examines the source code with Vet
# clean: Cleans the code
# release: Builds the code and compress build to .zip and .tar.gz
########################
# Configurable options #
# Build version
VERSION=0.0.0
# Build tags
TAGS=
# Binary file name
BINARY=run
# Project path
SOURCE=github.com/user/project
# Other build flags
BUILD_FLAGS=-v
# Docker build image (can be "golang")
DOCKER_BUILD_IMAGE=local/build-golang-project
# Release folder name
RELEASE_NAME=$(BINARY)
# Files and folders which be moved to release
RELEASE_FILES=LICENSE README.md
# Releases root folder
RELEASE_ROOT=release
############################
# Not configurable options #
BUILD_TIME=$(shell date -u '+%Y-%m-%d %I:%M:%S %Z')
BUILD_GIT_HASH=$(shell git rev-parse HEAD)
LDFLAGS += -X "${SOURCE}/cmd.BuildVersion=${VERSION}"
LDFLAGS += -X "${SOURCE}/cmd.BuildTime=${BUILD_TIME}"
LDFLAGS += -X "${SOURCE}/cmd.BuildGitHash=${BUILD_GIT_HASH}"
CMD_PREFIX=docker run --rm -v "${PWD}":/go/src/$(SOURCE) -w /go/src/$(SOURCE) $(DOCKER_BUILD_IMAGE)
CMD_GO=$(CMD_PREFIX) go
NOW = $(shell date -u '+%Y%m%d%I%M%S')
RELEASE_FILE_NAME=$(RELEASE_NAME)-$(NOW)-$(VERSION)
.PHONY: build govet gofmt golint build-dev pack pack-prepare pack-zip pack-tar-gz release get-deps clean
build:
····$(CMD_GO) build $(BUILD_FLAGS) -ldflags '$(LDFLAGS)' -tags '$(TAGS)' -o $(GOPATH)/bin/$(BINARY)
govet:
····$(CMD_GO) tool vet -composites=false -methods=false -structtags=false .
gofmt:
····$(CMD_PREFIX) gofmt -w .
# https://github.com/golang/lint
# go get github.com/golang/lint/golint
golint:
····$(CMD_PREFIX) golint ./...
build-dev: govet
····$(CMD_GO) build $(BUILD_FLAGS) -race -tags '$(TAGS)' -o $(BINARY)
····cp '$(GOPATH)/bin/$(BINARY)' $(BINARY)
get-deps:
····docker build -t $(DOCKER_BUILD_IMAGE) .
pack-prepare:
····rm -rf "$(RELEASE_ROOT)/$(RELEASE_NAME)"
····mkdir -p "$(RELEASE_ROOT)/$(RELEASE_NAME)"
····cp -r $(RELEASE_NAME) $(RELEASE_FILES) "$(RELEASE_ROOT)/$(RELEASE_NAME)"
pack-zip: pack-prepare
····cd $(RELEASE_ROOT) && zip -r "$(RELEASE_FILE_NAME).zip" "$(RELEASE_NAME)"
pack-tar-gz: pack-prepare
····cd $(RELEASE_ROOT) && tar -zcvf $(RELEASE_FILE_NAME).tar.gz "$(RELEASE_NAME)"
pack: pack-zip pack-tar-gz
release: build pack
clean:
····$(CMD_GO) clean -i ./...
····rm -f $(BINARY)
····rm -rf "$(RELEASE_ROOT)/$(RELEASE_NAME)"
····docker rmi $(DOCKER_BUILD_IMAGE)
clean-mac: clean
····find . -name ".DS_Store" -print0 | xargs -0 rm
test:
····$(CMD_GO) test -cover -race ./...
fixme:
····grep -rnw "FIXME" .
todo:
····grep -rnw "TODO" .
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment