added build option

This commit is contained in:
Andrei Yankovich 2018-05-26 16:48:58 +03:00
parent b36f72eb9a
commit 75fae751b6
7 changed files with 114 additions and 29 deletions

5
.gitignore vendored
View File

@ -50,3 +50,8 @@ snap/plugins/__pycache__/
*.snap *.snap
\.buildconfig \.buildconfig
b/
Build*/
*.stash

View File

@ -1,16 +1,31 @@
#include "buildmanager.h" #include "buildmanager.h"
#include <QProcess> #include <QProcess>
#include <QThread>
BuildManager::BuildManager(QObject *parent) : BaseClass(parent) 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() { bool BuildManager::initQMake() {
QDir dir(m_qtdir); QDir dir(m_qtdir);
if(!dir.exists("/bin/qmake")){ if(!dir.exists("bin/qmake")){
return false; return false;
} }
@ -19,22 +34,52 @@ bool BuildManager::initQMake() {
} }
const QString& BuildManager::log() const{
return tempLog;
}
bool BuildManager::initFolderName() { bool BuildManager::initFolderName() {
QDir dir(m_projectdir); QDir dir(m_projectdir);
if(!dir.cd("..")) { if(!dir.cd("..")) {
return false; return false;
} }
QStringList filesList = findFilesInsideDir("*.pro", m_projectdir);
QFileInfoList filesList = dir.entryInfoList(".pro");
if(filesList.size() < 1){ if(filesList.size() < 1){
return false; 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; 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(); tempBuildFolder.clear();
return false; return false;
} }
@ -43,16 +88,25 @@ bool BuildManager::initFolderName() {
} }
bool BuildManager::build(){ bool BuildManager::build(){
if(initQMake() && initFolderName()){ if(!initQMake() || !initFolderName()){
return false; return false;
} }
QProcess pQMake;
pQMake.setProgram(qmake); 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;
} }

View File

@ -6,20 +6,32 @@
class BuildManager : public BaseClass class BuildManager : public BaseClass
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY(QString log READ log NOTIFY logChanged)
private: private:
QString qmake; QString qmake;
QString tempBuildFolder; QString tempBuildFolder;
QString tempLog;
QString projectName;
QProcess pQMake;
bool initFolderName(); bool initFolderName();
bool initQMake(); bool initQMake();
private slots:
void buildLog();
void buildFinihed(int error);
public: public:
explicit BuildManager(QObject *parent = nullptr); explicit BuildManager(QObject *parent = nullptr);
bool build(); bool build();
signals: signals:
void logChanged();
void finished();
public slots: public slots:
const QString& log() const;
}; };
#endif // BUILDMANAGER_H #endif // BUILDMANAGER_H

View File

