1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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
|