nlve/build.sh
4aiman 9d6e5580a1 Квадратные кнопки со значками, журнал перестал уезжать из-под курсора
Двойной щелчок по кнопке журнала. Причина оказалась не в кнопке: журнал
лежал ниже полосы состояния. Спрятали журнал — полоса уехала вниз на сто
тридцать пикселей, кнопка ушла из-под курсора, и следующий щелчок в то же
место попадал уже мимо. Порядок исправлен: полоса состояния теперь самая
нижняя, журнал над ней, и при переключении ничего не движется.

Прилипание, схлопывание и журнал стали квадратными кнопками со значками и
собраны в один набор. Надписи переехали в подсказки — целиком, вместе с
состоянием: у значка нет другого способа рассказать о себе. Подсказка
всплывает через десятую долю секунды и держится пятнадцать.

Значки рисуются кодом, а не берутся из файла: программа не должна
зависеть от того, лежит ли рядом с ней картинка. Рисунки придуманы в
icons/*.svg — оттуда их можно перегнать в png чем угодно, проверено
командой convert.

Свойства из файлов форм теперь проверяются отдельной программой по
сведениям о типах. Файл формы разбирается при запуске, а не при сборке:
опечатка в имени свойства или в значении перечисления даёт не ошибку
компиляции, а падение окна на старте. Проверка включена в build.sh.
2026-08-22 01:08:58 +03:00

210 lines
7.2 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
# Свойства, записанные в файлах форм, проверяются по сведениям о типах.
# Файл формы разбирается при запуске, а не при сборке: опечатка в имени
# свойства даёт не ошибку компиляции, а падение окна на старте.
note "Проверка свойств из файлов форм"
if "$LAZBUILD" --primary-config-path="$LAZCONF" \
"$HERE/tests/lfmcheck/lfmcheck.lpi" >/dev/null 2>&1; then
if "$HERE/tests/lfmcheck/lfmcheck"; then
:
else
status=1
fi
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"