# Изменения при попытках собрать APK Этот отчёт описывает изменения после завершения первой волны Task 15 (коммит `29df541`), сделанные во время попыток сборки, и последующую правку для повторного использования результатов компиляции. Изменения самой волны Task 15 сюда не включены. ## 1. Ручные исправления исходников во время попыток сборки ### `code/GameDiagnosticsGraphics_Mobile.pas` - Добавлена повторная секция `private` после вложенного блока `type`, перед полями класса. Это исправляет разбор объявления класса компилятором FPC. - В `uses` раздела `implementation` добавлен `KM_CommonTypes`, чтобы используемые типы были доступны непосредственно этому модулю. - Переменная `Stage: TGraphicsVisibleDrawDiagnosticStageId` перенесена из внешнего блока переменных во вложенную процедуру `AdvanceVisiblePhase`. Это исправляет использование счётчика цикла во вложенной процедуре для FPC. ### `code/GameDiagnosticsView.pas` - Добавлена повторная секция `private` после вложенного объявления `TGraphicsRequest`, перед полями класса, для корректного разбора FPC. ### `port-source/kam_remake/src/render/KM_Render.pas` - Из интерфейсного `uses` удалены `Windows`, `LCLIntf`, `LCLType`, `OpenGLContext`, `dglOpenGL`. - Из `uses` реализации удалены `KromOGLUtils`, `KromUtils`, `KM_Defaults`, `KM_IoPNG`, `KM_CommonClasses`. - Цель: убрать ненужные зависимости мобильного адаптера от настольных модулей, которые мешали Android-компиляции. Тела методов этим изменением не переписывались. ### `port-source/kam_remake/src/res/KM_ResSprites.pas` - В объявлении и реализации `OverloadRXDataFromFolder` тип параметра `aOnProgress` выбирается условно: `TUnicodeStringEvent` для FPC, прежний `TProc` для остальных компиляторов. - Объявления и реализации `GetSoftenShadowType` и `SoftenShadowsList` заключены в `{$IFDEF WDC}`. - Подключение `KM_Resource` заключено в `{$IFDEF WDC}`. - Вложенная процедура `AppendFolder` внутри `OverloadGeneratedFromFolder` также заключена в `{$IFDEF WDC}`. - Цель: устранить несовместимый с FPC тип callback и ограничить зависимости от настольного владельца ресурсов. Это не устранило все настольные зависимости проекта: последняя сборка остановилась на `Graphics` в `KM_ResFonts`. ### Временная правка, которая была отменена Во время разбора зависимостей менялся `port-source/kam_remake/src/res/KM_Resource.pas`. Эти правки полностью отменены; в текущем diff изменений этого файла нет. ## 2. Ресурс, добавленный во время сборки ### `private-assets/data/Sprites/Tileset.rxx` - Создана копия существующего `private-assets/data/sprites/Tileset.rxx` в каталог `Sprites` с заглавной буквой. - Причина: различие регистра пути на Linux. Использована копия, поскольку подготовка ресурсов запрещает символьные ссылки. - Это игнорируемый Git ресурс, поэтому обычный `git diff` его не показывает. Исходный файл в `sprites` не заменялся. ## 3. Автоматические изменения сборочного скрипта ### `out/current/build.json` - Метаданные прежней успешной сборки заменены результатом последней попытки: `20261009T204819Z-d5b17e32`. - Итоговый статус: `FAIL`; компиляция завершилась с кодом `1`; упаковка APK не запускалась (`NOT_RUN`). - Количество подготовленных ресурсов изменилось с `1` на `8`. - Записана ошибка: ```text /work/vendor/kam_remake/src/res/KM_ResFonts.pas(5,13) Fatal: Can't find unit Graphics used by KM_ResFonts ``` ### `out/current/kam-mobile.apk` и `out/current/package.json` - Прежние файлы удалены автоматически существующим обработчиком неуспешной сборки, чтобы старый APK не выдавался за результат текущей попытки. - Новый APK при этих попытках не создан. ### `build-evidence//` Созданы каталоги с логами и итоговыми `build.json` для попыток: - `20261009T200852Z-e01492c5` - `20261009T201018Z-293f32ce` - `20261009T201542Z-734c8b9e` - `20261009T201938Z-0d29dc09` - `20261009T202407Z-e1fdcdb0` - `20261009T202805Z-effd8544` - `20261009T203305Z-0d62cff2` - `20261009T203736Z-692bf342` - `20261009T204411Z-618edf61` - `20261009T204819Z-d5b17e32` Рабочие каталоги этих попыток также создавались в игнорируемом Git каталоге `build//`. Это сгенерированные файлы компиляции, подготовки ресурсов и упаковки, а не ручные правки исходников. ## 4. Последующая правка инкрементальной сборки Эти изменения сделаны отдельно, после остановки попыток сборки, по просьбе сохранять логи и повторно использовать скомпилированные модули. ### `app/CastleEngineManifest.xml` - Удалена опция FPC `-B`, которая принудительно пересобирала все модули. - Остальные опции компилятора оставлены. ### `tools/generate.py` - `-B` удалён и из списка разрешённых `COMPILER_OPTIONS`, чтобы проверка постоянного манифеста соответствовала изменению. - `materialize_application_project` теперь обновляет существующий проект вместо требования всегда создавать новую папку. - Неизменившийся сгенерированный манифест не перезаписывается, чтобы сохранить его время изменения. - Каталог данных может существовать; проектные Android services обновляются копированием после проверки. - Добавлены проверки символьных ссылок для повторно используемых каталога проекта, каталога данных и манифеста. ### `tools/build_cache.py` — новый файл - Выбирает постоянный проект `build/work//application`. - Записывает параметры совместимости в `build/work//inputs.json`. - Сравнивает CPU, upstream commit, манифест, контракт выбора исходников, пути поиска, состав файлов исходников и параметры инструментария. - Для контейнерной сборки учитывает digest Docker image; для локальной — хеши исполняемых файлов `castle-engine` и `fpc`. - При несовместимости удаляет сгенерированный проект; при совпадении сохраняет его для повторного использования `.ppu` и `.o`. - Пишет сведения об использовании кэша в лог каждой попытки `compiler-cache.json`. ### `tools/runner.py` - Подключает `cached_project` и использует постоянную папку проекта вместо `build//application`. - Отдельные логи каждой попытки остаются в `build//logs`; копирование в `build-evidence` сохранено. - Перед компиляцией удаляет прежние итоговые библиотеки `lib_android_.so` и APK внутри проекта; промежуточные `.ppu` и `.o` сохраняет. - Передаёт digest образа внутрь контейнера через `KAM_TOOLCHAIN_IMAGE` для проверки совместимости кэша. - Сериализует обычные запуски через `build/runner.lock`, чтобы они не меняли общий кэш одновременно. Внутренний запуск контейнера повторно эту блокировку не берёт. ### `README.md` - Описаны постоянная папка компиляции, отдельные логи, автоматический сброс кэша и ручная очистка удалением `build/work/`. - Обновлено описание назначения каталога `build/`. ## 5. Состояние на момент отчёта - После правки инкрементальной сборки сборка и тесты не запускались. Ускорение пока не измерено. - Первый запуск нового механизма заполнит новый кэш; старые папки попыток автоматически в него не переносятся. - Ошибка отсутствующего модуля `Graphics` остаётся нерешённой; правка кэша её не исправляет. - Перечисленные изменения после `29df541` не закоммичены и не отправлены в Git. - Настройки агентов и TOML-файлы этой правкой не редактировались. - Этот отчёт сохранён в `BUILD_ATTEMPTS_CHANGES.md`.