Compare commits

...
Author SHA1 Message Date
berrux-dev 3924b1e72b externel dependency 2026-10-23 16:28:08 +02:00
berrux-dev fb3e91ea4b Close Schusstafel + KDChart plugin floors: cesPluginGeoPairing/OreOnlineReportsGuiPlugin in GROUP12 (presence-gated), image bakes KDChart
DDS member fixes (GeoPairing, OnlineReports charts/dialogs); FindKDChart/FindSchusstafel find-module wiring
2026-10-22 13:16:23 +02:00
berrux-dev e067c21b0d Enable Codification/OHP/PlanEditor/OrgChart plugin groups (G12 225); harden new_docker_build.sh
First-build fixes (DDS members, Qt6 transitive WebChannel/PrintSupport drops, logger init, Qt5 guard); script: log_warn, BUILD_WLS default ON, Poppler image+APT, XmlPatterns 6.0 wording
2026-10-21 13:50:10 +02:00
berrux-dev 131a6714cf Restore BZip2 in nglcompression (legacy REQUIRED it)
Define HAVE_BZIP2 so the real impl compiles instead of the stub; link libbz2; nglcomp_test green
2026-10-21 10:18:32 +02:00
21 changed files with 448 additions and 110 deletions

No files matched your search

+1
View File
@@ -1,4 +1,5 @@
# export MIGRATE_PIPELINE_ROOT="/home/torsten/sandbox/qt6-migration-pipeline"
export MIGRATE_PIPELINE_ROOT="/home/nkana/repo/qt6-migration-pipeline"
export CLAUDE_CODE_MAX_OUTPUT_TOKENS=16000
export LANG=C.UTF-8
export LC_ALL=C.UTF-8
@@ -360,6 +360,37 @@ if(NOT Qt6_FOUND)
message(STATUS "Found Qt6 (minimal): ${Qt6Core_VERSION}")
endif()
# Qt6::XmlPatterns (consumed by the MSDL/Saab import libs, gated by
# BUILD_PLUGINS_MSDL / BUILD_PLUGINS_SAAB): the XmlPatterns module (its own
# qtxmlpatterns repo) was removed in Qt 6.0 and never re-introduced, so no Qt 6
# install carries it. It is NOT part of the component lists above (a missing
# component there would flip Qt6_FOUND off and disable the whole GUI path).
# Find it separately; when absent the two plugins must stay disabled - their
# CMakeLists reference Qt6::XmlPatterns in link libraries and CMake errors at
# generate time for an undefined namespaced target.
if(NOT TARGET Qt6::XmlPatterns)
find_package(Qt6XmlPatterns QUIET)
if(Qt6XmlPatterns_FOUND)
message(STATUS "Found Qt6XmlPatterns")
else()
message(STATUS "Qt6XmlPatterns not found (PpmMSDLGuiPlugin/PpmSAABGuiPlugin require it; keep BUILD_PLUGINS_MSDL/BUILD_PLUGINS_SAAB OFF)")
endif()
endif()
# Qt6::WebChannel (consumed by PpmOrgChartGuiPlugin's QWebChannel page setup):
# in Qt5 Qt5::WebEngineWidgets transitively linked Qt5::WebChannel (Qt5's
# webengine depended on webchannel), but Qt6 dropped that dependency, so the
# module must be found and linked explicitly. Separate QUIET find - never let
# a missing optional component flip Qt6_FOUND off.
if(NOT TARGET Qt6::WebChannel)
find_package(Qt6 6.2 COMPONENTS WebChannel QUIET)
if(Qt6WebChannel_FOUND)
message(STATUS "Found Qt6WebChannel")
else()
message(STATUS "Qt6WebChannel not found (PpmOrgChartGuiPlugin requires it; keep BUILD_PLUGINS_PARTICIPANT_ORG_CHART OFF)")
endif()
endif()
# Manual Qt6 configuration - create imported targets for available libraries
if(NOT TARGET Qt6::Core)
find_package(Qt6 6.2 COMPONENTS Core REQUIRED)
@@ -64,20 +64,20 @@ bool AssignCodificationDataTable::init(const std::shared_ptr<CodificationManagem
for (const ParticipantManagement::Party& party : std::as_const(userVisibleParties))
{
if (party.id() != 2 && party.id() != 3)
if (party.id != 2 && party.id != 3)
continue;
QString partyName;
if (party.id() == 2)
if (party.id == 2)
partyName = tr("OPFOR:");
else if (party.id() == 3)
else if (party.id == 3)
partyName = tr("BLUFOR:");
else
partyName = ParticipantManagement::trPartyName(party.name());
partyName = ParticipantManagement::trPartyName(party.name);
m_ui->partyLayout->addWidget(new QLabel(partyName, this), i, 0, 1, 1);
LtsWidgets::LtsComboBox* cb = new LtsWidgets::LtsComboBox(this);
cb->setProperty(QLatin1String("partyId").data(), party.id());
cb->setProperty(QLatin1String("partyId").data(), party.id);
m_tableVec.append(cb);
cb->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
cb->addItem(QStringLiteral("---"), 0);
@@ -88,7 +88,7 @@ bool AssignCodificationDataTable::init(const std::shared_ptr<CodificationManagem
m_model->data(m_model->index(row, CodificationDataOverviewModel::Id), Qt::DisplayRole));
DEBUG_LOG(m_logger)
<< "Init Combobox[" << row << "]: PartyId: " << party.id() << " Identifier: "
<< "Init Combobox[" << row << "]: PartyId: " << party.id << " Identifier: "
<< m_model->data(m_model->index(row, CodificationDataOverviewModel::Identifier), Qt::DisplayRole)
.toString()
<< " CodTabId: "
@@ -105,7 +105,7 @@ bool AssignCodificationDataTable::init(const std::shared_ptr<CodificationManagem
.toInt();
DEBUG_LOG(m_logger) << "Assignment[" << row << "]: assignedPartyId: " << assignedPartyId;
if (party.id() == assignedPartyId)
if (party.id == assignedPartyId)
{
tableId =
m_model->data(m_model->index(row, CodificationDataOverviewModel::Id), Qt::DisplayRole).toInt();
@@ -84,17 +84,17 @@ void DetailedChartModel::onDynamicParticipantDataChanged(const ParticipantManage
{
Q_UNUSED(modType);
const ParticipantManagement::StateInformation &stateInfo = m_config.ppmDtc->youngestStateInformation(data.stateHistory());
const ParticipantManagement::StateInformation &stateInfo = m_config.ppmDtc->youngestStateInformation(data.stateHistory);
if (!m_config.participantIds.contains(data.participantId()) ||
stateInfo.vulnerabilityState() > ProjectDataManagement::VulnerabilityState::VulnerabilityState_CatastrophicKill)
if (!m_config.participantIds.contains(data.participantId) ||
stateInfo.vulnerabilityState > ProjectDataManagement::VulnerabilityState::VulnerabilityState_CatastrophicKill)
return;
for (auto it = m_participantStates.begin(); it != m_participantStates.end(); ++it)
it.value() -= data.participantId();
it.value() -= data.participantId;
m_participantStates[stateInfo.vulnerabilityState()] += data.participantId();
m_participantStates[stateInfo.vulnerabilityState] += data.participantId;
emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
}
@@ -113,7 +113,7 @@ DetailedChartModel::DetailedChartModel(const AbstractChartModel::ChartConfig &co
auto cb = [this](const ParticipantManagement::DynamicParticipantData & data)
{
if (!m_config.participantIds.contains(data.participantId()))
if (!m_config.participantIds.contains(data.participantId))
return;
onDynamicParticipantDataChanged(data, DataModification::eAdded);
};
@@ -56,18 +56,18 @@ void SimpleChartModel::onDynamicParticipantDataChanged(const ParticipantManageme
{
Q_UNUSED(modType);
if (!m_config.participantIds.contains(data.participantId()))
if (!m_config.participantIds.contains(data.participantId))
return;
const ParticipantManagement::StateInformation &stateInfo = m_config.ppmDtc->youngestStateInformation(data.stateHistory());
const ParticipantManagement::StateInformation &stateInfo = m_config.ppmDtc->youngestStateInformation(data.stateHistory);
DEBUG_LOG(m_logger) << "Participant id = " << data.participantId();
DEBUG_LOG(m_logger) << "State Info Vulnerability = " << stateInfo.vulnerabilityState();
DEBUG_LOG(m_logger) << "Participant id = " << data.participantId;
DEBUG_LOG(m_logger) << "State Info Vulnerability = " << static_cast<int>(stateInfo.vulnerabilityState);
if (stateInfo.vulnerabilityState() < ProjectDataManagement::VulnerabilityState::VulnerabilityState_CatastrophicKill)
setCombatReady(data.participantId());
if (stateInfo.vulnerabilityState < ProjectDataManagement::VulnerabilityState::VulnerabilityState_CatastrophicKill)
setCombatReady(data.participantId);
else
setKilled(data.participantId());
setKilled(data.participantId);
emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
}
@@ -76,7 +76,7 @@ SimpleChartModel::SimpleChartModel(const AbstractChartModel::ChartConfig &config
, m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger()) {
auto cb = [this](const ParticipantManagement::DynamicParticipantData & data)
{
if (!m_config.participantIds.contains(data.participantId()))
if (!m_config.participantIds.contains(data.participantId))
return;
onDynamicParticipantDataChanged(data, DataModification::eAdded);
};
@@ -160,10 +160,10 @@ bool CreateReportDialog::apply()
{
ParticipantManagement::ParticipantData data = m_participantModel->getParticipantData(index);
if (data.id() != 0 &&
data.equipmentNumber().has_value() &&
typeIds.contains(data.typeId()))
participantIds.insert(data.id());
if (data.id != 0 &&
data.equipmentNumber.has_value() &&
typeIds.contains(data.typeId))
participantIds.insert(data.id);
}
@@ -54,7 +54,7 @@ ReportDialog::ReportDialog(const AbstractChartModel::ChartConfig &config, QWidge
for (int32_t participantId :config.participantIds)
{
ParticipantManagement::Participant participant = config.ppmDtc->participant(participantId);
ParticipantManagement::TypeClass typeClass = config.ppmDtc->type(participant.typeId()).typeClass();
ParticipantManagement::TypeClass typeClass = config.ppmDtc->type(participant.typeId).typeClass;
participantIdsByTypeClass[typeClass] += participantId;
}
@@ -22,7 +22,7 @@ bool TypeModel::init()
{
m_ppmDtc->types([this](const ParticipantManagement::Type &type)
{
if (m_ppmDtc->isTypeInUse(type.id()))
if (m_ppmDtc->isTypeInUse(type.id))
insertRow(type);
});
@@ -33,7 +33,7 @@ int TypeModel::getTypeId(const QModelIndex &index) const
{
if (!indexIsValid(index))
return -1;
return m_vecData.at(index.row()).id();
return m_vecData.at(index.row()).id;
}
QVariant TypeModel::data(const QModelIndex &index, int role) const
@@ -46,9 +46,9 @@ QVariant TypeModel::data(const QModelIndex &index, int role) const
switch (index.column())
{
case 0:
return ParticipantManagement::toString(entry.typeClass());
return ParticipantManagement::toString(entry.typeClass);
case 1:
return QString::fromStdString(entry.name());
return QString::fromStdString(entry.name);
}
return QVariant();
}
@@ -56,8 +56,8 @@ QVariant TypeModel::data(const QModelIndex &index, int role) const
bool TypeModel::isFiltered(const ParticipantManagement::Type &data, DataModification modType) const
{
Q_UNUSED(modType);
return (data.typeClass() == ParticipantManagement::TypeClass::Unit ||
data.typeClass() == ParticipantManagement::TypeClass::SupportUnit);
return (data.typeClass == ParticipantManagement::TypeClass::Unit ||
data.typeClass == ParticipantManagement::TypeClass::SupportUnit);
}
}
@@ -91,7 +91,10 @@ ADD_INTERFACE_LIBRARY(PpmDataPluginInterface
svcPpmCommon
)
IF(Qt5WebEngineWidgets_VERSION VERSION_GREATER 5.7.9)
# Qt6 Migration: legacy guarded on Qt5WebEngineWidgets_VERSION > 5.7.9; the
# Qt6 equivalent is that the Qt6::WebEngineWidgets target exists (consumer
# plugins are additionally gated by BUILD_PLUGINS_PARTICIPANT_ORG_CHART).
IF(TARGET Qt6::WebEngineWidgets)
#
# Combat Power Gui Plugin Interface
#
@@ -44,6 +44,9 @@ if(QT6_GUI_AVAILABLE)
${Qt6_Widgets}
Qt6::WebEngineCore
Qt6::WebEngineWidgets
# Qt6 Migration: Qt5::WebEngineWidgets transitively linked Qt5::WebChannel;
# Qt6 dropped that dependency, so link the module explicitly.
Qt6::WebChannel
LtsSession
NGLLogger
PUBLIC
@@ -2,6 +2,7 @@
#include "participant_org_chart.h"
#include "ui_participant_org_chart.h"
#include <NGLLogger/NGLLoggerBootstrap.h>
#include <QtWebEngineCore/QWebEngineSettings>
#include <Symbology/symbol_data_to_render_role.h>
@@ -16,9 +17,9 @@ namespace ParticipantManagement
inline bool compareState(const StateInformation &a,
const StateInformation &b)
{
if (a.stateTime() != b.stateTime())
return a.stateTime() < b.stateTime();
return a.vulnerabilityState() < b.vulnerabilityState();
if (a.stateTime != b.stateTime)
return a.stateTime < b.stateTime;
return a.vulnerabilityState < b.vulnerabilityState;
}
LtsParticipantsOrgChart::LtsParticipantsOrgChart(QWidget *parent)
@@ -32,6 +33,7 @@ LtsParticipantsOrgChart::LtsParticipantsOrgChart(QWidget *parent)
, m_dtc(nullptr)
, m_asbItc(nullptr)
, m_ui(new Ui::LtsParticipantsOrgChart)
, m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger())
{
m_ui->setupUi(this);
}
@@ -137,16 +139,16 @@ void LtsParticipantsOrgChart::loadParty(int partyId)
for (const ParticipantManagement::Participant &part : participantMap)
{
if (part.isDeleted() || part.partyId() != m_partyId)
if (part.isDeleted || part.partyId != m_partyId)
continue;
if (part.superiorId() == 0)
if (part.superiorId == 0)
{
root = part;
break;
}
}
if (root.inferiorIds().size() == 0)
if (root.inferiorIds.size() == 0)
{
m_dataSource = preDefThing;
m_ui->wevOrgChart->reload();
@@ -166,10 +168,10 @@ void LtsParticipantsOrgChart::loadParty(int partyId)
connect(m_participantOrgChart_MimeDataHelper.data(), &ParticipantOrgChart_MimeDataHelper::finished,
this, &LtsParticipantsOrgChart::onParticipantOrgChart_MimeDataHelperFinished);
m_participantOrgChart_MimeDataHelper->run(root.id(),
m_participantOrgChart_MimeDataHelper->run(root.id,
false,
AdvancedSymbology::roleToRole<>(m_dtc->party(m_partyId).role()),
QColor::fromRgb(QRgb(m_dtc->party(m_partyId).color())),
AdvancedSymbology::roleToRole<>(m_dtc->party(m_partyId).role),
QColor::fromRgb(QRgb(m_dtc->party(m_partyId).color)),
m_useSymData);
}
@@ -231,10 +233,10 @@ bool LtsParticipantsOrgChart::loadTemplate(int templateRootId)
connect(m_participantOrgChart_MimeDataHelper.data(), &ParticipantOrgChart_MimeDataHelper::finished,
this, &LtsParticipantsOrgChart::onParticipantOrgChart_MimeDataHelperFinished);
m_participantOrgChart_MimeDataHelper->run(root.templateId(),
m_participantOrgChart_MimeDataHelper->run(root.templateId,
false,
AdvancedSymbology::roleToRole<>(m_dtc->party(m_partyId).role()),
QColor::fromRgb(QRgb(m_dtc->party(m_partyId).color())),
AdvancedSymbology::roleToRole<>(m_dtc->party(m_partyId).role),
QColor::fromRgb(QRgb(m_dtc->party(m_partyId).color)),
false);
return true;
@@ -258,8 +260,8 @@ void LtsParticipantsOrgChart::updateParticipant(int participantId)
helper->run(participantId,
true,
AdvancedSymbology::roleToRole<>(m_dtc->party(m_partyId).role()),
QColor::fromRgb(QRgb(m_dtc->party(m_partyId).color())),
AdvancedSymbology::roleToRole<>(m_dtc->party(m_partyId).role),
QColor::fromRgb(QRgb(m_dtc->party(m_partyId).color)),
m_useSymData);
}
@@ -301,8 +303,7 @@ void LtsParticipantsOrgChart::getWholeHierarchy()
WebNofitifier::WebNofitifier(QObject *parent) : QObject(parent)
, m_currentJsonString(QString())
, m_updateString(QString())
, m_updateTimer(new QTimer(this)),
m_logger(NGL::NGLLoggerBootstrap::getNGLRootLogger()) {
, m_updateTimer(new QTimer(this)) {
connect(m_updateTimer, &QTimer::timeout, this, &WebNofitifier::onTimerTick);
}
@@ -97,7 +97,6 @@ signals:
private:
NGL::INGLLogger &m_logger;
int m_partyId;
bool m_useSymData;
bool m_isMenuEnabled;
@@ -114,6 +113,8 @@ NGL::INGLLogger &m_logger;
std::shared_ptr<ParticipantManagement::Interface::Dtc> m_dtc;
std::shared_ptr<AdvancedSymbology::ForeignDataInterface> m_asbItc;
Ui::LtsParticipantsOrgChart *m_ui;
NGL::INGLLogger &m_logger;
};
}
@@ -75,6 +75,9 @@ if(QT6_GUI_AVAILABLE)
LtsSessionData
NGLLogger
Qt6::Xml
# Qt6 Migration: Qt5::WebEngineWidgets transitively linked Qt5::PrintSupport
# (plan_editor.cpp includes <QtPrintSupport/QPrintDialog>); Qt6 dropped that.
Qt6::PrintSupport
ngltranslator
PUBLIC
@@ -23,7 +23,7 @@
#include <LtsUtils/LtsUtilsGui/LtsUtilsGuiDds/request_helper.h>
#include <flm_data_plugin_interface.h>
#include <Plugins/FileManagement/flm_data_plugin_interface.h>
#include <FileManagement/flm_explorer_gui_plugin_interface.h>
#include <ParticipantManagement/ppm_data_plugin_interface.h>
@@ -475,9 +475,9 @@ bool InterfaceImpl::fmsCreatePlan(bool clearGeometryModel)
FileManagement::FileContent fc = m_internal->m_flmDtc->fileContent(fileId);
m_internal->m_currentFolderId = fc.folderId();
m_internal->m_currentFolderId = fc.folderId;
m_internal->m_currentFileId = fileId;
m_internal->m_currentNameOfPlan = QString::fromStdString(fc.name());
m_internal->m_currentNameOfPlan = QString::fromStdString(fc.name);
QFileInfo fileInfo(m_internal->m_currentNameOfPlan);
m_internal->m_planEditor->setNameOfPlan(fileInfo.baseName());
@@ -511,7 +511,7 @@ bool InterfaceImpl::fmsModifyPlan(int fileId, bool saveAs)
}
FileManagement::FileContent fileContent = m_internal->m_flmDtc->fileContent(fileId);
bool differentUser = fileContent.operatorId() != LtsSessionData::LtsSessionData::getInstance()->getOperatorId();
bool differentUser = fileContent.operatorId != LtsSessionData::LtsSessionData::getInstance()->getOperatorId();
if (saveAs || differentUser)
{
@@ -527,8 +527,8 @@ bool InterfaceImpl::fmsModifyPlan(int fileId, bool saveAs)
}
QString nameOfPlan = QString::fromStdString(fileContent.name());
m_internal->m_currentFolderId = fileContent.folderId();
QString nameOfPlan = QString::fromStdString(fileContent.name);
m_internal->m_currentFolderId = fileContent.folderId;
m_internal->m_currentNameOfPlan = nameOfPlan;
m_internal->m_currentFileId = fileId;
@@ -592,7 +592,7 @@ void InterfaceImpl::fmsReadPlan()
m_internal->m_planEditor->onPlanReset();
FileManagement::FileContent fc = m_internal->m_flmDtc->fileContent(fileId);
QString nameOfPlan = QString::fromStdString(fc.name());
QString nameOfPlan = QString::fromStdString(fc.name);
if (content.size() == 0)
{
@@ -606,8 +606,8 @@ void InterfaceImpl::fmsReadPlan()
m_internal->m_planEditor->setPlan(content);
m_internal->m_currentNameOfPlan = nameOfPlan;
m_internal->m_currentFolderId = fc.folderId();
m_internal->m_currentFileId = fc.id();
m_internal->m_currentFolderId = fc.folderId;
m_internal->m_currentFileId = fc.id;
QFileInfo fileInfo(m_internal->m_currentNameOfPlan);
m_internal->m_planEditor->setNameOfPlan(fileInfo.baseName());
@@ -650,7 +650,7 @@ void InterfaceImpl::fmsImportPlan()
if (fileId > 0)
{
FileManagement::FileContent fc = m_internal->m_flmDtc->fileContent(fileId);
QString nameOfPlan = QString::fromStdString(fc.name());
QString nameOfPlan = QString::fromStdString(fc.name);
if (content.size() == 0)
{
ERROR_LOG(m_logger) << "Error plan [" << nameOfPlan << "] is empty";
@@ -690,7 +690,7 @@ bool InterfaceImpl::fmsWritePlan(bool saveAs)
FileManagement::FileContent planFileContent;
if (m_internal->m_flmDtc->getFile(FileManagement::FileType::TacticalPlan, m_internal->m_currentFolderId, m_internal->m_currentNameOfPlan, planFileContent))
m_internal->m_currentFileId = planFileContent.id();
m_internal->m_currentFileId = planFileContent.id;
}
if (saveAs || (m_internal->m_currentFileId <= 0))
@@ -726,7 +726,7 @@ void InterfaceImpl::fmsDeletePlan()
if (fileId > 0)
{
FileManagement::FileContent fc = m_internal->m_flmDtc->fileContent(fileId);
QString nameOfPlan = QString::fromStdString(fc.name());
QString nameOfPlan = QString::fromStdString(fc.name);
LtsWidgets::Button doIt = LtsWidgets::LtsMessageDialog::showMessage(
m_session->baseLayout()
@@ -753,7 +753,7 @@ void InterfaceImpl::fmsDeletePlan()
void InterfaceImpl::onPlanContentChanged(const FileManagement::FileContent &data, DataModification modType)
{
if (data.fileType() != FileManagement::FileType::TacticalPlan)
if (data.fileType != FileManagement::FileType::TacticalPlan)
return;
switch (modType)
@@ -761,7 +761,7 @@ void InterfaceImpl::onPlanContentChanged(const FileManagement::FileContent &data
case DataModification::eModified :
break;
case DataModification::eRemoved :
if (m_internal->m_currentFileId == data.id())
if (m_internal->m_currentFileId == data.id)
m_internal->m_currentFileId = -1;
break;
@@ -780,7 +780,7 @@ void InterfaceImpl::onIterateParticipantsSidc()
auto gatherUpSidc = [&participantSidcsInUse](const ParticipantManagement::Participant & data)
{
const QString &sidcCode = QString::fromStdString(data.symbol());
const QString &sidcCode = QString::fromStdString(data.symbol);
if (AdvancedSymbology::SidcCodec::isEncoded(sidcCode))
{
@@ -822,7 +822,7 @@ void InterfaceImpl::readSymbolFavouritesRequest(const QString &favName, QString
return;
}
int fileId = fileContent.id();
int fileId = fileContent.id;
QByteArray content;
if (!m_internal->m_flmGui->loadContent(fileId, content, true))
@@ -929,23 +929,23 @@ void InterfaceImpl::storeSymbolFavouritesRequest(const QString &favName, const Q
LtsWidgets::LtsMessageDialog::showMessage(m_session->baseLayout(), msg, m_internal->m_messageBoxTitle);
return;
}
if (!m_internal->m_flmGui->saveContent(favContent.id(), favXMLContent.toUtf8(), QString()))
if (!m_internal->m_flmGui->saveContent(favContent.id, favXMLContent.toUtf8(), QString()))
ERROR_LOG(m_logger) << "Cannot save symbol favourites in library";
}
else
{
favContent.name(favName.toStdString());
favContent.isTemplate(false);
favContent.isUsedBy(false);
favContent.usedBy(0);
favContent.folderId(folderId);
favContent.fileStatus(FileManagement::FileStatus::Valid);
favContent.fileCategory(FileManagement::FileCategory::Global);
favContent.fileType(FileManagement::FileType::OperatorFavourite);
favContent.exerciseId();
favContent.phaseId();
favContent.lastModified(QDateTime::currentMSecsSinceEpoch());
favContent.operatorId(LtsSessionData::LtsSessionData::getInstance()->getOperatorId());
favContent.name = favName.toStdString();
favContent.isTemplate = false;
favContent.isUsedBy = false;
favContent.usedBy = 0;
favContent.folderId = folderId;
favContent.fileStatus = FileManagement::FileStatus::Valid;
favContent.fileCategory = FileManagement::FileCategory::Global;
favContent.fileType = FileManagement::FileType::OperatorFavourite;
favContent.exerciseId = 0;
favContent.phaseId = 0;
favContent.lastModified = QDateTime::currentMSecsSinceEpoch();
favContent.operatorId = LtsSessionData::LtsSessionData::getInstance()->getOperatorId();
ERROR_LOG(m_logger) << "New file content = " << favXMLContent;
@@ -6,7 +6,7 @@
#include <PluginInterfaces/gui_plugin_interface.h>
#include <Lts/Common/ProjectConfig/project_defines.h>
#include <PlanEditor/PlanEditorPlugin/plan_editor_gui_plugin_interface.h>
#include <flm_data_plugin_interface.h>
#include <Plugins/FileManagement/flm_data_plugin_interface.h>
#include <QtCore/QObject>
@@ -136,24 +136,24 @@ void GeoPairing::calculateAirFire(const QByteArray &transparentData,
while (i.hasNext())
{
i.next();
SInt32 vulnerabilityState = i.value().vulnerabilityState;
Float64 lat = i.value().pos().lat() * 180 / M_PI;
Float64 lon = i.value().pos().lon() * 180 / M_PI;
SInt32 vulnerabilityState = static_cast<SInt32>(i.value().vulnerabilityState);
Float64 lat = i.value().pos.lat * 180 / M_PI;
Float64 lon = i.value().pos.lon * 180 / M_PI;
DEBUG_LOG(m_logger) << "GeoPairing::calculateAirFire"
<< "\nl_Updater->update : " << i.key()
<< "\n: participantId=" << i.value().participantId()
<< "\n participantTypeId= " << i.value().participantTypeId()
<< "\n: participantId=" << i.value().participantId
<< "\n participantTypeId= " << i.value().participantTypeId
<< "\n pos lat=" << lat
<< "\n lon=" << lon
<< "\n alt=" << i.value().pos().z()
<< "\n posTime=" << i.value().sampleTime()
<< "\n alt=" << i.value().pos.z
<< "\n posTime=" << i.value().sampleTime
<< "\n state=" << i.value().vulnerabilityState
<< "\n state (SInt32)=" << vulnerabilityState;
l_Updater->update(i.value().participantId(),
l_Updater->update(i.value().participantId,
lat,
lon,
i.value().pos().z(),
i.value().sampleTime() / 1000, //s
i.value().pos.z,
i.value().sampleTime / 1000, //s
vulnerabilityState);
}
@@ -225,7 +225,7 @@ void GeoPairing::calculateAirFire(const QByteArray &transparentData,
if (l_TargetFound != l_CachedTrackingState || l_TimeoutPassed)
{
// prepare response for player
m_reportTarget.playerId = i.value().participantId();
m_reportTarget.playerId = i.value().participantId;
m_reportTarget.sendData.clear();
m_reportTarget.sendData.append(0xEB); // Report Target Detection
@@ -843,11 +843,11 @@ bool GeoPairing::geoPairingData(const std::shared_ptr<N_Ballistic::BallisticServ
while (i.hasNext())
{
i.next();
DEBUG_LOG(m_logger) << i.key() << ": participantId=" << i.value().participantId()
<< " participantTypeId= " << i.value().participantTypeId()
<< " pos lat=" << i.value().pos().lat()
<< " pos lon=" << i.value().pos().lon()
<< " z=" << i.value().pos().z();
DEBUG_LOG(m_logger) << i.key() << ": participantId=" << i.value().participantId
<< " participantTypeId= " << i.value().participantTypeId
<< " pos lat=" << i.value().pos.lat
<< " pos lon=" << i.value().pos.lon
<< " z=" << i.value().pos.z;
}
@@ -5,9 +5,8 @@
# $Author$
#
# BZip2 stub - libbz2-dev not available, disable bzip2 support
SET(HAVE_BZIP2 FALSE)
MESSAGE(STATUS "BZip2 disabled - development headers not available")
# BZip2 (legacy REQUIRED it; defines HAVE_BZIP2 so the real impl compiles instead of the stub)
FIND_PACKAGE(BZip2 REQUIRED)
SET(nglcomp_SRCS
nglcomp_bzip2iodevice.cpp
@@ -25,8 +24,14 @@ NGL_TARGET_LINK_LIBRARIES(nglcompression
PRIVATE
Qt6::Concurrent
NGLLogger
${BZIP2_LIBRARIES}
)
# BZip2 disabled - no linking needed
NGL_TARGET_INCLUDE_DIRECTORIES(nglcompression
PRIVATE
${BZIP2_INCLUDE_DIR}
)
# Enable the real bzip2 impl (guard in nglcomp_bzip2iodevice.{h,cpp}); legacy always compiled it
TARGET_COMPILE_DEFINITIONS(nglcompression PRIVATE HAVE_BZIP2)
NGL_INSTALL_TARGET(nglcompression)
IF(BUILD_WS AND BUILD_TESTING)
@@ -24,7 +24,9 @@ IF(KDCHART_INCLUDE_DIRS AND KDCHART_LIBRARY)
ELSE()
FIND_PATH(KDCHART_INCLUDE_DIRS KDChart/kdchart_export.h)
FIND_LIBRARY(KDCHART_LIBRARY NAMES kdchart)
# KDChart's Qt6 builds install the lib as libkdchart-qt6.so (OUTPUT_NAME
# kdchart${_LIBRARY_QTID}); Qt5 builds (legacy env) use libkdchart.so.
FIND_LIBRARY(KDCHART_LIBRARY NAMES kdchart kdchart-qt6)
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(KDChart DEFAULT_MSG KDCHART_LIBRARY KDCHART_INCLUDE_DIRS)
@@ -25,16 +25,32 @@
# Prebuilt Schusstafel package (Schusstafel.h + libSchusstafel.{so,a}); see the
# external/ symlink pattern used by FindArcGIS (${CMAKE_SOURCE_DIR}/external,
# /workspace/external in the build container).
SET(_SCHUSSTAFEL_HINTS
"${CMAKE_SOURCE_DIR}/external/Schusstafel"
"/workspace/external/Schusstafel"
)
IF(SCHUSSTAFEL_INCLUDE_DIR AND SCHUSSTAFEL_LIBRARY)
SET(SCHUSSTAFEL_FOUND TRUE)
ELSE(SCHUSSTAFEL_INCLUDE_DIR AND SCHUSSTAFEL_LIBRARY)
FIND_PATH(SCHUSSTAFEL_INCLUDE_DIR Schusstafel.h)
FIND_LIBRARY_WITH_DEBUG(SCHUSSTAFEL_LIBRARY WIN32_DEBUG_POSTFIX d NAMES Schusstafel libSchusstafel)
FIND_PATH(SCHUSSTAFEL_INCLUDE_DIR Schusstafel.h HINTS ${_SCHUSSTAFEL_HINTS})
FIND_LIBRARY_WITH_DEBUG(SCHUSSTAFEL_LIBRARY WIN32_DEBUG_POSTFIX d NAMES Schusstafel libSchusstafel HINTS ${_SCHUSSTAFEL_HINTS})
INCLUDE(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Schusstafel DEFAULT_MSG SCHUSSTAFEL_LIBRARY SCHUSSTAFEL_INCLUDE_DIR)
MARK_AS_ADVANCED(SCHUSSTAFEL_INCLUDE_DIR SCHUSSTAFEL_LIBRARY)
ENDIF(SCHUSSTAFEL_INCLUDE_DIR AND SCHUSSTAFEL_LIBRARY)
# Imported target consumed by cesPluginGeoPairing ($<TARGET_EXISTS:Schusstafel::Schusstafel>):
# carries the include dir for #include <Schusstafel.h> and the lib for the ST_* symbols.
IF(SCHUSSTAFEL_FOUND AND NOT TARGET Schusstafel::Schusstafel)
ADD_LIBRARY(Schusstafel::Schusstafel UNKNOWN IMPORTED)
SET_PROPERTY(TARGET Schusstafel::Schusstafel PROPERTY INTERFACE_INCLUDE_DIRECTORIES "${SCHUSSTAFEL_INCLUDE_DIR}")
SET_PROPERTY(TARGET Schusstafel::Schusstafel PROPERTY IMPORTED_LOCATION "${SCHUSSTAFEL_LIBRARY}")
ENDIF()
+1
View File
@@ -0,0 +1 @@
/workspace/external/Schusstafel
@@ -36,7 +36,34 @@ BUILD_ARCGIS:
--arcgis / --no-arcgis Enable/disable BUILD_ARCGIS (default: OFF)
BUILD_CODIFICATION:
--codification / --no-codification Enable/disable BUILD_CODIFICATION (default: OFF, requires KDReports)
--codification / --no-codification Enable/disable BUILD_CODIFICATION (default: ON, requires KDReports)
BUILD_WLS:
--wls / --no-wls Enable/disable BUILD_WLS (default: ON; the
GROUP4 targets svcWirelessLocationSystem /
wlsJsonClientTest only exist when it is ON)
BUILD_FILTERMANAGEMENT:
--filtermanagement / --no-filtermanagement Enable/disable BUILD_FILTERMANAGEMENT (default: ON)
BUILD_PLUGINS_SERVICEMONITOR:
--servicemonitor / --no-servicemonitor Enable/disable BUILD_PLUGINS_SERVICEMONITOR (default: ON)
BUILD_WEBENGINE_PLUGINS:
--webengine-plugins / --no-webengine-plugins
Enable/disable the WebEngine-based plugins (PlanEditor,
OnlineHelp, ParticipantOrgChart). PlanEditor links
situationMap, so ON promotes BUILD_ARCGIS to ON. (default: ON)
BUILD_XMLPATTERNS_PLUGINS:
--xmlpatterns-plugins / --no-xmlpatterns-plugins
Enable/disable the XmlPatterns-based plugins (MSDL, Saab)
when Qt6XmlPatterns is present in the Qt install. Qt
removed the XmlPatterns module in Qt 6.0 ("What's New in
Qt 6.0" / Qt Wiki: removed, not planned to be
re-introduced; no Qt 6 release ships it, no aqt
module), so with a stock Qt 6.10.2 install these
plugins stay disabled (environmental floor). (default: ON)
Build groups:
--group1 / --no-group1 Enable/disable DDS core libraries build
@@ -77,6 +104,11 @@ Environment variable overrides:
BUILD_GRANTLEE=ON|OFF
BUILD_ARCGIS=ON|OFF
BUILD_CODIFICATION=ON|OFF
BUILD_FILTERMANAGEMENT=ON|OFF
BUILD_WLS=ON|OFF
BUILD_PLUGINS_SERVICEMONITOR=ON|OFF
BUILD_WEBENGINE_PLUGINS=ON|OFF
BUILD_XMLPATTERNS_PLUGINS=ON|OFF
BUILD_GROUP1=ON|OFF
BUILD_GROUP2=ON|OFF
BUILD_GROUP3=ON|OFF
@@ -107,7 +139,12 @@ Defaults:
BUILD_RTI=ON
BUILD_GRANTLEE=ON
BUILD_ARCGIS=OFF
BUILD_CODIFICATION=OFF
BUILD_CODIFICATION=ON
BUILD_FILTERMANAGEMENT=ON
BUILD_WLS=ON
BUILD_PLUGINS_SERVICEMONITOR=ON
BUILD_WEBENGINE_PLUGINS=ON
BUILD_XMLPATTERNS_PLUGINS=ON
BUILD_GROUP1=ON
BUILD_GROUP2=ON
BUILD_GROUP3=ON
@@ -147,6 +184,10 @@ log_info() {
printf 'INFO: %s\n' "$*"
}
log_warn() {
printf 'WARNING: %s\n' "$*" >&2
}
log_error() {
printf 'ERROR: %s\n' "$*" >&2
}
@@ -264,6 +305,12 @@ APT_PACKAGES=(
vlc-plugin-base
git
python3-pip
# Poppler-Qt6 (PDF support): Z/src/nglwidgets detects it via
# pkg_check_modules(POPPLER_QT6 poppler-qt6) - pkg-config must be present for
# the probe to run at all. FlmExplorerGuiPlugin's flm_preview_playback.cpp
# uses Poppler types unconditionally, so a green Group 12 build requires it.
pkg-config
libpoppler-qt6-dev
)
# INTERFACE libraries (header-only) are built automatically as dependencies
@@ -554,8 +601,8 @@ GROUP4_TARGETS=(
svcTabocServer
svcTrainingAreaBaseOC
serialtest
# Proxies module - WirelessLocationSystem (requires -DBUILD_WLS=ON, e.g. via
# --cmake_build_flags "-DBUILD_WLS=ON")
# Proxies module - WirelessLocationSystem (only exists when BUILD_WLS=ON,
# script default; see the --wls flag)
svcWirelessLocationSystem
wlsJsonClientTest
# Proxies module - Other
@@ -607,6 +654,16 @@ RUN pip3 install --break-system-packages --quiet aqtinstall && \
--outputdir ${QT_BASE_DIR} && \
rm -rf /root/.cache/Aqt
# Qt6 XmlPatterns (MSDL/Saab plugins) is intentionally NOT installed: Qt removed
# the XmlPatterns module in Qt 6.0 ("What's New in Qt 6.0" / Qt Wiki: removed and
# not planned to be re-introduced - unlike e.g. Multimedia/WebEngine which
# returned in 6.1/6.2; no Qt 6 release ships it, no aqt module). Mixing an
# out-of-tree libQt6XmlPatterns built against an older Qt with a 6.10 install
# would put two Qt minor versions in one
# process. MSDL/Saab therefore stay disabled with a stock Qt install; to enable
# them, install a Qt-version-matching XmlPatterns (lib + headers + cmake config)
# into ${QT_BASE_DIR}/${QT_VERSION}/${QT_ARCH_DIR} and pass --xmlpatterns-plugins.
# Install KDReports from source (apt package not available in Ubuntu 22.04/26.04)
# Try apt install first (will fail), then build from KDAB GitHub mirror
RUN apt-get install -y -qq libkdreports-dev 2>/dev/null || \
@@ -623,6 +680,31 @@ RUN apt-get install -y -qq libkdreports-dev 2>/dev/null || \
# includes resolve through the default /usr/local/include search path.
RUN ln -sfn KDReports-qt6 /usr/local/include/KDReports
# KDChart (KDAB, MIT) from source: FindKDChart RETURN()s without it, which skips
# OreOnlineReportsGuiPlugin (app requirement iid ore.onlinereports). The legacy
# env had a KDChart 2.6.0 Qt5 RPM; the Qt6 build needs a Qt6-compatible release.
# Pinned to the verified kdchart-3.0.0 tag (KDChart_QT6=true; needs the
# Gui/Widgets/PrintSupport/Svg Qt6 components above). ECM
# (extra-cmake-modules) is required: KDChart plain-include()s ECMGeneratePriFile
# for Qt > 6.2 and never find_package(ECM)s.
RUN apt-get update -qq && \
apt-get install -y -qq extra-cmake-modules && \
rm -rf /var/lib/apt/lists/* && \
git clone --depth 1 --branch kdchart-3.0.0 https://github.com/KDAB/KDChart.git /tmp/KDChart && \
cmake -S /tmp/KDChart -B /tmp/KDChart/build \
-DKDChart_QT6=true -DKDChart_EXAMPLES=false -DKDChart_TESTS=false -DKDChart_DOCS=false \
-DCMAKE_PREFIX_PATH=${QT_BASE_DIR}/${QT_VERSION}/${QT_ARCH_DIR} \
-DCMAKE_MODULE_PATH=/usr/share/ECM/modules \
-DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local && \
cmake --build /tmp/KDChart/build -j$(nproc) && \
cmake --install /tmp/KDChart/build && \
ldconfig && \
rm -rf /tmp/KDChart
# KDChart's Qt6 build installs headers under KDChart-qt6 (same -qt6 suffix
# pattern as KDReports); legacy sources include the <KDChart/...> prefix.
RUN ln -sfn KDChart-qt6 /usr/local/include/KDChart
CMD ["/bin/bash"]
EOF
@@ -670,7 +752,12 @@ BUILD_AAR="${BUILD_AAR:-ON}"
BUILD_RTI="${BUILD_RTI:-ON}"
BUILD_GRANTLEE="${BUILD_GRANTLEE:-ON}"
BUILD_ARCGIS="${BUILD_ARCGIS:-OFF}"
BUILD_CODIFICATION="${BUILD_CODIFICATION:-OFF}"
BUILD_CODIFICATION="${BUILD_CODIFICATION:-ON}"
BUILD_FILTERMANAGEMENT="${BUILD_FILTERMANAGEMENT:-ON}"
BUILD_WLS="${BUILD_WLS:-ON}"
BUILD_PLUGINS_SERVICEMONITOR="${BUILD_PLUGINS_SERVICEMONITOR:-ON}"
BUILD_WEBENGINE_PLUGINS="${BUILD_WEBENGINE_PLUGINS:-ON}"
BUILD_XMLPATTERNS_PLUGINS="${BUILD_XMLPATTERNS_PLUGINS:-ON}"
BUILD_GROUP1="${BUILD_GROUP1:-ON}"
BUILD_GROUP2="${BUILD_GROUP2:-ON}"
BUILD_GROUP3="${BUILD_GROUP3:-ON}"
@@ -802,6 +889,36 @@ while [[ $# -gt 0 ]]; do
--no-codification)
BUILD_CODIFICATION=OFF
;;
--wls)
BUILD_WLS=ON
;;
--no-wls)
BUILD_WLS=OFF
;;
--filtermanagement)
BUILD_FILTERMANAGEMENT=ON
;;
--no-filtermanagement)
BUILD_FILTERMANAGEMENT=OFF
;;
--servicemonitor)
BUILD_PLUGINS_SERVICEMONITOR=ON
;;
--no-servicemonitor)
BUILD_PLUGINS_SERVICEMONITOR=OFF
;;
--webengine-plugins)
BUILD_WEBENGINE_PLUGINS=ON
;;
--no-webengine-plugins)
BUILD_WEBENGINE_PLUGINS=OFF
;;
--xmlpatterns-plugins)
BUILD_XMLPATTERNS_PLUGINS=ON
;;
--no-xmlpatterns-plugins)
BUILD_XMLPATTERNS_PLUGINS=OFF
;;
--no-ctest)
RUN_CTEST=OFF
;;
@@ -870,6 +987,18 @@ BUILD_RTI="$(normalize_on_off "$BUILD_RTI" "BUILD_RTI")"
BUILD_GRANTLEE="$(normalize_on_off "$BUILD_GRANTLEE" "BUILD_GRANTLEE")"
BUILD_ARCGIS="$(normalize_on_off "$BUILD_ARCGIS" "BUILD_ARCGIS")"
BUILD_CODIFICATION="$(normalize_on_off "$BUILD_CODIFICATION" "BUILD_CODIFICATION")"
BUILD_FILTERMANAGEMENT="$(normalize_on_off "$BUILD_FILTERMANAGEMENT" "BUILD_FILTERMANAGEMENT")"
BUILD_WLS="$(normalize_on_off "$BUILD_WLS" "BUILD_WLS")"
BUILD_PLUGINS_SERVICEMONITOR="$(normalize_on_off "$BUILD_PLUGINS_SERVICEMONITOR" "BUILD_PLUGINS_SERVICEMONITOR")"
BUILD_WEBENGINE_PLUGINS="$(normalize_on_off "$BUILD_WEBENGINE_PLUGINS" "BUILD_WEBENGINE_PLUGINS")"
BUILD_XMLPATTERNS_PLUGINS="$(normalize_on_off "$BUILD_XMLPATTERNS_PLUGINS" "BUILD_XMLPATTERNS_PLUGINS")"
# PlanEditorGuiPlugin links situationMap (ArcGIS scope), so the WebEngine plugin
# set cannot configure without ArcGIS: promote BUILD_ARCGIS when it is enabled.
if [[ "${BUILD_WEBENGINE_PLUGINS}" == "ON" && "${BUILD_ARCGIS}" == "OFF" ]]; then
log_info "BUILD_WEBENGINE_PLUGINS=ON implies ArcGIS-scope targets (PlanEditorGuiPlugin -> situationMap): promoting BUILD_ARCGIS=ON"
BUILD_ARCGIS=ON
fi
BUILD_GROUP1="$(normalize_on_off "$BUILD_GROUP1" "BUILD_GROUP1")"
BUILD_GROUP2="$(normalize_on_off "$BUILD_GROUP2" "BUILD_GROUP2")"
BUILD_GROUP3="$(normalize_on_off "$BUILD_GROUP3" "BUILD_GROUP3")"
@@ -900,7 +1029,7 @@ fi
CMAKE_BUILD_FLAGS="${CMAKE_BUILD_FLAGS:-}"
# Export variables for Docker container
export BUILD_ALL BUILD_RTI BUILD_GRANTLEE BUILD_ARCGIS BUILD_CODIFICATION BUILD_GROUP1 BUILD_GROUP2 BUILD_GROUP3 BUILD_GROUP4 BUILD_GROUP5 BUILD_GROUP6 BUILD_GROUP7 BUILD_GROUP8 BUILD_GROUP9 BUILD_GROUP10 BUILD_GROUP11 BUILD_VIEWER_ONLY RUN_CTEST TESTS_ONLY INTEGRATION_TEST USE_PREBUILT_IMAGE BUILD_PREBUILT_IMAGE DELETE_PREBUILT_IMAGE DOCKER_IMAGE CMAKE_BUILD_FLAGS
export BUILD_ALL BUILD_RTI BUILD_GRANTLEE BUILD_ARCGIS BUILD_CODIFICATION BUILD_FILTERMANAGEMENT BUILD_WLS BUILD_PLUGINS_SERVICEMONITOR BUILD_WEBENGINE_PLUGINS BUILD_XMLPATTERNS_PLUGINS BUILD_GROUP1 BUILD_GROUP2 BUILD_GROUP3 BUILD_GROUP4 BUILD_GROUP5 BUILD_GROUP6 BUILD_GROUP7 BUILD_GROUP8 BUILD_GROUP9 BUILD_GROUP10 BUILD_GROUP11 BUILD_GROUP12 BUILD_VIEWER_ONLY RUN_CTEST TESTS_ONLY INTEGRATION_TEST USE_PREBUILT_IMAGE BUILD_PREBUILT_IMAGE DELETE_PREBUILT_IMAGE DOCKER_IMAGE CMAKE_BUILD_FLAGS
# Group 5: Viewer module targets (conditional on BUILD_ARCGIS)
# Note: LtsFileDialog excluded from viewer-only builds due to Group 4 dependencies (svcExmCommon, svcOpmCommon, svcFlmCommon)
@@ -1081,8 +1210,32 @@ GROUP11_TARGETS=(
# without these the app reports "App Requirements check failed" at startup.
# Plugin outputs land in build4/lib, the directory the loader scans.
# Excluded (environmental floors, not migration regressions):
# cesPluginGeoPairing - needs the external Schusstafel.h header (missing)
# cesPluginGeoPairing - needs the external Schusstafel package (prebuilt
# Schusstafel.h + libSchusstafel.so) at
# external/Schusstafel (see resolve_schusstafel); it is
# built when the package is present
# OreOnlineReportsGuiPlugin - needs KDChart (open-source, KDAB) under
# /usr/local; built from github.com/KDAB/KDChart tag
# kdchart-3.0.0 with -DKDChart_QT6=true (see
# resolve_kdchart), built when present
# BldInfoGuiPlugin - links BuildingViewerCommon (dtEntity/OSG SDK absent)
# BdvViewerGuiPlugin - links BuildingViewerCommon (same floor; CMake skips its
# subdirectory when BuildingViewerCommon is not built)
# PpmMSDLGuiPlugin - links Qt6::XmlPatterns; Qt removed the XmlPatterns
# PpmSAABGuiPlugin - module in Qt 6.0 (not re-introduced; no Qt 6 release
# ships it, incl. 6.10.2). With a stock Qt install the
# BUILD_PLUGINS_MSDL/SAAB flags resolve to OFF (see
# resolve_xmlpatterns)
# The Flt*/Smo* targets only exist when BUILD_FILTERMANAGEMENT /
# BUILD_PLUGINS_SERVICEMONITOR are ON (script defaults; see the cmake call).
# With them OFF the five unconditional GUI plugins (EvlEdit, PpmParticipantInfo,
# Pws, SrmReplayManagement, OpmSettings) also fail to link (they need the
# FilterManagement interface libs) - so these defaults are load-bearing.
# The PlanEditorGuiPlugin/OhpOnlineHelpViewerGuiPlugin/PpmOrgChartGuiPlugin
# targets only exist when BUILD_WEBENGINE_PLUGINS=ON (script default; ON also
# promotes BUILD_ARCGIS=ON because PlanEditorGuiPlugin links situationMap),
# and the Cod*/codTopicTypePlugin targets when BUILD_CODIFICATION=ON (script
# default; requires KDReports).
GROUP12_TARGETS=(
AesAirSupportGuiPlugin
AesBcContaminationGuiPlugin
@@ -1120,6 +1273,8 @@ GROUP12_TARGETS=(
CesParticipantMoveGuiPlugin
CesParticipantUASGuiPlugin
CmoDataPlugin
CodCodificationDataGuiPlugin
CodDataPlugin
DevGuiPlugin
EfmDataPlugin
EfmSoundAreaGuiPlugin
@@ -1137,6 +1292,10 @@ GROUP12_TARGETS=(
FlmComboBoxGuiPlugin
FlmDataPlugin
FlmExplorerGuiPlugin
FltAesGuiPlugin
FltDataPlugin
FltParticipantGuiPlugin
Fltbldg_cmpntGuiPlugin
FspGuiPlugin
GimDataPlugin
GimInfoGuiPlugin
@@ -1163,12 +1322,14 @@ GROUP12_TARGETS=(
NomEditGuiPlugin
ObdBaseDownloaderGuiPlugin
ObdDataPlugin
OhpOnlineHelpViewerGuiPlugin
OpmComboBoxGuiPlugin
OpmDataPlugin
OpmEditGuiPlugin
OpmLoginGuiPlugin
OpmOverviewGuiPlugin
OpmSettingsGuiPlugin
OreOnlineReportsGuiPlugin
OscDataPlugin
OscParticipantInfoGuiPlugin
OscSystemGuiPlugin
@@ -1176,10 +1337,12 @@ GROUP12_TARGETS=(
PdmChargeTableGuiPlugin
PdmComboBoxGuiPlugin
PdmDataPlugin
PlanEditorGuiPlugin
PlanOverlaysGuiPlugin
PpmComboBoxGuiPlugin
PpmDataPlugin
PpmOperationalPlaningGuiPlugin
PpmOrgChartGuiPlugin
PpmParticipantEditGuiPlugin
PpmParticipantInfoGuiPlugin
PpmParticipantTemplatesGuiPlugin
@@ -1210,6 +1373,10 @@ GROUP12_TARGETS=(
ScrScreenRecordingGuiPlugin
SitmapGuiPlugin
SituationMapScriptFilterGuiPlugin
SmoEquipmentErrorRegistrationGuiPlugin
SmoHgrAndMineSearchGuiPlugin
SmoMonitorsGuiPlugin
SmoSystemMonitorGuiPlugin
SrmDataPlugin
SrmReplayManagementGuiPlugin
SrpDataPlugin
@@ -1247,6 +1414,7 @@ GROUP12_TARGETS=(
cesPluginCES_NBC
cesPluginCesBuildings
cesPluginExplosions
cesPluginGeoPairing
cesPluginMineAreas
cesPluginMineLayingArtillery
cesPluginParticipantBuildings
@@ -1394,6 +1562,7 @@ BUILD_AAR="${BUILD_AAR:-ON}"
BUILD_RTI="${BUILD_RTI:-ON}"
BUILD_GRANTLEE="${BUILD_GRANTLEE:-ON}"
BUILD_ARCGIS="${BUILD_ARCGIS:-OFF}"
WITH_SCHUSSTAFEL="${WITH_SCHUSSTAFEL:-ON}"
BUILD_GROUP1="${BUILD_GROUP1:-ON}"
BUILD_GROUP2="${BUILD_GROUP2:-ON}"
BUILD_GROUP3="${BUILD_GROUP3:-ON}"
@@ -1415,6 +1584,10 @@ log_info() {
printf 'INFO: %s\n' "$*"
}
log_warn() {
printf 'WARNING: %s\n' "$*" >&2
}
install_qt6_packages() {
log_info "Installing Qt6 packages via aqtinstall"
@@ -1518,6 +1691,66 @@ if [[ "${BUILD_ARCGIS}" == "ON" ]]; then
fi
fi
# The MSDL/Saab plugins link Qt6::XmlPatterns. Qt removed the XmlPatterns
# module in Qt 6.0 ("What's New in Qt 6.0" removal table / Qt Wiki: removed and
# not planned to be re-introduced - unlike Multimedia/WebEngine, which returned
# in 6.1/6.2). No Qt 6 release (incl. 6.10.2) ships it and there is no aqt
# module. An out-of-tree libQt6XmlPatterns built against an older Qt would mix
# two Qt minor versions in one process (ABI risk), so with a stock Qt install
# the plugins are gated OFF. If a Qt-version-matching XmlPatterns (lib +
# headers + Qt6XmlPatterns cmake config) is placed into the Qt prefix, they
# enable automatically.
resolve_xmlpatterns() {
BUILD_XMLPATTERNS_EFFECTIVE="${BUILD_XMLPATTERNS_PLUGINS}"
if [[ "${BUILD_XMLPATTERNS_EFFECTIVE}" == "ON" ]]; then
if ls "${QT_BASE_DIR}/${QT_VERSION}/${QT_ARCH_DIR}/lib/libQt6XmlPatterns.so.6" >/dev/null 2>&1; then
log_info "Qt6XmlPatterns present in the Qt install - MSDL/Saab plugins will be built"
else
log_warn "Qt6XmlPatterns is not present in the Qt install (removed in Qt 6.0, not re-introduced) - keeping BUILD_PLUGINS_MSDL/BUILD_PLUGINS_SAAB OFF (ppm.msdl / ppm.saab stay unbuilt)"
BUILD_XMLPATTERNS_EFFECTIVE=OFF
fi
fi
}
resolve_xmlpatterns
# Schusstafel is a prebuilt external package (Schusstafel.h +
# libSchusstafel.so) provided at external/Schusstafel, mirroring the ArcGIS
# symlink pattern. cesPluginGeoPairing #includes Schusstafel.h unconditionally,
# so without the package WITH_SCHUSSTAFEL stays OFF and the target is dropped
# from Group 12 (environmental floor, not a migration regression).
resolve_schusstafel() {
WITH_SCHUSSTAFEL_EFFECTIVE="${WITH_SCHUSSTAFEL}"
if [[ "${WITH_SCHUSSTAFEL_EFFECTIVE}" == "ON" ]]; then
if ls /workspace/external/Schusstafel/Schusstafel.h >/dev/null 2>&1; then
log_info "Schusstafel present at /workspace/external/Schusstafel - cesPluginGeoPairing will be built"
else
log_warn "Schusstafel not present at /workspace/external/Schusstafel - keeping WITH_SCHUSSTAFEL OFF (cesPluginGeoPairing stays unbuilt)"
WITH_SCHUSSTAFEL_EFFECTIVE=OFF
fi
fi
}
# KDChart (KDAB, MIT) is an open-source Qt charts extension, installed under
# /usr/local (header KDChart/kdchart_export.h + libkdchart.so; FindKDChart
# searches /usr/local by default). The legacy env had a KDChart 2.6.0 Qt5 RPM;
# the Qt6 build needs a Qt6-compatible release (e.g. github.com/KDAB/KDChart
# tag kdchart-3.0.0 with -DKDChart_QT6=true). OreOnlineReportsGuiPlugin's
# CMake RETURN()s when KDChart is absent, so without it the plugin (iid
# ore.onlinereports) stays unbuilt - environmental floor.
resolve_kdchart() {
KDCHART_PRESENT=OFF
if [[ -f /usr/local/include/KDChart/kdchart_export.h ]]; then
KDCHART_PRESENT=ON
log_info "KDChart present at /usr/local - OreOnlineReportsGuiPlugin will be built"
else
log_warn "KDChart not present at /usr/local - OreOnlineReportsGuiPlugin stays unbuilt (legacy KDChart 2.6.0 was a Qt5 RPM; build a Qt6-compatible release from source to close this floor)"
fi
}
resolve_schusstafel
resolve_kdchart
cd /workspace/qt-migration-legatus/qt6-after/qt6-migrated-legatus
rm -rf build4
@@ -1535,6 +1768,15 @@ cmake .. \
-DBUILD_GRANTLEE="${BUILD_GRANTLEE}" \
-DBUILD_ARCGIS="${BUILD_ARCGIS}" \
-DBUILD_CODIFICATION="${BUILD_CODIFICATION}" \
-DBUILD_FILTERMANAGEMENT="${BUILD_FILTERMANAGEMENT}" \
-DBUILD_WLS="${BUILD_WLS}" \
-DBUILD_PLUGINS_SERVICEMONITOR="${BUILD_PLUGINS_SERVICEMONITOR}" \
-DBUILD_PLUGINS_PLANEDITOR="${BUILD_WEBENGINE_PLUGINS}" \
-DBUILD_PLUGINS_ONLINEHELP="${BUILD_WEBENGINE_PLUGINS}" \
-DBUILD_PLUGINS_PARTICIPANT_ORG_CHART="${BUILD_WEBENGINE_PLUGINS}" \
-DBUILD_PLUGINS_MSDL="${BUILD_XMLPATTERNS_EFFECTIVE}" \
-DBUILD_PLUGINS_SAAB="${BUILD_XMLPATTERNS_EFFECTIVE}" \
-DWITH_SCHUSSTAFEL="${WITH_SCHUSSTAFEL_EFFECTIVE}" \
${CMAKE_BUILD_FLAGS:-} \
-DCMAKE_CXX_STANDARD=17 \
-DCMAKE_BUILD_TYPE=Release \
@@ -1553,6 +1795,30 @@ read -r -a GROUP10_ARRAY <<< "${GROUP10_TARGETS}"
read -r -a GROUP11_ARRAY <<< "${GROUP11_TARGETS}"
read -r -a GROUP12_ARRAY <<< "${GROUP12_TARGETS}"
# cesPluginGeoPairing #includes Schusstafel.h unconditionally - drop it from
# Group 12 when the Schusstafel package is unavailable (environmental floor).
if [[ "${WITH_SCHUSSTAFEL_EFFECTIVE}" != "ON" ]]; then
_GROUP12_ARRAY=()
for _t in "${GROUP12_ARRAY[@]}"; do
if [[ "${_t}" != "cesPluginGeoPairing" ]]; then
_GROUP12_ARRAY+=("${_t}")
fi
done
GROUP12_ARRAY=("${_GROUP12_ARRAY[@]}")
fi
# OreOnlineReportsGuiPlugin RETURN()s at configure when KDChart is absent -
# drop it from Group 12 in that case (environmental floor, see resolve_kdchart).
if [[ "${KDCHART_PRESENT}" != "ON" ]]; then
_GROUP12_ARRAY=()
for _t in "${GROUP12_ARRAY[@]}"; do
if [[ "${_t}" != "OreOnlineReportsGuiPlugin" ]]; then
_GROUP12_ARRAY+=("${_t}")
fi
done
GROUP12_ARRAY=("${_GROUP12_ARRAY[@]}")
fi
if [[ "${TESTS_ONLY}" != "ON" ]]; then
if [[ "${BUILD_VIEWER_ONLY}" == "ON" ]]; then
log_info "BUILD_VIEWER_ONLY enabled - skipping Groups 1-4, building only Viewer module targets"
@@ -1605,6 +1871,11 @@ docker run --rm \
-e BUILD_GRANTLEE \
-e BUILD_ARCGIS \
-e BUILD_CODIFICATION \
-e BUILD_FILTERMANAGEMENT \
-e BUILD_WLS \
-e BUILD_PLUGINS_SERVICEMONITOR \
-e BUILD_WEBENGINE_PLUGINS \
-e BUILD_XMLPATTERNS_PLUGINS \
-e BUILD_GROUP1 \
-e BUILD_GROUP2 \
-e BUILD_GROUP3 \