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
\.buildconfig
b/
Build*/
*.stash

View File

@ -1,16 +1,31 @@
#include "buildmanager.h"
#include <QProcess>
#include <QThread>
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;
}

View File

@ -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

View File

@ -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)

View File

@ -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);

View File

@ -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

View File

@ -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")));