@ -10,7 +10,7 @@ QStringList MainManager::getAllExecutables()
} }
MainManager::MainManager(CppManager *cpp, QmlManager *qml, OutputManager *out, MainManager::MainManager(CppManager *cpp, QmlManager *qml, OutputManager *out,
PluginManager *plg, QObject *parent) PluginManager *plg, BuildManager* bld, QObject *parent)
: BaseClass(parent) : BaseClass(parent)
{ {
setState(0); setState(0);
@ -19,26 +19,31 @@ MainManager::MainManager(CppManager *cpp, QmlManager *qml, OutputManager *out,
m_qml = qml; m_qml = qml;
m_out = out; m_out = out;
m_plg = plg; m_plg = plg;
m_bld = bld;
connect(m_bld, &BuildManager::finished, this, &MainManager::buildFinished);
} }
void MainManager::prepare(const QString &qtdir, const QString &execpath, void MainManager::buildFinished(){
const QString &projectdir, const QString &outdir) m_qml->start();
m_plg->start();
m_cpp->start(getAllExecutables());
}
void MainManager::prepare(const QString &qtdir, const QString &projectdir, const QString &outdir)
{ {
QStringList list; QStringList list;
list << qtdir << execpath << projectdir << outdir; list << qtdir << projectdir << outdir;
for (QString &S : list) for (QString &S : list)
if (S[S.count() - 1] == '/') S.remove(S.count() - 1, 1); if (S[S.count() - 1] == '/') S.remove(S.count() - 1, 1);
m_qtdir = list[0]; m_qtdir = list[0];
m_executablepath = list[1]; m_projectdir = list[1];
m_projectdir = list[2]; m_outputdir = list[2];
m_outputdir = list[3];
m_qml->start(); m_bld->build();
m_plg->start();
m_cpp->start(getAllExecutables());
} }
void MainManager::start(bool erase) void MainManager::start(bool erase)

View File

@ -6,6 +6,7 @@
#include "outputmanager.h" #include "outputmanager.h"
#include "pluginmanager.h" #include "pluginmanager.h"
#include "qmlmanager.h" #include "qmlmanager.h"
#include "buildmanager.h"
class MainManager : public BaseClass class MainManager : public BaseClass
{ {
@ -17,20 +18,24 @@ class MainManager : public BaseClass
QmlManager *m_qml; QmlManager *m_qml;
PluginManager *m_plg; PluginManager *m_plg;
OutputManager *m_out; OutputManager *m_out;
BuildManager *m_bld;
int m_state; int m_state;
QStringList getAllExecutables(); QStringList getAllExecutables();
private slots:
void buildFinished();
public: public:
explicit MainManager(CppManager *cpp, QmlManager *qml, OutputManager *out, explicit MainManager(CppManager *cpp, QmlManager *qml, OutputManager *out,
PluginManager *plg, QObject *parent = nullptr); PluginManager *plg, BuildManager* bld, QObject *parent = nullptr);
int state() const; int state() const;
public slots: public slots:
void prepare(const QString &qtdir, const QString &execpath, void prepare(const QString &qtdir, const QString &projectdir, const QString &outdir);
const QString &projectdir, const QString &outdir);
void start(bool erase); void start(bool erase);

View File

@ -42,12 +42,10 @@ Page {
text: qsTr("Next") text: qsTr("Next")
Material.background: buttonColor Material.background: buttonColor
Layout.alignment: Qt.AlignRight Layout.alignment: Qt.AlignRight
enabled: qtdir.confirmed && execpath.confirmed enabled: qtdir.confirmed && projectdir.confirmed && outdir.confirmed
&& projectdir.confirmed && outdir.confirmed
onClicked: { onClicked: {
MainManager.prepare(qtdir.content, execpath.content, MainManager.prepare(qtdir.content, projectdir.content, outdir.content)
projectdir.content, outdir.content)
prp.outdir = outdir.content prp.outdir = outdir.content
swipeview.currentIndex = 1 swipeview.currentIndex = 1

View File

@ -9,6 +9,8 @@
#include "CPP/outputmanager.h" #include "CPP/outputmanager.h"
#include "CPP/pluginmanager.h" #include "CPP/pluginmanager.h"
#include "CPP/qmlmanager.h" #include "CPP/qmlmanager.h"
#include "CPP/buildmanager.h"
bool loadTr(QGuiApplication &app){ bool loadTr(QGuiApplication &app){
QTranslator translator; QTranslator translator;
@ -37,8 +39,10 @@ int main(int argc, char *argv[])
QmlManager Q; QmlManager Q;
PluginManager P; PluginManager P;
OutputManager O; OutputManager O;
BuildManager B;
MainManager M(&C, &Q, &O, &P);
MainManager M(&C, &Q, &O, &P, &B);
QQmlApplicationEngine engine; QQmlApplicationEngine engine;
@ -48,6 +52,8 @@ int main(int argc, char *argv[])
R->setContextProperty("PluginManager", &P); R->setContextProperty("PluginManager", &P);
R->setContextProperty("MainManager", &M); R->setContextProperty("MainManager", &M);
R->setContextProperty("OutputManager", &O); R->setContextProperty("OutputManager", &O);
R->setContextProperty("BuildManager", &B);
engine.load(QUrl(QLatin1String("qrc:/QML/main.qml"))); engine.load(QUrl(QLatin1String("qrc:/QML/main.qml")));