Author SHA1 Message Date
torsten 6493829fa4 Execute the same instructions but now for tools in folders you are getti
Entire-Metadata: .entire/metadata/fb87247f-2a75-407e-b336-cbc8c20ba5a6
Entire-Session: fb87247f-2a75-407e-b336-cbc8c20ba5a6
Entire-Strategy: manual-commit
2026-09-24 16:43:59 +00:00
torsten b75578c188 Execute the same instructions but now for tools in folders you are getti
Entire-Metadata: .entire/metadata/fb87247f-2a75-407e-b336-cbc8c20ba5a6
Entire-Session: fb87247f-2a75-407e-b336-cbc8c20ba5a6
Entire-Strategy: manual-commit
2026-09-24 16:33:37 +00:00
torsten 77c67c12ca Execute the same instructions but now for tools in folders you are getti
Entire-Metadata: .entire/metadata/fb87247f-2a75-407e-b336-cbc8c20ba5a6
Entire-Session: fb87247f-2a75-407e-b336-cbc8c20ba5a6
Entire-Strategy: manual-commit
2026-09-24 16:24:51 +00:00
11 changed files with 6953 additions and 3489 deletions

No files matched your search

File diff suppressed because it is too large. Load diff
@@ -0,0 +1,13 @@
execute instructions in ./prompts/migrate-lts-tools-d-and-l.md
---
execute the same instructions but now for tools in folders you are getting with ls ./Lts/Tools/A* ./Lts/Tools/B* ./Lts/Tools/C* ./Lts/Tools/E* ./Lts/Tools/I*
---
execute the same instructions but now for tools in folders you are getting with ls ./Lts/Tools/J* ./Lts/Tools/M* ./Lts/Tools/N* ./Lts/Tools/P* ./Lts/Tools/Q*
---
execute the same instructions but now for tools in folders you are getting with ls ./Lts/Tools/R* ./Lts/Tools/S* ./Lts/Tools/T* ./Lts/Tools/V* ./Lts/Tools/W*
-1
View File
@@ -83,4 +83,3 @@ build-qt6
build-qt6-old
build-qt6-new
fix_*.py
.*
-186
View File
@@ -1,186 +0,0 @@
# 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<int>(enumValue)` for 6 calls (FrequencyBand, ModulationType, ChannelSpacing, RcOperatingMode) |
| `Lts/Tools/ConfigX/configurator.cpp` | `#include <QDesktopWidget>` (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**
-1940
View File
File diff suppressed because it is too large. Load diff
@@ -1,383 +0,0 @@
# Strict Qt6 Migration Prompt: Merge of the two basis-modules branches
This prompt is binding task context. Keep changes minimal, scoped, and reproducible.
The only allowed outcome is a merge commit on `feature/qt6-migration-basis-modules-merge`
that contains the full work of both source branches and preserves the legacy code
behavior of every migrated file.
## Required base prompts
Before making changes, read and apply:
- ./prompts/combined-migration-subfolder-rti-compact.prompt.md
- ./prompts/commit-policy.prompt.md (repository mapping, pre-commit checks, per-repo commits)
If a base prompt is stricter, follow it. This prompt overrides it only for:
- build variants: use ON variants only, never OFF
- commit message format: max 2 lines, single author, no co-author lines (see "Commits")
## Task
Merge these two branches and resolve every conflict without changing code behavior:
- **ours (merge target base):** `feature/qt6-migration-basis-modules`
remote tip at prompt writing: `ed9fc51e7` ("Migrates ./Lts/Viewer successfully to Qt6")
- **theirs (branch to merge in):** `feature/qt6-migration-basis-modules-services`
remote tip at prompt writing: `881d44f4d` ("Migrates residual Lts sources to generated rtiddsgen API")
- **merge base:** `9e3858378` ("Adds functionality and with already migrated components integration test to cmake targets unter ./Z")
- **result branch:** `feature/qt6-migration-basis-modules-merge` (already created from `origin/feature/qt6-migration-basis-modules`)
All work happens in the repository `./qt-migration-legatus` (it is a separate git
repository; never commit its changes into the workspace root or the legacy repository).
## Branches and trees
Working repository:
- `./qt-migration-legatus`
Trees:
- Legacy Qt5 source tree (read-only reference, never modify):
`./qt-migration-legatus/qt5-before/qt5-legatus-legacy`
- Qt6 target tree (the only tree that is modified):
`./qt-migration-legatus/qt6-after/qt6-migrated-legatus`
Before starting:
1. `git fetch origin` in `./qt-migration-legatus`.
2. Verify both remote tips still match the hashes above (`git rev-parse origin/feature/qt6-migration-basis-modules` and `git rev-parse origin/feature/qt6-migration-basis-modules-services`).
3. If either tip moved, recompute the merge base and re-run the dry-run merge (step 4 of the procedure) before resolving anything.
4. Verify the working tree of `./qt-migration-legatus` is clean (`git status --short`). Do not overwrite uncommitted user changes; if they block safe work, report the blocker.
## What each side contains
Understand both sides before resolving anything. The merge must keep the work of BOTH sides.
**basis-modules side (ours, 9 commits after the merge base, ~121 files):**
- `./Lts/Viewer` migrated to Qt6 (LtsFileDialog et al.), GROUP5 build configuration and CTest registration
- DDS migration completion and LTS/Proxies migration reports
- merge of `origin/feature/migrate-and-test-DDS-targets` into this branch
- ktexttemplate added as apt package to `new_docker_build.sh`
- `./Z` and `./Lts/Proxies` made production ready
- modifications to the stub headers under `include/` (see modify/delete conflicts)
**services side (theirs, 44 commits after the merge base, ~1203 files):**
- migration of the residual services, proxies, plugins, `Lts/Common` and `Lts/DDS` sources to the generated rtiddsgen 7.7 API: `Xxx_def::EnumValue` → `Xxx::EnumValue`, accessor calls → plain member access (e.g. `m_data.id()` → `m_data.id`), renamed enumerators where the generated name collides (e.g. `PdmEventType::Hit` → `PdmEventType::EventType_Hit`)
- NmeaManagement enabled in the build plus `tests/test_nme_dtc.cpp`, `tests/test_nme_enums.cpp`, `tests/test_nmea_handler.cpp`
- Qt6::SerialPort manual IMPORTED target in the root `CMakeLists.txt`
- codegen template include-prefix fixes (`svc_db_structs.h.grantlee`, `svc_translation.h.grantlee`, `svc_dts_impl.cpp.grantlee`, `svc_ftc_impl.cpp.grantlee`, `svc_record_replay_plugin.cpp.grantlee`)
- deletion of the stale stub headers under `include/` and of `tests/test_migration_stubs.cpp` (real generated headers from the build tree replaced them)
## Known conflict surface (dry run 2026-09-23)
A dry-run merge (`git worktree` + `git merge --no-commit --no-ff`) found 17 conflicts.
Re-run the dry run after the fetch and treat its output as authoritative; the list
below is the expected starting point.
Content conflicts (12):
1. `qt6-after/qt6-migrated-legatus/CMakeLists.txt`
2. `qt6-after/qt6-migrated-legatus/Lts/Common/CodeGen/svc_dts_impl.cpp.grantlee`
3. `qt6-after/qt6-migrated-legatus/Lts/Common/CodeGen/svc_ftc_impl.cpp.grantlee`
4. `qt6-after/qt6-migrated-legatus/Lts/Common/CodeGen/svc_record_replay_plugin.cpp.grantlee`
5. `qt6-after/qt6-migrated-legatus/Lts/DDS/Core/CMakeLists.txt`
6. `qt6-after/qt6-migrated-legatus/Lts/DDS/Core/pacemaker.cpp`
7. `qt6-after/qt6-migrated-legatus/Lts/DDS/Core/topic_lock_master.cpp`
8. `qt6-after/qt6-migrated-legatus/Lts/DDS/Core/topic_lock_master.h`
9. `qt6-after/qt6-migrated-legatus/Lts/DDS/FTC/generic_ftc_impl.h`
10. `qt6-after/qt6-migrated-legatus/Lts/DDS/FTS/generic_fts_impl.h`
11. `qt6-after/qt6-migrated-legatus/Lts/Proxies/Buildings/BuildingControlUnit/VWM/CMakeLists.txt`
12. `qt6-after/qt6-migrated-legatus/Lts/Proxies/Buildings/BuildingControlUnit/VWM/vwm_building.h`
Modify/delete conflicts (5; deleted on the services side, modified on the basis-modules side):
13. `qt6-after/qt6-migrated-legatus/include/Core/core_dtc.h`
14. `qt6-after/qt6-migrated-legatus/include/DDS/DTC/generic_dtc.h`
15. `qt6-after/qt6-migrated-legatus/include/DDS/DTC/generic_dtc_impl.h`
16. `qt6-after/qt6-migrated-legatus/include/DDS/Generic/generic_data_reader.h`
17. `qt6-after/qt6-migrated-legatus/tests/test_migration_stubs.cpp`
## Conflict resolution rules
These rules exist to guarantee: the merged tree keeps both branches' functionality
and no file's behavior deviates from the legacy Qt5 behavior beyond the approved
Qt6/C++17/rtiddsgen adaptations.
General:
- Resolve semantically, never mechanically. For every conflicted hunk read four
versions: the merge-base version, ours, theirs, and the legacy Qt5 equivalent in
`./qt-migration-legatus/qt5-before/qt5-legatus-legacy` (same relative path, or the
closest legacy counterpart). The resolution must implement the legacy semantics
with both branches' approved adaptations applied.
- Never take `ours` or `theirs` wholesale unless you prove the losing side had no
unique changes: `git diff <merge-base>..theirs -- <file>` (or `..ours`) must show
nothing that the kept version lacks. Record the proof in the final report.
- A merge commit must not drop functionality of either branch: every target,
dependency, test registration, docker build step, and code fix present on one
side must be present (or superseded by an equivalent) in the merged tree.
- No behavior-changing edits beyond the merge itself. No refactoring, no style
cleanup, no warning suppression, no new features.
- Generated API shape (rtiddsgen 7.7, `-language C++11 -stl`): plain public data
members (no getters/setters), no `*_def::type` wrappers, enums directly in the
service namespace, renamed enumerators on collision, `omg::types::optional` /
`omg::types::sequence` members. Where a conflict shows both API shapes, the
generated header in the build tree is the authority — read it, do not guess.
- Grantlee `*.grantlee` template conflicts: the template, not the generated output,
is the source of truth. Resolve the template so codegen produces code consistent
with both branches' consumers. Never hand-edit generated outputs.
CMake conflicts (root `CMakeLists.txt`, `Lts/DDS/Core/CMakeLists.txt`, `Lts/Proxies/Buildings/BuildingControlUnit/VWM/CMakeLists.txt`):
- Take the union of both sides' targets, dependencies, include directories, and
link libraries. Both sides' target additions must survive.
- Keep the Qt6::SerialPort manual IMPORTED target (services side) and the GROUP5 /
Viewer target wiring (basis-modules side) side by side.
- ON-variant-only rule: `BUILD_RTI=ON`, `BUILD_GRANTLEE=ON` are the only valid
variants. Do not add CMake logic, stubs, or fallbacks for OFF variants.
- After resolving, verify with a fresh configure that both sides' targets exist
(`cmake --build` list / `make help` or the docker script's group options).
Modify/delete conflicts (the 5 files above):
- The services side deleted these stale stubs because real generated headers from
the build tree replaced them. The basis-modules side modified them.
- For each file: inspect what the basis-modules modification added
(`git diff <merge-base>..origin/feature/qt6-migration-basis-modules -- <file>`),
then grep the merged tree for anything that still includes or references the
file's path (including the docker build scripts and CMake lists).
- If nothing references it after the merge: keep the deletion
(`git rm <file>`), and if the basis-modules modification carried a needed fix,
port that fix into the file that now provides the same functionality (real
generated header consumer or the approved stub location).
- If something on the merged tree still references it: do not resurrect stale
stub content. Point the reference at the real generated header from the build
tree, or relocate the stub to an approved directory
(`forward-declarations/` or `.forward-declarations/include/`), preserving the
basis-modules modification.
- For `tests/test_migration_stubs.cpp`: the deletion is correct if no test
registration (CMake glob, explicit list, docker script) depends on it. If the
basis-modules side added test cases to it that are still meaningful, port those
cases into the current test convention under `qt6-after/qt6-migrated-legatus/tests/`
with policy-compatible names.
## Mandatory build variants
Only these variants are valid:
- `BUILD_RTI=ON`
- `BUILD_GRANTLEE=ON`
Forbidden: `BUILD_RTI=OFF`, `BUILD_GRANTLEE=OFF`.
- Do not implement, fix, preserve, test, or validate OFF variants.
- Do not add CMake logic, tests, stubs, or fallbacks for OFF variants.
- Validation must use `BUILD_RTI=ON` and `BUILD_GRANTLEE=ON`.
## Preservation rules
Preserve module removals from commit `92ad7d468` ("remove all unneeded module listed from Niklas"): do not restore removed modules, files, targets, directories, or dependencies — on either side.
Preserve LogViewer reinsert from commit `1fa789767` ("Added LogViewer again"): do not remove, disable, or break LogViewer integration.
Preserve prior IDL warning fixes from commit `be912de9d`: do not reintroduce multiple enum definitions, duplicate enumerators, or builtin type/keyword collisions.
Preserve the ON-variant-only decisions already made on both branches.
## Stubs and forward declarations
Any required existing stub, compatibility declaration, or forward declaration must live only under:
- `./qt-migration-legatus/qt6-after/qt6-migrated-legatus/forward-declarations/`
- `./qt-migration-legatus/qt6-after/qt6-migrated-legatus/.forward-declarations/include/`
- Do not leave such files in service directories unless they are real service source files.
- Do not create or keep stubs for forbidden OFF variants.
- Do not use stubs as replacements for real RTI, ndsgen, KTextTemplate, or Grantlee outputs in ON builds.
- Report every moved, removed, or newly referenced stub/forward declaration, including the 5 modify/delete files above.
## Qt link rules
No active target in the merged tree may link Qt5 imported targets.
Search the merged tree for and fix active uses of: `Qt5::`, `find_package(Qt5`, `QT5_`, `Qt5Core`, `Qt5Widgets`, `Qt5Network`.
A regression check specific to this merge: the services side removed Qt5 references in files the basis-modules side also touched. After the merge, re-run the search over ALL conflicted files, not just the hunks you edited.
## Legacy comparison (required validation step)
This step proves the merge did not change code behavior.
For every one of the 17 conflicted files (and for any other file you edit during
conflict resolution):
1. Read the legacy Qt5 source at the same relative path in
`./qt-migration-legatus/qt5-before/qt5-legatus-legacy`. If the file does not
exist there (pure Qt6 build machinery), say so and compare against the merge
base instead.
2. Produce three diffs: merge-base vs legacy, ours vs legacy, theirs vs legacy.
3. Produce the audit diff: merged result vs legacy.
4. Classify every hunk of the audit diff into exactly one category:
- `qt6-api`: mandatory Qt5→Qt6 API adaptation (module includes, QRegExp, signal/slot, QDesktopWidget, QMetaType, Qt6 links)
- `rtiddsgen-api`: generated-API adaptation (plain members, no `*_def`, renamed enumerators, omg::types)
- `build`: CMake/docker/test-infra change with no runtime semantics
- `merge-union`: line present because both branches required it
- `semantic-change`: anything else
5. Every `semantic-change` hunk is a failure of this merge unless you can point to
the legacy source line that implements the same behavior. Fix it back to the
legacy semantics (with approved adaptations) or report it as a blocker. Do not
silently accept `semantic-change` hunks.
6. Record the per-file hunk classification (counts per category is sufficient;
list every `semantic-change` hunk explicitly) in the final report.
Additional equivalence checks on the merged tree:
- The enum switch/case sets and default branches in `Lts/DDS/Core/pacemaker.cpp`, `topic_lock_master.cpp`, `topic_lock_master.h` cover exactly the enumerators of the generated headers, matching the legacy control flow.
- The Grantlee template conflicts resolve to output that matches what both branches' consumers expect; verify by building, not by reading generated files.
- Test registrations: the union of both sides' CTest registrations is present; the tests the services side deleted are gone and no dangling references to them remain.
- Docker build scripts: every target group and apt package both sides added is present; the script still contains `set -eo pipefail` in the container script.
## Tests
- Both sides' test suites must build and run; this merge adds no new feature tests by default.
- If a conflict resolution changed C++ semantics (it should not), add CTest tests
under `./qt-migration-legatus/qt6-after/qt6-migrated-legatus/tests/` that pin the
legacy behavior, registered with CTest, running with `BUILD_RTI=ON` and
`BUILD_GRANTLEE=ON`, policy-compatible names (`test_<name>.cpp`, ...).
- No OFF-variant tests. No host-local paths.
## Docker and CI
Authoritative migration Dockerfile:
- `./app/Dockerfile`
Authoritative validation scripts (both exist in the tree after the merge; run the
one(s) whose target groups cover the merged changes, and if in doubt run both):
- `./qt-migration-legatus/qt6-after/qt6-migrated-legatus/docker_build.sh`
- `./qt-migration-legatus/qt6-after/qt6-migrated-legatus/new_docker_build.sh`
Validation container expectations:
- repository root at `/repo`, or the script's documented mount path
- external dependencies under `/repo/external` (including `external/rti_connext_dds-7.7.0`, `external/ArcGIS`, `external/GeographicLib` where the scripts expect them)
- `./rti_license.dat` mounted read-only if RTI requires it
- no developer-local paths
Jenkins CI must be able to discover and run the merged test set. Inspect and minimally update only if needed:
- `./qt-migration-legatus/ci/Dockerfile.*`
- `./qt-migration-legatus/ci/check_pr_policies.py`
## Required procedure
1. Read the base prompts. Run `git fetch origin` and verify both remote tips and the merge base.
2. Check out `feature/qt6-migration-basis-modules-merge` in `./qt-migration-legatus` (working tree must be clean).
3. Re-run the dry-run merge in a throwaway worktree; confirm the conflict list.
4. Run the real merge: `git merge --no-ff origin/feature/qt6-migration-basis-modules-services` (do not auto-commit; resolve first).
5. Resolve the conflicts one file at a time using the four-version method (merge base, ours, theirs, legacy) and the rules above.
6. Run the legacy comparison audit (previous section) over every resolved/edited file.
7. Run the regression checks: Qt5 links, removed modules, LogViewer, IDL warnings, stub locations, ON-variant-only CMake, docker script integrity, CTest registration union.
8. Validate in Docker with `BUILD_RTI=ON` and `BUILD_GRANTLEE=ON` (docker_build.sh and, where applicable, new_docker_build.sh).
9. Run CTest in the validated build directory.
10. Check Jenkins/policy compatibility.
11. Create the merge commit (see Commits).
12. Report factual status.
Do not push. The merge result stays local on `feature/qt6-migration-basis-modules-merge` until the user says otherwise.
## Required validation
From `./qt-migration-legatus/qt6-after/qt6-migrated-legatus`, run:
```bash
BUILD_RTI=ON BUILD_GRANTLEE=ON ./docker_build.sh
```
and, if its target groups do not cover all merged changes:
```bash
BUILD_RTI=ON BUILD_GRANTLEE=ON ./new_docker_build.sh
```
CTest must run as part of validation. If a direct clean build is useful, use:
```bash
cmake -S /repo/qt-migration-legatus/qt6-after/qt6-migrated-legatus -B /repo/build-merge-rti-on-grantlee-on -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBUILD_RTI=ON -DBUILD_GRANTLEE=ON
cmake --build /repo/build-merge-rti-on-grantlee-on --parallel
ctest --test-dir /repo/build-merge-rti-on-grantlee-on --output-on-failure
```
CTest baseline: ctest exits with code 8 when tests are "Not Run". A pre-existing set of Not Run tests (for example nglcomp_test, aes/avm/exm/scm/bld suites, GrantleeParserSmoke) belongs to sibling targets outside the docker build scripts' make list and existed before this migration series; that set is not a failure. Treat only `***Failed` entries as failures. Do not widen this exception to skip real failures, and do not add missing sibling targets to fix the exit code. If a previously passing test becomes Not Run or Failed after the merge, that is a merge regression: fix it or report it as a blocker.
Do not run or validate OFF variants.
## Commits
- Single author: the user's git identity. The user is the only author; do not add any co-author, co-authored-by, or bot attribution lines of any kind.
- Commit message: maximum 2 lines (one subject line plus at most one short body line), no blank-line separators, no extra metadata.
- Merge commit subject example (2 lines max):
`Merge feature/qt6-migration-basis-modules-services into feature/qt6-migration-basis-modules`
body line: `Resolves 17 conflicts against legacy Qt5 semantics; validates with BUILD_RTI=ON BUILD_GRANTLEE=ON.`
- If a conflict resolution requires an additional fix commit on top of the merge commit, the same 2-line / single-author rules apply.
- Follow `./prompts/commit-policy.prompt.md` for repository mapping and pre-commit checks. If it requires signed commits and signing is not configured in this repository context, stop and report the exact reason instead of committing unsigned.
## Success criteria
Success requires:
- `feature/qt6-migration-basis-modules-merge` contains a merge commit with both parents `origin/feature/qt6-migration-basis-modules` (or its verified successor tip) and `origin/feature/qt6-migration-basis-modules-services` (or its verified successor tip)
- all 17 conflicts resolved with the four-version method; resolution evidence recorded
- both branches' functionality preserved: Viewer/GROUP5 and DDS/Proxies/./Z work from the basis-modules side, and the full rtiddsgen services/proxies/plugins migration plus NMEA tests from the services side
- legacy comparison audit done for every resolved file; zero unexplained `semantic-change` hunks
- configure, build, and CTest pass with `BUILD_RTI=ON` and `BUILD_GRANTLEE=ON`
- the docker build script(s) run the merged test set and fail on test failure
- Jenkins/policy discovery accepts the merged test set
- no active Qt5 imported target links remain in the merged tree
- generated outputs are build-tree only, freshly produced, never committed or consumed from the source tree
- no fake generated files, dummy files, mocks, placeholders, or stubbed generated outputs
- required stubs/forward declarations only in allowed directories
- removed modules remain removed; LogViewer preserved
- no OFF-variant logic, tests, or stubs introduced
- no push performed
## If blocked
Do not fake success. Report:
- failing command
- key error output
- affected file/branch
- category: project, path, merge, CMake, Qt API, codegen, Docker, RTI/license, Grantlee/KTextTemplate, test, CTest, Jenkins CI, stub relocation, or environment
- which side (ours/theirs) the problematic hunk came from
- what was resolved safely
- what remains blocked
- whether stale artifacts were ruled out
- whether generated files were involved
- exact missing files, targets, or generator step
- whether tests and CTest integration succeeded
- whether Docker validation and Jenkins discovery succeeded
- the legacy comparison status for the unresolved files
## Final report
Keep it short. Include:
- status: validated, partially validated, or blocked
- merge commit hash, both parents, branch name
- per-conflicted-file resolution: file, method (union / four-version semantic / keep-deletion / port-modification), and the one-line reason
- modify/delete outcomes for the 5 stub/test files (kept deleted or relocated, and where the basis-modules modification went)
- legacy comparison audit summary: per-file hunk counts by category, and every `semantic-change` hunk with its justification or fix
- files changed beyond the conflicted set
- CTest registration union check result
- Docker and Jenkins CI changes
- Qt5 references removed or remaining
- confirmation that removed modules were not restored and LogViewer was preserved
- confirmation that both branches' target sets are present after the merge
- exact validation commands and results
- remaining blockers or risks
@@ -1,377 +0,0 @@
# Strict Qt6 Migration Prompt: CMake targets in predefined folders:
./Lts/Projects
./Lts/Application
This prompt is binding task context. Keep changes minimal, scoped, and reproducible.
## Required base prompt
Before making changes, read and apply:
- ./prompts/combined-migration-subfolder-rti-compact.prompt.md
- ./prompts/combined-migration-compact.prompt.md
If these prompts are stricter, follow them. This prompt overrides them only for build variants: use ON variants only. Do not pursue OFF variants.
## Module in scope
Migrate only:
- cmake targets under these predefined folders:
./Lts/Projects
./Lts/Application
From:
- ./qt-migration-legatus/qt5-before/qt5-legatus-legacy
To:
- ./qt-migration-legatus/qt6-after/qt6-migrated-legatus
Do not migrate sibling tools or unrelated modules.
## Mandatory build variants
Only these variants are valid:
- BUILD_RTI=ON
- BUILD_GRANTLEE=ON
- BUILD_ARCGIS=ON
Forbidden:
- BUILD_RTI=OFF
- BUILD_GRANTLEE=OFF
- BUILD_ARCGIS=OFF
Rules:
- Do not implement, fix, preserve, test, or validate OFF variants.
- Do not add CMake logic, tests, stubs, or fallbacks for OFF variants.
- Do not report OFF variants as supported or partially supported.
- Validation must use BUILD_RTI=ON and BUILD_GRANTLEE=ON and BUILD_ARCGIS=ON.
## Branches and trees
Qt6 target branch:
- feature/migrate-lts-projects-and-application
Qt5 legacy branch, if comparison is needed:
- story/qt6-migration
Legacy source tree:
- ./qt-migration-legatus/qt5-before/qt5-legatus-legacy
Qt6 target tree:
- ./qt-migration-legatus/qt6-after/qt6-migrated-legatus
Work in the Qt6 target tree only. Do not modify the Qt5 legacy tree.
## Scope rules
Touch files outside the targets directories only when directly required to configure, generate, build, link, test, or validate these targets.
Allowed outside-scope changes:
- parent CMakeLists.txt entries for these targets
- central CMake helper fixes required by these targets
- shared include path fixes required by these targets
- RTI, codegen, ndsgen, KTextTemplate, or Grantlee integration fixes required by these targets
- test infrastructure needed by tests for these targets
- new_docker_build.sh changes needed to run those tests
- minimal Jenkins CI discovery or policy updates needed for those tests
- relocation of required stubs or forward declarations to allowed directories
Not allowed:
- restoring removed modules
- reintroducing stale dependencies on removed modules
- removing or disabling active modules to hide failures
- disabling targets instead of fixing root causes
- broad refactoring, cleanup, renaming, or modernization
- warning suppression instead of fixing causes
- committing generated files
- consuming generated outputs from the source tree
- fake success, dummy files, handwritten generated replacements, mocks, placeholders, or generated-output stubs
## CMake targets
- under folder ./qt-migration-legatus/qt6-after/qt6-migrated-legatus/
./Lts/Projects
./Lts/Application
- Discover real CMake targets defined in the predefined folders.
- Learn options of script ./qt-migration-legatus/qt6-after/qt6-migrated-legatus/new_docker_build.sh to improve peformance of migration process
- Reuse prebuilt migration image as much as possible
- Add every required CMake target to ./qt-migration-legatus/qt6-after/qt6-migrated-legatus/new_docker_build.sh so the validation container builds or validates it.
- Add new --groupXYZ options for required CMake targets where XYZ refers to valid integers
- Add required apt packages to new_docker_build.sh
- Do not invent CMake targets under perdefined folders.
- Do not add targets that do not exist.
- If a folder does not exist, has no CMake targets, or a target is intentionally out of scope, report that fact and the reason.
- Do not weaken validation to make CMake targets under predefined folders pass.
## Preservation rules
Preserve module removals from commit:
- 92ad7d468, "remove all unneeded module listed from Niklas"
Do not restore removed modules, files, targets, directories, or dependencies.
Preserve LogViewer reinsert from commit:
- 1fa789767, "Added LogViewer again"
Do not remove, disable, or break LogViewer integration.
Preserve prior IDL warning fixes from commit:
- be912de9d, "Removes .IDL warnings: multiple enum definitons and builtin-type collisions"
Do not blindly replay that commit. Use it only as reference. Do not reintroduce removed modules.
IDL regressions to avoid:
- multiple enum definitions
- duplicate enumerators
- builtin type or keyword collisions
Check first for duplicate inputs, stale paths, removed-module references, source-tree generated outputs, source/build-tree confusion, and repeated IDL definitions before treating an issue as semantic IDL conflict.
## Stubs and forward declarations
Any required existing stub, compatibility declaration, or forward declaration must live only under:
- ./qt-migration-legatus/qt6-after/qt6-migrated-legatus/forward-declarations/
- ./qt-migration-legatus/qt6-after/qt6-migrated-legatus/include/
Rules:
- Do not leave such files in service directories unless they are real service source files.
- Do not create or keep stubs for forbidden OFF variants.
- Do not use stubs or forward declarations as replacements for real RTI, ndsgen, KTextTemplate, or Grantlee outputs in ON builds.
- Report every moved, removed, or newly referenced stub/forward declaration.
## Migration checks
For each cmake target, inspect and migrate only as needed:
- source and header files
- CMakeLists.txt and parent CMake registration
- ui, qrc, resource, plugin, and service metadata
- RTI IDL, ndsgen, KTextTemplate, and Grantlee inputs/templates
- tests directly tied to these targets
Fix only real Qt6/C++17 build issues, such as:
- Qt module imports and target links
- moc, uic, and rcc handling
- QRegExp to QRegularExpression when required
- QTextCodec replacement when required
- QDesktopWidget or QApplication::desktop() replacement when required
- QString, QVariant, QMetaType, QDateTime, QAction, QMenu, signal/slot, enum, plugin, or metadata compatibility issues when required
No opportunistic refactoring or style cleanup.
## Qt link rules
No active target in the Qt6 tree may link Qt5 imported targets.
Search for and fix active uses of:
- Qt5::
- find_package(Qt5
- QT5_
- Qt5Core
- Qt5Widgets
- Qt5Network
Use Qt6 equivalents. Prefer central CMake helper fixes when the issue is central.
## Code generation rules
If generated files are required:
- reconstruct the real legacy generation flow
- generate into the build tree
- consume from the build tree
- list complete OUTPUT and BYPRODUCTS
- set correct DEPENDS and MAIN_DEPENDENCY where useful
- use deterministic WORKING_DIRECTORY
- use VERBATIM
- wire generated sources with target_sources
- wire generated include dirs with target_include_directories
- ensure compilation depends on generation
- ensure incremental rebuilds trigger on input/template changes
Never commit generated .idl, .h, .hpp, or .cpp outputs. Never consume generated outputs from the source tree. Never fabricate generated outputs.
## Tests
For every C++ code change, add three meaningful CTest tests where feasible.
Rules:
- tests must validate changed behavior, not only compilation
- tests must be registered with CTest
- tests must run with BUILD_RTI=ON and BUILD_GRANTLEE=ON and BUILD_ARCGIS=ON
- do not add OFF-variant tests
- use deterministic tests without host-local paths
- if three meaningful tests are impossible, add the maximum meaningful set and explain why
- ./qt-migration-legatus/qt6-after/qt6-migrated-legatus/new_docker_build.sh changes needed to run those tests
- ./qt-migration-legatus/qt6-after/qt6-migrated-legatus/new_docker_build.sh changes needed to build or validate required CMake targets under folder ./qt-migration-legatus/qt6-after/qt6-migrated-legatus/Lts/Viewer
Preferred location:
- ./qt-migration-legatus/qt6-after/qt6-migrated-legatus/tests
Use policy-compatible names, for example:
- test_<name>.cpp
- <name>_test.cpp
- <name>test.cpp
- <name>gtest.cpp
## Docker and CI
Authoritative migration Dockerfile:
- ./app/Dockerfile
Authoritative validation script:
- ./qt-migration-legatus/qt6-after/qt6-migrated-legatus/new_docker_build.sh
Do not use other Dockerfiles as task authority.
Validation container expectations:
- repository root at /repo, or the script's documented mount path
- external dependencies under /repo/external, or the script's documented equivalent
- RTI 7.7 at /repo/external/rti_connext_dds-7.7.0, or documented equivalent
- ./rti_license.dat mounted read-only if RTI requires it
- no developer-local paths
Jenkins CI must be able to discover and run the new tests, or verify that new_docker_build.sh runs them. Inspect and minimally update only if needed:
- ./qt-migration-legatus/ci/Dockerfile.*
- ./qt-migration-legatus/ci/check_pr_policies.py
### External dependencies to be mapped into Docker container
- `./external`
- expected subfolders:
- `./external/ArcGIS`
- `./external/GeographicLib`
- `./external/rti_connext_dds-7.7.0`
### RTI license
- `./rti_license.dat`
## Required procedure
1. Inspect repository state, branch, working tree, submodules, required prompts, service paths, and forward-declaration directories.
2. Compare Qt5 source targets with Qt6 targets. Classify files as already migrated, missing, stale, generated, intentionally removed, build-only, or needing Qt6 adaptation.
3. Identify dependencies, generated inputs, Qt modules, parent CMake entries, removed-module references, LogViewer interactions, and required stub/forward-declaration relocations.
4. Apply the smallest valid migration changes.
5. Add required CTest tests for C++ changes.
6. Review RTI, ndsgen, KTextTemplate, and Grantlee generation paths.
7. Check regressions: Qt5 links, removed modules, LogViewer, IDL warnings, source-tree generated consumption, stale artifacts, and misplaced stubs.
8. Validate in Docker with BUILD_RTI=ON and BUILD_GRANTLEE=ON.
9. Run CTest in the validated build directory.
10. Check Jenkins/policy compatibility.
11. Report factual status.
Do not overwrite uncommitted user changes. If they block safe work, report the blocker.
## Required validation
From:
- ./qt-migration-legatus/qt6-after/qt6-migrated-legatus
Run:
```bash
BUILD_RTI=ON BUILD_GRANTLEE=ON BUILD_ARCGIS=ON ./new_docker_build.sh
```
CTest must run as part of validation. If a direct clean build is useful, use:
```bash
cmake -S /repo/qt-migration-legatus/qt6-after/qt6-migrated-legatus -B /repo/build-rti-on-grantlee-on -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBUILD_RTI=ON -DBUILD_GRANTLEE=ON -DBUILD_ARCGIS=ON
cmake --build /repo/build-rti-on-grantlee-on --parallel
ctest --test-dir /repo/build-rti-on-grantlee-on --output-on-failure
```
Also check whether this file exists and run it only if present:
```bash
./new_docker-build.h
```
If it is absent or a typo, report that. Do not invent a replacement.
Do not run or validate OFF variants.
## Success criteria
Success requires:
- cmake targets migrated or confirmed already correct
- cmake targets included in the Qt6 build
- configure, build, and CTest pass with BUILD_RTI=ON and BUILD_GRANTLEE=ON and BUILD_ARCGIS=ON
- new_docker_build.sh runs the relevant tests and fails on test failure
- Jenkins/policy discovery accepts the new tests and validation changes
- no active Qt5 imported target links remain for these targets
- generated outputs are build-tree only and freshly produced when required
- no generated outputs are committed or consumed from the source tree
- no fake generated files, dummy files, mocks, placeholders, or stubbed generated outputs exist
- required stubs/forward declarations are only in allowed directories
- removed modules remain removed
- LogViewer remains preserved
- RTI/codegen and Grantlee/KTextTemplate success is real, not stale or faked
## If blocked
Do not fake success. Report:
- failing command
- key error output
- affected service
- category: project, path, merge, CMake, Qt API, codegen, Docker, RTI/license, Grantlee/KTextTemplate, ArcGIS, test, CTest, Jenkins CI, stub relocation, or environment
- what was fixed safely
- what remains blocked
- whether stale artifacts were ruled out
- whether generated files were involved
- exact missing files, targets, or generator step
- whether tests and CTest integration succeeded
- whether Docker validation and Jenkins discovery succeeded
## Final report
Keep it short. Include:
- status: validated, partially validated, or blocked
- cmake targets under predefined folders migrated or already correct
- files changed
- C++ files changed
- tests added per C++ change
- CTest registration changes
- CMake and generator changes
- stub/forward-declaration moves or removals
- Docker and Jenkins CI changes
- Qt5 references removed or remaining
- confirmation that removed modules were not restored
- confirmation that LogViewer was preserved
- exact validation commands and results
- result of new_docker-build.h if present
- remaining blockers or risks
+9 -9
View File
@@ -94,15 +94,15 @@ Work in the Qt6 target tree only. Do not modify the Qt5 legacy tree.
## Scope rules
Touch files outside the targets directories only when directly required to configure, generate, build, link, test, or validate these targets.
Touch files outside the targets directories only when directly required to configure, generate, build, link, test, or validate these services.
Allowed outside-scope changes:
- parent CMakeLists.txt entries for these targets
- central CMake helper fixes required by these targets
- shared include path fixes required by these targets
- RTI, codegen, ndsgen, KTextTemplate, or Grantlee integration fixes required by these targets
- test infrastructure needed by tests for these targets
- parent CMakeLists.txt entries for these services
- central CMake helper fixes required by these services
- shared include path fixes required by these services
- RTI, codegen, ndsgen, KTextTemplate, or Grantlee integration fixes required by these services
- test infrastructure needed by tests for these services
- new_docker_build.sh changes needed to run those tests
- minimal Jenkins CI discovery or policy updates needed for those tests
- relocation of required stubs or forward declarations to allowed directories
@@ -196,7 +196,7 @@ For each cmake target, inspect and migrate only as needed:
- CMakeLists.txt and parent CMake registration
- ui, qrc, resource, plugin, and service metadata
- RTI IDL, ndsgen, KTextTemplate, and Grantlee inputs/templates
- tests directly tied to these targets
- tests directly tied to these services
Fix only real Qt6/C++17 build issues, such as:
@@ -306,7 +306,7 @@ Jenkins CI must be able to discover and run the new tests, or verify that new_do
## Required procedure
1. Inspect repository state, branch, working tree, submodules, required prompts, service paths, and forward-declaration directories.
2. Compare Qt5 source targets with Qt6 targets. Classify files as already migrated, missing, stale, generated, intentionally removed, build-only, or needing Qt6 adaptation.
2. Compare Qt5 source services with Qt6 targets. Classify files as already migrated, missing, stale, generated, intentionally removed, build-only, or needing Qt6 adaptation.
3. Identify dependencies, generated inputs, Qt modules, parent CMake entries, removed-module references, LogViewer interactions, and required stub/forward-declaration relocations.
4. Apply the smallest valid migration changes.
5. Add required CTest tests for C++ changes.
@@ -358,7 +358,7 @@ Success requires:
- configure, build, and CTest pass with BUILD_RTI=ON and BUILD_GRANTLEE=ON and BUILD_ARCGIS=ON
- new_docker_build.sh runs the relevant tests and fails on test failure
- Jenkins/policy discovery accepts the new tests and validation changes
- no active Qt5 imported target links remain for these targets
- no active Qt5 imported target links remain for these services
- generated outputs are build-tree only and freshly produced when required
- no generated outputs are committed or consumed from the source tree
- no fake generated files, dummy files, mocks, placeholders, or stubbed generated outputs exist
-429
View File
@@ -1,429 +0,0 @@
# Strict Qt6 Migration Prompt: NmeaManagement Service
This prompt is binding task context. Keep changes minimal, scoped, and reproducible.
## Required base prompt
Before making changes, read and apply:
- ./prompts/combined-migration-subfolder-rti-compact.prompt.md
If that prompt is stricter, follow it. This prompt overrides it only for build variants: use ON variants only. Do not pursue OFF variants.
## Service in scope
Migrate only:
- **Lts/Services/NmeaManagement**
All rules below apply exactly to this service and its direct build, generation, and test dependencies. Do not touch other services or unrelated modules.
## Status of this service
The NmeaManagement service directory already exists in the Qt6 tree (`qt-migration-legatus/qt6-after/qt6-migrated-legatus/Lts/Services/NmeaManagement/`) and its source files have been migrated from Qt5 to Qt6:
- Include paths modernized (`#include <QX>` → `#include <QtCore/QX>`, `#include <QtWidgets/QX>`, `#include <QtGui/QX>`)
- `QRegExp` → `QRegularExpression` (nmea_handler.cpp)
- Signal/slot macros → type-safe connections (`connect(m_reconnectTimer, SIGNAL(timeout()), ...) → connect(m_reconnectTimer, &QTimer::timeout, ...)`)
- `QDesktopWidget` → `QScreen` (nme_battery_info_dialog.cpp in the plugin)
- `QT5_WRAP_UI` → no-op shim (NGLMacros.cmake, AUTOUIC handles `.ui` files)
- CMakeLists.txt migrated: `Qt5::` → `Qt6::`, codegen steps wrapped in `IF(BUILD_RTI)`
- `ddscore` and `ddsconnector` → conditional `$<IF:$<TARGET_EXISTS:...>>`
**The only thing preventing the service from building is that `ADD_SUBDIRECTORY(NmeaManagement)` is commented out in `Lts/Services/CMakeLists.txt` (line 28).**
## From / To
From:
- `./qt-migration-legatus/qt5-before/qt5-legatus-legacy/Lts/Services/NmeaManagement/`
To:
- `./qt-migration-legatus/qt6-after/qt6-migrated-legatus/Lts/Services/NmeaManagement/`
Do not migrate sibling services, sibling plugins, or unrelated modules.
## Mandatory build variants
Only these variants are valid:
- `BUILD_RTI=ON`
- `BUILD_GRANTLEE=ON`
Forbidden:
- `BUILD_RTI=OFF`
- `BUILD_GRANTLEE=OFF`
Rules:
- Do not implement, fix, preserve, test, or validate OFF variants.
- Do not add CMake logic, tests, stubs, or fallbacks for OFF variants.
- Do not report OFF variants as supported or partially supported.
- Validation must use `BUILD_RTI=ON` and `BUILD_GRANTLEE=ON`.
## Branches and trees
Qt6 target branch:
- `feature/qt6-migration-basis-modules`
Qt5 legacy branch, if comparison is needed:
- `story/qt6-migration`
Legacy source tree:
- `./qt-migration-legatus/qt5-before/qt5-legatus-legacy`
Qt6 target tree:
- `./qt-migration-legatus/qt6-after/qt6-migrated-legatus`
Work in the Qt6 target tree only. Do not modify the Qt5 legacy tree.
## Scope rules
Touch files outside `Lts/Services/NmeaManagement/` only when directly required to configure, generate, build, link, test, or validate this service.
Allowed outside-scope changes:
- `Lts/Services/CMakeLists.txt` — uncommenting `ADD_SUBDIRECTORY(NmeaManagement)`
- central CMake helper fixes required by this service
- shared include path fixes required by this service
- RTI, codegen, ndsgen, KTextTemplate, or Grantlee integration fixes required by this service
- test infrastructure needed by tests for this service
- docker_build.sh changes needed to run those tests
- minimal Jenkins CI discovery or policy updates needed for those tests
- relocation of required stubs or forward declarations to allowed directories
Not allowed:
- restoring removed modules (commit `92ad7d468`)
- reintroducing stale dependencies on removed modules
- removing or disabling active modules to hide failures
- disabling targets instead of fixing root causes
- broad refactoring, cleanup, renaming, or modernization
- warning suppression instead of fixing causes
- committing generated files
- consuming generated outputs from the source tree
- fake success, dummy files, handwritten generated replacements, mocks, placeholders, or generated-output stubs
## Preservation rules
Preserve module removals from commit:
- `92ad7d468`, "remove all unneeded module listed from Niklas"
Do not restore removed modules, files, targets, directories, or dependencies.
Preserve LogViewer reinsert from commit:
- `1fa789767`, "Added LogViewer again"
Do not remove, disable, or break LogViewer integration.
Preserve prior IDL warning fixes from commit:
- `be912de9d`, "Removes .IDL warnings: multiple enum definitons and builtin-type collisions"
Do not blindly replay that commit. Use it only as reference. Do not reintroduce removed modules.
IDL regressions to avoid:
- multiple enum definitions
- duplicate enumerators
- builtin type or keyword collisions
Check first for duplicate inputs, stale paths, removed-module references, source-tree generated outputs, source/build-tree confusion, and repeated IDL definitions before treating an issue as semantic IDL conflict.
## Stubs and forward declarations
Any required existing stub, compatibility declaration, or forward declaration must live only under:
- `./qt-migration-legatus/qt6-after/qt6-migrated-legatus/forward-declarations/`
- `./qt-migration-legatus/qt6-after/qt6-migrated-legatus/.forward-declarations/include/`
Rules:
- Do not leave such files in service directories unless they are real service source files.
- Do not create or keep stubs for forbidden OFF variants.
- Do not use stubs or forward declarations as replacements for real RTI, ndsgen, KTextTemplate, or Grantlee outputs in ON builds.
- Report every moved, removed, or newly referenced stub/forward declaration.
## Migration checks
Inspect and migrate only as needed:
- source and header files in `Lts/Services/NmeaManagement/`
- `CMakeLists.txt` and parent CMake registration
- RTI IDL (`nme_service.xml`), ndsgen, KTextTemplate, and Grantlee inputs/templates
- tests directly tied to this service
The source files are already migrated. Focus on:
1. **Uncommenting** `ADD_SUBDIRECTORY(NmeaManagement)` in `Lts/Services/CMakeLists.txt`
2. **Fixing any compile errors** that surface after the service is added to the build
3. **Verifying codegen** (`nme_service.xml` → `.idl` → `.hpp`/`.cpp`) produces expected outputs
4. **Verifying Qt module links** (the executable links `Qt6::Core`, `Qt6::Network`, `svcCoreClient`, etc.)
Fix only real Qt6/C++17 build issues. No opportunistic refactoring or style cleanup.
## Qt link rules
No active target in the Qt6 tree may link Qt5 imported targets.
Search for and fix active uses of:
- `Qt5::`
- `find_package(Qt5`
- `QT5_`
- `Qt5Core`
- `Qt5Widgets`
- `Qt5Network`
Use Qt6 equivalents. Prefer central CMake helper fixes when the issue is central.
## Code generation rules
The NmeaManagement service uses the standard RTI/Grantlee codegen pipeline:
1. `CODEGEN_IDL_SVC` — generates `nme_enums.idl` and `nme.idl` from `nme_service.xml`
2. `RTIDDSGEN` — compiles `.idl` files into `.hpp`, `.cpp`, `.cxx`, `.Plugin` outputs
3. `CODEGEN_TOPIC_TYPEDEFS` — generates `nme_dt[s,c]_types.h` / `nme_ft[s,c]_types.h`
4. `CODEGEN_CLIENT_TOPICS_IFC` — generates `nme_[d|f]tc.h`
5. `CODEGEN_CLIENT_TOPICS_IMPL` — generates `nme_[d|f]tc_impl.[cpp|h]`
6. `CODEGEN_SERVER_TOPICS` — generates `nme_[d|f]ts.h`, `nme_[d|f]ts_impl.[cpp|h]`
7. `CODEGEN_DATABASE` — generates `nme_db_impl.cpp/.h`, `nme_db.h`
8. `CODEGEN_SQL` — generates `nme.sql`, `nme.xml`
9. `CREATE_TOPIC_TYPE_PLUGIN` — generates topic type plugin files
If generated files are required:
- generate into the build tree
- consume from the build tree
- list complete OUTPUT and BYPRODUCTS
- set correct DEPENDS and MAIN_DEPENDENCY where useful
- use deterministic WORKING_DIRECTORY
- use VERBATIM
- wire generated sources with target_sources
- wire generated include dirs with target_include_directories
- ensure compilation depends on generation
- ensure incremental rebuilds trigger on input/template changes
Never commit generated `.idl`, `.h`, `.hpp`, or `.cpp` outputs. Never consume generated outputs from the source tree. Never fabricate generated outputs.
## Known pitfalls from the FileManagement/FilterManagement run
Apply these rules before debugging from scratch; skipping them repeats known problems.
### rtiddsgen 7.7 generated API shape
RTI Connext 7.7 rtiddsgen with `-language C++11 -stl` generates:
- plain public data members with no getters or setters: use `data.id` and `data.id = value`, not `data.id()` or `data.id(value)`
- no `*_def::type` wrapper types: use enums directly in the service namespace
- renamed enums when the generated name collides with a framework type
- `omg::types::optional` and `omg::types::sequence` members
When a compile error looks like old getter/setter syntax ("expression cannot be used as a function") or a missing `*_def` type, read the generated header in the build tree for the real member and type names. Check every call site in the service, its handlers, and its WebSocket interfaces.
### Grantlee templates generate the service impl files
Service `*_impl.[ch]` files are generated from `Lts/Common/CodeGen/*.grantlee` templates. If the fix belongs in generated code, fix the template; codegen reruns automatically. Never hand-edit generated outputs.
### NGL_ADD_LIBRARY2 does not define the compile guard
NGL_ADD_LIBRARY defines `MAKE_<SYMBOL>_LIB` for the target; NGL_ADD_LIBRARY2 does not. A target consuming generated `*_impl.h` headers that carry an include guard fails with `#error "You are not allowed to include this file in your code!"` unless the guard is defined explicitly:
```cmake
TARGET_COMPILE_DEFINITIONS(<target> PRIVATE MAKE_<SYMBOL>_LIB)
```
### Stub copies racing the codegen
An unconditional `CONFIGURE_FILE(... COPYONLY)` that copies a stub header to a build-dir path that codegen also writes overwrites the generated file on every cmake re-configure. Guard such copies with `IF(NOT BUILD_RTI)` or `IF(NOT BUILD_GRANTLEE)`.
### Qt6 discovery in the container takes the minimal path
`find_package(Qt6 ... COMPONENTS ...)` always fails in the validation container. The tree takes the "Found Qt6 (minimal)" path and every Qt6 component target is a manual IMPORTED target in the root CMakeLists. When a migrated service needs a Qt6 module the container does not discover (for example WebSockets):
- add the matching `qt6-<module>-dev` package to docker_build.sh
- create a manual IMPORTED target in the root CMakeLists following the existing pattern
- define the availability macro via `add_compile_definitions` when the real module is present
- link the target by name in the service CMakeLists
- gate the compile macro and the link on the same condition
Flipping a compile macro on an existing build dir leaves stale AUTOMOC caches. A clean build dir is required after flipping such macros.
### Include shadowing between the stub tree and real generated headers
An include like `<Core/core_dtc.h>` can resolve into the migration stub tree (wrong namespaces) instead of the real generated header in the build tree. Use the full path from the build-tree include root (`<DDS/Core/core_dtc.h>`), add `include_directories(BEFORE ${CMAKE_SOURCE_DIR}/Lts)` when stub trees shadow Lts headers, and verify forward declarations name the same namespace as the real header.
### Compare with the Qt5 original before inventing fixes
Several "missing field" or "unknown template" errors in the first run came from includes or members the Qt5 original had and the Qt6 copy had silently dropped. When a class fails to compile over a missing member or unknown base, diff against the Qt5 original first; restore the dropped piece rather than designing around it.
### Export-header macro names
Generated export headers uppercase the whole target name, merging adjacent word letters: target `LtsSessionData` defines `LTSSESSIONDATA_EXPORT`. When writing tests that assert export macros, derive the expected prefix from the generated header, not from visual expectation.
### Build orchestration
- docker_build.sh must keep `set -eo pipefail` in the container script
- When a migrated service adds a test executable, add it to the fixed make target list in docker_build.sh so ctest actually runs it
- build4 is root-owned and wiped by every docker_build.sh run
## Tests
For every C++ code change, add three meaningful CTest tests where feasible.
Rules:
- tests must validate changed behavior, not only compilation
- tests must be registered with CTest
- tests must run with `BUILD_RTI=ON` and `BUILD_GRANTLEE=ON`
- do not add OFF-variant tests
- use deterministic tests without host-local paths
Preferred location:
- `./qt-migration-legatus/qt6-after/qt6-migrated-legatus/tests`
Use policy-compatible names, for example:
- `test_<name>.cpp`
- `<name>_test.cpp`
- `<name>test.cpp`
- `<name>gtest.cpp`
## Docker and CI
Authoritative migration Dockerfile:
- `./app/Dockerfile`
Authoritative validation script:
- `./qt-migration-legatus/qt6-after/qt6-migrated-legatus/docker_build.sh`
Do not use other Dockerfiles as task authority.
Validation container expectations:
- repository root at `/repo`, or the script's documented mount path
- external dependencies under `/repo/external`, or the script's documented equivalent
- RTI 7.7 at `/repo/external/rti_connext_dds-7.7.0`, or documented equivalent
- `./rti_license.dat` mounted read-only if RTI requires it
- no developer-local paths
Jenkins CI must be able to discover and run the new tests, or verify that docker_build.sh runs them. Inspect and minimally update only if needed:
- `./qt-migration-legatus/ci/Dockerfile.*`
- `./qt-migration-legatus/ci/check_pr_policies.py`
## Required procedure
1. Inspect repository state, branch, working tree, and forward-declaration directories.
2. Compare Qt5 source with Qt6 target for NmeaManagement. Classify files as already migrated, missing, stale, generated, or needing adaptation.
3. Identify dependencies: `svcCoreClient`, `ProjectConfig`, `LtsCommandLineParser`, `nglcoreapplication`, Qt6 modules, and any service-level interdependencies.
4. Uncomment `ADD_SUBDIRECTORY(NmeaManagement)` in parent `Lts/Services/CMakeLists.txt`.
5. Apply the smallest valid migration changes to fix compile/link errors.
6. Add required CTest tests for C++ changes (if applicable).
7. Review RTI/codegen paths for `nme_service.xml`.
8. Check regressions: Qt5 links, removed modules, LogViewer, IDL warnings.
9. Validate in Docker with `BUILD_RTI=ON` and `BUILD_GRANTLEE=ON`.
10. Run CTest in the validated build directory.
11. Check Jenkins/policy compatibility.
12. Report factual status.
Do not overwrite uncommitted user changes. If they block safe work, report the blocker.
## Required validation
From:
- `./qt-migration-legatus/qt6-after/qt6-migrated-legatus`
Run:
```bash
BUILD_RTI=ON BUILD_GRANTLEE=ON ./docker_build.sh
```
CTest must run as part of validation.
Expected CTest baseline: ctest exits with code 8 when tests are "Not Run". A pre-existing set of Not Run tests (for example nglcomp_test, aes/avm/exm/scm/bld suites, GrantleeParserSmoke) belongs to sibling targets outside the docker_build.sh make list; that set existed before this migration series and is not a failure. Treat only `***Failed` entries as failures. Do not widen this exception to skip or filter real failures, and do not add the missing sibling targets to fix the exit code. If a previously passing test becomes Not Run or Failed, that is a regression of this run.
If a direct clean build is useful, use:
```bash
cmake -S /repo/qt-migration-legatus/qt6-after/qt6-migrated-legatus -B /repo/build-rti-on-grantlee-on -G Ninja -DCMAKE_BUILD_TYPE=Debug -DBUILD_RTI=ON -DBUILD_GRANTLEE=ON
cmake --build /repo/build-rti-on-grantlee-on --parallel
ctest --test-dir /repo/build-rti-on-grantlee-on --output-on-failure
```
Also check whether this file exists and run it only if present:
```bash
./docker-build.h
```
If it is absent or a typo, report that. Do not invent a replacement.
Do not run or validate OFF variants.
## Success criteria
Success requires:
- NmeaManagement migrated and confirmed buildable
- NmeaManagement included in the Qt6 build (uncommented in parent CMakeLists.txt)
- configure, build, and CTest pass with `BUILD_RTI=ON` and `BUILD_GRANTLEE=ON`
- docker_build.sh runs the relevant tests and fails on test failure
- Jenkins/policy discovery accepts any new tests and validation changes
- no active Qt5 imported target links remain for this service
- generated outputs are build-tree only and freshly produced when required
- no generated outputs are committed or consumed from the source tree
- no fake generated files, dummy files, mocks, placeholders, or stubbed generated outputs exist
- required stubs/forward declarations are only in allowed directories
- removed modules remain removed
- LogViewer remains preserved
- RTI/codegen and Grantlee/KTextTemplate success is real, not stale or faked
## If blocked
Do not fake success. Report:
- failing command
- key error output
- affected service
- category: project, path, merge, CMake, Qt API, codegen, Docker, RTI/license, Grantlee/KTextTemplate, test, CTest, Jenkins CI, stub relocation, or environment
- what was fixed safely
- what remains blocked
- whether stale artifacts were ruled out
- whether generated files were involved
- exact missing files, targets, or generator step
- whether tests and CTest integration succeeded
- whether Docker validation and Jenkins discovery succeeded
## Final report
Keep it short. Include:
- status: validated, partially validated, or blocked
- service migrated or already correct
- files changed
- C++ files changed
- tests added per C++ change
- CTest registration changes
- CMake and generator changes
- stub/forward-declaration moves or removals
- Docker and Jenkins CI changes
- Qt5 references removed or remaining
- confirmation that removed modules were not restored
- confirmation that LogViewer was preserved
- exact validation commands and results
- result of ./docker-build.h if present
- remaining blockers or risks
-163
View File
@@ -1,163 +0,0 @@
flmTests
flmTopicTypePlugin
svcAesClient
svcAesCommon
svcAesServer
svcAlmClient
svcAlmCommon
svcAlmServer
svcAreaEffectSimulation
svcAsmClient
svcAsmCommon
svcAsmServer
svcAssetManagement
svcAudioVideoManagement
svcAvmClient
svcAvmCommon
svcAvmServer
svcBldClient
svcBldCommon
svcBldServer
svcBuildings
svcCentralEffectSimulation
svcCesClient
svcCesCommon
svcCesDDSCommon
svcCesGeoPairingImpl
svcCesServer
svcCmoClient
svcCmoCommon
svcCmoServer
svcCnrHelper
svcCodClient
svcCodCommon
svcCodServer
svcCombatNetRadio
svcComponentMonitor
svcCoreClient
svcDifferentialGPS
svcEemClient
svcEemCommon
svcEemServer
svcEffectShowClient
svcEscClient
svcEscCommon
svcEscServer
svcEsmClient
svcEsmCommon
svcEsmServer
svcEvlClient
svcEvlCommon
svcEvlServer
svcExerciseEventManagement
svcExerciseManagement
svcExmClient
svcExmCommon
svcExmServer
svcFileManagement
svcFilterManagement
svcFlmClient
svcFlmCommon
svcFlmServer
svcFltClient
svcFltCommon
svcFltServer
svcGimClient
svcGimCommon
svcGimServer
svcGmpServer
svcGnaClient
svcGnaCommon
svcGnaServer
svcGuezIedManagement
svcInfrastructureManagement
svcIsmClient
svcIsmCommon
svcIsmServer
svcMapDummy
svcMdmClient
svcMdmCommon
svcMdmServer
svcMessaging
svcMeteoDataManagement
svcMrkClient
svcMrkCommon
svcMrkServer
svcMsgClient
svcMsgCommon
svcMsgServer
svcNomClient
svcNomCommon
svcNomServer
svcNotificationManagement
svcObdClient
svcObdCommon
svcObdServer
svcOcBaseDownload
svcOcSituationClient
svcOcSituationServer
svcOperatorManagement
svcOpmClient
svcOpmCommon
svcOpmServer
svcOreDummy
svcOscClient
svcOscCommon
svcOscServer
svcOssClient
svcOssCommon
svcOssServer
svcParticipantManagement
svcPdmClient
svcPdmCommon
svcPdmServer
svcPedDummy
svcPpmClient
svcPpmCommon
svcPpmServer
svcPreClient
svcPreCommon
svcPreServer
svcProjectDataManagement
svcPwsCommon
svcRecCommon
svcRecordingManagement
svcRepClient
svcRepCommon
svcRepCommonExecutable
svcRepServer
svcReportAnalyzer
svcReportGenerator
svcScmClient
svcScmCommon
svcScmServer
svcScrDummy
svcServiceManagement
svcSituationReplay
svcSmoDummy
svcSomClient
svcSomCommon
svcSomServer
svcSoundManagement
svcSrmCommon
svcSrpClient
svcSrpCommon
svcSrpServer
svcTabClient
svcTabCommon
svcTabServer
svcTabocClient
svcTabocCommon
svcTabocServer
svcTargetManagement
svcTgtClient
svcTgtCommon
svcTgtServer
svcTrainingAreaBase
svcTrainingAreaBaseOC
svcVideoOverlayManagement
svcWarehouseGuez
svcWarehouseManagement
svcWhgClient
svcWhgCommon
svcWhgServer