From b792b81a0081b004ed3199ee581ae08ef6acfa2b Mon Sep 17 00:00:00 2001 From: 4aiman Date: Sat, 22 Aug 2026 12:53:05 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B1=D0=BE=D1=80=D0=BA=D0=B0=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=20macOS=20=D0=BE=D1=82=D0=B4=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=BD=D0=BE=D0=B9=20=D1=86=D0=B5=D0=BB=D1=8C=D1=8E,=20=D0=BE?= =?UTF-8?q?=D0=B3=D1=80=D0=B0=D0=BD=D0=B8=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D1=8B=20=D0=B2=20?= =?UTF-8?q?=D0=B1=D1=8D=D0=BA=D0=BB=D0=BE=D0=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ./build.sh macos делает две сборки: nlve_intel для Intel и nlve_arm для Apple Silicon. Имя цели в проекте одно на все системы, и сборка под darwin затирает линуксовую — поэтому каждый файл переименовывается сразу, а сборка под эту систему в конце делается заново. Обёртку .app, которую делает lazbuild, удаляем: внутри неё ссылка на файл с именем nlve, которого после переименования уже нет. BACKLOG.md — то, что известно и сознательно не сделано. Про macOS там записано главное: собирается, но предпросмотра не будет, пока встраивание mpv не научится работать через NSView; окно зависимостей советует маку apt вместо brew; проверить нечем, потому что мака нет. Заодно туда переехали лицензионный вопрос с libmpv и три мелочи: значок exe, кэш наложений и четыре секунды на открытие окна кадрирования. --- .gitignore | 2 ++ BACKLOG.md | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ build.sh | 48 ++++++++++++++++++++++++++++++++++++- 3 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 BACKLOG.md diff --git a/.gitignore b/.gitignore index cd5a3f0..5dab6c1 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,8 @@ /nlve.app/ /nlve /nlve.exe +/nlve_intel +/nlve_arm /nlve.dbg /nlve.res /tests/lib/ diff --git a/BACKLOG.md b/BACKLOG.md new file mode 100644 index 0000000..1661ee8 --- /dev/null +++ b/BACKLOG.md @@ -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 с каждый на шестигигабайтном файле) и +только потом показывается. Лечится показом окна сразу и дорисовкой кадра +по готовности, либо одним кадром вместо двух. diff --git a/build.sh b/build.sh index 6a03f16..d64f1f7 100755 --- a/build.sh +++ b/build.sh @@ -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