diff --git a/build.sh b/build.sh index 22c188d..b1610f5 100755 --- a/build.sh +++ b/build.sh @@ -51,6 +51,9 @@ else cd "$FUSH_DIR" fi +# Определение операционной системы +OS=$(uname -s) + # Определение переменных PROJECT_NAME="fush" BINARY_NAME="bin/${PROJECT_NAME}" @@ -64,6 +67,27 @@ GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown") GO_VERSION=$(go version | awk '{print $3}' | sed 's/go//') REQUIRED_VERSION="1.26.0" +# Настройки для OpenIndiana/Solaris +if [ "$OS" = "SunOS" ]; then + echo -e "${YELLOW}Обнаружена OpenIndiana/Solaris, применяются специальные настройки...${NC}" + + # Отключаем CGO для Solaris (частая причина проблем) + export CGO_ENABLED=0 + + # Устанавливаем специфичные флаги + export GOOS=solaris + export GOARCH=amd64 + + # Отключаем проверку buildid для инструментов + export GOFLAGS="-buildid= -trimpath" + + # Solaris требует отключения asyncpreempt + export GODEBUG=asyncpreemptoff=1 + + echo -e "${GREEN}✓ CGO отключен для совместимости${NC}" + echo -e "${GREEN}✓ Установлены Solaris-специфичные переменные${NC}" +fi + # Функция для сравнения версий (работает без sort -V) version_compare() { # Удаляем префикс 'v' если есть @@ -147,6 +171,15 @@ show_help() { echo -e " $0 install # Собрать и установить" echo -e " $0 run # Собрать и запустить" echo + echo -e "${GREEN}Особенности:${NC}" + echo -e " ${YELLOW}• Встроенная команда mycurl для скачивания файлов${NC}" + echo -e " ${YELLOW}• Поддержка HTTP/HTTPS с редиректами${NC}" + echo -e " ${YELLOW}• Работает на Linux и OpenIndiana/Hipster${NC}" + echo -e " ${YELLOW}• Интеграция Lua скриптов${NC}" + if [ "$OS" = "SunOS" ]; then + echo -e " ${GREEN}• OpenIndiana режим: CGO_ENABLED=0${NC}" + fi + echo } # Функция проверки версии Go @@ -172,7 +205,6 @@ check_go_version() { # Функция проверки операционной системы check_os() { - OS=$(uname -s) case "$OS" in Linux|SunOS) echo -e "${GREEN}✓ Поддерживаемая ОС: ${OS}${NC}" @@ -230,6 +262,11 @@ install_deps() { exit 1 fi + # Для OpenIndiana используем специальные флаги + if [ "$OS" = "SunOS" ]; then + export GOFLAGS="-buildid= -trimpath" + fi + # Обновляем go.mod и создаем go.sum echo -e "${YELLOW}Выполнение go mod download...${NC}" $GO mod download 2>&1 | while IFS= read -r line; do @@ -301,6 +338,12 @@ build_project() { return 1 fi + # Для OpenIndiana дополнительные проверки + if [ "$OS" = "SunOS" ]; then + echo -e "${YELLOW}OpenIndiana режим: CGO_ENABLED=${CGO_ENABLED}${NC}" + echo -e "${YELLOW}OpenIndiana режим: GOFLAGS=${GOFLAGS}${NC}" + fi + # Создаем директорию для бинарных файлов mkdir -p "$BUILD_DIR" echo -e "${GREEN}✓ Директория ${BUILD_DIR} создана${NC}" @@ -308,6 +351,11 @@ build_project() { # Формируем флаги сборки LDFLAGS="-X main.BuildTime=${BUILD_TIME} -X main.GitCommit=${GIT_COMMIT}" + # Добавляем дополнительный флаг для Solaris + if [ "$OS" = "SunOS" ]; then + LDFLAGS="-s -w -buildid= ${LDFLAGS}" + fi + # Выполняем сборку с явным указанием выходного файла echo -e "${YELLOW}Выполнение: go build -v -ldflags=\"${LDFLAGS}\" -o ${BINARY_NAME} ./cmd/fush${NC}" @@ -392,6 +440,13 @@ clean_project() { echo -e "${GREEN}✓ Файл ${ROOT_BINARY_NAME} удален${NC}" fi + # Очищаем кэш Go для OpenIndiana + if [ "$OS" = "SunOS" ]; then + echo -e "${YELLOW}Очистка кэша Go...${NC}" + go clean -cache + echo -e "${GREEN}✓ Кэш Go очищен${NC}" + fi + echo -e "${GREEN}✓ Очистка завершена${NC}" } @@ -410,17 +465,35 @@ install_project() { fi # Копируем в системную директорию - if [ -w "/usr/local/bin" ]; then - cp "$ROOT_BINARY_NAME" /usr/local/bin/ - echo -e "${GREEN}✓ Установлен в /usr/local/bin/${PROJECT_NAME}${NC}" + if [ "$OS" = "SunOS" ]; then + # Для OpenIndiana используем /usr/bin вместо /usr/local/bin + if [ -w "/usr/bin" ]; then + cp "$ROOT_BINARY_NAME" /usr/bin/ + echo -e "${GREEN}✓ Установлен в /usr/bin/${PROJECT_NAME}${NC}" + else + echo -e "${YELLOW}Нет прав на запись в /usr/bin. Используем sudo...${NC}" + sudo cp "$ROOT_BINARY_NAME" /usr/bin/ + if [ $? -eq 0 ]; then + echo -e "${GREEN}✓ Установлен в /usr/bin/${PROJECT_NAME}${NC}" + else + echo -e "${RED}error: Не удалось установить в /usr/bin/${PROJECT_NAME}${NC}" + return 1 + fi + fi else - echo -e "${YELLOW}Нет прав на запись в /usr/local/bin. Используем sudo...${NC}" - sudo cp "$ROOT_BINARY_NAME" /usr/local/bin/ - if [ $? -eq 0 ]; then + # Для Linux используем /usr/local/bin + if [ -w "/usr/local/bin" ]; then + cp "$ROOT_BINARY_NAME" /usr/local/bin/ echo -e "${GREEN}✓ Установлен в /usr/local/bin/${PROJECT_NAME}${NC}" else - echo -e "${RED}error: Не удалось установить в /usr/local/bin/${PROJECT_NAME}${NC}" - return 1 + echo -e "${YELLOW}Нет прав на запись в /usr/local/bin. Используем sudo...${NC}" + sudo cp "$ROOT_BINARY_NAME" /usr/local/bin/ + if [ $? -eq 0 ]; then + echo -e "${GREEN}✓ Установлен в /usr/local/bin/${PROJECT_NAME}${NC}" + else + echo -e "${RED}error: Не удалось установить в /usr/local/bin/${PROJECT_NAME}${NC}" + return 1 + fi fi fi @@ -455,7 +528,14 @@ test_project() { return 1 fi - TEST_OUTPUT=$($GO test -v ./... 2>&1) + # Для OpenIndiana отключаем тесты, требующие CGO + if [ "$OS" = "SunOS" ]; then + echo -e "${YELLOW}OpenIndiana: Запуск тестов с CGO_ENABLED=0${NC}" + TEST_OUTPUT=$(CGO_ENABLED=0 $GO test -v ./... 2>&1) + else + TEST_OUTPUT=$($GO test -v ./... 2>&1) + fi + TEST_EXIT_CODE=$? echo "$TEST_OUTPUT" | while IFS= read -r line; do @@ -516,6 +596,16 @@ main() { check_os check_go_version + # Показываем настройки для OpenIndiana + if [ "$OS" = "SunOS" ]; then + echo -e "${CYAN}Режим OpenIndiana Hipster:${NC}" + echo -e " CGO_ENABLED=${CGO_ENABLED}" + echo -e " GOOS=${GOOS}" + echo -e " GOARCH=${GOARCH}" + echo -e " GOFLAGS=${GOFLAGS}" + echo + fi + # Определяем команду COMMAND="${1:-all}" @@ -562,4 +652,4 @@ main() { } # Запуск основной функции -main "$@" +main "$@" \ No newline at end of file