- Comprehensive overview of both Module Z and Proxies migrations
- Documents all changes, test results, and technical challenges
- Includes build instructions and recommendations
- Ready for production deployment
Co-authored-by: Copilot <2235556219+Copilot@users.noreply.github.com>
Entire-Checkpoint: 01M2W910DA42R3RHHZAJG1Y0W9
- Documents all changes made during Qt5 to Qt6 migration
- Includes test results (92% pass rate, 462/502 tests passing)
- Lists all template fixes for LOGGER_T namespace issues
- Provides build instructions and dependency information
- Details technical challenges and solutions
- Outlines remaining work and recommendations
Co-authored-by: Copilot <2235556219+Copilot@users.noreply.github.com>
Entire-Checkpoint: 01M2VT02KPEC3WNZ34Z694TDVT
- Updated MIGRATION_STATUS.md with current build status and blockers
- Updated combined-migration-compact.prompt.md with latest instructions
- Updated Dockerfile for migration pipeline with RTI 7.7 support
- Updated build scripts for Docker-based migration workflow
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Entire-Checkpoint: 01M1BQ6VBZ20E1WJ29NYGT8EWJ
- Submodule updated to commit 115243d47
- Added opm_db.h and exm_db.h stub headers for BUILD_RTI=OFF
- Service modules now have required DDS stub headers
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Entire-Checkpoint: 01M17MZT9GX56C9S928XR0EVRG
- Corrected all session dates from 2026-08-24 to 2026-08-25
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Entire-Checkpoint: 01M0X6NRPV5BYY9QRFFTX1ZF42
- Submodule updated to include complete QRegExp → QRegularExpression migration
- All Lts/Tools modules now use Qt6-compatible QRegularExpression
- TextEditorTest includes Core5Compat for legacy QTextCodec support
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Entire-Checkpoint: 01M0WDZXVMCG78CF3S063661T1
- Documented lts_app_descriptor_editor.cpp and qsql_informix.cpp migration
- Added technical details for SIGNAL/SLOT pattern and QTextCodec
- Updated status and next steps
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Entire-Checkpoint: 01M0VX1FZBW74JEY580TM9B16Z
QDesktopWidget → QScreen migration complete:
- AVM Mobile Video System GUI plugin
- TetraIF LogView Telegram Dialog
All QApplication::desktop() usage has been migrated to QGuiApplication::primaryScreen().
Refs: Qt6 migration, C++17
Entire-Checkpoint: 01M0TGGZV3RW8G3XF8ZND8W597
- Document QRegExp → QRegularExpression migration across all modules
- List all migrated files: symbol_dictionary_impl, mil2525d_to_mil2525c,
pre_script_dialog, nmea_handler_rx, handler_aes_data, stream_name_mapping,
nmea_handler, sidc_builder_base, sidc_codec
- Update migration progress table with Qt6 API status
- Mark QDesktopWidget and QRegExp migrations as complete
- Add commit references for f15f342a (QRegExp) and 793c9f8b (BUILD_RTI=OFF)
- Update timestamps for auto-commit tracking
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Entire-Checkpoint: 01M0TC687R9Y6P7855R57DM9TX
- Document QJsonObject and QJsonDocument Qt6 API fixes
- Update build status: Qt6 fixes successful for both BUILD_RTI=ON/OFF
- Add changed files section with commit references
- Update remaining blockers (RTI Core type errors separate from Qt6)
- Update next steps for continued migration
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Entire-Checkpoint: 01M0QQYZ2GBAQSWY4KWC438E7K
- Grantlee-Tests conditional auf BUILD_GRANTLEE gesetzt
- Build erfolgreich mit BUILD_RTI=OFF und BUILD_GRANTLEE=OFF
- Alle 17 Libraries gebaut
- Policy-Check bestanden
Entire-Checkpoint: 01M0GT5W2HE04WW9N1G4E8FE72
- Grantlee-Tests conditional auf BUILD_GRANTLEE gesetzt
- Build erfolgreich mit BUILD_RTI=OFF und BUILD_GRANTLEE=OFF
- Alle 17 Libraries gebaut
- Policy-Check bestanden
Entire-Checkpoint: 01M0GT3Q0CBCA9PSQ5J6G4AC2D
- Submodule updated to commit with STUB file removal
- All STUB files for external dependencies removed
- CMakeLists.txt updated to use real implementations
- BUILD_RTI=ON is now default
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Entire-Checkpoint: 01M0G2RJXWP1ZQG7KX17WM7SH8
- Changed stage names from 'Build RPM'/'Publish RPM' to 'Build DEB'/'Publish DEB'
- Updated parameter descriptions to reference DEB packages
- Updated comments to reference make_rpm_ubuntu26.py
- Changed artifact repository path from cts-rpms to cts-debs
Part of Qt5/C++11 to Qt6/C++23 migration project.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Entire-Checkpoint: 01M0CH79QV1X40QYRYX2FJ835F
- Submodule commit includes IF(BUILD_RTI) wrapper for LtsWidgets library
- Fixes include paths for export header generation
- Enables LtsWidgets to build when BUILD_RTI=ON and BUILD_WS=ON
Entire-Checkpoint: 01M0BEW4METXK5F9X7WEHEAQCY
- Changed spec_suffix_for_os['26.04'] from '' to '26.04'
- This selects lts26.04.spec for Ubuntu 26.04 builds
- Updated comments to reflect Ubuntu 26.04 as target platform
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Entire-Checkpoint: 01M0B40E71R875JD5R4PBDV0SE
- .gitmodules: Set submodule branch to feature/qt6-migration-basis-modules
- app/Dockerfile: Update FROM ubuntu:24.04 to ubuntu:26.04
- files/qt6-submodule-migration-changes.md: Update status with successful test results
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Entire-Checkpoint: 01M08CV4EFR0GM7NSVCTBC16K5
Cosmetic changes for readability and consistency:
- Update Docker image tag from ubuntu22.04 to ubuntu26.04 in all scripts
- Align with Dockerfile base image (ubuntu:26.04)
Files updated:
- app/run_docker.sh
- migration/automate_migrate_Lts_DDS.sh
- migration/migrate_module.sh
- final-migration/run_final_migration.sh
- .github/workflows/qt6-migration.yml (submodules: recursive)
- migration/run_clang_tidy_common.sh
Documentation:
- files/qt6-submodule-migration-changes.md: Added note about qt6-after being empty
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Entire-Checkpoint: 01M08C7DVVVDNBXGPN4M02CFB5
- Keep RTI optional (no REQUIRED)
- Use host UID:GID when running fallback docker run to allow cleaning build dir
\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
- Add only existing Lts subdirectories to allow partial migrations
- Make RTI optional in Lts/Common/CodeGen and guard RTI target properties
\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Replaced deprecated qAsConst usages in built modules and updated QMouseEvent::localPos() to position() per Qt6 deprecation guidance.\n\nCo-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
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*
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 |
`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`).
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`
- 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
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:
- 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:
-`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
- 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.
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
- 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.
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:
- 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
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:
-`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).**
-`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:
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:
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
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.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.