2026-05-17 20:12:47 +00:00
|
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
|
# Copyright 2026 Safronov Grigorii
|
|
|
|
|
|
#
|
|
|
|
|
|
# Licensed under the CDDL, Version 1.0 (the "License");
|
|
|
|
|
|
# you may not use this file except in compliance with the License.
|
|
|
|
|
|
#
|
|
|
|
|
|
# You may obtain a copy of the License at
|
|
|
|
|
|
# https://opensource.org/licenses/CDDL-1.0
|
|
|
|
|
|
#
|
|
|
|
|
|
# Универсальный скрипт сборки futriis для Linux и Illumos
|
|
|
|
|
|
# НЕ ТРЕБУЕТ GCC - использует CGO_ENABLED=0 для всех платформ
|
|
|
|
|
|
|
|
|
|
|
|
set -e
|
|
|
|
|
|
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
echo "🔨 Building futriis database..."
|
|
|
|
|
|
|
|
|
|
|
|
# Определение ОС
|
|
|
|
|
|
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
|
|
|
|
|
|
|
|
|
|
|
|
# Цвета для вывода
|
|
|
|
|
|
if [ -t 1 ]; then
|
|
|
|
|
|
RED='\033[0;31m'
|
|
|
|
|
|
GREEN='\033[0;32m'
|
|
|
|
|
|
YELLOW='\033[1;33m'
|
2026-05-18 19:01:06 +00:00
|
|
|
|
CYAN='\033[1;36m' # Жирный-голубой (cyan)
|
2026-05-17 20:12:47 +00:00
|
|
|
|
NC='\033[0m'
|
|
|
|
|
|
else
|
|
|
|
|
|
RED=''; GREEN=''; YELLOW=''; CYAN=''; NC=''
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Функции
|
|
|
|
|
|
error_msg() { echo -e "${RED}❌ $1${NC}"; }
|
|
|
|
|
|
success_msg() { echo -e "${GREEN}✅ $1${NC}"; }
|
|
|
|
|
|
info_msg() { echo -e "${CYAN}📋 $1${NC}"; } # Изменено с BLUE на CYAN
|
|
|
|
|
|
warning_msg() { echo -e "${YELLOW}⚠️ $1${NC}"; }
|
|
|
|
|
|
print_separator() { echo "================================================"; }
|
|
|
|
|
|
|
|
|
|
|
|
# Проверка Go
|
|
|
|
|
|
check_go() {
|
|
|
|
|
|
info_msg "Checking Go installation..."
|
|
|
|
|
|
if ! command -v go >/dev/null 2>&1; then
|
|
|
|
|
|
error_msg "Go is not installed or not in PATH"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
GO_VERSION=$(go version | awk '{print $3}')
|
|
|
|
|
|
success_msg "Go found: $GO_VERSION"
|
|
|
|
|
|
|
|
|
|
|
|
# Настраиваем Go proxy для ускорения
|
|
|
|
|
|
go env -w GOPROXY=https://proxy.golang.org,direct 2>/dev/null || true
|
|
|
|
|
|
info_msg "Go proxy: $(go env GOPROXY)"
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Подготовка vendor с видимым прогрессом
|
|
|
|
|
|
setup_vendor() {
|
|
|
|
|
|
info_msg "Checking vendor directory..."
|
|
|
|
|
|
|
|
|
|
|
|
# Проверяем, нужно ли обновить vendor
|
|
|
|
|
|
NEED_VENDOR=false
|
|
|
|
|
|
|
|
|
|
|
|
if [ ! -d "vendor" ] || [ ! -f "vendor/modules.txt" ]; then
|
|
|
|
|
|
warning_msg "Vendor directory not found or incomplete"
|
|
|
|
|
|
NEED_VENDOR=true
|
|
|
|
|
|
elif [ "go.mod" -nt "vendor/modules.txt" ]; then
|
|
|
|
|
|
warning_msg "go.mod is newer than vendor directory"
|
|
|
|
|
|
NEED_VENDOR=true
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
if [ "$NEED_VENDOR" = true ]; then
|
|
|
|
|
|
info_msg "Creating/updating vendor directory..."
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
info_msg "Step 1/2: Downloading modules..."
|
|
|
|
|
|
go mod download -x 2>&1 | grep -E "^(GET|Downloading)" | head -20 || true
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
info_msg "Step 2/2: Creating vendor directory..."
|
|
|
|
|
|
go mod vendor
|
|
|
|
|
|
success_msg "Vendor dependencies ready"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
else
|
|
|
|
|
|
info_msg "Vendor directory is up to date"
|
|
|
|
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Сборка статического бинарника
|
|
|
|
|
|
build_static() {
|
|
|
|
|
|
local target_os=$1
|
|
|
|
|
|
local target_arch="amd64"
|
|
|
|
|
|
local output_name="futriis-${target_os}"
|
|
|
|
|
|
local output_path="bin/${output_name}"
|
|
|
|
|
|
|
|
|
|
|
|
info_msg "Building for ${target_os} (static, no CGO)..."
|
|
|
|
|
|
|
|
|
|
|
|
export GOOS="${target_os}"
|
|
|
|
|
|
export GOARCH="${target_arch}"
|
|
|
|
|
|
export CGO_ENABLED=0
|
|
|
|
|
|
|
|
|
|
|
|
local build_tags=""
|
|
|
|
|
|
if [ "${target_os}" = "illumos" ] || [ "${target_os}" = "solaris" ]; then
|
|
|
|
|
|
build_tags="-tags=illumos"
|
|
|
|
|
|
output_name="futriis-illumos"
|
|
|
|
|
|
output_path="bin/futriis-illumos"
|
|
|
|
|
|
elif [ "${target_os}" = "linux" ]; then
|
|
|
|
|
|
output_name="futriis-linux"
|
|
|
|
|
|
output_path="bin/futriis-linux"
|
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
|
|
# Создаём bin директорию
|
|
|
|
|
|
mkdir -p bin
|
|
|
|
|
|
|
|
|
|
|
|
# Сборка
|
|
|
|
|
|
if go build -mod=vendor ${build_tags} -ldflags="-s -w" -o "${output_path}" ./cmd/futriis; then
|
|
|
|
|
|
success_msg "Build successful for ${target_os}: ${output_path}"
|
|
|
|
|
|
cp "${output_path}" "./${output_name}" 2>/dev/null || true
|
|
|
|
|
|
info_msg "Binary copied to: ./${output_name}"
|
|
|
|
|
|
|
|
|
|
|
|
SIZE=$(ls -lh "${output_path}" | awk '{print $5}')
|
|
|
|
|
|
info_msg "Binary size: ${SIZE}"
|
|
|
|
|
|
return 0
|
|
|
|
|
|
else
|
|
|
|
|
|
error_msg "Build failed for ${target_os}"
|
|
|
|
|
|
return 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Основная функция
|
|
|
|
|
|
main() {
|
|
|
|
|
|
print_separator
|
|
|
|
|
|
echo -e "${GREEN}🔨 Building futriis database (static, no GCC required)${NC}"
|
|
|
|
|
|
print_separator
|
|
|
|
|
|
|
|
|
|
|
|
info_msg "Detected OS: ${OS}"
|
|
|
|
|
|
|
|
|
|
|
|
check_go
|
|
|
|
|
|
setup_vendor
|
|
|
|
|
|
|
|
|
|
|
|
print_separator
|
|
|
|
|
|
|
|
|
|
|
|
# Сборка для текущей ОС
|
|
|
|
|
|
BUILD_SUCCESS=true
|
|
|
|
|
|
|
|
|
|
|
|
case "${OS}" in
|
|
|
|
|
|
linux)
|
|
|
|
|
|
if ! build_static "linux"; then
|
|
|
|
|
|
BUILD_SUCCESS=false
|
|
|
|
|
|
fi
|
|
|
|
|
|
;;
|
|
|
|
|
|
sunos|illumos)
|
|
|
|
|
|
if ! build_static "illumos"; then
|
|
|
|
|
|
BUILD_SUCCESS=false
|
|
|
|
|
|
fi
|
|
|
|
|
|
;;
|
|
|
|
|
|
darwin)
|
|
|
|
|
|
info_msg "Detected macOS, cross-compiling for Linux..."
|
|
|
|
|
|
if ! build_static "linux"; then
|
|
|
|
|
|
BUILD_SUCCESS=false
|
|
|
|
|
|
fi
|
|
|
|
|
|
;;
|
|
|
|
|
|
*)
|
|
|
|
|
|
warning_msg "Unknown OS: ${OS}, building for Linux..."
|
|
|
|
|
|
if ! build_static "linux"; then
|
|
|
|
|
|
BUILD_SUCCESS=false
|
|
|
|
|
|
fi
|
|
|
|
|
|
;;
|
|
|
|
|
|
esac
|
|
|
|
|
|
|
|
|
|
|
|
print_separator
|
|
|
|
|
|
|
|
|
|
|
|
if [ "$BUILD_SUCCESS" = true ]; then
|
|
|
|
|
|
success_msg "Build complete!"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
info_msg "To run the database:"
|
|
|
|
|
|
echo " ./futriis-linux # On Linux"
|
|
|
|
|
|
echo " ./futriis-illumos # On Illumos/OpenIndiana"
|
|
|
|
|
|
echo ""
|
|
|
|
|
|
info_msg "Binary location: bin/"
|
|
|
|
|
|
ls -lh bin/ 2>/dev/null || true
|
|
|
|
|
|
else
|
|
|
|
|
|
error_msg "Build failed"
|
|
|
|
|
|
exit 1
|
|
|
|
|
|
fi
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Запуск
|
|
|
|
|
|
main "$@"
|