This commit is contained in:
1 file changed
+204
-164
+204
-164
@@ -1,187 +1,227 @@
|
||||
# Qt6 Migration Status Report
|
||||
# Qt6 Migration Status
|
||||
|
||||
## Aktueller Stand (2026-08-21 15:09 CET)
|
||||
## Session: BUILD_RTI Guards und Submodule-Migration
|
||||
|
||||
### 🏗️ Build-Fortschritt
|
||||
- **Gesamt-Targets**: 1854
|
||||
- **Aktueller Fortschritt**: 114/1854 (6%)
|
||||
- **Build-System**: Ninja, Debug, BUILD_RTI=OFF
|
||||
- **Qt-Version**: Qt 6.10.2 (fest, kein Versions-Mix)
|
||||
- **C++-Standard**: C++23
|
||||
- **Build-Umgebung**: Docker-Container (migration-pipeline:ubuntu26.04-qt6)
|
||||
### Datum: 2026-08-21 (Letztes Update: 18:14 Uhr)
|
||||
|
||||
### Zusammenfassung
|
||||
BUILD_RTI guards für alle RTI Connext DDS und DDSConnector Dependencies implementiert. Submodule-Struktur eingerichtet. Migration auf Qt 6.10.2 und C++23 läuft.
|
||||
|
||||
### Aktuelle Repository-Struktur
|
||||
|
||||
```
|
||||
/home/torsten/swy/sandbox/
|
||||
├── .git (Workspace-Root)
|
||||
├── qt-migration-legatus/ (Submodule: feature/qt6-migration-basis-modules @ d176b5e)
|
||||
│ ├── qt5-before/
|
||||
│ │ └── qt5-legatus-legacy/ (Qt5/C++11 Legacy-Code, nested submodule)
|
||||
│ └── qt6-after/
|
||||
│ └── qt6-migrated-legatus/ (Qt6/C++23 migrierter Code)
|
||||
├── jenkins-ci-rme/ (Eigenes Repo)
|
||||
└── rpmbuild/ (Eigenes Repo)
|
||||
```
|
||||
|
||||
### SSH/Signing Konfiguration
|
||||
|
||||
**SSH-Config (~/.ssh/config)**:
|
||||
```
|
||||
Host devel
|
||||
Hostname gitea.life-maps.com
|
||||
Port 2223
|
||||
User git
|
||||
IdentityFile ~/.ssh/twi-devel.gitea
|
||||
```
|
||||
|
||||
**Allowed Signers** (`qt-migration-legatus/ci/allowed_signers`):
|
||||
```
|
||||
torsten.wierschin@life-maps.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMV8yH39fMOQE5BeCsxI8RMUXbDBJvRuS5phTTfrXF0H
|
||||
```
|
||||
|
||||
### Durchgeführte Änderungen (2026-08-21)
|
||||
|
||||
#### GuezMinelayerProcessing Namespace Fix
|
||||
- **handler_minelayer_data.cpp**: Namespace-Schließung korrigiert, `#endif // BUILD_RTI` nach `} // namespace GuezMinelayerProcessing` hinzugefügt
|
||||
|
||||
#### Submodule-Integration
|
||||
- Migrationsskripte auf Submodule-Pfade aktualisiert (`/repo/qt-migration-legatus/qt6-after/qt6-migrated-legatus`)
|
||||
- Docker-Image: `migration-pipeline:ubuntu26.04` (Ubuntu 26.04, Qt 6.10.2, C++23)
|
||||
- CI-Workflow mit `submodules: recursive` konfiguriert
|
||||
|
||||
---
|
||||
|
||||
## ✅ Erfolgreich abgeschlossene Arbeiten
|
||||
### Durchgeführte Änderungen (2026-08-18)
|
||||
|
||||
### 1. Build-Infrastructure
|
||||
- [x] Docker-Build-Infrastructure validiert
|
||||
- [x] CMake-Cache-Permission-Problem behoben (als root löschen)
|
||||
- [x] CMake-Konfiguration erfolgreich abgeschlossen
|
||||
- [x] NGLLogger Export-Macro konfiguriert
|
||||
- [x] GuezNasat Include-Pfade konfiguriert
|
||||
#### Core Header Fixes
|
||||
- **core_dtc.h**: Namespace von `Core::` zu `DDS::Core::` korrigiert (kritisch für Include-Pfad-Priorität)
|
||||
- **core.hpp**:
|
||||
- GeoPosition2D Struktur hinzugefügt (mit impliziter GeoPosition-Konversion)
|
||||
- operator<< für ostream-Output hinzugefügt
|
||||
- setter-Methodien (z(), lon(), lat()) für Qt5-Kompatibilität
|
||||
|
||||
### 2. Plugin-System Migration (43 Module)
|
||||
| Kategorie | Anzahl | Status |
|
||||
|-----------|--------|--------|
|
||||
| DataPlugins | 38 | ✅ AUTOMOC ON + Q_INTERFACES() entfernt |
|
||||
| Plugin-Interfaces | 5 | ✅ AUTOMOC ON |
|
||||
| **Gesamt** | **43** | ✅ Fertig |
|
||||
#### LtsCoordinate Fixes
|
||||
- **lts_coordinate.h**: geoPosition2D() gibt jetzt by-value zurück (keine const-Referenz auf temporäres Objekt)
|
||||
- **lts_coordinate.h**: rz() gibt m_geo.altitude direkt zurück (kein rvalue-binding Problem)
|
||||
|
||||
**Wichtigste Erkenntnis**: Q_INTERFACES() ist inkombatibel mit QObject-Vererbung in Qt6 - muss entfernt werden.
|
||||
#### Logger Initialisierung Fixes
|
||||
- **lts_web_socket_client.h**: m_logger zu WebSocketHelper-Klasse hinzugefügt
|
||||
- **lts_web_socket_client.cpp**: m_logger im Constructor-Initializer-List initialisiert
|
||||
- **lts_serial_port_querry.h**: m_logger Redeklaration bereinigt
|
||||
- **lts_serial_port_querry.cpp**: m_logger im Constructor-Initializer-List initialisiert
|
||||
|
||||
### 3. LtsTimelineClassic Module
|
||||
- [x] Export-Macro konfiguriert (generate_export_header)
|
||||
- [x] AUTOUIC_SEARCH_PATHS für Ui-Verzeichnis hinzugefügt
|
||||
- [x] BUILD_RTI-Guard entfernt (immer benötigtes Target)
|
||||
- [x] Target-Abhängigkeit für Tests hinzugefügt
|
||||
- [x] Include-Pfad in test_abstracttimelinemodel.cpp korrigiert
|
||||
#### GuezMinelayerProcessing (GMP) BUILD_RTI Guards
|
||||
- **settings.h**: Include-Pfad von svcgmpserver_export.h zu gmp_export.h korrigiert
|
||||
- **logger.h**: Include-Pfad von svcgmpserver_export.h zu gmp_export.h korrigiert
|
||||
- **initialization.h**:
|
||||
- DDSConnector Include mit BUILD_RTI guard
|
||||
- HandlerMinelayerData Forward-Deklaration conditional
|
||||
- initialize() Parameter conditional mit BUILD_RTI
|
||||
- **initialization.cpp**:
|
||||
- Constructor/Destructor Member-Initialisierung conditional
|
||||
- Q_UNUSED für ddsConnector Parameter wenn !BUILD_RTI
|
||||
- **handler_minelayer_data.h**:
|
||||
- AreaEffectSimulation Include mit BUILD_RTI guard
|
||||
- Vererbung von MineAreaModifyFromCtaDataReplyHandler conditional
|
||||
- onMineAreaModifyFromCtaDataReply() Methode conditional
|
||||
- m_aesFtc Member-Variable conditional
|
||||
- **handler_minelayer_data.cpp**:
|
||||
- aes_ftc.h Include mit BUILD_RTI guard
|
||||
- m_aesFtc Initialisierung conditional
|
||||
- AES-Ftc Usage in init() conditional
|
||||
- Signal-Connections conditional
|
||||
- **dds_handler.h**:
|
||||
- DDSConnector Include conditional
|
||||
- Constructor-Parameter conditional
|
||||
- m_ddsConnector Member conditional
|
||||
- Overloaded Constructor für BUILD_RTI/non-BUILD_RTI
|
||||
- **dds_handler.cpp**:
|
||||
- Constructor-Implementierung conditional
|
||||
- init() Methode mit BUILD_RTI guard
|
||||
- Q_UNUSED für nicht-genutzte Parameter
|
||||
|
||||
### 4. NGLLogger Integration
|
||||
- [x] Export-Macro Include-Pfad im Haupt-CMakeLists.txt (`${CMAKE_BINARY_DIR}/Z/src/NGLLogger`)
|
||||
- [x] Source-Pfad zu globalen Include-Pfaden hinzugefügt
|
||||
- [x] Include-Pfad korrigiert: `<NGLLoggerBootstrap.h>` (nicht `<NGLLogger/NGLLoggerBootstrap.h>`)
|
||||
- [x] API-Change: `getLogger()` → `getNGLRootLogger()` in 4 Dateien
|
||||
- Event.cpp
|
||||
- Event.h
|
||||
- AbstractTimelineModel.cpp
|
||||
- TimelineWidget.cpp
|
||||
- TimelineIndicator.cpp
|
||||
#### DDS/FTS BUILD_RTI Guards
|
||||
- **connext.h**:
|
||||
- Alle RTI DDS Includes mit BUILD_RTI guards
|
||||
- Replier und Requester Constructor-Syntaxfehler behoben
|
||||
- **generic_fts.h**: RTI Includes (rti/core/SampleIdentity.hpp) mit BUILD_RTI guards
|
||||
- **generic_fts_internal.h**:
|
||||
- WaitSetHandler::CallbackInterface Vererbung conditional
|
||||
- dataAvailable() Methode conditional
|
||||
|
||||
### 5. Qt6 API-Changes
|
||||
| Datei | Change | Status |
|
||||
|-------|--------|--------|
|
||||
| TimelineView.cpp | `angle()` → `angleDelta()` | ✅ |
|
||||
| TimelineView.cpp | `globalPos()` → `globalPosition().toPoint()` | ✅ |
|
||||
| lts_msec_date_time_edit.cpp | `fromMSecsSinceEpoch()` deprecated (Warnung akzeptiert) | ⚠️ |
|
||||
| lts_text_editor.cpp | `setFontFamily()` deprecated (Warnung akzeptiert) | ⚠️ |
|
||||
#### RoutingServiceNG BUILD_RTI Guards
|
||||
- **connection.h**: DDSConnector Include mit BUILD_RTI guard
|
||||
- **connection.cpp**: Vollständig mit BUILD_RTI guards umschlossen (Zeile 13-188)
|
||||
- **session.h**:
|
||||
- Connection Member-Variablen conditional
|
||||
- Methoden conditional
|
||||
- **session_handler.cpp**: Vollständig mit BUILD_RTI guards umschlossen
|
||||
- **main_handler.h**: DDSConnector Member/Methoden conditional
|
||||
- **main_handler.cpp**: Vollständig mit BUILD_RTI guards umschlossen
|
||||
- **partition_handler.h**: DDSConnector Member conditional
|
||||
- **partition_handler.cpp**: Vollständig mit BUILD_RTI guards umschlossen
|
||||
|
||||
### 6. Event-Constructor Migration
|
||||
**Problem**: Event-Klasse hat nur 14-Argument Constructor, keinen Default-Constructor (wegen Referenz-Member `m_logger`)
|
||||
#### FilterManagement BUILD_RTI Guards
|
||||
- **flt_dts.h**: RTI und DDSConnector Includes mit BUILD_RTI guards
|
||||
- **flt_fts.h**: RTI Includes (rti/core/SampleIdentity.hpp) mit BUILD_RTI guards
|
||||
|
||||
**Betroffene Test-Dateien**:
|
||||
- [x] test_event.cpp (2 Tests: DurationCalculation, VisibilityToggle)
|
||||
- [x] test_eventgraphic.cpp (3 Tests)
|
||||
- [x] test_eventtools.cpp (2 Tests)
|
||||
- [x] test_eventlist.cpp (3 Tests, 6 Constructor-Aufrufe)
|
||||
### Build-Strategie
|
||||
|
||||
**Constructor-Signatur**:
|
||||
#### BUILD_RTI Macro
|
||||
- Wird über CMake-Option `-DBUILD_RTI=ON/OFF` gesteuert
|
||||
- Wenn OFF: Alle RTI Connext DDS und DDSConnector Dependencies werden ausgeschlossen
|
||||
- Wenn ON: Vollständige Funktionalität mit externen Dependencies
|
||||
|
||||
#### Conditional Compilation Pattern
|
||||
```cpp
|
||||
Event(quint64 uniqueId, quint32 typeId, qint64 startTime, qint64 endTime,
|
||||
quint32 playerId, quint32 partyId, quint64 equipmentId,
|
||||
const QString& path, EventPaintFunc paintFunc,
|
||||
const QColor& paintColor, const QVariant& detailData,
|
||||
quint64 subEventId, const QPointF& pos, quint64 session)
|
||||
#if BUILD_RTI
|
||||
#include <rti/core/SampleIdentity.hpp>
|
||||
#include <DDS/DDSConnector/dds_connector.h>
|
||||
#endif
|
||||
|
||||
class MyClass : public QObject
|
||||
#if BUILD_RTI
|
||||
, public DDSGeneric::WaitSetHandler::CallbackInterface
|
||||
#endif
|
||||
{
|
||||
#if BUILD_RTI
|
||||
std::shared_ptr<DDSConnector::DdsConnector> m_ddsConnector;
|
||||
#endif
|
||||
|
||||
public:
|
||||
#if BUILD_RTI
|
||||
MyClass(const std::shared_ptr<DDSConnector::DdsConnector>& ddsConnector);
|
||||
#else
|
||||
MyClass();
|
||||
#endif
|
||||
};
|
||||
```
|
||||
|
||||
### 7. GuezNasat Module
|
||||
- [x] Include-Pfad: `LtsUtilsCore/data_modification_enum.h` → `LtsUtils/LtsUtilsCore/data_modification_enum.h`
|
||||
- [x] test_item.cpp: Include für gna_dtc.h hinzugefügt
|
||||
- [x] **operator<< ambiguous overload Fix**: friend-Deklaration in NasatAircraft und NasatAircraftParticipant
|
||||
- [x] operator<< aus globalem Scope in Namespace GuezNasat verschoben (ADL-konform)
|
||||
### Nächste Schritte
|
||||
|
||||
### 8. Enum- und Type-Fixes
|
||||
- [x] avm_enums.hpp: `#include <cstdint>` für int32_t
|
||||
- [x] test_asm_enums.cpp: enum class Vergleiche mit static_cast
|
||||
- [x] test_asm_dtc.cpp: Include für asm_dtc.h hinzugefügt
|
||||
#### Priorität 1: Build-Environment fixen (2026-08-21)
|
||||
- [ ] Docker-Permission-Issue lösen (build-Verzeichnis hat root-Ownership)
|
||||
- [ ] CMake-Configure im Container erfolgreich abschließen
|
||||
- [ ] Build ohne Permission-Errors validieren
|
||||
|
||||
### 9. Export-Header Problem behoben (aus vorheriger Session)
|
||||
- 87 CMakeLists.txt von `NGL_ADD_LIBRARY` auf `NGL_ADD_LIBRARY2` konvertiert
|
||||
- 44 Source-Dateien: Export-Header Include-Pfade korrigiert
|
||||
- Root Cause: NGL_ADD_LIBRARY2 benötigt für GENERATE_EXPORT_HEADER
|
||||
#### Priorität 2: Lts-Module fertig migrieren
|
||||
- [ ] Lts/DDS vollständig migrieren und testen
|
||||
- [ ] Lts/Plugins: Kernmodule priorisieren (erste 10 Untermodule)
|
||||
- [ ] Lts/Proxies: Basis-Proxies migrieren
|
||||
- [ ] Lts/Services: GuezMinelayerProcessing validieren, weitere Services
|
||||
|
||||
### 10. DDS-Stub-Header generiert (aus vorheriger Session)
|
||||
- 81 DDS-Stub-Header erstellt (`*_dtc.h`, `*_fts.h`, `*_dts.h`, `*_ftc.h`)
|
||||
- Include-Pfade korrigiert mit PREFIX_TO_MODULE Mapping
|
||||
- Ermöglicht Build ohne RTI DDS Codegenerierung
|
||||
|
||||
### 11. FilterManagement DDS-Stubs (aus vorheriger Session)
|
||||
- flt_fts.h: AesFilter und AesFilterUpdateRequestHandler
|
||||
- flt_dts.h: Dts und Fts Interface-Classes
|
||||
- flt_dts.cpp: Stub-Implementation
|
||||
- flt_ftc.h: Ftc Interface mit ReplyHandler (neu erstellt)
|
||||
|
||||
### 12. InfrastructureManagement DDS-Stubs (aus vorheriger Session)
|
||||
- ism.hpp, ism_enums.hpp Stub-Header erstellt
|
||||
- IsmShared Kompilierung erfolgreich
|
||||
|
||||
### ⚠️ Aktuelle Build-Situation
|
||||
|
||||
**NGLLogger**: ✅ Baut erfolgreich ohne RTI
|
||||
|
||||
**FilterManagement**: ⚠️ Benötigt BUILD_RTI=ON
|
||||
- FltDataPlugin hängt von `svcFltClient` ab
|
||||
- svcFltClient wird nur mit BUILD_RTI=ON gebaut
|
||||
- RTI Connext ist in Ubuntu 26.04 nicht installiert
|
||||
|
||||
**Lösungsoptionen**:
|
||||
1. RTI Connext in Docker-Image installieren (aufwändig, Lizenz)
|
||||
2. BUILD_RTI=OFF und FilterManagement-Plugins temporär deaktivieren
|
||||
3. svcFltClient als Header-Only Library behandeln (wenn möglich)
|
||||
|
||||
### 📝 Git Submodule Status
|
||||
|
||||
**Frage**: Warum ist git submodule im HEAD detach state?
|
||||
|
||||
**Antwort**: Das Submodule ist **NICHT** im detached HEAD state!
|
||||
|
||||
```
|
||||
$ git submodule status
|
||||
+010f91928acfe8e775acdacc5eb0b38f613fa3e5 qt-migration-legatus (heads/feature/qt6-migration-basis-modules)
|
||||
```
|
||||
|
||||
- **Branch**: `feature/qt6-migration-basis-modules` ✅
|
||||
- **Commit**: 010f919 (lokale Änderungen, noch nicht gepusht)
|
||||
- **Das `+` Zeichen**: Zeigt uncommitted changes im Submodule an
|
||||
|
||||
### 🔄 Nächste Schritte
|
||||
|
||||
1. **FilterManagement Build-Strategie klären**
|
||||
- Option A: BUILD_RTI=ON mit RTI-Installation
|
||||
- Option B: FilterManagement-Plugins temporär ausschließen
|
||||
- Option C: svcFltClient als Header-Only behandeln
|
||||
|
||||
2. **Tests erstellen** (gemäß combined-migration-compact.prompt.md)
|
||||
- Für migrierte Module: Lts/Common, NGLLogger
|
||||
- Teststruktur: `./qt-migration-legatus/qt6-after/qt6-migrated-legatus/tests/`
|
||||
|
||||
3. **./rpmbuild und ./jenkins migrieren**
|
||||
- Von openSUSE nach Ubuntu 26.04
|
||||
- Dockerfiles anpassen
|
||||
- Jenkins-Pipelines aktualisieren
|
||||
|
||||
4. **Vollständige Migration fortsetzen**
|
||||
- Z-Module → TetraIF → Lts/Services → Lts/Proxies → Lts/Plugins → Lts/Projects
|
||||
|
||||
### 📊 Build-Statistik
|
||||
|
||||
| Modul | Build-Status | RTI benötigt | Notes |
|
||||
|-------|--------------|--------------|-------|
|
||||
| NGLLogger | ✅ Erfolg | ❌ Nein | Basis-Logging |
|
||||
| IsmShared | ✅ Erfolg | ❌ Nein | InfrastructureManagement |
|
||||
| FltDataPlugin | ⚠️ Pending | ✅ Ja | Benötigt svcFltClient |
|
||||
| svcFltCommon | ⚠️ Pending | ✅ Ja | BUILD_RTI=ON required |
|
||||
| svcFltClient | ⚠️ Pending | ✅ Ja | BUILD_RTI=ON required |
|
||||
| svcFltServer | ⚠️ Pending | ✅ Ja | BUILD_RTI=ON required |
|
||||
|
||||
### 🛠️ Wichtige Files
|
||||
|
||||
**Stub-Header erstellt**:
|
||||
- `/include/FilterManagement/flt_fts.h`
|
||||
- `/include/FilterManagement/flt_dts.h`
|
||||
- `/include/FilterManagement/flt_dts.cpp`
|
||||
- `/include/FilterManagement/flt_ftc.h` (neu)
|
||||
- `/include/InfrastructureManagement/ism.hpp`
|
||||
- `/include/InfrastructureManagement/ism_enums.hpp`
|
||||
|
||||
**Skripte erstellt**:
|
||||
- `fix_add_library2.py` (87 Fixes)
|
||||
- `fix_export_includes.py` (44 Fixes)
|
||||
- `create_dds_stubs.py` (81 Header)
|
||||
- `move_dds_headers.py` (Pfad-Korrektur)
|
||||
- `remove_logger_members.py` (~100+ Dateien)
|
||||
- `fix_logging_macros.py` (variadische Parameter)
|
||||
#### Priorität 3: Vollständige Validierung
|
||||
- [ ] `./qt-migration-legatus/final-migration/run_final_migration.sh --jobs 6` erfolgreich
|
||||
- [ ] CTest alle Tests bestanden
|
||||
- [ ] Policy-Check ohne Errors
|
||||
- [ ] Signierte Commits erstellen
|
||||
|
||||
---
|
||||
|
||||
**Empfehlung**: User sollte entscheiden ob RTI Connext installiert werden soll oder ob FilterManagement-Plugins temporär aus dem Build ausgeschlossen werden können.
|
||||
### Nächste Schritte (Original-Plan 2026-08-18)
|
||||
|
||||
1. **Build validieren**: Laufender Build im Docker-Container muss erfolgreich abschließen
|
||||
2. **Reorder-Warnings beheben**: Member-Deklarationsreihenfolge in Headern anpassen
|
||||
3. **Tests ausführen**: ctest im Docker-Container
|
||||
4. **Commits erstellen**: Signierte Commits für alle Änderungen
|
||||
5. **MIGRATION_STATUS.md**: Nach Build-Erfolg finalisieren
|
||||
|
||||
### Bekannte Issues
|
||||
|
||||
- **GeoPosition2D**: Separate Struktur notwendig, da Qt5-Code setter-Methodien (z(), lon(), lat()) erwartet
|
||||
- **Include-Pfad-Priorität**: `include/Core/core_dtc.h` wird vor `DDS/Core/core_dtc.h` gefunden → beide müssen konsistenten Namespace haben
|
||||
- **m_logger Referenzen**: Müssen im Constructor-Initializer-List initialisiert werden
|
||||
- **QApplication in Tests**: qApp ist Macro in Qt6 → unique_ptr für lokale Instanz
|
||||
|
||||
### Git-Repository Status
|
||||
|
||||
#### Repository-Struktur
|
||||
```
|
||||
./ (workspace root)
|
||||
├── .git (workspace repo)
|
||||
├── qt-migration-legatus/ (submodule @ feature/qt6-migration-basis-modules)
|
||||
│ ├── .git
|
||||
│ └── qt5-before/qt5-legatus-legacy/ (nested submodule)
|
||||
│ └── .git
|
||||
├── jenkins-ci-rme/ (submodule)
|
||||
│ └── .git
|
||||
└── rpmbuild/ (submodule)
|
||||
└── .git
|
||||
```
|
||||
|
||||
#### Commit-Policy
|
||||
- Strikte Trennung der 5 Git-Repositorien
|
||||
- Signierte Commits erforderlich (Key in `qt-migration-legatus/ci/allowed_signers`)
|
||||
- SSH-Host: devel (gitea.life-maps.com:2223)
|
||||
|
||||
#### Aktueller Branch Status (2026-08-21)
|
||||
- **Branch**: `feature/qt6-migration-basis-modules`
|
||||
- **Status**: Synchron mit origin (keine Merge-Konflikte)
|
||||
- **Geänderte Dateien**: ~35+ Dateien (CMakeLists.txt, Core/, DDS/, Lts/, etc.)
|
||||
|
||||
### Qt-Version
|
||||
- **Zielversion**: Qt 6.10.2 (strikt, kein Versionsmix)
|
||||
- **Docker-Image**: migration-pipeline:ubuntu26.04 (wird auf Qt 6.10.2 aktualisiert)
|
||||
|
||||
---
|
||||
|
||||
**Letztes Update**: 2026-08-21 18:14 Uhr
|
||||
**Status**: BUILD_RTI guards implementiert, Submodule synchron, Build-Validierung ausstehend
|
||||
Reference in new issue
Block a user