diff options
Diffstat (limited to 'Makefile')
| -rw-r--r-- | Makefile | 143 |
1 files changed, 143 insertions, 0 deletions
diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..02c5d68 --- /dev/null +++ b/Makefile @@ -0,0 +1,143 @@ +BINARY_NAME=qchat +VERSION=$(shell git describe --tags --always --dirty 2>/dev/null || echo "dev") +BUILD_TIME=$(shell date -u '+%Y-%m-%d_%H:%M:%S') +LDFLAGS=-ldflags="-s -w -X main.version=$(VERSION) -X main.buildTime=$(BUILD_TIME)" +DIST_DIR=dist + +CGO_ENABLED=0 +GOBUILD=go build -trimpath $(LDFLAGS) + +PLATFORMS=linux/amd64 linux/arm64 linux/386 linux/arm/v7 linux/arm/v6 \ + windows/amd64 windows/386 \ + darwin/amd64 darwin/arm64 \ + freebsd/amd64 freebsd/arm64 \ + openbsd/amd64 openbsd/arm64 \ + netbsd/amd64 netbsd/arm64 \ + dragonfly/amd64 \ + solaris/amd64 + +os=$(word 1,$(subst /, ,$1)) +arch=$(word 2,$(subst /, ,$1)) +variant=$(word 3,$(subst /, ,$1)) + +.PHONY: all +all: clean build-all + +.PHONY: build-all +build-all: $(PLATFORMS) + +.PHONY: $(PLATFORMS) +$(PLATFORMS): + $(eval OS=$(call os,$@)) + $(eval ARCH=$(call arch,$@)) + $(eval VARIANT=$(call variant,$@)) + $(eval OUTPUT_DIR=$(DIST_DIR)/$(OS)_$(ARCH)$(if $(VARIANT),_$(VARIANT))) + @echo "Сборка для $(OS)/$(ARCH)$(if $(VARIANT),/$(VARIANT))..." + @mkdir -p $(OUTPUT_DIR) + @if [ "$(VARIANT)" = "" ]; then \ + GOOS=$(OS) GOARCH=$(ARCH) CGO_ENABLED=$(CGO_ENABLED) $(GOBUILD) -o $(OUTPUT_DIR)/$(BINARY_NAME)$(if $(filter windows,$(OS)),.exe) ./cmd/...; \ + else \ + GOOS=$(OS) GOARCH=$(ARCH) GOARM=$(subst v,,$(VARIANT)) CGO_ENABLED=$(CGO_ENABLED) $(GOBUILD) -o $(OUTPUT_DIR)/$(BINARY_NAME) ./cmd/...; \ + fi + @echo "Размер бинарника: $$(du -h $(OUTPUT_DIR)/$(BINARY_NAME)$(if $(filter windows,$(OS)),.exe) | cut -f1)" + +.PHONY: build-linux +build-linux: linux/amd64 linux/arm64 linux/386 linux/arm/v7 linux/arm/v6 + +.PHONY: build-windows +build-windows: windows/amd64 windows/386 + +.PHONY: build-darwin +build-darwin: darwin/amd64 darwin/arm64 + +.PHONY: build-bsd +build-bsd: freebsd/amd64 freebsd/arm64 openbsd/amd64 openbsd/arm64 netbsd/amd64 netbsd/arm64 + +.PHONY: build +build: + @echo "Сборка для текущей платформы..." + @mkdir -p $(DIST_DIR)/local + CGO_ENABLED=$(CGO_ENABLED) $(GOBUILD) -o $(DIST_DIR)/local/$(BINARY_NAME) ./cmd/... + @echo "Размер бинарника: $$(du -h $(DIST_DIR)/local/$(BINARY_NAME) | cut -f1)" + +.PHONY: deps +deps: + @echo "Установка зависимостей..." + go mod download + go mod tidy + +.PHONY: vuln-check +vuln-check: + @echo "Проверка на уязвимости..." + govulncheck ./... + +.PHONY: test +test: + @echo "Запуск тестов..." + go test -v -race ./... + +.PHONY: test-coverage +test-coverage: + @echo "Запуск тестов с покрытием..." + go test -v -race -coverprofile=coverage.out ./... + go tool cover -html=coverage.out -o coverage.html + +.PHONY: fmt +fmt: + @echo "Форматирование кода..." + go fmt ./... + +.PHONY: lint +lint: + @echo "Проверка кода..." + golangci-lint run + +.PHONY: clean +clean: + @echo "Очистка..." + rm -rf $(DIST_DIR) + rm -f coverage.out coverage.html + +.PHONY: package +package: build-upx + @echo "Создание архивов..." + @for platform in $(PLATFORMS); do \ + OS=$$(echo $$platform | cut -d'/' -f1); \ + ARCH=$$(echo $$platform | cut -d'/' -f2); \ + VARIANT=$$(echo $$platform | cut -d'/' -f3); \ + OUTPUT_DIR="$(DIST_DIR)/$${OS}_$${ARCH}$${VARIANT:+_$${VARIANT}}"; \ + BINARY_NAME="$(BINARY_NAME)$$(if [ "$$OS" = "windows" ]; then echo .exe; fi)"; \ + if [ -f "$$OUTPUT_DIR/$$BINARY_NAME" ]; then \ + cd $$OUTPUT_DIR && \ + if [ "$$OS" = "windows" ]; then \ + zip -q ../$(BINARY_NAME)-$$OS-$$ARCH$${VARIANT:+-$$VARIANT}.zip $$BINARY_NAME; \ + else \ + tar -czf ../$(BINARY_NAME)-$$OS-$$ARCH$${VARIANT:+-$$VARIANT}.tar.gz $$BINARY_NAME; \ + fi && \ + cd -; \ + fi; \ + done + @echo "Архивы созданы в директории $(DIST_DIR)" + + +.PHONY: build-upx +build-upx: build-all + @echo "Сжатие бинарников с помощью UPX..." + @if command -v upx >/dev/null 2>&1; then \ + for platform in $(PLATFORMS); do \ + OS=$$(echo $$platform | cut -d'/' -f1); \ + ARCH=$$(echo $$platform | cut -d'/' -f2); \ + VARIANT=$$(echo $$platform | cut -d'/' -f3); \ + OUTPUT_DIR="$(DIST_DIR)/$${OS}_$${ARCH}$${VARIANT:+_$${VARIANT}}"; \ + BINARY_NAME="$(BINARY_NAME)$$(if [ "$$OS" = "windows" ]; then echo .exe; fi)"; \ + if [ -f "$$OUTPUT_DIR/$$BINARY_NAME" ]; then \ + upx --best --lzma "$$OUTPUT_DIR/$$BINARY_NAME" 2>/dev/null || true; \ + echo "Сжатый размер $$OS/$$ARCH$${VARIANT:+/$$VARIANT}: $$(du -h $$OUTPUT_DIR/$$BINARY_NAME | cut -f1)"; \ + fi; \ + done; \ + else \ + echo "UPX не найден. Установите UPX для дополнительного сжатия."; \ + fi + +.PHONY: ci +ci: deps fmt lint test vuln-check build-upx package |
