cat << 'EOF' > ~/lfs-builder/scripts/build.sh #!/bin/bash set -e set -o pipefail # Автоматически определяем корень проекта относительно самого скрипта LFS_BUILDER_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" # Загружаем конфигурацию из корня if [ -f "$LFS_BUILDER_ROOT/config.conf" ]; then source "$LFS_BUILDER_ROOT/config.conf" else echo "Ошибка: Конфигурационный файл config.conf не найден в $LFS_BUILDER_ROOT!" exit 1 fi # Проверка переданных аргументов if [ -z "$1" ] || [ -z "$2" ]; then echo "Использование: $0 <имя_архива> <скрипт_пакета.sh>" echo "Пример: $0 binutils-2.42.tar.xz packages/001-binutils-p1.sh" exit 1 fi ARCHIVE="$1" PACK_SCRIPT="$2" PKG_NAME=$(basename "$PACK_SCRIPT" .sh) LOG_FILE="$LOGS/${PKG_NAME}.log" echo "=== Запуск сборки пакета: $PKG_NAME ===" echo "Лог компиляции: $LOG_FILE" # Переход в рабочую область исходников (из config.conf) cd "$SOURCES" # Распаковка тарболла echo "Распаковка $ARCHIVE..." case "$ARCHIVE" in *.tar.gz|*.tgz) tar -f "$ARCHIVE" -zxf ;; *.tar.xz|*.txz) tar -f "$ARCHIVE" -Jxf ;; *.tar.bz2|*.tbz2) tar -f "$ARCHIVE" -jxf ;; *) echo "Неизвестный формат архива!"; exit 1 ;; esac # Определение имени созданной папки SRC_DIR=$(ls -td */ | head -n1) cd "$SRC_DIR" echo "Переход в каталог исходников: $SRC_DIR" # Выполнение скрипта сборки с логированием set +e bash "$LFS_BUILDER_ROOT/$PACK_SCRIPT" 2>&1 | tee "$LOG_FILE" EXIT_CODE=${PIPESTATUS[0]} set -e # Очистка рабочей папки cd "$SOURCES" echo "Удаление временной директории исходников $SRC_DIR..." rm -rf "$SRC_DIR" if [ $EXIT_CODE -eq 0 ]; then echo "=== [УСПЕХ] Пакет $PKG_NAME собран успешно! ===" else echo "=== [ОШИБКА] Сбой при сборке $PKG_NAME. См. лог: $LOG_FILE ===" exit $EXIT_CODE fi EOF # Делаем скрипт исполняемым chmod +x ~/lfs-builder/scripts/build.sh