...
1# Root directory of the project (absolute path).
2ROOTDIR=$(dir $(abspath $(lastword $(MAKEFILE_LIST))))
3
4# Used to populate version variable in main package.
5VERSION=$(shell git describe --match 'v[0-9]*' --dirty='.m' --always)
6REVISION=$(shell git rev-parse HEAD)$(shell if ! git diff --no-ext-diff --quiet --exit-code; then echo .m; fi)
7
8
9PKG=github.com/docker/distribution
10
11# Project packages.
12PACKAGES=$(shell go list -tags "${BUILDTAGS}" ./... | grep -v /vendor/)
13INTEGRATION_PACKAGE=${PKG}
14COVERAGE_PACKAGES=$(filter-out ${PKG}/registry/storage/driver/%,${PACKAGES})
15
16
17# Project binaries.
18COMMANDS=registry digest registry-api-descriptor-template
19
20# Allow turning off function inlining and variable registerization
21ifeq (${DISABLE_OPTIMIZATION},true)
22 GO_GCFLAGS=-gcflags "-N -l"
23 VERSION:="$(VERSION)-noopt"
24endif
25
26WHALE = "+"
27
28# Go files
29#
30TESTFLAGS_RACE=
31GOFILES=$(shell find . -type f -name '*.go')
32GO_TAGS=$(if $(BUILDTAGS),-tags "$(BUILDTAGS)",)
33GO_LDFLAGS=-ldflags '-s -w -X $(PKG)/version.Version=$(VERSION) -X $(PKG)/version.Revision=$(REVISION) -X $(PKG)/version.Package=$(PKG) $(EXTRA_LDFLAGS)'
34
35BINARIES=$(addprefix bin/,$(COMMANDS))
36
37# Flags passed to `go test`
38TESTFLAGS ?= -v $(TESTFLAGS_RACE)
39TESTFLAGS_PARALLEL ?= 8
40
41.PHONY: all build binaries check clean test test-race test-full integration coverage
42.DEFAULT: all
43
44all: binaries
45
46# This only needs to be generated by hand when cutting full releases.
47version/version.go:
48 @echo "$(WHALE) $@"
49 ./version/version.sh > $@
50
51check: ## run all linters (TODO: enable "unused", "varcheck", "ineffassign", "unconvert", "staticheck", "goimports", "structcheck")
52 @echo "$(WHALE) $@"
53 @GO111MODULE=off golangci-lint --build-tags "${BUILDTAGS}" run
54
55test: ## run tests, except integration test with test.short
56 @echo "$(WHALE) $@"
57 @go test ${GO_TAGS} -test.short ${TESTFLAGS} $(filter-out ${INTEGRATION_PACKAGE},${PACKAGES})
58
59test-race: ## run tests, except integration test with test.short and race
60 @echo "$(WHALE) $@"
61 @go test ${GO_TAGS} -race -test.short ${TESTFLAGS} $(filter-out ${INTEGRATION_PACKAGE},${PACKAGES})
62
63test-full: ## run tests, except integration tests
64 @echo "$(WHALE) $@"
65 @go test ${GO_TAGS} ${TESTFLAGS} $(filter-out ${INTEGRATION_PACKAGE},${PACKAGES})
66
67integration: ## run integration tests
68 @echo "$(WHALE) $@"
69 @go test ${TESTFLAGS} -parallel ${TESTFLAGS_PARALLEL} ${INTEGRATION_PACKAGE}
70
71coverage: ## generate coverprofiles from the unit tests
72 @echo "$(WHALE) $@"
73 @rm -f coverage.txt
74 @go test ${GO_TAGS} -i ${TESTFLAGS} $(filter-out ${INTEGRATION_PACKAGE},${COVERAGE_PACKAGES}) 2> /dev/null
75 @( for pkg in $(filter-out ${INTEGRATION_PACKAGE},${COVERAGE_PACKAGES}); do \
76 go test ${GO_TAGS} ${TESTFLAGS} \
77 -cover \
78 -coverprofile=profile.out \
79 -covermode=atomic $$pkg || exit; \
80 if [ -f profile.out ]; then \
81 cat profile.out >> coverage.txt; \
82 rm profile.out; \
83 fi; \
84 done )
85
86FORCE:
87
88# Build a binary from a cmd.
89bin/%: cmd/% FORCE
90 @echo "$(WHALE) $@${BINARY_SUFFIX}"
91 @go build ${GO_GCFLAGS} ${GO_BUILD_FLAGS} -o $@${BINARY_SUFFIX} ${GO_LDFLAGS} ${GO_TAGS} ./$<
92
93binaries: $(BINARIES) ## build binaries
94 @echo "$(WHALE) $@"
95
96build:
97 @echo "$(WHALE) $@"
98 @go build ${GO_GCFLAGS} ${GO_BUILD_FLAGS} ${GO_LDFLAGS} ${GO_TAGS} $(PACKAGES)
99
100clean: ## clean up binaries
101 @echo "$(WHALE) $@"
102 @rm -f $(BINARIES)
View as plain text