nlve/build.sh
4aiman fd34e71f49 Показатель работы внизу: ход, участок на монтаже, переключатель журнала
Полоска выполнения теперь показывает всё, что делается в стороне от
окна: сборку наложений и затуханий, разбор звука, миниатюры. Раньше она
знала только про звук и миниатюры, а самое долгое — пересборку участков
с прозрачностью — не показывала вовсе.

Как она растёт. Настоящая доля известна только вехами: вставка готова,
файл разобран. Между вехами не происходит ничего видимого, и полоска,
стоящая на месте, выглядит как зависшая программа. Поэтому между вехами
она ползёт сама — к следующей вехе, но никогда её не достигая: каждый
шаг покрывает малую долю оставшегося расстояния. Работа идёт как
задумано — веха приходит быстро и полоска прыгает к ней; затянулась —
шаги мельчают, и заполнение само собой замедляется. Назад не идёт
никогда, полной без настоящего конца не становится.

Расчёт вынесен в uAppTypes отдельной функцией именно затем, чтобы его
можно было прогнать числами, и прогоняется: проверки в
tests/progress/progtest.lpr включены в build.sh. Замер: до половины пути
десять шагов таймера, до трёх четвертей — ещё десять.

Участок монтажа, который сейчас пересобирается, помечается косой
штриховкой во всю высоту дорожек. Сплошная заливка закрыла бы клипы, а
рамка на узком участке была бы неразличима; штрих наклонный, чтобы его
не спутать с курсором и границами клипов — те все вертикальные.

Кнопка «Журнал» прячет и показывает нижнюю полосу с сообщениями,
состояние переживает перезапуск.

Системный TStatusBar не взят намеренно: его рисует система, и под
Windows он остался бы светлой полосой — ровно та беда, из-за которой уже
переписаны кнопки, полосы прокрутки, журнал и меню. Всё сделано на своей
нижней панели, теми же средствами.
2026-08-22 00:52:09 +03:00

