Сборка под macOS отдельной целью, ограничения записаны в бэклог

./build.sh macos делает две сборки: nlve_intel для Intel и nlve_arm для
Apple Silicon. Имя цели в проекте одно на все системы, и сборка под
darwin затирает линуксовую — поэтому каждый файл переименовывается сразу,
а сборка под эту систему в конце делается заново.

Обёртку .app, которую делает lazbuild, удаляем: внутри неё ссылка на файл
с именем nlve, которого после переименования уже нет.

BACKLOG.md — то, что известно и сознательно не сделано. Про macOS там
записано главное: собирается, но предпросмотра не будет, пока встраивание
mpv не научится работать через NSView; окно зависимостей советует маку
apt вместо brew; проверить нечем, потому что мака нет. Заодно туда
переехали лицензионный вопрос с libmpv и три мелочи: значок exe, кэш
наложений и четыре секунды на открытие окна кадрирования.
This commit is contained in:
4aiman 2026-08-22 12:53:05 +03:00
commit b792b81a00
3 changed files with 118 additions and 1 deletions

2
.gitignore vendored
View file

@ -4,6 +4,8 @@
/nlve.app/
/nlve
/nlve.exe
/nlve_intel
/nlve_arm
/nlve.dbg
/nlve.res
/tests/lib/

69
BACKLOG.md Normal file
View file

@ -0,0 +1,69 @@
# Что отложено
Список того, что известно и сознательно не сделано. Не «когда-нибудь
починим», а «знаем, чего это стоит, и решили пока не платить».
## macOS: собирается, но работает наполовину
Сборка проверена. В тулчейне fpcupdeluxe уже стоит всё нужное:
кросс-компиляторы, Apple SDK (10.13, 11.0, 12.3) и виджетсет cocoa для
обеих архитектур. Обе цели собираются с первого раза:
./build.sh macos → nlve_intel (Mach-O x86_64)
nlve_arm (Mach-O arm64)
Чего не будет, пока не сделано:
**Предпросмотра нет.** Встраивание mpv написано под два случая: X11 (под
gtk2 создаётся своё дочернее окно и его номер отдаётся mpv в `wid`) и
Windows (там у панели есть настоящий HWND). Под cocoa нужен третий путь —
отдать mpv указатель на NSView. Это не правка на десять строк: нужно
разобраться, как LCL под cocoa отдаёт NSView панели, и проверить, что mpv
рисует именно в неё.
**Окно зависимостей врёт.** Списки в `uDeps.pas` разделены на два случая:
Windows и всё остальное. Мак попадает во второй и получает совет
`sudo apt install ffmpeg`. Нужен свой список: `brew install ffmpeg mpv`
или готовые сборки.
**Проверить нечем.** У нас нет мака. Собранный, но ни разу не запущенный
файл — это предположение, а не сборка. Всё, что можно утверждать сейчас:
компилятор и компоновщик отработали без ошибок.
**Двух файлов может оказаться мало.** Intel и Apple Silicon сейчас
раздаются отдельно. Склеить их в один универсальный умеет `lipo`, но в
тулчейне он есть только для powerpc — для x86_64 и arm64 его надо
доставить.
**Обёртка .app не настроена.** lazbuild её создаёт, но внутри лежит
ссылка на файл с именем `nlve`, которого после переименования нет.
Сейчас она просто удаляется. Настоящему приложению нужны свой Info.plist,
значок и, для раздачи, подпись и нотаризация у Apple.
## Лицензия не выбрана
libmpv грузится в наш процесс, а её сборки — GPL (в Ubuntu GPL-3+ из-за
libsmbclient, у shinchiro тоже GPL). По толкованию FSF это делает
совместную работу производной, и при раздаче программа должна быть под
GPL-3+ или совместимой.
Пока ничего не раздаётся — вопрос не стоит. Решать его перед первой
раздачей сборок. Возможный обход: отказаться от libmpv в пользу своего
вывода кадров через ffmpeg, но это большая работа и заметно хуже по
плавности.
ffmpeg проблемой не является: он запускается отдельной программой.
## Мелочи, до которых не дошли руки
**Значок файла программы под Windows.** Значок окна задаётся из
`uIconData`, а значок самого `.exe` в проводнике берётся из ресурса при
сборке — там он до сих пор стандартный.
**Кэш наложений не убирается.** Каждая правка прозрачности создаёт в
кэше проекта новый файл; старые остаются лежать.
**Окно кадрирования открывается около четырёх секунд.** Оно синхронно
достаёт два кадра ffmpeg-ом (по 2.2 с каждый на шестигигабайтном файле) и
только потом показывается. Лечится показом окна сразу и дорисовкой кадра
по готовности, либо одним кадром вместо двух.

View file

@ -6,6 +6,7 @@
# ./build.sh current то же самое
# ./build.sh windows редактор под Windows (кросс-сборка)
# ./build.sh tool консольный инструмент проверок
# ./build.sh macos две сборки под macOS: nlve_intel и nlve_arm
# ./build.sh test инструмент плюс прогон проверок
# ./build.sh all всё перечисленное
# ./build.sh run собрать под эту систему и запустить
@ -101,6 +102,48 @@ build_windows() {
rm -rf "$HERE/lib/x86_64-win64"
}
build_macos() {
check_toolchain
# Сборка под macOS кладёт файл туда же, куда и сборка под Linux, и
# затирает её: имя цели в проекте одно на все системы. Поэтому каждый
# файл переименовывается сразу, а линуксовая сборка в конце делается
# заново.
if run_lazbuild "Редактор под macOS (Intel)" \
--cpu=x86_64 --os=darwin --ws=cocoa "$HERE/nlve.lpi"; then
mv -f "$HERE/nlve" "$HERE/nlve_intel"
echo "готово: $HERE/nlve_intel"
file "$HERE/nlve_intel" 2>/dev/null | cut -d: -f2- | sed 's/^/ /'
else
echo "не собралось" >&2
status=1
fi
if run_lazbuild "Редактор под macOS (Apple Silicon)" \
--cpu=aarch64 --os=darwin --ws=cocoa "$HERE/nlve.lpi"; then
mv -f "$HERE/nlve" "$HERE/nlve_arm"
echo "готово: $HERE/nlve_arm"
file "$HERE/nlve_arm" 2>/dev/null | cut -d: -f2- | sed 's/^/ /'
else
echo "не собралось" >&2
status=1
fi
# Обёртку .app делает lazbuild, и внутри неё ссылка на файл с именем
# nlve, которого после переименования уже нет. Обманчивая пустышка не
# нужна.
rm -rf "$HERE/nlve.app"
# Модули под darwin лежат отдельно, но сборку под Linux мы затёрли —
# возвращаем её на место.
note "Возвращаю сборку под эту систему"
build_current
echo
echo "ВНИМАНИЕ: под macOS предпросмотра не будет — встраивание mpv"
echo "написано под X11 и Windows. Подробности в BACKLOG.md."
}
build_tool() {
note "Консольный инструмент проверок"
if "$HERE/tests/build.sh"; then
@ -171,6 +214,9 @@ case "${1:-current}" in
windows|win|win64)
build_windows
;;
macos|mac|darwin)
build_macos
;;
tool)
build_tool
;;
@ -197,7 +243,7 @@ case "${1:-current}" in
;;
*)
fail "неизвестная цель: $1
Доступны: current, windows, tool, test, all, run, clean"
Доступны: current, windows, macos, tool, test, all, run, clean"
;;
esac