NAME := gdu MAJOR_VER := v5 PACKAGE := github.com/dundee/$(NAME)/$(MAJOR_VER) CMD_GDU := cmd/gdu VERSION := $(shell git describe --tags 2>/dev/null) NAMEVER := $(NAME)-$(subst v,,$(VERSION)) DATE := $(shell date +'%Y-%m-%d') GOFLAGS ?= -buildmode=pie -trimpath -mod=readonly -modcacherw -pgo=default.pgo GOFLAGS_STATIC ?= -trimpath -mod=readonly -modcacherw -pgo=default.pgo LDFLAGS := -s -w -extldflags '-static' \ -X '$(PACKAGE)/build.Version=$(VERSION)' \ -X '$(PACKAGE)/build.User=$(shell id -u -n)' \ -X '$(PACKAGE)/build.Time=$(shell LC_ALL=en_US.UTF-8 date)' TAR := tar ifeq ($(shell uname -s),Darwin) TAR := gtar # brew install gnu-tar endif all: clean tarball build-all build-docker man clean-uncompressed-dist shasums run: go run $(PACKAGE)/$(CMD_GDU) vendor: go.mod go.sum go mod vendor tarball: vendor -mkdir dist $(TAR) czf dist/$(NAMEVER).tgz --transform "s,^,$(NAMEVER)/," --exclude dist --exclude test_dir --exclude coverage.txt * build: @echo "Version: " $(VERSION) mkdir -p dist GOFLAGS="$(GOFLAGS)" CGO_ENABLED=0 go build -ldflags="$(LDFLAGS)" -o dist/$(NAME) $(PACKAGE)/$(CMD_GDU) build-static: @echo "Version: " $(VERSION) mkdir -p dist GOFLAGS="$(GOFLAGS_STATIC)" CGO_ENABLED=0 go build -ldflags="$(LDFLAGS)" -o dist/$(NAME) $(PACKAGE)/$(CMD_GDU) build-docker: @echo "Version: " $(VERSION) docker build . --tag ghcr.io/dundee/gdu:$(VERSION) build-all: @echo "Version: " $(VERSION) -mkdir dist -CGO_ENABLED=0 gox \ -os="darwin" \ -arch="amd64 arm64" \ -output="dist/gdu_{{.OS}}_{{.Arch}}" \ -ldflags="$(LDFLAGS)" \ $(PACKAGE)/$(CMD_GDU) -CGO_ENABLED=0 gox \ -os="windows" \ -arch="amd64" \ -output="dist/gdu_{{.OS}}_{{.Arch}}" \ -ldflags="$(LDFLAGS)" \ $(PACKAGE)/$(CMD_GDU) -CGO_ENABLED=0 gox \ -os="linux freebsd netbsd openbsd" \ -output="dist/gdu_{{.OS}}_{{.Arch}}" \ -ldflags="$(LDFLAGS)" \ $(PACKAGE)/$(CMD_GDU) GOFLAGS="$(GOFLAGS)" CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o dist/gdu_linux_amd64-x $(PACKAGE)/$(CMD_GDU) GOFLAGS="$(GOFLAGS_STATIC)" CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="$(LDFLAGS)" -o dist/gdu_linux_amd64_static $(PACKAGE)/$(CMD_GDU) CGO_ENABLED=0 GOOS=linux GOARM=5 GOARCH=arm go build -ldflags="$(LDFLAGS)" -o dist/gdu_linux_armv5l $(PACKAGE)/$(CMD_GDU) CGO_ENABLED=0 GOOS=linux GOARM=6 GOARCH=arm go build -ldflags="$(LDFLAGS)" -o dist/gdu_linux_armv6l $(PACKAGE)/$(CMD_GDU) CGO_ENABLED=0 GOOS=linux GOARM=7 GOARCH=arm go build -ldflags="$(LDFLAGS)" -o dist/gdu_linux_armv7l $(PACKAGE)/$(CMD_GDU) CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="$(LDFLAGS)" -o dist/gdu_linux_arm64 $(PACKAGE)/$(CMD_GDU) CGO_ENABLED=0 GOOS=android GOARCH=arm64 go build -ldflags="$(LDFLAGS)" -o dist/gdu_android_arm64 $(PACKAGE)/$(CMD_GDU) cd dist; for file in gdu_linux_* gdu_darwin_* gdu_netbsd_* gdu_openbsd_* gdu_freebsd_* gdu_android_*; do tar czf $$file.tgz $$file; done cd dist; for file in gdu_windows_*; do zip $$file.zip $$file; done gdu.1: gdu.1.md sed 's/{{date}}/$(DATE)/g' gdu.1.md > gdu.1.date.md pandoc gdu.1.date.md -s -t man > gdu.1 rm -f gdu.1.date.md man: gdu.1 cp gdu.1 dist cd dist; tar czf gdu.1.tgz gdu.1 show-man: sed 's/{{date}}/$(DATE)/g' gdu.1.md > gdu.1.date.md pandoc gdu.1.date.md -s -t man | man -l - test: gotestsum coverage: gotestsum -- -race -coverprofile=coverage.txt -covermode=atomic ./... coverage-html: coverage go tool cover -html=coverage.txt gobench: go test -bench=. $(PACKAGE)/pkg/analyze heap-profile: go tool pprof -web http://localhost:6060/debug/pprof/heap pgo: wget -O cpu.pprof http://localhost:6060/debug/pprof/profile?seconds=30 go tool pprof -proto cpu.pprof default.pgo > merged.pprof mv merged.pprof default.pgo trace: wget -O trace.out http://localhost:6060/debug/pprof/trace?seconds=30 gotraceui ./trace.out benchmark: sudo cpupower frequency-set -g performance hyperfine --export-markdown=bench-cold.md \ --prepare 'sync; echo 3 | sudo tee /proc/sys/vm/drop_caches' \ --ignore-failure \ 'dua ~' 'duc index ~' 'ncdu -0 -o /dev/null ~' \ 'diskus ~' 'du -hs ~' 'dust -d0 ~' 'pdu ~' \ 'gdu -npc ~' 'gdu -gnpc ~' 'gdu -npc --use-storage ~' hyperfine --export-markdown=bench-warm.md \ --warmup 5 \ --ignore-failure \ 'dua ~' 'duc index ~' 'ncdu -0 -o /dev/null ~' \ 'diskus ~' 'du -hs ~' 'dust -d0 ~' 'pdu ~' \ 'gdu -npc ~' 'gdu -gnpc ~' 'gdu -npc --use-storage ~' sudo cpupower frequency-set -g schedutil lint: golangci-lint run -c .golangci.yml clean: go mod tidy -rm coverage.txt -rm -r test_dir -rm -r vendor -rm -r dist clean-uncompressed-dist: find dist -type f -not -name '*.tgz' -not -name '*.zip' -delete shasums: cd dist; sha256sum * > sha256sums.txt cd dist; gpg --sign --armor --detach-sign sha256sums.txt release: gh release create -t "gdu $(VERSION)" $(VERSION) ./dist/* install-dev-dependencies: go install gotest.tools/gotestsum@latest go install github.com/mitchellh/gox@latest go install honnef.co/go/gotraceui/cmd/gotraceui@master go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest .PHONY: run build build-static build-all test gobench benchmark coverage coverage-html clean clean-uncompressed-dist man show-man release