194 lines
6.5 KiB
Bash
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
#
# Сборка nlve.
#
# ./build.sh редактор под эту систему
# ./build.sh current то же самое
# ./build.sh windows редактор под Windows (кросс-сборка)
# ./build.sh tool консольный инструмент проверок
# ./build.sh test инструмент плюс прогон проверок
# ./build.sh all всё перечисленное
# ./build.sh run собрать под эту систему и запустить
# ./build.sh clean убрать промежуточные файлы сборки
#
# Тулчейн берётся из fpcupdeluxe, а не из системы. Это не придирка:
# системный Lazarus другой версии, и собранные им модули LCL с нашими
# несовместимы — сборка падает на ровном месте.
set -u
HERE=$(cd "$(dirname "$0")" && pwd)
FPCUP=${FPCUP:-/home/chaiman/fpcupdeluxe}
LAZBUILD="$FPCUP/lazarus/lazbuild"
LAZCONF="$FPCUP/config_lazarus"
# Компилятор нужен напрямую для консольных проверок без формы.
FPC="$FPCUP/fpc/bin/x86_64-linux/fpc.sh"
# Собранный виджетсет только один — gtk2. Ни qt5, ни gtk3 в этом
# тулчейне нет, подставлять их бессмысленно.
LCL_LINUX=gtk2
# Под Windows виджетсет называется win32 и работает в том числе на 64 битах:
# это имя интерфейса, а не разрядности.
LCL_WINDOWS=win32
status=0
fail() {
echo "ОШИБКА: $*" >&2
exit 1
}
note() {
echo
echo "=== $* ==="
}
check_toolchain() {
[ -x "$LAZBUILD" ] || fail "не найден lazbuild: $LAZBUILD
Задайте другой корень через переменную FPCUP, например:
FPCUP=/путь/к/fpcupdeluxe ./build.sh"
}
# Из вывода lazbuild интересны только ошибки и итог. Подсказок о
# неиспользованных параметрах там сотни, и за ними не видно главного.
run_lazbuild() {
local title=$1
local rc
shift
note "$title"
"$LAZBUILD" --primary-config-path="$LAZCONF" "$@" 2>&1 \
| grep -viE "^Hint: \(lazbuild\)|^Hint: \(lazarus\)|Start of reading config|End of reading config" \
| grep -iE "error|fatal|warning|Linking|lines compiled|Compiling package"
# Код возврата берём у lazbuild, а не у grep: grep возвращает 1 просто
# потому, что ничего не нашёл, и это не ошибка сборки.
#
# PIPESTATUS читается сразу же и в переменную. Любая следующая команда
# его затирает — даже двоеточие. На этом скрипт уже один раз соврал:
# сборка падала, а он докладывал «готово».
rc=${PIPESTATUS[0]}
return "$rc"
}
build_current() {
check_toolchain
if run_lazbuild "Редактор под эту систему ($LCL_LINUX)" \
--ws="$LCL_LINUX" "$HERE/nlve.lpi"; then
echo "готово: $HERE/nlve"
else
echo "не собралось" >&2
status=1
fi
}
build_windows() {
check_toolchain
if run_lazbuild "Редактор под Windows (x86_64)" \
--cpu=x86_64 --os=win64 --ws="$LCL_WINDOWS" "$HERE/nlve.lpi"; then
echo "готово: $HERE/nlve.exe"
# Печатаем, что именно получилось: перепутать разрядность легко, а
# заметить это без запуска под Windows нечем.
file "$HERE/nlve.exe" 2>/dev/null | cut -d: -f2- | sed 's/^/ /'
else
echo "не собралось" >&2
status=1
fi
# Кросс-сборка оставляет модули для Windows в том же каталоге, что и
# родные. Следующая сборка под Linux их не тронет и возьмёт как свои,
# после чего компоновщик выдаст непонятную ошибку. Поэтому чистим.
rm -rf "$HERE/lib/x86_64-win64"
}
build_tool() {
note "Консольный инструмент проверок"
if "$HERE/tests/build.sh"; then
:
else
echo "не собралось" >&2
status=1
fi
}
run_tests() {
build_tool
[ "$status" -eq 0 ] || return
note "Проверки уплощения монтажа"
if "$HERE/tests/nlvetool" flattest; then
echo "проверки пройдены"
else
echo "проверки не пройдены" >&2
status=1
fi
# Ход полоски выполнения проверяется отдельной программой: расчёт вынесен
# в uAppTypes именно затем, чтобы его можно было прогнать числами.
note "Проверка хода полоски выполнения"
if "$FPC" -Fu"$HERE/src" -FE"$HERE/tests/progress" \
-o"$HERE/tests/progress/progtest" \
"$HERE/tests/progress/progtest.lpr" >/dev/null 2>&1; then
if "$HERE/tests/progress/progtest"; then
:
else
status=1
fi
else
echo "не собралось" >&2
status=1
fi
}
do_clean() {
note "Уборка"
rm -rf "$HERE/lib" "$HERE/tests/lib"
rm -f "$HERE/nlve.dbg"
echo "убраны промежуточные файлы сборки"
echo "готовые двоичные файлы (nlve, nlve.exe, tests/nlvetool) оставлены"
}
case "${1:-current}" in
current|linux|"")
build_current
;;
windows|win|win64)
build_windows
;;
tool)
build_tool
;;
test|tests)
run_tests
;;
all)
build_current
build_windows
run_tests
;;
run)
build_current
[ "$status" -eq 0 ] || exit 1
note "Запуск"
exec "$HERE/nlve"
;;
clean)
do_clean
;;
-h|--help|help)
# Печатаем шапку файла до первой строки, которая уже не комментарий.
awk 'NR>2 { if ($0 !~ /^#/) exit; sub(/^# ?/, ""); print }' "$0"
;;
*)
fail "неизвестная цель: $1
Доступны: current, windows, tool, test, all, run, clean"
;;
esac
echo
if [ "$status" -eq 0 ]; then
echo "ИТОГ: без ошибок"
else
echo "ИТОГ: были ошибки"
fi
exit "$status"