1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
GO ?= go
GOFMT ?= gofmt
V ?=
PREFIX ?= /usr/local
PKGS = $(shell go list ./... | grep -v vendor)
SUBPKGS = $(shell go list ./... | sed '1d' | tr '\n' ',' | sed 's/,$$//1')
PKGNAME = mender-artifact
PKGFILES = $(shell find . \( -path ./vendor -o -path ./Godeps \) -prune \
-o -type f -name '*.go' -print)
PKGFILES_notest = $(shell echo $(PKGFILES) | tr ' ' '\n' | grep -v _test.go)
GOCYCLO ?= 20
CGO_ENABLED=1
export CGO_ENABLED
TOOLS = \
github.com/fzipp/gocyclo/... \
github.com/opennota/check/cmd/varcheck \
github.com/mendersoftware/deadcode \
github.com/mendersoftware/gobinarycoverage
VERSION = $(shell git describe --tags --dirty --exact-match 2>/dev/null || git rev-parse --short HEAD)
GO_LDFLAGS = \
-ldflags "-X github.com/mendersoftware/mender-artifact/cli.Version=$(VERSION)"
ifeq ($(V),1)
BUILDV = -v
endif
TAGS =
ifeq ($(LOCAL),1)
TAGS += local
endif
ifneq ($(TAGS),)
BUILDTAGS = -tags '$(TAGS)'
endif
build:
$(GO) build $(GO_LDFLAGS) $(BUILDV) $(BUILDTAGS)
PLATFORMS := darwin linux windows
GO_LDFLAGS_WIN = -ldflags "-X github.com/mendersoftware/mender-artifact/cli.Version=$(VERSION) -linkmode=internal -s -w -extldflags '-static' -extld=x86_64-w64-mingw32-gcc"
build-natives:
@arch="amd64";
@echo "building mac";
@env GOOS=darwin GOARCH=$$arch CGO_ENABLED=0 \
$(GO) build -a $(GO_LDFLAGS) $(BUILDV) $(BUILDTAGS) -o $(PKGNAME)-darwin ;
@echo "building linux";
@env GOOS=linux GOARCH=$$arch \
$(GO) build -a $(GO_LDFLAGS) $(BUILDV) $(BUILDTAGS) -o $(PKGNAME)-linux ;
@echo "building windows";
@env GOOS=windows GOARCH=$$arch CC=x86_64-w64-mingw32-gcc CXX=x86_64-w64-mingw32-g++ \
$(GO) build $(GO_LDFLAGS_WIN) $(BUILDV) -tags $(TAGS) nolzma -o $(PKGNAME)-windows.exe ;
build-contained:
rm -f mender-artifact && \
image_id=$$(docker build -f Dockerfile -q .) && \
docker run --rm --entrypoint "/bin/sh" -v $(shell pwd):/binary $$image_id -c "cp /go/bin/mender-artifact /binary" && \
docker image rm $$image_id
build-natives-contained:
rm -f mender-artifact-darwin mender-artifact-linux mender-artifact-windows.exe && \
image_id=$$(docker build -f Dockerfile.binaries -q .) && \
docker run --rm --entrypoint "/bin/sh" -v $(shell pwd):/binary $$image_id -c "cp /go/bin/mender-artifact* /binary" && \
docker image rm $$image_id
install:
@$(GO) install $(GO_LDFLAGS) $(BUILDV) $(BUILDTAGS)
install-autocomplete-scripts:
@echo "Installing Bash auto-complete script into $(DESTDIR)/etc/bash_completion.d/"
@install -Dm0644 ./autocomplete/bash_autocomplete $(DESTDIR)/etc/bash_completion.d/mender-artifact
@if which zsh >/dev/null 2>&1 ; then \
echo "Installing zsh auto-complete script into $(DESTDIR)$(PREFIX)/share/zsh/site-functions/" && \
install -Dm0644 ./autocomplete/zsh_autocomplete $(DESTDIR)$(PREFIX)/share/zsh/site-functions/_mender-artifact \
; fi
clean:
$(GO) clean
rm -f mender-artifact-darwin mender-artifact-linux mender-artifact-windows.exe
rm -f coverage.txt coverage-tmp.txt
get-tools:
set -e ; for t in $(TOOLS); do \
echo "-- go getting $$t"; \
go get -u $$t; \
done
go mod vendor
check: test extracheck
tooldep:
echo "check if mtools is installed on the system"
mtools --version
test: tooldep
$(GO) test -v $(PKGS)
extracheck:
echo "-- checking if code is gofmt'ed"
@if [ -n "$$($(GOFMT) -d $(PKGFILES))" ]; then \
"$$($(GOFMT) -d $(PKGFILES))" \
echo "-- gofmt check failed"; \
/bin/false; \
fi
echo "-- checking with govet"
$(GO) vet -unsafeptr=false
echo "-- checking for dead code"
deadcode
echo "-- checking with varcheck"
varcheck .
echo "-- checking cyclometric complexity > $(GOCYCLO)"
gocyclo -over $(GOCYCLO) $(PKGFILES_notest)
cover: coverage
$(GO) tool cover -func=coverage.txt
htmlcover: coverage
$(GO) tool cover -html=coverage.txt
instrument-binary:
git apply patches/0001-Instrument-with-coverage.patch
gobinarycoverage github.com/mendersoftware/mender-artifact
coverage:
rm -f coverage.txt
echo 'mode: set' > coverage.txt
set -e ; for p in $(PKGS); do \
rm -f coverage-tmp.txt; \
$(GO) test -coverprofile=coverage-tmp.txt -coverpkg=$(SUBPKGS) $$p ; \
if [ -f coverage-tmp.txt ]; then \
cat coverage-tmp.txt |grep -v 'mode:' | cat >> coverage.txt; \
fi; \
done
rm -f coverage-tmp.txt
.PHONY: build clean get-tools test check \
cover htmlcover coverage tooldep install-autocomplete-scripts \
instrument-binary
|