1
Makefile
wiki-sync-bot edited this page 2026-02-23 14:28:35 +03:00
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Makefile — описание команд

В проекте используется Makefile как единая точка входа для сборки, тестирования, линтинга и управления релизами. Файл поддерживает Windows (PowerShell) и Unix (sh) — ветвление происходит автоматически через ifeq ($(OS),Windows_NT).

Команда по умолчанию (make без аргументов) показывает справку.


Переменные конфигурации

Переменная Значение по умолчанию Назначение
APP_NAME genaudiobookinfo Имя исполняемого файла
VERSION 2.0.0 Версия, встраивается в бинарник через -ldflags
BUILD_DIR build Директория для артефактов сборки
CMD_PATH ./cmd/genaudiobookinfo Путь к main.go
GO go Команда Go-компилятора
GOFLAGS -trimpath Флаги компилятора (убирает пути хоста из бинарника)
LDFLAGS -s -w -X main.version=$(VERSION) Линковщик: strip debug, strip DWARF, встроить версию
OUTPUT_DIR ./result Директория с результатами работы программы
GITEA_URL https://github.dfv24.com Адрес Gitea-инстанции
GITEA_REPO fofanov/genaudiobookinfo Владелец/репозиторий в Gitea
GITEA_TOKEN (пусто) Токен API Gitea (нужен только для ci-release)

Переменные можно переопределять при вызове:

make build VERSION=2.1.0
make ci-release VERSION=2.1.0 GITEA_TOKEN=abc123

Основные команды

make / make help

Вывод справки со списком всех доступных команд. Цель по умолчанию — не требует аргументов.

make

make all

Последовательно выполняет build и vet. Удобен как первичная проверка после изменений.

make all

make build

Компилирует бинарник для текущей платформы и помещает его в build/.

ОС Результирующий файл
Windows build/genaudiobookinfo.exe
Linux build/genaudiobookinfo
macOS build/genaudiobookinfo

Флаги компилятора: -trimpath -ldflags "-s -w -X main.version=2.0.0".

make build
make build VERSION=2.1.0   # встроить другую версию

make build-windows-current

Компилирует genaudiobookinfo.exe (Windows/amd64) в корневой директории проекта (не в build/). Удобно для быстрой локальной проверки на Windows без отдельной папки.

make build-windows-current

make run

Запускает программу напрямую через go run без предварительной компиляции с параметрами по умолчанию: -workers 8 -timeout 60m. Директории DIR_IN и DIR_OUT берутся из .env.

make run

make run-custom ARGS="..."

Запускает программу с произвольными CLI-флагами через переменную ARGS.

make run-custom ARGS="-workers 4 -timeout 30m"
make run-custom ARGS="-workers 2"

Полный список CLI-флагов: CLI-Usage.


Тестирование

make test

Запускает все unit-тесты с флагами -v -race -count=1.

  • -v — podробный вывод
  • -race — детектор гонок (data race detector)
  • -count=1 — отключает кэширование результатов тестов
make test

make test-cover

Запускает тесты с измерением покрытия кода и генерирует HTML-отчёт coverage.html.

make test-cover
# откройте coverage.html в браузере для просмотра отчёта

Файлы:

  • coverage.out — сырые данные покрытия
  • coverage.html — визуальный отчёт (удаляется через make clean)

Качество кода

make fmt

Форматирует весь Go-код согласно стандарту gofmt. Эквивалент go fmt ./....

make fmt

make vet

Запускает статический анализ go vet ./.... Выявляет потенциальные ошибки: неправильный printf-формат, достижимые nil-dereference и т.п.

make vet

make lint

Запускает golangci-lint run ./.... Если golangci-lint не установлен, выводит команду для установки.

make lint
# Установка линтера:
go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest

make deps

Загружает все зависимости модуля (go mod download). Полезно для первоначальной настройки или подготовки к офлайн-сборке.

make deps

make tidy

Запускает go mod tidy — убирает неиспользуемые зависимости и обновляет go.sum.

make tidy

Очистка

make clean

Удаляет артефакты сборки:

  • папку build/
  • файл genaudiobookinfo.exe в корне (от build-windows-current)
  • файлы coverage.out и coverage.html
make clean

make clean-results

Удаляет и пересоздаёт директорию результатов (./result/). Используйте с осторожностью — удаляет все обработанные аудиокниги из выходной папки.

make clean-results

Директория OUTPUT_DIR задаётся переменной Makefile (./result по умолчанию), но реальный путь при работе программы берётся из DIR_OUT в .env.


make clean-all

Выполняет clean + clean-results — полная очистка проекта.

make clean-all

Кросс-компиляция

make build-all

Компилирует бинарники для всех 16 поддерживаемых платформ. Сначала выполняет clean, затем ensure-build-dir, затем собирает каждую платформу последовательно. Все результаты помещаются в build/.

make build-all
make build-all VERSION=2.1.0

Время выполнения: 13 минуты в зависимости от машины.


Платформы и выходные файлы

