#!/bin/bash set -e # Прерывать выполнение при ошибках # Цвета для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Конфигурация SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" BUILD_DIR="build-x86" TOOLCHAIN_FILE="toolchain-x86.cmake" JOBS=$(nproc) # Функции для вывода print_info() { echo -e "${BLUE}[INFO]${NC} $1" } print_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } print_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } print_error() { echo -e "${RED}[ERROR]${NC} $1" } # Проверка наличия toolchain файла check_toolchain() { if [ ! -f "$SCRIPT_DIR/$TOOLCHAIN_FILE" ]; then print_error "Файл $TOOLCHAIN_FILE не найден в $SCRIPT_DIR" exit 1 fi print_info "Найден toolchain файл: $TOOLCHAIN_FILE" } # Создание директории сборки setup_build_dir() { print_info "Настройка директории сборки: $BUILD_DIR" if [ -d "$SCRIPT_DIR/$BUILD_DIR" ]; then print_warning "Директория сборки уже существует" read -p "Очистить существующую сборку? [y/N]: " -n 1 -r echo if [[ $REPLY =~ ^[Yy]$ ]]; then rm -rf "$SCRIPT_DIR/$BUILD_DIR" print_info "Директория сборки очищена" fi fi mkdir -p "$SCRIPT_DIR/$BUILD_DIR" print_success "Директория сборки готова" } # Конфигурация CMake configure_cmake() { print_info "Конфигурация CMake для x86..." cd "$SCRIPT_DIR/$BUILD_DIR" # Определяем тип сборки (Debug по умолчанию для отладки) local build_type="${BUILD_TYPE:-Debug}" print_info "Тип сборки: $build_type" cmake \ -DCMAKE_C_COMPILER=gcc-11 \ -DCMAKE_CXX_COMPILER=g++-11 \ -DCMAKE_BUILD_TYPE="$build_type" \ -DCMAKE_VERBOSE_MAKEFILE=ON \ .. if [ $? -eq 0 ]; then print_success "CMake конфигурация завершена успешно" else print_error "Ошибка конфигурации CMake" exit 1 fi } # Сборка проекта build_project() { print_info "Сборка проекта (используется $JOBS потоков)..." cd "$SCRIPT_DIR/$BUILD_DIR" make -j$JOBS if [ $? -eq 0 ]; then print_success "Сборка завершена успешно" else print_error "Ошибка сборки" exit 1 fi } # Проверка результата сборки check_build_result() { local binary_path="$SCRIPT_DIR/$BUILD_DIR/test_app" if [ -f "$binary_path" ]; then print_success "Исполняемый файл создан: $binary_path" # Проверяем архитектуру local file_info=$(file "$binary_path") print_info "Информация о файле: $file_info" if echo "$file_info" | grep -q "x86-64\|x86_64"; then print_success "Подтверждена x86 архитектура" else print_warning "Архитектура может быть неправильной" fi # Показываем размер файла local file_size=$(du -h "$binary_path" | cut -f1) print_info "Размер исполняемого файла: $file_size" else print_error "Исполняемый файл не найден: $binary_path" exit 1 fi } # Главная функция main() { print_info "=== Кросс-компиляция test_app для x86 ===" # Переходим в директорию скрипта cd "$SCRIPT_DIR" # Проверки # Сборка setup_build_dir configure_cmake build_project check_build_result print_success "=== Кросс-компиляция завершена успешно! ===" print_info "Исполняемый файл: $SCRIPT_DIR/$BUILD_DIR/test_app" print_info "Для запуска на x86 устройстве скопируйте файл и запустите его" } # Обработка аргументов командной строки case "${1:-}" in "clean") print_info "Очистка директории сборки x86..." rm -rf "$SCRIPT_DIR/$BUILD_DIR" print_success "Директория сборки очищена" exit 0 ;; "debug") export BUILD_TYPE="Debug" print_info "Режим Debug сборки (с отладочными символами)" main ;; "release") export BUILD_TYPE="Release" print_info "Режим Release сборки (оптимизированная)" main ;; "help"|"-h"|"--help") echo "Использование: $0 [команда]" echo "" echo "Команды:" echo " (нет) - Выполнить Debug сборку (по умолчанию)" echo " debug - Выполнить Debug сборку (с отладочными символами)" echo " release - Выполнить Release сборку (оптимизированная)" echo " clean - Очистить директорию сборки" echo " help - Показать эту справку" echo "" echo "Примеры:" echo " $0 # Debug сборка" echo " $0 debug # Debug сборка (явно)" echo " $0 release # Release сборка" echo " $0 clean # Очистка" echo "" echo "Переменные окружения:" echo " BUILD_TYPE # Debug, Release, RelWithDebInfo, MinSizeRel" exit 0 ;; "") export BUILD_TYPE="${BUILD_TYPE:-Debug}" main ;; *) print_error "Неизвестная команда: $1" print_info "Используйте '$0 help' для справки" exit 1 ;; esac