195 lines
6.2 KiB
Bash
Executable File
195 lines
6.2 KiB
Bash
Executable File
#!/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_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
|