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