This is an example of Makefile to build a Go project. This is quite
similar to Filippo Valsorda's hellogopher.
This is for people who don't know about GOPATH or who don't want to
use it (like me). With such a Makefile, a project can be built
whatever its location on the disk. Note however the use of symlinks is
frowned upon by Go authors and some tools refuse to work with them.
This is intended for programs only. For libraries, you should be
able to use go build, go install, go get directly or you will
make the life of your users difficult.
Also, it is not intended to be an universal Makefile. It should stay
basic to stay easy to understand.
This example relies on modules to retrieve dependencies. This require
use of Go 1.11. To update a dependency, just edit go.mod. If you
don't want to set a specific version, use go get -u DEPENDENCY@REVISION.
For older versions of Go, it's possible to use vgo instead:
go get -u golang.org/x/vgo
make GO=$GOPATH/bin/vgo
On first build, you need to run go mod init PROJECTNAME.
Version is extracted from git tags using anything prefixed by v.
The following commands are available:
make helpto get helpmaketo build the binary (inbin/)make build-dockerbuild the docker imagemake testto run testsmake test-verboseto run tests in verbose modemake test-racefor race testsmake test-xmlfor tests with xUnit-compatible outputmake test-coveragefor test coverage (will outputindex.html,coverage.xmlandprofile.outintest/coverage.*/.make test PKG=helloworld/helloto restrict test to a packagemake cleanmake lintto run golintmake fmtto run gofmt
The very first line of the Makefile is the most important one: this
is the path of the package. I don't use a go getable package path
but you can.
Be sure to browse the remaining of the Makefile to understand what
it does. There are some tools that will be downloaded. You can use
already-installed one by specifying their full path this way instead:
make lint GOLINT=/usr/bin/golint
Files other than .gitignore and Makefile are just examples.
This Makefile is published under the CC0 1.0 license. See LICENSE
for more details.