aboutsummaryrefslogtreecommitdiff
path: root/Makefile
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--Makefile143
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