271 lines
11 KiB
Makefile
271 lines
11 KiB
Makefile
# Makefile для GPIO Monitor Server
|
||
|
||
.PHONY: all build clean run test fmt lint help install dev deb prepare-debian
|
||
|
||
# Переменные
|
||
APP_NAME := gpio-monitor-server
|
||
CMD_PATH := ./cmd/server
|
||
BUILD_DIR := ./build
|
||
BINARY := $(BUILD_DIR)/$(APP_NAME)
|
||
WEB_DIR := ./cmd/server/web
|
||
DEB_DIR := ./debian
|
||
DEB_PACKAGE := $(DEB_DIR)/$(APP_NAME)
|
||
|
||
# Целевая платформа (по умолчанию)
|
||
GOOS ?= linux
|
||
GOARCH ?= arm64
|
||
|
||
# Флаги сборки
|
||
LDFLAGS := -ldflags="-s -w"
|
||
|
||
# Цвета для вывода
|
||
RED := \033[0;31m
|
||
GREEN := \033[0;32m
|
||
YELLOW := \033[0;33m
|
||
NC := \033[0m # No Color
|
||
|
||
# ============================================
|
||
# ИНИЦИАЛИЗАЦИЯ И ПОДГОТОВКА СИСТЕМЫ
|
||
# ============================================
|
||
|
||
.PHONY: init check-node
|
||
|
||
## init - Полная подготовка окружения после git clone
|
||
init: check-node deps
|
||
@echo "$(GREEN)Проект успешно инициализирован и готов к сборке!$(NC)"
|
||
@echo "Запустите '$(IMAGE_TARGET) make build' для сборки или 'make run' для запуска."
|
||
|
||
# Проверка установленного Node.js и npm
|
||
check-node:
|
||
@echo "$(YELLOW)Проверка окружения...$(NC)"
|
||
@which node > /dev/null 2>&1 || (echo "$(RED)❌ Ошибка: Node.js не установлен!$(NC)" && echo "Установите его командой: sudo apt install nodejs npm" && exit 1)
|
||
@which npm > /dev/null 2>&1 || (echo "$(RED)❌ Ошибка: npm не установлен!$(NC)" && exit 1)
|
||
@echo "$(GREEN) Node.js и npm найдены.$(NC)"
|
||
|
||
# ============================================
|
||
# ОСНОВНЫЕ ЦЕЛИ
|
||
# ============================================
|
||
|
||
all: help
|
||
|
||
## build - Полная сборка проекта (фронтенд + бекенд)
|
||
build: build-frontend build-backend
|
||
@echo "$(GREEN)Сборка завершена!$(NC)"
|
||
@ls -lh $(BINARY)
|
||
|
||
## build-frontend - Сборка TypeScript фронтенда
|
||
build-frontend:
|
||
@echo "$(YELLOW)Сборка TypeScript фронтенда...$(NC)"
|
||
@cd $(WEB_DIR) && \
|
||
if [ ! -d "node_modules" ]; then \
|
||
echo " Установка npm зависимостей..."; \
|
||
npm install; \
|
||
fi && \
|
||
echo " Компиляция TypeScript..." && \
|
||
npm run build && \
|
||
echo "$(GREEN)TypeScript скомпилирован успешно!$(NC)"
|
||
|
||
## build-backend - Сборка Go сервера
|
||
build-backend:
|
||
@echo "$(YELLOW)Сборка Go сервера...$(NC)"
|
||
@mkdir -p $(BUILD_DIR)
|
||
@echo " Целевая платформа: $(GOOS)/$(GOARCH)"
|
||
@GOOS=$(GOOS) GOARCH=$(GOARCH) go build $(LDFLAGS) -o $(BINARY) $(CMD_PATH)
|
||
@echo "$(GREEN)Go сервер скомпилирован успешно!$(NC)"
|
||
|
||
## run - Запуск сервера (сборка + запуск)
|
||
run: build
|
||
@echo "$(YELLOW)Запуск сервера...$(NC)"
|
||
@$(BINARY)
|
||
|
||
## dev - Режим разработки (без оптимизации, с hot-reload)
|
||
dev:
|
||
@echo "$(YELLOW)Режим разработки...$(NC)"
|
||
@go run $(CMD_PATH) -port :8080
|
||
|
||
## clean - Очистка артефактов сборки
|
||
clean:
|
||
@echo "$(YELLOW)Очистка...$(NC)"
|
||
@rm -rf $(BUILD_DIR)
|
||
@rm -rf $(WEB_DIR)/dist
|
||
@rm -rf $(WEB_DIR)/node_modules
|
||
@rm -rf $(DEB_PACKAGE)
|
||
@rm -f *.deb
|
||
@echo "$(GREEN)Очищено$(NC)"
|
||
|
||
## test - Запуск тестов
|
||
test:
|
||
@echo "$(YELLOW)Запуск тестов...$(NC)"
|
||
@go test -v ./...
|
||
|
||
## fmt - Форматирование кода
|
||
fmt:
|
||
@echo "$(YELLOW)Форматирование кода...$(NC)"
|
||
@go fmt ./...
|
||
@cd $(WEB_DIR) && npm run format 2>/dev/null || true
|
||
|
||
## lint - Проверка кода
|
||
lint:
|
||
@echo "$(YELLOW)Проверка кода...$(NC)"
|
||
@golangci-lint run ./... 2>/dev/null || echo " Установите golangci-lint: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest"
|
||
|
||
## deps - Установка зависимостей
|
||
deps:
|
||
@echo "$(YELLOW)Установка зависимостей Go...$(NC)"
|
||
go mod download
|
||
go mod tidy
|
||
@echo "$(YELLOW)Установка npm-пакетов фронтенда (это может занять время)...$(NC)"
|
||
cd $(WEB_DIR) && npm install --progress=true --loglevel=info
|
||
|
||
## install - Установка бинарника в систему
|
||
install: build
|
||
@echo "$(YELLOW)Установка $(APP_NAME)...$(NC)"
|
||
@sudo cp $(BINARY) /usr/local/bin/$(APP_NAME)
|
||
@echo "$(GREEN)Установлено в /usr/local/bin/$(APP_NAME)$(NC)"
|
||
|
||
## uninstall - Удаление из системы
|
||
uninstall:
|
||
@echo "$(YELLOW)🗑Удаление $(APP_NAME)...$(NC)"
|
||
@sudo rm -f /usr/local/bin/$(APP_NAME)
|
||
@echo "$(GREEN)Удалено$(NC)"
|
||
|
||
## help - Показать справку
|
||
help:
|
||
@echo "$(GREEN)GPIO Monitor Server - команды Makefile$(NC)"
|
||
@echo ""
|
||
@echo "Доступные команды:"
|
||
@awk '/^##/ { \
|
||
cmd = $$0; \
|
||
gsub(/^## /, "", cmd); \
|
||
printf " $(GREEN)%-20s$(NC) %s\n", $$2, cmd \
|
||
}' $(MAKEFILE_LIST) | sort
|
||
@echo ""
|
||
@echo "Примеры:"
|
||
@echo " make build - Полная сборка"
|
||
@echo " make run - Сборка и запуск"
|
||
@echo " make dev - Запуск в режиме разработки"
|
||
@echo " make clean - Очистка"
|
||
@echo " make install - Установка в систему"
|
||
@echo " make deb - Сборка DEB пакета"
|
||
|
||
# ============================================
|
||
# СБОРКА DEB ПАКЕТА
|
||
# ============================================
|
||
|
||
## prepare-debian - Подготовка структуры для deb-пакета
|
||
prepare-debian:
|
||
@echo "$(YELLOW)Подготовка структуры DEB пакета...$(NC)"
|
||
@# Создаем основную структуру
|
||
@mkdir -p $(DEB_PACKAGE)/DEBIAN
|
||
@mkdir -p $(DEB_PACKAGE)/usr/bin
|
||
@mkdir -p $(DEB_PACKAGE)/usr/share/doc/$(APP_NAME)
|
||
@mkdir -p $(DEB_PACKAGE)/opt/gpio-monitoring/web
|
||
@mkdir -p $(DEB_PACKAGE)/etc/gpio-monitoring
|
||
@mkdir -p $(DEB_PACKAGE)/etc/systemd/system
|
||
@# Копируем DEBIAN файлы
|
||
@if [ -f $(DEB_DIR)/control ]; then cp $(DEB_DIR)/control $(DEB_PACKAGE)/DEBIAN/; fi
|
||
@if [ -f $(DEB_DIR)/preinst ]; then cp $(DEB_DIR)/preinst $(DEB_PACKAGE)/DEBIAN/; fi
|
||
@if [ -f $(DEB_DIR)/postinst ]; then cp $(DEB_DIR)/postinst $(DEB_PACKAGE)/DEBIAN/; fi
|
||
@if [ -f $(DEB_DIR)/prerm ]; then cp $(DEB_DIR)/prerm $(DEB_PACKAGE)/DEBIAN/; fi
|
||
@if [ -f $(DEB_DIR)/postrm ]; then cp $(DEB_DIR)/postrm $(DEB_PACKAGE)/DEBIAN/; fi
|
||
@# Копируем документацию
|
||
@if [ -f $(DEB_DIR)/copyright ]; then cp $(DEB_DIR)/copyright $(DEB_PACKAGE)/usr/share/doc/$(APP_NAME)/; fi
|
||
@if [ -f $(DEB_DIR)/changelog ]; then \
|
||
cp $(DEB_DIR)/changelog $(DEB_PACKAGE)/usr/share/doc/$(APP_NAME)/; \
|
||
gzip -9 -n $(DEB_PACKAGE)/usr/share/doc/$(APP_NAME)/changelog 2>/dev/null || true; \
|
||
fi
|
||
@# Устанавливаем права
|
||
@chmod 755 $(DEB_PACKAGE)/DEBIAN/* 2>/dev/null || true
|
||
@echo "$(GREEN)Структура подготовлена$(NC)"
|
||
|
||
## deb - Сборка DEB пакета
|
||
deb: clean build-frontend build-backend prepare-debian
|
||
@echo "$(YELLOW)Сборка DEB пакета...$(NC)"
|
||
@# Копируем бинарник
|
||
@cp $(BINARY) $(DEB_PACKAGE)/usr/bin/
|
||
@# Копируем веб-файлы
|
||
@if [ -d "$(WEB_DIR)/dist" ]; then cp -r $(WEB_DIR)/dist $(DEB_PACKAGE)/opt/gpio-monitoring/web/; fi
|
||
@if [ -d "$(WEB_DIR)/css" ]; then cp -r $(WEB_DIR)/css $(DEB_PACKAGE)/opt/gpio-monitoring/web/; fi
|
||
@if [ -d "$(WEB_DIR)/fonts" ]; then cp -r $(WEB_DIR)/fonts $(DEB_PACKAGE)/opt/gpio-monitoring/web/; fi
|
||
@if ls $(WEB_DIR)/*.html 1>/dev/null 2>&1; then cp $(WEB_DIR)/*.html $(DEB_PACKAGE)/opt/gpio-monitoring/web/ 2>/dev/null || true; fi
|
||
@if [ -f "$(WEB_DIR)/favicon.png" ]; then cp $(WEB_DIR)/favicon.png $(DEB_PACKAGE)/opt/gpio-monitoring/web/ 2>/dev/null || true; fi
|
||
@# Копируем systemd сервис
|
||
@if [ -f "$(DEB_DIR)/$(APP_NAME).service" ]; then cp $(DEB_DIR)/$(APP_NAME).service $(DEB_PACKAGE)/etc/systemd/system/; fi
|
||
@# Копируем конфиг
|
||
@if [ -f "$(DEB_DIR)/$(APP_NAME).conf" ]; then cp $(DEB_DIR)/$(APP_NAME).conf $(DEB_PACKAGE)/etc/gpio-monitoring/config; fi
|
||
@# Копируем скрипт для логов
|
||
@if [ -f "$(DEB_DIR)/usr/bin/gpio-logs" ]; then \
|
||
cp $(DEB_DIR)/usr/bin/gpio-logs $(DEB_PACKAGE)/usr/bin/; \
|
||
chmod +x $(DEB_PACKAGE)/usr/bin/gpio-logs; \
|
||
fi
|
||
@# Устанавливаем правильные права
|
||
@chown -R root:root $(DEB_PACKAGE) 2>/dev/null || true
|
||
@# Создаем архив с контрольными суммами
|
||
@cd $(DEB_PACKAGE) && find . -type f ! -path "./DEBIAN/*" -exec md5sum {} \; > DEBIAN/md5sums 2>/dev/null || true
|
||
@# Собираем пакет
|
||
@dpkg-deb --root-owner-group --build $(DEB_PACKAGE) .
|
||
@mkdir -p $(BUILD_DIR)
|
||
@mv *.deb $(BUILD_DIR)/
|
||
@echo "$(GREEN)DEB пакет создан: $(BUILD_DIR)/$(APP_NAME).deb$(NC)"
|
||
@ls -lh $(BUILD_DIR)/*.deb
|
||
@echo ""
|
||
@echo "$(GREEN)Информация о пакете:$(NC)"
|
||
@dpkg-deb -I $(BUILD_DIR)/*.deb | head -15
|
||
|
||
# ============================================
|
||
# ДОПОЛНИТЕЛЬНЫЕ ЦЕЛИ
|
||
# ============================================
|
||
|
||
## build-arm64 - Сборка для ARM64 (Raspberry Pi)
|
||
build-arm64:
|
||
@$(MAKE) build GOOS=linux GOARCH=arm64
|
||
|
||
## build-amd64 - Сборка для AMD64
|
||
build-amd64:
|
||
@$(MAKE) build GOOS=linux GOARCH=amd64
|
||
|
||
## build-mac - Сборка для macOS
|
||
build-mac:
|
||
@$(MAKE) build GOOS=darwin GOARCH=amd64
|
||
|
||
## build-windows - Сборка для Windows
|
||
build-windows:
|
||
@$(MAKE) build GOOS=windows GOARCH=amd64
|
||
|
||
## build-all - Сборка для всех платформ
|
||
build-all: build-arm64 build-amd64 build-mac build-windows
|
||
@echo "$(GREEN)Все платформы собраны$(NC)"
|
||
|
||
## docker-build - Сборка Docker образа
|
||
docker-build:
|
||
@echo "$(YELLOW)Сборка Docker образа...$(NC)"
|
||
@docker build -t gpio-monitor:latest .
|
||
|
||
## docker-run - Запуск в Docker
|
||
docker-run:
|
||
@echo "$(YELLOW)Запуск в Docker...$(NC)"
|
||
@docker run -p 8080:8080 gpio-monitor:latest
|
||
|
||
## deb-clean - Очистка временных файлов deb-пакета
|
||
deb-clean:
|
||
@echo "$(YELLOW)Очистка deb-временных файлов...$(NC)"
|
||
@rm -rf $(DEB_PACKAGE)
|
||
@rm -f $(BUILD_DIR)/$(APP_NAME).deb
|
||
@echo "$(GREEN)Очищено$(NC)"
|
||
|
||
## deb-info - Показать информацию о deb-пакете
|
||
deb-info:
|
||
@if [ -f "$(BUILD_DIR)/$(APP_NAME).deb" ]; then \
|
||
dpkg-deb -I $(BUILD_DIR)/$(APP_NAME).deb; \
|
||
else \
|
||
echo "$(RED)Пакет не найден. Сначала выполните: make deb$(NC)"; \
|
||
fi
|
||
|
||
## deb-contents - Показать содержимое deb-пакета
|
||
deb-contents:
|
||
@if [ -f "$(BUILD_DIR)/$(APP_NAME).deb" ]; then \
|
||
dpkg-deb -c $(BUILD_DIR)/$(APP_NAME).deb; \
|
||
else \
|
||
echo "$(RED)Пакет не найден. Сначала выполните: make deb$(NC)"; \
|
||
fi
|