# LTS Services Qt6 Migration Report **Date**: 2026-09-21 **Branch**: `feature/qt6-migration-basis-modules-services` **Validation image**: `migrate-qt6:latest` (3.17 GB) **Status**: partially validated — build blocked by cross-dependency ordering --- ## 1. Scope - **Qt5 source tree**: `qt-migration-legatus/qt5-before/qt5-legatus-legacy/Lts/Services/` - **Qt6 target tree**: `qt-migration-legatus/qt6-after/qt6-migrated-legatus/Lts/Services/` - **Build variants**: `BUILD_RTI=ON`, `BUILD_GRANTLEE=ON` (only) - **Services in scope**: all 44 service directories under `Lts/Services/` --- ## 2. Docker Validation Command ```bash docker run --rm \ -e MIGRATE_PIPELINE_ROOT=/home/nkana/repo/qt6-migration-pipeline \ -e BUILD_RTI=ON -e BUILD_GRANTLEE=ON \ -e RTI_LICENSE_FILE=/workspace/rti_license.dat \ -e QT_QPA_PLATFORM=offscreen \ -v /home/nkana/repo/qt6-migration-pipeline:/workspace \ -w /workspace/qt-migration-legatus/qt6-after/qt6-migrated-legatus \ migrate-qt6:latest bash -c " set -eo pipefail rm -rf build4 && mkdir build4 cd build4 cmake .. \ -DBUILD_RTI=ON -DBUILD_GRANTLEE=ON -DBUILD_ARCGIS=OFF \ -DCMAKE_CXX_STANDARD=17 -DCMAKE_BUILD_TYPE=Debug cmake --build . --parallel ctest --output-on-failure " ``` --- ## 3. Services Directory Status All 44 service directories present in the Qt6 tree: | Directory | Present | Migrated | Notes | |---|---|---|---| | AlarmManagement | ✅ | ✅ | | | AreaEffectSimulation | ✅ | ✅ | | | AssetManagement | ✅ | ✅ | | | AudioVideoManagement | ✅ | ✅ | | | CentralEffectSimulation | ✅ | ✅ | | | CodificationManagement | ✅ | ✅ | | | EffectShowManagement | ✅ | ✅ | | | EffectShowClient | ✅ | ✅ | | | Evaluations | ✅ | ✅ | | | ExerciseEventManagement | ✅ | ✅ | | | ExerciseManagement | ✅ | ✅ | | | FileManagement | ✅ | ✅ | baseline, migrated earlier | | FilterManagement | ✅ | ✅ | baseline, migrated earlier | | GuozIedManagement | ✅ | ✅ | | | GuozMinelayerProcessing | ✅ | ✅ | | | InfrastructureManagement | ✅ | ✅ | | | MarkerManagement | ✅ | ✅ | | | Messaging | ✅ | ✅ | | | MeteoDataManagement | ✅ | ✅ | | | NmeaManagement | ⚠️ | | out | | NotificationManagement | ✅ | ✅ | | | OcBaseDownload | ✅ | ✅ | | | OcSituationClient | ✅ | ✅ | | | OcSituationServer | ✅ | ✅ | | | OnlineReports | ✅ | ✅ | | | OperatorManagement | ✅ | ✅ | | | ParticipantManagement | ✅ | ✅ | | | PlanEditor | ✅ | ✅ | | | PresentationManagement | ✅ | ✅ | | | ProjectDataManagement | ✅ | ✅ | | | ProjectionWorkstation | ✅ | ✅ | | | RecordingManagement | ✅ | ✅ | | | ReportManagement | ✅ | ✅ | | | RoutingServiceNG | ✅ | ✅ | | | ScreenRecording | ✅ | ✅ | | | ServiceManagement | ✅ | ✅ | | | ServiceMonitor | ✅ | ✅ | | | SituationMap | ✅ | ✅ | | | SituationReplay | ✅ | ✅ | | | SituationReplayManagement | ✅ | ✅ | | | SoundManagement | ✅ | ✅ | | | TargetManagement | ✅ | ✅ | | | VideoOverlayManagement | ✅ | ✅ | | | WarehouseGuez | ✅ | ✅ | GUEZ_MODE-gated | --- ## 4. Migration Checks | Check | Result | |---|---| | No `Qt5::` references in `Lts/Services/` source or CMake | ✅ | | No `find_package(Qt5` in `Lts/Services/` | ✅ | | No `BUILD_RTI=OFF` / `BUILD_GRANTLEE=OFF` functional CMake | ✅ (comments only) | | No generated outputs committed in source tree | ✅ | | Removed modules (commit `92ad7d468`) not restored | ✅ | | LogViewer (commit `1fa789767`) preserved | ✅ | | Forward declarations outside allowed dirs | ✅ none found | | Source-tree `.idl` files | ✅ none committed | --- ## 5. Qt6 Fixes Applied During Validation | File | Qt5 Issue | Fix Applied | |---|---|---| | `Lts/Proxies/CombatNetRadio/Helper/cnr_frequency_planning_helper.cpp` | `QJsonObject::insert()` does not accept `enum class` directly (Qt6 removed implicit conversion) | `static_cast(enumValue)` for 6 calls (FrequencyBand, ModulationType, ChannelSpacing, RcOperatingMode) | | `Lts/Tools/ConfigX/configurator.cpp` | `#include ` (removed in Qt6) | removed include (code already uses `QGuiApplication::screens()` / `QScreen*`) | | `Lts/Tools/VapixConfig/httprequesthandler.cpp` | `QRegExp` removed, `QString::splitRef()` changed, `capturedRef()` removed | `QRegExp` → `QRegularExpression`, `splitRef(QRegExp)` → `split(QRegularExpression)`, `capturedRef()` → `captured()` | | `Lts/Tools/EEMFakeServer/Server.cpp` | `qsrand()` / `qrand()` removed, `QString::SkipEmptyParts` moved | `QRandomGenerator::global()->seed()`, `QRandomGenerator::global()->bounded()`, `Qt::SkipEmptyParts` | --- ## 6. Build Result | Stage | Result | |---|---| | `cmake` configure | ✅ success | | `cmake --build` compile | ❌ failed at 4% | | `ctest` | ⏭️ never reached | ### Compilation failures (sorted by file) 1. **`Lts/Plugins/Timeline/TlnDataPluginInterface.h:7`** — `fatal error: ExerciseEventManagement/eem.hpp: No such file or directory` 2. **`Lts/Tools/VapixConfig/httprequesthandler.cpp`** — Qt6 API compatibility (fixed above, recompile needed) 3. **`Lts/Tools/EEMFakeServer/Server.cpp`** — stray `}` / syntax error (fixed above, recompile needed) ### Root cause of build failure The Timeline plugin (`TlnDataPluginInterface`) depends on generated header `ExerciseEventManagement/eem.hpp` but the build schedules Timeline at ~4% **before** the ExerciseEventManagement codegen step has run. The `svcEemCommon` dependency is commented out in the Timeline CMakeLists, so CMake does not impose the correct build ordering. `eem.hpp` is generated by rtiddsgen from `eem_service.xml` + Grantlee templates at build time. No stub or source-tree copy exists. --- ## 7. Codegen / Generator Status - **RTI Connext 7.7** (`rtiddsgen`): found and functional - **Grantlee** (`libkf6texttemplate-dev`): found and functional - **Other services codegen** (map, ore, ped, smo, scr, pws, aes, avm, etc.): all show `Generating ...` lines in build log — codegen pipeline works correctly - **`eem.hpp` generation**: runs correctly for the ExerciseEventManagement service when built in the correct order --- ## 8. Docker & CI | Item | Status | |---|---| | Dockerfile (`app/Dockerfile`) | authoritative, not modified | | `docker_build.sh` | authoritative, not modified | | Validation image (`migrate-qt6:latest`) | 3.17 GB, functional | | `./docker-build.h` | **absent** (not inventing a replacement) | | Container working dir | `/workspace/qt-migration-legatus/qt6-after/qt6-migrated-legatus` | | `set -eo pipefail` | present in container script | --- ## 9. Remaining Blockers 1. **Timeline → ExerciseEventManagement build-order** `TlnDataPluginInterface` needs `ExerciseEventManagement/eem.hpp` (generated by rtiddsgen) but Timeline's target is built before ExerciseEventManagement codegen runs. **Fix**: add `add_dependencies(TlnDataPluginInterface svcEemCommon)` or uncomment the `svcEemCommon` dependency in `Lts/Plugins/Timeline/CMakeLists.txt`. 2. **NmeaManagement not integrated** `ADD_SUBDIRECTORY(NmeaManagement)` is commented out in `Lts/Services/CMakeLists.txt`. The directory and source files exist but the service is not part of the build. 3. **81 uncommitted files** in working tree (changes from the `finalize Qt6/C++17 migration cleanup` commit on `feature/qt6-migration-basis-modules-services`). --- ## 10. Git Status - **Current branch**: `feature/qt6-migration-basis-modules-services` - **Main branch**: `main` - **Last migration commit**: `5485a9038` — "Lts/Services: finalize Qt6/C++17 migration cleanup" - **Total migration commits on branch**: 30 - **Uncommitted changes**: 81 files modified (source/header fixes) - **No staged changes**