Команда make GOOS GOARCH Доп. флаг Файл
build-linux-amd64 linux amd64 genaudiobookinfo-linux-amd64
build-linux-386 linux 386 genaudiobookinfo-linux-386
build-linux-arm64 linux arm64 genaudiobookinfo-linux-arm64
build-linux-arm7 linux arm GOARM=7 genaudiobookinfo-linux-armv7
build-darwin-amd64 darwin amd64 genaudiobookinfo-darwin-amd64
build-darwin-arm64 darwin arm64 genaudiobookinfo-darwin-arm64
build-windows-amd64 windows amd64 genaudiobookinfo-windows-amd64.exe
build-windows-386 windows 386 genaudiobookinfo-windows-386.exe
build-windows-arm64 windows arm64 genaudiobookinfo-windows-arm64.exe
build-arm-mips linux mips GOMIPS=softfloat genaudiobookinfo-linux-mips
build-arm-mipsle linux mipsle GOMIPS=softfloat genaudiobookinfo-linux-mipsle
build-arm-riscv64 linux riscv64 genaudiobookinfo-linux-riscv64
build-freebsd-amd64 freebsd amd64 genaudiobookinfo-freebsd-amd64
build-freebsd-arm64 freebsd arm64 genaudiobookinfo-freebsd-arm64
build-openbsd-amd64 openbsd amd64 genaudiobookinfo-openbsd-amd64
build-netbsd-amd64 netbsd amd64 genaudiobookinfo-netbsd-amd64

Каждую платформу можно собирать независимо:

make build-linux           # Linux: все 4 варианта
make build-darwin          # macOS: Intel + Apple Silicon
make build-windows         # Windows: amd64 + 386 + arm64
make build-arm             # Embedded: MIPS + MIPSle + RISC-V
make build-freebsd         # FreeBSD: amd64 + arm64
make build-openbsd         # OpenBSD: amd64
make build-netbsd          # NetBSD: amd64

Локальный релиз

make release

Выполняет build-all, затем копирует все скомпилированные бинарники из build/ в build/release/.

make release

make checksum

Выполняет release, затем генерирует файл build/release/checksums-sha256.txt с SHA256-хешами всех бинарников.

  • Windows: использует Get-FileHash (PowerShell)
  • Unix: использует sha256sum
make checksum

make release-local

Рекомендуемая команда для полного локального релиза. Псевдоним для checksum — собирает все платформы, создаёт архивную папку и файл контрольных сумм.

make release-local
make release-local VERSION=2.1.0

Результат: папка build/release/ с 16 бинарниками и checksums-sha256.txt.


CI/CD через Gitea

Для автоматизации релизов используется пайплайн .gitea/workflows/release.yml (3 стадии: quality → build → publish). Подробнее: Architecture.

make ci-check

Показывает текущее состояние рабочего дерева (git status --short) и последние 5 коммитов. Рекомендуется запускать перед созданием тега релиза, чтобы убедиться, что все изменения закоммичены.

make ci-check

make release-tag VERSION=X.Y.Z

Создаёт аннотированный git-тег vX.Y.Z и пушит его в origin. Это автоматически запускает CI/CD pipeline в Gitea (триггер push tags v*.*.*).

make ci-check                        # 1. проверяем состояние
make release-tag VERSION=2.1.0       # 2. создаём тег → CI запускается

Внимание: если VERSION не изменён (остался 2.0.0), команда выведет предупреждение, но тег всё равно будет создан. Обязательно указывайте нужную версию явно.

После создания тега статус CI доступен по адресу: https://github.dfv24.com/fofanov/genaudiobookinfo/actions


make release-tag-delete VERSION=X.Y.Z

Удаляет тег vX.Y.Z локально и в origin. Используется для исправления ошибочно созданного тега.

make release-tag-delete VERSION=2.1.0

Затем можно выполнить коммит исправлений и повторно создать тег:

git add .
git commit -m "fix: исправление перед релизом"
make release-tag VERSION=2.1.0

make ci-release VERSION=X.Y.Z GITEA_TOKEN=<токен>

Запускает CI/CD workflow вручную через Gitea REST API (endpoint workflow_dispatch) — без создания git-тега. Удобно для тестирования пайплайна или выпуска сборки на уже существующей ветке.

make ci-release VERSION=2.1.0 GITEA_TOKEN=abc123def456
  • GITEA_TOKEN обязателен — команда завершится с ошибкой, если токен не задан.
  • Токен получается в настройках Gitea: Settings → Applications → Generate Token (scope: write:repository).
  • Windows: использует Invoke-RestMethod (PowerShell)
  • Unix: использует curl

Типичные рабочие сценарии

Разработка (ежедневно)

make fmt        # форматирование перед коммитом
make vet        # статический анализ
make test       # запуск тестов
make build      # локальная сборка

Выпуск новой версии через CI

make ci-check                     # проверить состояние
make release-tag VERSION=2.1.0    # создать тег → CI запустится автоматически

Локальный релиз (без CI)

make release-local VERSION=2.1.0
# результат: build/release/ — 16 бинарников + checksums-sha256.txt

Отладка пайплайна CI

make ci-release VERSION=2.1.0 GITEA_TOKEN=abc123   # ручной запуск без тега
make release-tag-delete VERSION=2.1.0              # откат тега при ошибке

Совместимость с платформами

Функция Windows (PowerShell) Linux/macOS (sh)
Установка GOOS/GOARCH $$env:GOOS='...' GOOS=... $(GO)
Создание директорий New-Item -Force mkdir -p
Удаление файлов Remove-Item -Force rm -rf
SHA256 контрольные суммы Get-FileHash sha256sum
Запрос к Gitea API Invoke-RestMethod curl
Вывод сообщений $(info ...) $(info ...)

$(info ...) используется вместо @echo "..." для корректной работы в PowerShell, где двойные кавычки обрабатываются иначе.