# transocks makefile # ================== SHELL := /usr/bin/env bash PROJECT_ID := transocks PROJECT_NAME ?= Transocks BIN_SUFFIX := TMPDIR ?= $(CURDIR)/tmp OUTDIR ?= $(CURDIR)/out BINDIR ?= $(OUTDIR)/bin VERSION ?= $(strip $(shell ./scripts/version.sh)) VERSION_NUMBER := $(strip $(shell ./scripts/version.sh number)) GOOS ?= $(shell go env GOOS) GOARCH ?= $(shell go env GOARCH) GO_LDFLAGS ?= GO_OPT_V := -X "main.version=$(VERSION)" GO_OPT_APP := -X "main.appname=$(PROJECT_NAME)" GO_OPT_BASE := -ldflags '$(GO_OPT_V) $(GO_OPT_APP) $(GO_LDFLAGS)' GO_OPT ?= EXPORT_RESULT ?= false # for CI please set EXPORT_RESULT to true GOCMD := go GOTEST := $(GOCMD) test GOVET := $(GOCMD) vet ECHO_CMD := echo -e DIST_EXT := .tar.gz DIST_OPTS := -czf PKG_NAME := $(PROJECT_ID)_$(VERSION)_$(GOOS)-$(GOARCH) DIST_FILE := $(PKG_NAME)$(DIST_EXT) PKG_ARCH := $(GOARCH) ifeq ($(PKG_ARCH),arm) PKG_ARCH = armhf endif GREEN := $(shell tput -Txterm setaf 2) YELLOW := $(shell tput -Txterm setaf 3) WHITE := $(shell tput -Txterm setaf 7) CYAN := $(shell tput -Txterm setaf 6) RESET := $(shell tput -Txterm sgr0) .DEFAULT_GOAL := all version: ## Version of the project to be built @echo $(VERSION) .PHONY:version version-number: ## Version number of the project to be built @echo $(VERSION_NUMBER) .PHONY:version-number ## Build all: clean vendor build ## Build binary .PHONY:all clean: ## Remove build related files @rm -fr $(TMPDIR) @rm -fr $(OUTDIR) @$(ECHO_CMD) "Clean\t\t${GREEN}[OK]${RESET}" .PHONY:clean vendor: ## Copy of all packages needed to support builds and tests in the vendor directory $(GOCMD) mod vendor @$(ECHO_CMD) "Vendor\t\t${GREEN}[OK]${RESET}" .PHONY:vendor APPS := $(patsubst cmd/%/, %, $(dir $(wildcard cmd/*/main.go))) build: $(addprefix $(BINDIR)/, $(APPS)) ## Build your project and put the output binary in out/bin/ @mkdir -p $(BINDIR) @$(ECHO_CMD) "Build\t\t${GREEN}[OK]${RESET}" .PHONY:build $(BINDIR)/%: cmd/%/main.go $(patsubst cmd/%/main.go,cmd/%/*.go,$<) @rm -f "$(BINDIR)/$(BIN_PREFIX)$(patsubst cmd/%/main.go,%,$<)$(BIN_SUFFIX)" $(GOCMD) build $(GO_OPT_BASE) $(GO_OPT) \ -o "$(BINDIR)/$(BIN_PREFIX)$(patsubst cmd/%/main.go,%,$<)$(BIN_SUFFIX)" \ $(patsubst %/main.go,./%,$<) dist: ## Create binary distro package @rm -f "$(OUTDIR)/$(DIST_FILE)" tar $(DIST_OPTS) "$(OUTDIR)/$(DIST_FILE)" -C "$(OUTDIR)" bin @$(ECHO_CMD) "Dist\t\t${GREEN}[OK]${RESET}" .PHONY:dist DEB_NAME := $(PROJECT_ID)_$(VERSION_NUMBER)-1_$(PKG_ARCH) pkg-deb: ## Build debian package @rm -rf $(TMPDIR) @mkdir -p $(TMPDIR)/$(DEB_NAME)/DEBIAN @mkdir -p $(TMPDIR)/$(DEB_NAME)/etc @mkdir -p $(TMPDIR)/$(DEB_NAME)/usr/bin @cp $(CURDIR)/configs/transocks.example.toml $(TMPDIR)/$(DEB_NAME)/etc/transocks.toml @cp -a $(BINDIR)/* $(TMPDIR)/$(DEB_NAME)/usr/bin/ @sed -e "s/VERSION/$(VERSION_NUMBER)/g" \ $(CURDIR)/build/package/debian/changelog.tpl \ > $(TMPDIR)/changelog @sed -e "s/ARCH/$(PKG_ARCH)/g" $(CURDIR)/build/package/debian/control.tpl \ > $(TMPDIR)/control DEB_HOST_ARCH=$(PKG_ARCH) dpkg-gencontrol -v$(VERSION_NUMBER)-1 \ -c$(TMPDIR)/control \ -l$(TMPDIR)/changelog \ -f$(TMPDIR)/$(DEB_NAME)/DEBIAN/files -Ptmp/$(DEB_NAME) dpkg-deb --build --root-owner-group $(TMPDIR)/$(DEB_NAME) dpkg-genchanges --build=binary \ -c$(TMPDIR)/control \ -l$(TMPDIR)/changelog \ -f$(TMPDIR)/$(DEB_NAME)/DEBIAN/files \ -u$(TMPDIR) -O$(OUTDIR)/$(DEB_NAME).changes @mv $(TMPDIR)/*.deb $(OUTDIR)/ @$(ECHO_CMD) "pkg-deb\t\t${GREEN}[OK]${RESET}" .PHONY:pkg-deb ## Deploy deploy-deb: ## Deploy debian packages find -O1 $(OUT_DIR) -name '*.changes' -exec dput mousesoft \{\} \; .PHONY:deploy-deb ## Test test: ## Run the tests of the project ifeq ($(EXPORT_RESULT), true) @mkdir -p $(OUTDIR) $(eval OUTPUT_OPTIONS = | go-junit-report -set-exit-code > $(OUTDIR)/junit-report.xml) endif $(GOTEST) -v $(GO_OPT) ./... $(OUTPUT_OPTIONS) @$(ECHO_CMD) "Test\t\t${GREEN}[OK]${RESET}" .PHONY:test ## Lint lint: ## Run all available linters. go vet ./... errcheck ./... staticcheck ./... usestdlibvars ./... shadow ./... @$(ECHO_CMD) "Lint\t\t${GREEN}[OK]${RESET}" .PHONY:lint golangci-lint: ## Run golangci-lint linter @golangci-lint run @$(ECHO_CMD) "GolangCI Lint\t${GREEN}[OK]${RESET}" .PHONY:golangci-lint ## Help help: ## Show this help. @$(ECHO_CMD) '' @$(ECHO_CMD) 'Usage:' @$(ECHO_CMD) ' ${YELLOW}make${RESET} ${GREEN}${RESET}' @$(ECHO_CMD) '' @$(ECHO_CMD) 'Targets:' @awk 'BEGIN {FS = ":.*?## "} { \ if (/^[a-zA-Z_-]+:.*?##.*$$/) {printf " ${YELLOW}%-20s${GREEN}%s${RESET}\n", $$1, $$2} \ else if (/^## .*$$/) {printf " ${CYAN}%s${RESET}\n", substr($$1,4)} \ }' $(MAKEFILE_LIST) .PHONY:help