diff --git a/.gitignore b/.gitignore index 7a5df63..55dfb7b 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,8 @@ snap/plugins/__pycache__/ *.snap \.buildconfig + +b/ +Build*/ + +*.stash diff --git a/source/CPP/buildmanager.cpp b/source/CPP/buildmanager.cpp index b72b2cd..dcaaa97 100644 --- a/source/CPP/buildmanager.cpp +++ b/source/CPP/buildmanager.cpp @@ -1,16 +1,31 @@ #include "buildmanager.h" #include +#include BuildManager::BuildManager(QObject *parent) : BaseClass(parent) { + connect(&pQMake, &QProcess::readyRead, this, &BuildManager::buildLog); + connect(&pQMake, SIGNAL(finished(int)), this, SLOT(buildFinihed(int))); } +void BuildManager::buildLog(){ + tempLog = pQMake.readAll(); + emit logChanged(); +} + +void BuildManager::buildFinihed(int error) { + if(pQMake.program() == "make" && !error){ + m_executablepath = tempBuildFolder + "/" + projectName; + emit finished(); + } +} + bool BuildManager::initQMake() { QDir dir(m_qtdir); - if(!dir.exists("/bin/qmake")){ + if(!dir.exists("bin/qmake")){ return false; } @@ -19,22 +34,52 @@ bool BuildManager::initQMake() { } +const QString& BuildManager::log() const{ + return tempLog; +} + bool BuildManager::initFolderName() { QDir dir(m_projectdir); if(!dir.cd("..")) { return false; } - - QFileInfoList filesList = dir.entryInfoList(".pro"); + QStringList filesList = findFilesInsideDir("*.pro", m_projectdir); if(filesList.size() < 1){ return false; } - - QString projectName = filesList.first().baseName(); + + QFile f(filesList.first()); + if(!f.open(QIODevice::ReadOnly | QIODevice::Text)){ + return false; + } + + QString proFile = f.readAll(); + f.close(); + + proFile.replace(" ", ""); + int tempIndex = proFile.indexOf(QRegExp("TARGET=") ); + if(tempIndex < 0){ + return false; + } + int beginTarget = tempIndex + 7; + + tempIndex = proFile.indexOf("\n", beginTarget); + int longTraget = -1; + + if(tempIndex >= 0){ + longTraget = tempIndex - beginTarget; + } + projectName = proFile.mid(beginTarget, longTraget); tempBuildFolder = dir.absolutePath() + "/Build-" + projectName; - if(!dir.exists(tempBuildFolder) && !dir.mkdir(tempBuildFolder)){ + if(dir.exists(tempBuildFolder) && !QDir(tempBuildFolder).removeRecursively()){ + + tempBuildFolder.clear(); + return false; + } + + if(!dir.mkdir(tempBuildFolder)){ tempBuildFolder.clear(); return false; } @@ -43,16 +88,25 @@ bool BuildManager::initFolderName() { } bool BuildManager::build(){ - if(initQMake() && initFolderName()){ + if(!initQMake() || !initFolderName()){ return false; } - - QProcess pQMake; - pQMake.setProgram(qmake); + pQMake.setWorkingDirectory(tempBuildFolder); + pQMake.setArguments(QStringList() << m_projectdir); - pQMake.setArguments(QStringList() << ); + pQMake.start(); + + if(!pQMake.waitForFinished()){ + return false; + } + + pQMake.setProgram("make"); + pQMake.setArguments(QStringList() << QString("-j%0").arg(QThread::idealThreadCount())); + pQMake.start(); + + return true; } diff --git a/source/CPP/buildmanager.h b/source/CPP/buildmanager.h index 5b57e6e..6d233f1 100644 --- a/source/CPP/buildmanager.h +++ b/source/CPP/buildmanager.h @@ -6,20 +6,32 @@ class BuildManager : public BaseClass { Q_OBJECT + Q_PROPERTY(QString log READ log NOTIFY logChanged) + private: QString qmake; QString tempBuildFolder; + QString tempLog; + QString projectName; + QProcess pQMake; + bool initFolderName(); bool initQMake(); +private slots: + void buildLog(); + void buildFinihed(int error); public: explicit BuildManager(QObject *parent = nullptr); bool build(); signals: + void logChanged(); + void finished(); public slots: + const QString& log() const; }; #endif // BUILDMANAGER_H diff --git a/source/CPP/mainmanager.cpp b/source/CPP/mainmanager.cpp index 9c667b2..59243db 100755 --- a/source/CPP/mainmanager.cpp +++ b/source/CPP/mainmanager.cpp @@ -10,7 +10,7 @@ QStringList MainManager::getAllExecutables() } MainManager::MainManager(CppManager *cpp, QmlManager *qml, OutputManager *out, - PluginManager *plg, QObject *parent) + PluginManager *plg, BuildManager* bld, QObject *parent) : BaseClass(parent) { setState(0); @@ -19,26 +19,31 @@ MainManager::MainManager(CppManager *cpp, QmlManager *qml, OutputManager *out, m_qml = qml; m_out = out; m_plg = plg; + m_bld = bld; + + connect(m_bld, &BuildManager::finished, this, &MainManager::buildFinished); } -void MainManager::prepare(const QString &qtdir, const QString &execpath, - const QString &projectdir, const QString &outdir) +void MainManager::buildFinished(){ + m_qml->start(); + m_plg->start(); + m_cpp->start(getAllExecutables()); +} + +void MainManager::prepare(const QString &qtdir, const QString &projectdir, const QString &outdir) { QStringList list; - list << qtdir << execpath << projectdir << outdir; + list << qtdir << projectdir << outdir; for (QString &S : list) if (S[S.count() - 1] == '/') S.remove(S.count() - 1, 1); m_qtdir = list[0]; - m_executablepath = list[1]; - m_projectdir = list[2]; - m_outputdir = list[3]; + m_projectdir = list[1]; + m_outputdir = list[2]; - m_qml->start(); - m_plg->start(); - m_cpp->start(getAllExecutables()); + m_bld->build(); } void MainManager::start(bool erase) diff --git a/source/CPP/mainmanager.h b/source/CPP/mainmanager.h index c58cf75..fbc6128 100755 --- a/source/CPP/mainmanager.h +++ b/source/CPP/mainmanager.h @@ -6,6 +6,7 @@ #include "outputmanager.h" #include "pluginmanager.h" #include "qmlmanager.h" +#include "buildmanager.h" class MainManager : public BaseClass { @@ -17,20 +18,24 @@ class MainManager : public BaseClass QmlManager *m_qml; PluginManager *m_plg; OutputManager *m_out; + BuildManager *m_bld; + int m_state; QStringList getAllExecutables(); +private slots: + void buildFinished(); + public: explicit MainManager(CppManager *cpp, QmlManager *qml, OutputManager *out, - PluginManager *plg, QObject *parent = nullptr); + PluginManager *plg, BuildManager* bld, QObject *parent = nullptr); int state() const; public slots: - void prepare(const QString &qtdir, const QString &execpath, - const QString &projectdir, const QString &outdir); + void prepare(const QString &qtdir, const QString &projectdir, const QString &outdir); void start(bool erase); diff --git a/source/QML/StartPage.qml b/source/QML/StartPage.qml index b95a76f..9f97a88 100755 --- a/source/QML/StartPage.qml +++ b/source/QML/StartPage.qml @@ -42,12 +42,10 @@ Page { text: qsTr("Next") Material.background: buttonColor Layout.alignment: Qt.AlignRight - enabled: qtdir.confirmed && execpath.confirmed - && projectdir.confirmed && outdir.confirmed + enabled: qtdir.confirmed && projectdir.confirmed && outdir.confirmed onClicked: { - MainManager.prepare(qtdir.content, execpath.content, - projectdir.content, outdir.content) + MainManager.prepare(qtdir.content, projectdir.content, outdir.content) prp.outdir = outdir.content swipeview.currentIndex = 1 diff --git a/source/main.cpp b/source/main.cpp index 5fa87d8..4c29411 100755 --- a/source/main.cpp +++ b/source/main.cpp @@ -9,6 +9,8 @@ #include "CPP/outputmanager.h" #include "CPP/pluginmanager.h" #include "CPP/qmlmanager.h" +#include "CPP/buildmanager.h" + bool loadTr(QGuiApplication &app){ QTranslator translator; @@ -37,8 +39,10 @@ int main(int argc, char *argv[]) QmlManager Q; PluginManager P; OutputManager O; + BuildManager B; - MainManager M(&C, &Q, &O, &P); + + MainManager M(&C, &Q, &O, &P, &B); QQmlApplicationEngine engine; @@ -48,6 +52,8 @@ int main(int argc, char *argv[]) R->setContextProperty("PluginManager", &P); R->setContextProperty("MainManager", &M); R->setContextProperty("OutputManager", &O); + R->setContextProperty("BuildManager", &B); + engine.load(QUrl(QLatin1String("qrc:/QML/main.qml")));