3
#include "kdevmakebuilder.h"
5
#include <kdevproject.h>
7
#include <kdevmakefrontend.h>
9
#include <makeoptionswidget.h>
11
#include <kiconloader.h>
12
#include <kgenericfactory.h>
14
#include <kdialogbase.h>
21
K_EXPORT_COMPONENT_FACTORY(libkdevmakebuilder, KGenericFactory<KDevMakeBuilder>("kdevmakebuilder"))
24
const QString &KDevMakeBuilder::builder =
25
KGlobal::staticQString("/kdevprojectmanager/builder");
27
const QString &KDevMakeBuilder::makeTool =
28
KGlobal::staticQString("/kdevprojectmanager/builder/make/makebin");
30
const QString &KDevMakeBuilder::priority =
31
KGlobal::staticQString("/kdevprojectmanager/builder/make/prio");
33
const QString &KDevMakeBuilder::abortOnError =
34
KGlobal::staticQString("/kdevprojectmanager/builder/make/abortonerror");
36
const QString &KDevMakeBuilder::numberOfJobs =
37
KGlobal::staticQString("/kdevprojectmanager/builder/make/numberofjobs");
39
const QString &KDevMakeBuilder::dontAct =
40
KGlobal::staticQString("/kdevprojectmanager/builder/make/dontact");
42
const QString &KDevMakeBuilder::environment =
43
KGlobal::staticQString("/kdevprojectmanager/builder/make/envvars");
45
KDevMakeBuilder::KDevMakeBuilder(QObject *parent, const char *name, const QStringList &)
46
: KDevProjectBuilder(parent, name)
48
m_project = ::qt_cast<KDevProject*>(parent);
51
connect(project()->core(), SIGNAL(projectConfigWidget(KDialogBase*)),
52
this, SLOT(projectConfigWidget(KDialogBase*)));
54
if (KDevMakeFrontend *make = project()->extension<KDevMakeFrontend>("KDevelop/MakeFrontend")) {
55
connect(make, SIGNAL(commandFinished(const QString &)),
56
this, SLOT(commandFinished(const QString &)));
58
connect(make, SIGNAL(commandFailed(const QString &)),
59
this, SLOT(commandFailed(const QString &)));
63
KDevMakeBuilder::~KDevMakeBuilder()
67
KDevProject *KDevMakeBuilder::project() const
72
bool KDevMakeBuilder::isExecutable(ProjectItemDom dom) const
78
ProjectItemDom KDevMakeBuilder::defaultExecutable() const
80
return m_defaultExecutable;
83
void KDevMakeBuilder::setDefaultExecutable(ProjectItemDom dom)
85
m_defaultExecutable = dom;
88
bool KDevMakeBuilder::configure(ProjectItemDom dom)
94
bool KDevMakeBuilder::build(ProjectItemDom dom)
96
if (KDevMakeFrontend *make = project()->extension<KDevMakeFrontend>("KDevelop/MakeFrontend")) {
97
if (ProjectFolderDom folder = dom->toFolder()) {
98
// ### compile the folder
99
QString command = buildCommand(dom);
100
make->queueCommand(folder->name(), command);
101
m_commands.append(qMakePair(command, dom));
103
} else if (ProjectTargetDom target = dom->toTarget()) {
104
// ### compile the target
105
} else if (ProjectFileDom file = dom->toFile()) {
106
// ### compile the file
113
bool KDevMakeBuilder::clean(ProjectItemDom dom)
119
bool KDevMakeBuilder::execute(ProjectItemDom dom)
125
void KDevMakeBuilder::projectConfigWidget(KDialogBase *dlg)
129
QVBox *vbox = dlg->addVBoxPage(i18n("Make Options"), i18n("Make Options"), BarIcon( "make", KIcon::SizeMedium ));
130
MakeOptionsWidget *widget = new MakeOptionsWidget(*project()->projectDom(), builder, vbox);
131
connect(dlg, SIGNAL(okClicked()), widget, SLOT(accept()));
134
void KDevMakeBuilder::commandFinished(const QString &command)
136
if (!m_commands.isEmpty()) {
137
QPair<QString, ProjectItemDom> item = m_commands.first();
138
if (item.first == command) {
139
m_commands.pop_front();
140
emit builded(item.second);
145
void KDevMakeBuilder::commandFailed(const QString &command)
149
if (!m_commands.isEmpty()) {
156
QString KDevMakeBuilder::buildCommand(ProjectItemDom item, const QString &target)
158
QDomDocument &dom = *project()->projectDom();
160
QString cmdline = DomUtil::readEntry(dom, makeTool);
161
int prio = DomUtil::readIntEntry(dom, priority);
164
nice = QString("nice -n%1 ").arg(prio);
167
if (cmdline.isEmpty())
168
cmdline = MAKE_COMMAND;
169
if (!DomUtil::readBoolEntry(dom, abortOnError))
171
int jobs = DomUtil::readIntEntry(dom, numberOfJobs);
174
cmdline += QString::number(jobs);
176
if (DomUtil::readBoolEntry(dom, dontAct))
182
cmdline.prepend(nice);
183
cmdline.prepend(makeEnvironment());
185
Q_ASSERT(item->toFolder());
187
QString dircmd = "cd ";
188
QString dir = item->toFolder()->name();
189
dircmd += KProcess::quote(dir);
192
return dircmd + cmdline;
195
QString KDevMakeBuilder::makeEnvironment() const
197
DomUtil::PairList envvars =
198
DomUtil::readPairListEntry(*project()->projectDom(), environment, "envvar", "name", "value");
201
DomUtil::PairList::ConstIterator it;
202
for (it = envvars.begin(); it != envvars.end(); ++it) {
205
env += KProcess::quote((*it).second);