File indexing completed on 2024-05-19 04:48:24
0001 #include "processmanager.h" 0002 #include <QProcess> 0003 #include <QDir> 0004 #include <QDebug> 0005 0006 #include "cmakeproject.h" 0007 0008 #include "processes/configureprocess.h" 0009 #include "cmakeprojectmanager.h" 0010 #include "cmakeprojectmanager.h" 0011 #include "projectpreferences.h" 0012 #include "projectmanager.h" 0013 #include "cmakeprojecttarget.h" 0014 0015 #include <MauiKit3/FileBrowsing/fmstatic.h> 0016 0017 ProcessManager::ProcessManager(CMakeProject *project) : QObject(project) 0018 ,m_project(project) 0019 ,m_configureProcess(new ConfigureProcess(project->manager ())) 0020 ,m_buildProcess(new QProcess(this)) 0021 ,m_deployProcess(new QProcess()) 0022 { 0023 0024 m_deployProcess->setReadChannel(QProcess::StandardOutput); 0025 m_deployProcess->setProcessChannelMode (QProcess:: ForwardedChannels); 0026 // Configure Process 0027 connect(m_configureProcess, &QProcess::readyReadStandardOutput,[this]() 0028 { 0029 // qWarning() << "Configure output" << m_configureProcess->readAllStandardOutput(); 0030 emit this->outputLine(m_configureProcess->readAllStandardOutput()); 0031 }); 0032 0033 connect(m_configureProcess, &QProcess::readyReadStandardError, [this](){ 0034 emit this->outputLine(m_buildProcess->readAllStandardError()); 0035 }); 0036 0037 connect(m_configureProcess, &QProcess::started,[this]() 0038 { 0039 qWarning() << "Configure step started" ; 0040 m_infoLabel = "Configuring project..."; 0041 emit this->infoLabelChanged(m_infoLabel); 0042 0043 m_configureStatus = Status::Running; 0044 emit this->configureStatusChanged(m_configureStatus); 0045 0046 m_processRunning = true; 0047 emit this->processRunningChanged(m_processRunning); 0048 }); 0049 0050 connect(m_configureProcess, &QProcess::errorOccurred,[this](QProcess::ProcessError error) 0051 { 0052 qWarning() << "Building error << " << error; 0053 m_configureStatus = Status::Error; 0054 emit this->configureStatusChanged (m_configureStatus); 0055 0056 emit this->outputLine(m_configureProcess->errorString()); 0057 }); 0058 0059 connect(m_configureProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [this](int exitCode, QProcess::ExitStatus status) 0060 { 0061 qWarning() << "Configure step finished" << exitCode; 0062 0063 if(status == QProcess::CrashExit) 0064 { 0065 m_infoLabel = QString("Error Configuring project: %1").arg(m_configureProcess->errorString ()); 0066 0067 m_configureStatus = Status::Error; 0068 0069 m_processRunning = false; 0070 0071 }else 0072 { 0073 m_infoLabel = QString("Configuring finished with %1").arg(QString::number(exitCode)); 0074 0075 m_configureStatus = exitCode == 0 ? Status::Finished : Status::Error; 0076 0077 m_processRunning = false; 0078 } 0079 0080 emit this->configureStatusChanged(m_configureStatus); 0081 emit this->processRunningChanged(m_processRunning); 0082 emit this->infoLabelChanged(m_infoLabel); 0083 0084 }); 0085 0086 // Build Process 0087 connect(m_buildProcess, &QProcess::readyReadStandardOutput,[this]() 0088 { 0089 // qWarning() << "Build output" << m_buildProcess->readAllStandardOutput(); 0090 emit this->outputLine(m_buildProcess->readAllStandardOutput()); 0091 }); 0092 0093 0094 0095 connect(m_buildProcess, &QProcess::readyReadStandardError, [this](){ 0096 emit this->outputLine(m_buildProcess->readAllStandardError()); 0097 }); 0098 0099 connect(m_buildProcess, &QProcess::started,[this]() 0100 { 0101 qWarning() << "Build step started" ; 0102 m_infoLabel = "Building project..."; 0103 emit this->infoLabelChanged(m_infoLabel); 0104 0105 m_buildStatus = Status::Running; 0106 emit this->buildStatusChanged(m_buildStatus); 0107 0108 m_processRunning = true; 0109 emit this->processRunningChanged(m_processRunning); 0110 }); 0111 0112 connect(m_buildProcess, &QProcess::errorOccurred,[this](QProcess::ProcessError error) 0113 { 0114 qWarning() << "Building error << " << error; 0115 m_buildStatus = Status::Error; 0116 emit this->buildStatusChanged (m_buildStatus); 0117 0118 emit this->outputLine(m_buildProcess->errorString()); 0119 }); 0120 0121 connect(m_buildProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [this](int exitCode, QProcess::ExitStatus status) 0122 { 0123 if(status == QProcess::CrashExit) 0124 { 0125 m_infoLabel = QString("Error Bulding project: %1").arg(m_buildProcess->errorString ()); 0126 0127 m_buildStatus = Status::Error; 0128 0129 m_processRunning = false; 0130 0131 }else 0132 { 0133 m_infoLabel = QString("Building finished with %1").arg(QString::number(exitCode)); 0134 0135 m_buildStatus = exitCode == 0 ? Status::Finished : Status::Error; 0136 0137 m_processRunning = false; 0138 } 0139 0140 emit this->buildStatusChanged (m_configureStatus); 0141 emit this->processRunningChanged(m_processRunning); 0142 emit this->infoLabelChanged(m_infoLabel); 0143 0144 }); 0145 0146 // Run Process 0147 connect(m_deployProcess, &QProcess::readyReadStandardOutput,[this]() 0148 { 0149 // qWarning() << "Run output" << m_deployProcess->readAllStandardOutput(); 0150 emit this->outputLine(m_deployProcess->readAll()); 0151 0152 }); 0153 0154 connect(m_deployProcess, &QProcess::readyReadStandardError, [this](){ 0155 emit this->outputLine(m_deployProcess->readAllStandardError()); 0156 }); 0157 0158 connect(m_deployProcess, &QProcess::started,[this]() 0159 { 0160 qWarning() << "Running step started" ; 0161 0162 m_infoLabel = "Running binary..."; 0163 emit this->infoLabelChanged(m_infoLabel); 0164 0165 m_deployStatus = Status::Running; 0166 emit this->deployStatusChanged(m_deployStatus); 0167 0168 m_processRunning = true; 0169 emit this->processRunningChanged(m_processRunning); 0170 }); 0171 0172 connect(m_deployProcess, &QProcess::errorOccurred,[this](QProcess::ProcessError error) 0173 { 0174 qWarning() << "Running binary error << " << error; 0175 m_deployStatus = Status::Error; 0176 emit this->deployStatusChanged (m_deployStatus); 0177 0178 emit this->outputLine(m_deployProcess->errorString()); 0179 }); 0180 0181 0182 connect(m_deployProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), [this](int exitCode, QProcess::ExitStatus status) 0183 { 0184 qWarning() << "Running step finished" << exitCode; 0185 if(status == QProcess::CrashExit) 0186 { 0187 m_infoLabel = QString("Error Deploying project: %1").arg(m_deployProcess->errorString ()); 0188 0189 m_deployStatus = Status::Error; 0190 0191 m_processRunning = false; 0192 0193 }else 0194 { 0195 m_infoLabel = QString("Deploying finished with %1").arg(QString::number(exitCode)); 0196 0197 m_deployStatus = exitCode == 0 ? Status::Finished : Status::Error; 0198 0199 m_processRunning = false; 0200 } 0201 0202 emit this->deployStatusChanged (m_deployStatus); 0203 emit this->processRunningChanged(m_processRunning); 0204 emit this->infoLabelChanged(m_infoLabel); 0205 }); 0206 } 0207 0208 ProcessManager::~ProcessManager() 0209 { 0210 stopDeploy (); 0211 m_deployProcess->deleteLater (); 0212 } 0213 0214 bool ProcessManager::processRunning() const 0215 { 0216 return m_processRunning; 0217 } 0218 0219 ProcessManager::Status ProcessManager::configureStatus() const 0220 { 0221 return m_configureStatus; 0222 } 0223 0224 ProcessManager::Status ProcessManager::buildStatus() const 0225 { 0226 return m_buildStatus; 0227 } 0228 0229 ProcessManager::Status ProcessManager::deployStatus() const 0230 { 0231 return m_deployStatus; 0232 } 0233 0234 bool ProcessManager::enabled() const 0235 { 0236 return m_enabled; 0237 } 0238 0239 QString ProcessManager::infoLabel() const 0240 { 0241 return m_infoLabel; 0242 } 0243 0244 void ProcessManager::build() 0245 { 0246 QMetaObject::Connection * const connection = new QMetaObject::Connection; 0247 *connection = connect(m_configureProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this, connection](int exitCode, QProcess::ExitStatus exitStatus) 0248 { 0249 qDebug() << "Configure step finished"; 0250 0251 if(exitStatus == QProcess::NormalExit) 0252 { 0253 qDebug() << "Configure step sucessfull, now build will start"; 0254 0255 buildStep(); 0256 }else 0257 { 0258 qWarning() << "Configure step failed " << exitCode << exitStatus; 0259 qWarning() << "Build step can not continue."; 0260 } 0261 0262 QObject::disconnect(*connection); 0263 delete connection; 0264 }, Qt::ConnectionType::UniqueConnection); 0265 0266 configure(); 0267 } 0268 0269 void ProcessManager::configure() 0270 { 0271 configureStep(); 0272 } 0273 0274 void ProcessManager::deploy() 0275 { 0276 QMetaObject::Connection * const connection = new QMetaObject::Connection; 0277 *connection = connect(m_buildProcess, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, [this, connection](int exitCode, QProcess::ExitStatus exitStatus) 0278 { 0279 qDebug() << "Build step finished"; 0280 0281 if(exitStatus == QProcess::NormalExit) 0282 { 0283 qDebug() << "Build step sucessfull, now run will start"; 0284 deployStep(); 0285 }else 0286 { 0287 qWarning() << "Build step failed " << exitCode << exitStatus; 0288 qWarning() << "Run step can not continue."; 0289 } 0290 0291 QObject::disconnect(*connection); 0292 delete connection; 0293 0294 }, Qt::ConnectionType::UniqueConnection); 0295 0296 build(); 0297 } 0298 0299 void ProcessManager::stopBuild() 0300 { 0301 m_buildProcess->terminate(); 0302 m_buildProcess->waitForFinished (); 0303 } 0304 0305 void ProcessManager::stopConfigure() 0306 { 0307 m_configureProcess->terminate(); 0308 m_configureProcess->waitForFinished (); 0309 } 0310 0311 void ProcessManager::stopDeploy() 0312 { 0313 m_deployProcess->terminate(); 0314 m_deployProcess->waitForFinished (); 0315 } 0316 0317 void ProcessManager::buildStep() 0318 { 0319 m_buildProcess->setWorkingDirectory(m_project->manager ()->root ()->preferences ()->buildDir ().toLocalFile()); 0320 m_buildProcess->start("make", QStringList()); 0321 } 0322 0323 void ProcessManager::configureStep() 0324 { 0325 m_configureProcess->prepare (); 0326 0327 this->m_enabled = true; 0328 emit this->enabledChanged(m_enabled); 0329 0330 m_configureProcess->start (); 0331 } 0332 0333 void ProcessManager::deployStep() 0334 { 0335 qDebug() << "Execute:" << m_project->target ()->artifacts ().first ().toString (); 0336 m_deployProcess->start(m_project->target ()->artifacts ().first ().toString (), QStringList()); 0337 }