12 KiB
Qt5/C++11 to Qt6/C++23 Migrationsplan
📋 Ausgangslage
Projektstruktur
$PROJDIR_MIGRATE_QT5_TO_QT6 = /home/torsten/swy/sandbox/qt-migration-legatus
├── qt5-before/qt5-legatus-legacy/ (Qt5/C++11 Legacy-Code)
└── qt6-after/qt6-migrated-legatus/ (Qt6/C++23 migrierter Code)
Submodule Konfiguration
- Submodule:
qt-migration-legatuszeigt auffeature/qt6-migration-basis-modules(commitd176b5e) - Quellverzeichnis:
qt5-before/qt5-legatus-legacy/enthält vollständigen Qt5-Code mit CMakeLists.txt - Zielverzeichnis:
qt6-after/qt6-migrated-legatus/enthält bereits migrierte Module
Bereits migrierte Module (Stand: Session a41bb15a)
✅ Lts/Common - Vollständig migriert, Tests erfolgreich (1/1 bestanden) ✅ Lts/DDS - Struktur vorhanden ✅ Lts/Plugins - Struktur vorhanden ✅ Lts/Projects - Struktur vorhanden ✅ Lts/Proxies - Struktur vorhanden ✅ Lts/Services - Struktur vorhanden ✅ TetraIF - Teilweise migriert ✅ Z - Teilweise migriert (nglwidgets, QtSingleApplication, qsql_informix, WMS_Interface)
Infrastruktur
- ✅ Docker-Image:
migration-pipeline:ubuntu26.04(Ubuntu 26.04, Qt 6.8.3) - ✅ CMake 3.16+, C++23
- ✅ CI-Workflow mit
submodules: recursive - ✅ Migrationsskripte aktualisiert für Submodule-Pfade
🎯 Migrationsziele (aus combined-migration-compact.prompt.md)
Hauptziele
- Qt5 → Qt6 Upgrade aller Module
- C++11/14/17 → C++23 Modernisierung
- Qt Core, Gui, Widgets explizit verlinken
- QRegExp → QRegularExpression ersetzen
- QDesktopWidget → QScreen-basierte APIs
- QTextCodec entfernen, Qt6-safe text handling
- SIGNAL/SLOT alte Syntax → function-pointer connect syntax
- 0/NULL →
nullptrersetzen
C++23 Modernisierung
autowo offensichtlich- Strukturierte Bindings wo klarer
- Raw Pointer →
std::unique_ptr/std::shared_ptr std::make_unique/std::make_sharedstd::string_view(lifetime safety beachten)std::spanfür non-owning contiguous data.contains()stattfind(...) != end()- Algorithms/Ranges statt manueller Loops
[[nodiscard]]wo sinnvoll- Early Returns statt nested control flow
std::optionalmonadic operationsconstexpr,if constexpr, concepts,requiresnoexcept,override,final,= default,= deleteenum classstatt unscoped enumsstd::print/std::println(wenn unterstützt)- Typed
std::chrono,std::jthread
Safety Rules
- ✅ Semantics first, modernize second
- ❌ KEINE Behavior Changes (außer Qt6 compatibility)
- ❌ KEINE Code Cleanup
- ❌ KEINE Umbenennungen
- ❌ KEINE Function/Class Extractions
- ❌ KEINE Logic Restructuring
- ❌ KEINE stylistic rewrites
- ❌ KEINE opportunistic improvements
📝 Migrationsphasen
Phase 1: Vorbereitung und Analyse
Todo-ID: prepare
- Submodule initialisieren:
git submodule update --init - Docker-Image bauen:
docker build -t migration-pipeline:ubuntu26.04 ./app - Bereits migrierte Module identifizieren
- Vollständige Inventur aller noch zu migrierenden Dateien
- Migrationsskripte für verbleibende Module vorbereiten
Phase 2: Lts-Module komplett migrieren
Todo-ID: lts-modules Dependencies: prepare
Bereits migriert:
- Lts/Common
- Lts/DDS (prüfen, ob vollständig)
- Lts/Plugins (alle Untermodule prüfen)
- Lts/Projects (alle Untermodule prüfen)
- Lts/Proxies (alle Untermodule prüfen)
- Lts/Services (alle Untermodule prüfen)
Vorgehen pro Modul (mit Test- und Docker-Validierung):
./migration/migrate_module.sh Lts/<Modul> --jobs 4- Tests erstellen: Für jede Code-Änderung mindestens 3 Tests hinzufügen
- Tests in
qt6-after/qt6-migrated-legatus/tests/ablegen - Dateinamen:
test_<name>.cpp,<name>_test.cpp,<name>test.cpp, oder<name>gtest.cpp - Tests in CMake registrieren (CTest)
- Tests in
- Docker-Validierung (obligatorisch vor Commit):
# Configure im Docker-Container docker run --rm -v $(pwd):/repo migration-pipeline:ubuntu26.04 \ cmake -S /repo/qt-migration-legatus/qt6-after/qt6-migrated-legatus \ -B /repo/build -G Ninja -DCMAKE_BUILD_TYPE=Debug # Build im Docker-Container docker run --rm -v $(pwd):/repo migration-pipeline:ubuntu26.04 \ cmake --build /repo/build --parallel # Tests im Docker-Container docker run --rm -v $(pwd):/repo migration-pipeline:ubuntu26.04 \ ctest --test-dir /repo/build --output-on-failure # Policy-Check im Docker-Container docker run --rm -v $(pwd):/repo migration-pipeline:ubuntu26.04 \ python3 /repo/ci/check_pr_policies.py - Fehlerklassifikation:
- Environment-Failures (command not found, missing package):
ci/Dockerfile.ciaktualisieren, Image neu bauen - Project-Failures (compile/link errors, test failures): Code fixen
- Environment-Failures (command not found, missing package):
- Bei Erfolg: clang-tidy laufen lassen, Changes commiten
Phase 3: TetraIF komplett migrieren
Todo-ID: tetraif Dependencies: lts-modules
- TetraIF Hauptcode migrieren
- Alle Includes und Abhängigkeiten prüfen
- Tests erstellen (mind. 3 Tests pro Code-Änderung)
- Docker-Validierung (Configure → Build → Test → Policy)
- clang-tidy Integration testen
Phase 4: Z-Module komplett migrieren
Todo-ID: z-modules Dependencies: tetraif
Bereits teilweise migriert:
- Z/src/nglwidgets
- Z/src/QtSingleApplication
- Z/src/qsql_informix
- Z/src/WMS_Interface
- Fehlende Z-Module identifizieren und migrieren
Vorgehen pro Modul (wie Phase 2 mit Test- und Docker-Validierung)
Phase 5: Vollständige Build-Validierung
Todo-ID: full-build Dependencies: lts-modules, tetraif, z-modules
./final-migration/run_final_migration.sh --jobs 6ausführen- Docker-Validierung komplett:
- Configure:
cmake -S qt6-after/qt6-migrated-legatus -B build -G Ninja -DCMAKE_BUILD_TYPE=Debug - Build:
cmake --build build --parallel - Test:
ctest --test-dir build --output-on-failure - Policy:
python3 ci/check_pr_policies.py
- Configure:
- Alle Tests bestehen (CTest)
- Policy-Check erfolgreich
Phase 6: CI/CD Validierung
Todo-ID: ci-validation Dependencies: full-build
- CI-Workflow lokal simulieren
- Submodule checkout testen
- Alle Migrationsschritte im CI-Kontext verifizieren
- Build-Artefakte prüfen
- Test-Logs analysieren
- Docker-Image als Source of Truth:
lifemaps/ci-cpp:latest(odermigration-pipeline:ubuntu26.04)- Bei fehlenden Tools:
ci/Dockerfile.ciminimal aktualisieren - Image neu bauen und Validierung wiederholen
- Bei fehlenden Tools:
🧪 Validierungskriterien
Pre-Migration (lokal)
git submodule update --initerfolgreich- Docker-Image Build erfolgreich
- Lts/Common Migration erfolgreich getestet
- Vollständige Inventur aller Module
Post-Migration (lokal)
- Configure im Docker-Container erfolgreich
- Build im Docker-Container erfolgreich
- Alle Tests bestehen (
ctest --test-dir build --output-on-failure) - Policy-Check erfolgreich (
python3 ci/check_pr_policies.py)
CI-Validierung
- Checkout mit Submodules erfolgreich
- Lts/Common Migration Step erfolgreich
- Lts/DDS Migration Step erfolgreich
- Final Migration Build ohne Fehler
- CTest läuft und besteht
- Workflow-Zeit < 120 Minuten
📊 Fortschrittsübersicht
Migrierte Module (✅)
| Modul | Status | Tests | Build | Notes |
|---|---|---|---|---|
| Lts/Common | ✅ Vollständig | 1/1 ✅ | ✅ | Basis erfolgreich |
| Lts/DDS | 🟡 Struktur vorhanden | ? | ? | Prüfung ausstehend |
| Lts/Plugins | 🟡 Struktur vorhanden | ? | ? | 60 Untermodule |
| Lts/Projects | 🟡 Struktur vorhanden | ? | ? | 5 Untermodule |
| Lts/Proxies | 🟡 Struktur vorhanden | ? | ? | 13 Untermodule |
| Lts/Services | 🟡 Struktur vorhanden | ? | ? | 47 Untermodule |
| TetraIF | 🟡 Teilweise | ? | ? | Migration läuft |
| Z | 🟡 Teilweise | ? | ? | Einige Submodule fertig |
Noch zu migrieren (❌)
- Alle Untermodule in Lts/Plugins (60)
- Alle Untermodule in Lts/Projects (5)
- Alle Untermodule in Lts/Proxies (13)
- Alle Untermodule in Lts/Services (47)
- Restliche Z-Module
⚠️ Risiken und Gegenmaßnahmen
Risiko 1: Submodule Permissions
Problem: CI benötigt SSH-Zugriff auf git@devel:lifemaps/qt-migration-legatus.git
Mitigation: SSH-Key in CI secrets konfigurieren oder HTTPS mit Token verwenden
Risiko 2: Git Operations in Submodules
Problem: run_clang_tidy_common.sh committet in Submodule-Pfad
Mitigation: Lokal testen, Submodule-Commits separat von Main-Repo-Commits betrachten
Risiko 3: Externe Dependencies
Problem: Skripte erwarten /repo/external mit RTI Connext und ArcGIS SDK
Mitigation: CI stellt Dependencies bereit oder behandelt fehlende Dependencies gracefully
Risiko 4: Nested Git Repo
Problem: qt5-legatus-legacy hat eigenes .git-Verzeichnis
Mitigation: git submodule update --init OHNE --recursive verwenden
🔄 Rollback-Plan
Bei kritischen Problemen:
- CI-Workflow revertieren:
submodules: recursiveentfernen - Migration-Skripte revertieren: Original
-S /repoPfade wiederherstellen - Fallback: Alte Ordernstruktur temporär am Repo-Root wiederherstellen
📈 Nächste Schritte (sofort)
- Logging-Fixes validieren: Build im Docker-Container nach Logger-Fixes testen
- Inventur vervollständigen: Alle noch zu migrierenden Dateien identifizieren
- Lts/DDS prüfen: Ist das Modul vollständig migriert? Build testen
- Lts/Plugins: Erste Untermodule migrieren (priorisiere Kernfunktionalität)
- TetraIF: Migration abschließen und validieren
- Vollständigen Build testen:
./final-migration/run_final_migration.sh --jobs 6
🛠️ Wichtige Commands
Submodule Management
# Submodule initialisieren
git submodule update --init
# Submodule auf Branch aktualisieren
git submodule update --remote
# Submodule Status prüfen
git submodule status
Migration
# Einzelnes Modul migrieren
./migration/migrate_module.sh Lts/<Modul> --jobs 4
# Vollständige Migration
./final-migration/run_final_migration.sh --jobs 6
# Clang-tidy für Modul
./migration/run_clang_tidy_common.sh Lts/<Modul>
Docker-Validierung (OBLIGATORISCH)
# Configure im Container
docker run --rm -v $(pwd):/repo migration-pipeline:ubuntu26.04 \
cmake -S /repo/qt-migration-legatus/qt6-after/qt6-migrated-legatus \
-B /repo/build -G Ninja -DCMAKE_BUILD_TYPE=Debug
# Build im Container
docker run --rm -v $(pwd):/repo migration-pipeline:ubuntu26.04 \
cmake --build /repo/build --parallel
# Tests im Container
docker run --rm -v $(pwd):/repo migration-pipeline:ubuntu26.04 \
ctest --test-dir /repo/build --output-on-failure
# Policy-Check
docker run --rm -v $(pwd):/repo migration-pipeline:ubuntu26.04 \
python3 /repo/ci/check_pr_policies.py
Docker-Image bei fehlenden Tools
# ci/Dockerfile.ci bearbeiten (fehlendes Package hinzufügen)
# Dann Image neu bauen:
docker build -t migration-pipeline:ubuntu26.04 ./app
# Validierung wiederholen
📝 Session-Referenzen
- Session a41bb15a-b5cc-4955-8d71-0169516fcef3: Vorherige Migration-Sessions
- Checkpoint 008-qt6-migration-infrastructure: Letzte Infrastruktur-Updates
- Submodule Branch:
feature/qt6-migration-basis-modules@d176b5e
Erstellt: 2026-08-18 Aktualisiert: 2026-08-18 (Test- und Docker-Validierungsanforderungen integriert) Status: Bereit für User-Feedback und Implementierung