# GenAudioBookInfo Makefile # Сборка, запуск, тестирование под все платформы APP_NAME := genaudiobookinfo VERSION := 1.0.0 BUILD_DIR := build CMD_PATH := ./cmd/genaudiobookinfo GO := go GOFLAGS := -trimpath LDFLAGS := -s -w -X main.version=$(VERSION) # Директории проекта INPUT_DIR := ./audiobook OUTPUT_DIR := ./result # Дата и коммит для информации о сборке BUILD_DATE := $(shell powershell -Command "Get-Date -Format 'yyyy-MM-ddTHH:mm:ssZ'" 2>nul || echo unknown) GIT_COMMIT := $(shell git rev-parse --short HEAD 2>nul || echo unknown) # ============================================================================ # Основные команды # ============================================================================ .PHONY: all build run clean test lint deps tidy fmt vet help clean-results ## Сборка для текущей платформы build: @echo ">>> Сборка $(APP_NAME) для текущей платформы..." $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME) $(CMD_PATH) @echo ">>> Готово: $(BUILD_DIR)/$(APP_NAME)" ## Сборка для Windows build-windows-current: @echo ">>> Сборка $(APP_NAME).exe для Windows..." $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(APP_NAME).exe $(CMD_PATH) @echo ">>> Готово: $(APP_NAME).exe" ## Запуск без сборки (с параметрами по умолчанию) run: @echo ">>> Запуск $(APP_NAME)..." $(GO) run $(CMD_PATH) -workers 8 -timeout 60 ## Запуск с собственными параметрами (пример: make run-custom ARGS="-workers 4 -timeout 30") run-custom: @echo ">>> Запуск с параметрами: $(ARGS)..." $(GO) run $(CMD_PATH) $(ARGS) ## Запуск unit-тестов test: @echo ">>> Запуск тестов..." $(GO) test ./... -v -race -count=1 ## Запуск тестов с покрытием test-cover: @echo ">>> Запуск тестов с покрытием..." $(GO) test ./... -v -race -coverprofile=coverage.out $(GO) tool cover -html=coverage.out -o coverage.html @echo ">>> Отчёт: coverage.html" ## Установка зависимостей deps: @echo ">>> Установка зависимостей..." $(GO) mod download ## Очистка и обновление go.mod tidy: $(GO) mod tidy ## Форматирование кода fmt: @echo ">>> Форматирование кода..." $(GO) fmt ./... ## Статический анализ vet: @echo ">>> Статический анализ..." $(GO) vet ./... ## Линтер (требуется golangci-lint) lint: @echo ">>> Линтинг..." @where golangci-lint >nul 2>&1 && golangci-lint run ./... || echo "golangci-lint не установлен: go install github.com/golangci-lint/golangci-lint/cmd/golangci-lint@latest" ## Очистка артефактов сборки clean: @echo ">>> Очистка артефактов сборки..." @if exist $(BUILD_DIR) rmdir /s /q $(BUILD_DIR) @if exist $(APP_NAME).exe del /q $(APP_NAME).exe @if exist coverage.out del /q coverage.out @if exist coverage.html del /q coverage.html @echo ">>> Готово" ## Очистка результатов работы программы clean-results: @echo ">>> Очистка директории результатов..." @if exist $(OUTPUT_DIR) rmdir /s /q $(OUTPUT_DIR) @if not exist $(OUTPUT_DIR) mkdir $(OUTPUT_DIR) @echo ">>> Готово" ## Полная очистка (артефакты + результаты) clean-all: clean clean-results # ============================================================================ # Кросс-компиляция: все платформы # ============================================================================ .PHONY: build-all build-linux build-darwin build-windows build-arm build-freebsd build-openbsd build-netbsd ## Сборка под ВСЕ платформы build-all: clean build-linux build-darwin build-windows build-arm build-freebsd build-openbsd build-netbsd @echo "" @echo "=========================================" @echo " Сборка завершена для всех платформ" @echo "=========================================" @if exist $(BUILD_DIR) dir $(BUILD_DIR) /b @echo "" # --- Linux --- build-linux: build-linux-amd64 build-linux-386 build-linux-arm64 build-linux-arm7 build-linux-amd64: @echo ">>> Linux amd64..." GOOS=linux GOARCH=amd64 $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME)-linux-amd64 $(CMD_PATH) build-linux-386: @echo ">>> Linux 386..." GOOS=linux GOARCH=386 $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME)-linux-386 $(CMD_PATH) build-linux-arm64: @echo ">>> Linux arm64..." GOOS=linux GOARCH=arm64 $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME)-linux-arm64 $(CMD_PATH) build-linux-arm7: @echo ">>> Linux armv7..." GOOS=linux GOARCH=arm GOARM=7 $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME)-linux-armv7 $(CMD_PATH) # --- macOS --- build-darwin: build-darwin-amd64 build-darwin-arm64 build-darwin-amd64: @echo ">>> macOS amd64 (Intel)..." GOOS=darwin GOARCH=amd64 $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME)-darwin-amd64 $(CMD_PATH) build-darwin-arm64: @echo ">>> macOS arm64 (Apple Silicon)..." GOOS=darwin GOARCH=arm64 $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME)-darwin-arm64 $(CMD_PATH) # --- Windows --- build-windows: build-windows-amd64 build-windows-386 build-windows-arm64 build-windows-amd64: @echo ">>> Windows amd64..." GOOS=windows GOARCH=amd64 $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME)-windows-amd64.exe $(CMD_PATH) build-windows-386: @echo ">>> Windows 386..." GOOS=windows GOARCH=386 $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME)-windows-386.exe $(CMD_PATH) build-windows-arm64: @echo ">>> Windows arm64..." GOOS=windows GOARCH=arm64 $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME)-windows-arm64.exe $(CMD_PATH) # --- ARM (embedded / Raspberry Pi / роутеры) --- build-arm: build-arm-mips build-arm-mipsle build-arm-riscv64 build-arm-mips: @echo ">>> MIPS (big-endian)..." GOOS=linux GOARCH=mips GOMIPS=softfloat $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME)-linux-mips $(CMD_PATH) build-arm-mipsle: @echo ">>> MIPS (little-endian)..." GOOS=linux GOARCH=mipsle GOMIPS=softfloat $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME)-linux-mipsle $(CMD_PATH) build-arm-riscv64: @echo ">>> RISC-V 64..." GOOS=linux GOARCH=riscv64 $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME)-linux-riscv64 $(CMD_PATH) # --- FreeBSD --- build-freebsd: build-freebsd-amd64 build-freebsd-arm64 build-freebsd-amd64: @echo ">>> FreeBSD amd64..." GOOS=freebsd GOARCH=amd64 $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME)-freebsd-amd64 $(CMD_PATH) build-freebsd-arm64: @echo ">>> FreeBSD arm64..." GOOS=freebsd GOARCH=arm64 $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME)-freebsd-arm64 $(CMD_PATH) # --- OpenBSD --- build-openbsd: build-openbsd-amd64 build-openbsd-amd64: @echo ">>> OpenBSD amd64..." GOOS=openbsd GOARCH=amd64 $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME)-openbsd-amd64 $(CMD_PATH) # --- NetBSD --- build-netbsd: build-netbsd-amd64 build-netbsd-amd64: @echo ">>> NetBSD amd64..." GOOS=netbsd GOARCH=amd64 $(GO) build $(GOFLAGS) -ldflags "$(LDFLAGS)" -o $(BUILD_DIR)/$(APP_NAME)-netbsd-amd64 $(CMD_PATH) # ============================================================================ # Релиз (архивирование бинарников) # ============================================================================ .PHONY: release checksum ## Создание архивов для всех платформ release: build-all @echo ">>> Создание архивов релиза..." @if not exist $(BUILD_DIR)\release mkdir $(BUILD_DIR)\release @echo ">>> Архивы: $(BUILD_DIR)/release/" ## Генерация контрольных сумм SHA256 checksum: release @echo ">>> Генерация SHA256..." @cd $(BUILD_DIR)\release && powershell -Command "Get-FileHash * | Format-List > checksums-sha256.txt" @echo ">>> Контрольные суммы: $(BUILD_DIR)/release/checksums-sha256.txt" # ============================================================================ # Справка # ============================================================================ ## Показать справку help: @echo "" @echo " GenAudioBookInfo v$(VERSION) — Makefile" @echo " ─────────────────────────────────────────" @echo "" @echo " Основные:" @echo " make build Сборка для текущей платформы" @echo " make build-windows-current Сборка genaudiobookinfo.exe" @echo " make run Запуск без сборки (workers=8, timeout=60)" @echo " make run-custom Запуск с параметрами (ARGS=\"-workers 4\")" @echo " make clean Очистка артефактов сборки" @echo " make clean-results Очистка директории результатов" @echo " make clean-all Полная очистка" @echo "" @echo " Тестирование:" @echo " make test Unit-тесты" @echo " make test-cover Тесты с покрытием кода" @echo "" @echo " Качество кода:" @echo " make fmt Форматирование (go fmt)" @echo " make vet Статический анализ (go vet)" @echo " make lint Линтер (golangci-lint)" @echo " make tidy Обновление go.mod/go.sum" @echo "" @echo " Кросс-компиляция:" @echo " make build-all Все платформы" @echo " make build-linux Linux: amd64, 386, arm64, armv7" @echo " make build-darwin macOS: amd64 (Intel), arm64 (Apple Silicon)" @echo " make build-windows Windows: amd64, 386, arm64" @echo " make build-arm Embedded: MIPS, MIPSle, RISC-V 64" @echo " make build-freebsd FreeBSD: amd64, arm64" @echo " make build-openbsd OpenBSD: amd64" @echo " make build-netbsd NetBSD: amd64" @echo "" @echo " Релиз:" @echo " make release Сборка для всех платформ" @echo " make checksum Релиз + SHA256 контрольные суммы" .DEFAULT_GOAL := help