Files
AE_Anons/makefile

305 lines
13 KiB
Makefile
Raw Blame History

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.

.PHONY: all clean build-mac build-windows build-linux build-linux-musl package help quick package-single icons favicon
# Название проекта
PROJECT_NAME := ae_anons
RELEASE_DIR := target/release
BINARIES_DIR := releases
VERSION := $(shell grep '^version' Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')
# Определение текущей ОС
UNAME_S := $(shell uname -s)
UNAME_M := $(shell uname -m)
# Цвета для вывода
GREEN := \033[0;32m
RED := \033[0;31m
YELLOW := \033[1;33m
BLUE := \033[0;34m
CYAN := \033[0;36m
MAGENTA := \033[0;35m
BOLD := \033[1m
NC := \033[0m
# Файл для хранения времени сборки
TIMING_FILE := .build_timing
# Определение команды ImageMagick (v6 = convert, v7 = magick)
IMAGEMAGICK := $(shell command -v magick 2>/dev/null || command -v convert 2>/dev/null || echo "false")
help:
@echo "$(BOLD)$(CYAN)AE Anons - Makefile команды$(NC)"
@echo ""
@echo "$(GREEN)Сборка под конкретную платформу:$(NC)"
@echo " make build-mac - Собрать для macOS (Apple Silicon)"
@echo " make build-windows - Собрать для Windows x86_64"
@echo " make build-linux - Собрать для Linux x86_64 (GNU)"
@echo " make build-linux-musl - Собрать для Linux x86_64 (musl static)"
@echo ""
@echo "$(GREEN)Быстрая сборка:$(NC)"
@echo " make quick - Собрать под текущую платформу с упаковкой"
@echo " make quick-release - Собрать под текущую платформу (release, без упаковки)"
@echo ""
@echo "$(GREEN)Полная сборка:$(NC)"
@echo " make build-all - Собрать для всех платформ"
@echo " make package - Создать пакеты для всех платформ"
@echo " make package-single - Создать пакет для текущей платформы"
@echo ""
@echo "$(GREEN)Иконки:$(NC)"
@echo " make icons - Создать все иконки (logo.ico, logo.icns, favicon.ico)"
@echo " make favicon - Создать только favicon.ico"
@echo ""
@echo "$(GREEN)Очистка:$(NC)"
@echo " make clean - Очистить все сборки"
@echo " make clean-timing - Очистить файл с временами сборки"
# ============================================
# ВСПОМОГАТЕЛЬНЫЕ ФУНКЦИИ
# ============================================
define copy_common_files
@cp .env.example $(1)/ 2>/dev/null || true
@cp README.md $(1)/ 2>/dev/null || true
@if [ -f LICENSE ]; then cp LICENSE $(1)/; else echo "$(YELLOW)⚠️ LICENSE не найден, пропускаем$(NC)"; fi
endef
define measure_time
@start=$$(date +%s); \
$(2); \
end=$$(date +%s); \
duration=$$((end - start)); \
echo "$(1): $$duration сек" >> $(TIMING_FILE); \
if [ $$duration -ge 60 ]; then \
min=$$((duration / 60)); \
sec=$$((duration % 60)); \
echo "$(GREEN)$(1) завершён за $${min}m $${sec}s$(NC)"; \
else \
echo "$(GREEN)$(1) завершён за $${duration}s$(NC)"; \
fi
endef
define print_timing_summary
@echo ""
@echo "$(BOLD)$(CYAN)═══════════════════════════════════════════════════════════════$(NC)"
@echo "$(BOLD)$(CYAN) ВРЕМЯ СБОРКИ $(NC)"
@echo "$(BOLD)$(CYAN)═══════════════════════════════════════════════════════════════$(NC)"
@if [ -f $(TIMING_FILE) ]; then \
total=0; \
while IFS=':' read -r platform duration; do \
sec=$$(echo $$duration | sed 's/ сек//'); \
total=$$((total + sec)); \
printf "$(YELLOW)%-25s$(NC) : $(GREEN)%5d сек$(NC)\n" "$$platform" "$$sec"; \
done < $(TIMING_FILE); \
echo "$(BOLD)$(CYAN)───────────────────────────────────────────────────────────────$(NC)"; \
printf "$(BOLD)$(MAGENTA)%-25s$(NC) : $(BOLD)$(GREEN)%5d сек$(NC) (%.2f мин)\n" "ВСЕГО" "$$total" "$$(echo "scale=2; $$total/60" | bc 2>/dev/null || echo "$$total/60" | awk '{printf "%.2f", $$1/60}')"; \
else \
echo "$(YELLOW)Нет данных о времени сборки$(NC)"; \
fi
@echo "$(BOLD)$(CYAN)═══════════════════════════════════════════════════════════════$(NC)"
@rm -f $(TIMING_FILE)
endef
# ============================================
# ИКОНКИ
# ============================================
icons: favicon
@echo "$(GREEN)Создание иконок для Windows и macOS...$(NC)"
@if [ "$(IMAGEMAGICK)" = "false" ]; then \
echo "$(RED)❌ ImageMagick не установлен. Установите: brew install imagemagick$(NC)"; \
exit 1; \
fi
# Windows .ico
@$(IMAGEMAGICK) assets/logo.png -define icon:auto-resize=256,128,64,48,32,16 assets/logo.ico
@echo "$(GREEN) ✓ assets/logo.ico$(NC)"
# macOS .icns
@mkdir -p assets/icon.iconset
@sips -z 16 16 assets/logo.png --out assets/icon.iconset/icon_16x16.png 2>/dev/null
@sips -z 32 32 assets/logo.png --out assets/icon.iconset/icon_16x16@2x.png 2>/dev/null
@sips -z 32 32 assets/logo.png --out assets/icon.iconset/icon_32x32.png 2>/dev/null
@sips -z 64 64 assets/logo.png --out assets/icon.iconset/icon_32x32@2x.png 2>/dev/null
@sips -z 128 128 assets/logo.png --out assets/icon.iconset/icon_128x128.png 2>/dev/null
@sips -z 256 256 assets/logo.png --out assets/icon.iconset/icon_128x128@2x.png 2>/dev/null
@sips -z 256 256 assets/logo.png --out assets/icon.iconset/icon_256x256.png 2>/dev/null
@sips -z 512 512 assets/logo.png --out assets/icon.iconset/icon_256x256@2x.png 2>/dev/null
@sips -z 512 512 assets/logo.png --out assets/icon.iconset/icon_512x512.png 2>/dev/null
@iconutil -c icns assets/icon.iconset -o assets/logo.icns 2>/dev/null
@rm -rf assets/icon.iconset
@echo "$(GREEN) ✓ assets/logo.icns$(NC)"
favicon:
@echo "$(GREEN)Создание favicon.ico...$(NC)"
@if [ "$(IMAGEMAGICK)" = "false" ]; then \
echo "$(RED)❌ ImageMagick не установлен. Установите: brew install imagemagick$(NC)"; \
exit 1; \
fi
@$(IMAGEMAGICK) assets/logo.png -define icon:auto-resize=48,32,16 src/static/favicon.ico
@echo "$(GREEN) ✓ src/static/favicon.ico$(NC)"
# ============================================
# ИКОНКА ДЛЯ WINDOWS
# ============================================
windows-icon:
@if [ ! -f assets/logo.ico ]; then \
echo "$(YELLOW)logo.ico не найден, запускаю генерацию...$(NC)"; \
$(MAKE) icons; \
fi
# ============================================
# ОПРЕДЕЛЕНИЕ ПЛАТФОРМЫ
# ============================================
detect-platform:
ifeq ($(UNAME_S),Darwin)
@echo "$(BLUE)🍎 macOS $(UNAME_M)$(NC)"
@$(MAKE) quick-mac
else ifeq ($(UNAME_S),Linux)
@echo "$(BLUE)🐧 Linux $(UNAME_M)$(NC)"
@$(MAKE) quick-linux
else ifeq ($(OS),Windows_NT)
@echo "$(BLUE)🪟 Windows$(NC)"
@$(MAKE) quick-windows
else
@echo "$(RED)❌ Неизвестная платформа: $(UNAME_S)$(NC)"
@exit 1
endif
# ============================================
# БЫСТРАЯ СБОРКА (ТЕКУЩАЯ ПЛАТФОРМА)
# ============================================
quick: detect-platform
quick-release:
ifeq ($(UNAME_S),Darwin)
@echo "$(GREEN)🍎 Сборка для macOS...$(NC)"
@time cargo build --release
else ifeq ($(UNAME_S),Linux)
@echo "$(GREEN)🐧 Сборка для Linux (musl)...$(NC)"
@time cargo build --target x86_64-unknown-linux-musl --release
else ifeq ($(OS),Windows_NT)
@echo "$(GREEN)🪟 Сборка для Windows...$(NC)"
@time cargo build --release
else
@echo "$(RED)❌ Неизвестная платформа$(NC)"
@exit 1
endif
quick-mac:
@rm -f $(TIMING_FILE)
@$(call measure_time,"🍎 macOS $(UNAME_M)",cargo build --release)
@mkdir -p $(BINARIES_DIR)/$(PROJECT_NAME)-v$(VERSION)-macos-$(UNAME_M)
@cp $(RELEASE_DIR)/$(PROJECT_NAME) $(BINARIES_DIR)/$(PROJECT_NAME)-v$(VERSION)-macos-$(UNAME_M)/
$(call copy_common_files,$(BINARIES_DIR)/$(PROJECT_NAME)-v$(VERSION)-macos-$(UNAME_M))
@echo "$(GREEN)✅ Пакет: $(BINARIES_DIR)/$(PROJECT_NAME)-v$(VERSION)-macos-$(UNAME_M)/$(NC)"
@$(call print_timing_summary)
quick-linux:
@rm -f $(TIMING_FILE)
@$(call measure_time,"🐧 Linux $(UNAME_M)",cargo build --target x86_64-unknown-linux-musl --release)
@mkdir -p $(BINARIES_DIR)/$(PROJECT_NAME)-v$(VERSION)-linux-$(UNAME_M)
@cp target/x86_64-unknown-linux-musl/release/$(PROJECT_NAME) $(BINARIES_DIR)/$(PROJECT_NAME)-v$(VERSION)-linux-$(UNAME_M)/
$(call copy_common_files,$(BINARIES_DIR)/$(PROJECT_NAME)-v$(VERSION)-linux-$(UNAME_M))
@echo "$(GREEN)✅ Пакет: $(BINARIES_DIR)/$(PROJECT_NAME)-v$(VERSION)-linux-$(UNAME_M)/$(NC)"
@$(call print_timing_summary)
quick-windows:
@rm -f $(TIMING_FILE)
@if command -v x86_64-w64-mingw32-gcc >/dev/null 2>&1; then \
$(call measure_time,"🪟 Windows x64",cargo build --target x86_64-pc-windows-gnu --release); \
mkdir -p $(BINARIES_DIR)/$(PROJECT_NAME)-v$(VERSION)-windows-x64; \
cp target/x86_64-pc-windows-gnu/release/$(PROJECT_NAME).exe $(BINARIES_DIR)/$(PROJECT_NAME)-v$(VERSION)-windows-x64/; \
$(call copy_common_files,$(BINARIES_DIR)/$(PROJECT_NAME)-v$(VERSION)-windows-x64); \
echo "$(GREEN)✅ Пакет: $(BINARIES_DIR)/$(PROJECT_NAME)-v$(VERSION)-windows-x64/$(NC)"; \
$(call print_timing_summary); \
else \
echo "$(RED)❌ Для кросс-компиляции Windows установите mingw-w64:$(NC)"; \
echo " brew install mingw-w64"; \
exit 1; \
fi
# ============================================
# СБОРКА ПОД КОНКРЕТНЫЕ ПЛАТФОРМЫ
# ============================================
build-mac:
@echo "$(GREEN)🍎 Сборка для macOS...$(NC)"
@time cargo build --release
build-windows: windows-icon
@echo "$(GREEN)🪟 Сборка для Windows x86_64...$(NC)"
@time cargo build --target x86_64-pc-windows-gnu --release
build-linux:
@echo "$(GREEN)🐧 Сборка для Linux x86_64 (GNU)...$(NC)"
@time cargo build --target x86_64-unknown-linux-gnu --release
build-linux-musl:
@echo "$(GREEN)🐧 Сборка для Linux x86_64 (musl static)...$(NC)"
@time cargo build --target x86_64-unknown-linux-musl --release
# ============================================
# СБОРКА ВСЕХ ПЛАТФОРМ С ТАЙМИНГОМ
# ============================================
build-all:
@rm -f $(TIMING_FILE)
@echo "$(BOLD)$(CYAN)🚀 Сборка для всех платформ...$(NC)"
@echo ""
@$(call measure_time,"🍎 macOS",cargo build --release)
@echo ""
@$(call measure_time,"🐧 Linux GNU",cargo build --target x86_64-unknown-linux-gnu --release)
@echo ""
@$(call measure_time,"🐧 Linux Musl",cargo build --target x86_64-unknown-linux-musl --release)
@echo ""
@-$(call measure_time,"🪟 Windows",cargo build --target x86_64-pc-windows-gnu --release)
@echo ""
@$(call print_timing_summary)
# ============================================
# УПАКОВКА РЕЛИЗОВ
# ============================================
define create_release_package
@echo "$(YELLOW)📦 Упаковка для $(1)...$(NC)"
@mkdir -p $(BINARIES_DIR)/$(PROJECT_NAME)-v$(VERSION)-$(1)
@cp $(2) $(BINARIES_DIR)/$(PROJECT_NAME)-v$(VERSION)-$(1)/$(3) 2>/dev/null || true
$(call copy_common_files,$(BINARIES_DIR)/$(PROJECT_NAME)-v$(VERSION)-$(1))
@echo "$(GREEN) ✓ $(PROJECT_NAME)-v$(VERSION)-$(1)$(NC)"
endef
package: build-all
@echo ""
@echo "$(BOLD)$(CYAN)📦 Создание пакетов...$(NC)"
@mkdir -p $(BINARIES_DIR)
@$(call create_release_package,macos-arm64,$(RELEASE_DIR)/$(PROJECT_NAME),$(PROJECT_NAME))
@$(call create_release_package,windows-x64,target/x86_64-pc-windows-gnu/release/$(PROJECT_NAME).exe,$(PROJECT_NAME).exe)
@$(call create_release_package,linux-gnu,target/x86_64-unknown-linux-gnu/release/$(PROJECT_NAME),$(PROJECT_NAME))
@$(call create_release_package,linux-musl,target/x86_64-unknown-linux-musl/release/$(PROJECT_NAME),$(PROJECT_NAME))
@echo ""
@echo "$(GREEN)🗜️ Создание общего архива...$(NC)"
@tar -czf $(PROJECT_NAME)-v$(VERSION)-all.tar.gz -C $(BINARIES_DIR) .
@echo "$(GREEN)✅ Архив: $(PROJECT_NAME)-v$(VERSION)-all.tar.gz$(NC)"
@echo ""
@echo "$(BOLD)$(GREEN)🎉 Релиз v$(VERSION) готов!$(NC)"
@echo "$(BOLD)📁 Папка: $(BINARIES_DIR)/$(NC)"
@ls -lh $(BINARIES_DIR)/ | grep "^d"
package-single: detect-platform
# ============================================
# ОЧИСТКА
# ============================================
clean:
@echo "$(RED)🧹 Очистка...$(NC)"
cargo clean
@rm -rf $(BINARIES_DIR)
@rm -f *.tar.gz
@rm -f $(TIMING_FILE)
@echo "$(GREEN)✅ Очищено$(NC)"
clean-timing:
@rm -f $(TIMING_FILE)
@echo "$(GREEN)✅ Файл с временами сборки удалён$(NC)"