hellogopher
hellogopher copied to clipboard
Makefile to build a Go project
Makefile for Go projects (1.16+)
This is an example of Makefile to build a Go project. This is quite
similar to Filippo Valsorda's hellogopher.
Initially, this is for people who don't know about GOPATH or who
don't want to use it (like me). However, starting with Go 1.11,
modules enable to work outside of GOPATH without any special
environment. This turns this Makefile as only a convenience tool.
Dependencies
This example relies on modules to retrieve dependencies. This requires
use of Go 1.11 or more recent. To update a dependency, use go get DEPENDENCY@REVISION.
We also rely on go install TOOL@latest which requires Go 1.16. You
can checkout tag v0.6 if you need compatibility up to Go 1.11.
On first build, you need to run go mod init PROJECTNAME.
Versioning
Version is extracted from git tags using anything prefixed by v.
Usage
The following commands are available:
make helpto get helpmaketo build the binary (inbin/)make testto run testsmake test-verboseto run tests in verbose modemake test-racefor race testsmake test-coveragefor test coverage (will outputcoverage.htmlandcoverage.xmlintest/.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.
Misc
If golint complains with go/build: importGo hellogopher/cmd: exit status 2, just delete it from bin/ and let the Makefile build it
again.
If you prefer, you can also include this Makefile into another one.
Rename it to hellogopher.mk and put in Makefile something like
this:
include hellogopher.mk
# Your custom settings
TIMEOUT=10
# Your custom rules
doc: ; $(info $(M) build documentation) @ ## Build documentation
$(MAKE) -C doc
License
This Makefile is published under the CC0 1.0 license. See LICENSE
for more details.