Makefileを作る

Goのプロジェクトはビルドツールにmakeを使ってることが多い。myawsはビルドとかパッケージ周りの作業は雑なシェルスクリプトで作業してたんだけど、やっぱりMakefileあった方がよいかなぁとか思って、Makefileを作った。随分前にC++とかやってたときは書いてたはずなんだけど、久々すぎて書き方がさっぱりわからなくてググりまくったり、人のリポジトリを参考にしたりして、まぁそれっぽいものはできた。あとは必要に応じて改造していけば出発点としてはよかろう。誰かの参考になるかと思い晒しておく。依存ライブラリの取得をどうしようかはいくつか選択肢があるので悩み中。

NAME			:= myaws
VERSION			:= v0.0.6
REVISION		:= $(shell git rev-parse --short HEAD)
LDFLAGS			:= "-X github.com/minamijoyo/myaws/cmd.Version=${VERSION} -X github.com/minamijoyo/myaws/cmd.Revision=${REVISION}"
OSARCH			:= "darwin/amd64 linux/amd64"
GITHUB_USER	:= minamijoyo

ifndef GOBIN
GOBIN := $(shell echo "$${GOPATH%%:*}/bin")
endif

LINT := $(GOBIN)/golint
GOX := $(GOBIN)/gox
ARCHIVER := $(GOBIN)/archiver
GHR := $(GOBIN)/ghr

$(LINT): ; @go get github.com/golang/lint/golint
$(GOX): ; @go get github.com/mitchellh/gox
$(ARCHIVER): ; @go get github.com/mholt/archiver/cmd/archiver
$(GHR): ; @go get github.com/tcnksm/ghr

.DEFAULT_GOAL := build

.PHONY: build
build:
	go build -ldflags $(LDFLAGS) -o bin/$(NAME)

.PHONY: install
install:
	go install -ldflags $(LDFLAGS)

.PHONY: cross-build
cross-build: $(GOX)
	rm -rf ./out && \
	gox -ldflags $(LDFLAGS) -osarch $(OSARCH) -output "./out/${NAME}_${VERSION}_{{.OS}}_{{.Arch}}/{{.Dir}}"

.PHONY: package
package: cross-build $(ARCHIVER)
	rm -rf ./pkg && mkdir ./pkg && \
	pushd out && \
	find * -type d -exec archiver make ../pkg/{}.tar.gz {}/$(NAME) \; && \
	popd

.PHONY: release
release: package $(GHR)
	ghr -u $(GITHUB_USER) $(VERSION) pkg/

.PHONY: lint
lint: $(LINT)
	@golint ./...

.PHONY: vet
vet:
	@go vet ./...

.PHONY: test
test:
	@go test ./...

.PHONY: check
check: lint vet test build