summaryrefslogtreecommitdiff
path: root/src/plugins
diff options
context:
space:
mode:
authordt <qtc-commiter@nokia.com>2008-12-09 14:13:29 +0100
committerdt <qtc-commiter@nokia.com>2008-12-09 14:13:29 +0100
commit7d4dab15a5823c88a7e1911c6c4e7c90d995e12d (patch)
tree0c2fb77563211715de26f22c8ac53168bd11e424 /src/plugins
parent7411d9db55404f83a7a649f682e0cd987cdd2718 (diff)
downloadqt-creator-7d4dab15a5823c88a7e1911c6c4e7c90d995e12d.tar.gz
Fixes: Some running support for cmake
Task: - RevBy: - AutoTest: - Details: Note: I need to refactor the code significantly, i'm more or less convinced that one build configuration per target is wrong. We probably want one build configuration per build directory and instead build all targets that we are interested then in the makestep. This means we won't have any cmake support for the beta.
Diffstat (limited to 'src/plugins')
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeproject.cpp136
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeproject.h19
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectconstants.h1
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro6
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp2
-rw-r--r--src/plugins/cmakeprojectmanager/cmakestep.cpp5
-rw-r--r--src/plugins/projectexplorer/runconfiguration.h2
7 files changed, 144 insertions, 27 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index 5569c900f2..6e4cdfa59e 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -36,10 +36,13 @@
#include "cmakeprojectnodes.h"
#include "cmakestep.h"
#include "makestep.h"
+#include "cmakerunconfiguration.h"
#include <extensionsystem/pluginmanager.h>
#include <cpptools/cppmodelmanagerinterface.h>
+#include <QProcess>
+#include <QDir>
#include <QtCore/QDebug>
using namespace CMakeProjectManager;
@@ -48,20 +51,31 @@ using namespace CMakeProjectManager::Internal;
CMakeProject::CMakeProject(CMakeManager *manager, const QString &fileName)
: m_manager(manager), m_fileName(fileName), m_rootNode(new CMakeProjectNode(m_fileName))
{
- //TODO
+
m_file = new CMakeFile(this, fileName);
QDir dir = QFileInfo(m_fileName).absoluteDir();
QString cbpFile = findCbpFile(dir);
if (cbpFile.isEmpty())
cbpFile = createCbpFile(dir);
+ //TODO move this parsing to a seperate method, which is also called if the CMakeList.txt is updated
CMakeCbpParser cbpparser;
if (cbpparser.parseCbpFile(cbpFile)) {
+ // TODO do a intelligent updating of the tree
buildTree(m_rootNode, cbpparser.fileList());
foreach(ProjectExplorer::FileNode *fn, cbpparser.fileList())
m_files.append(fn->path());
m_files.sort();
+ m_targets = cbpparser.targets();
+ qDebug()<<"Printing targets";
+ foreach(CMakeTarget ct, m_targets) {
+ qDebug()<<ct.title<<" with executable:"<<ct.executable;
+ qDebug()<<"WD:"<<ct.workingDirectory;
+ qDebug()<<ct.makeCommand<<ct.makeCleanCommand;
+ qDebug()<<"";
+ }
+
CppTools::CppModelManagerInterface *modelmanager = ExtensionSystem::PluginManager::instance()->getObject<CppTools::CppModelManagerInterface>();
if (modelmanager) {
CppTools::CppModelManagerInterface::ProjectInfo pinfo = modelmanager->projectInfo(this);
@@ -69,6 +83,7 @@ CMakeProject::CMakeProject(CMakeManager *manager, const QString &fileName)
// TODO we only want C++ files, not all other stuff that might be in the project
pinfo.sourceFiles = m_files;
// TODO defines
+ // TODO gcc preprocessor files
modelmanager->updateProjectInfo(pinfo);
}
} else {
@@ -96,16 +111,20 @@ QString CMakeProject::findCbpFile(const QDir &directory)
return QString::null;
}
-
-QString CMakeProject::createCbpFile(const QDir &)
+QString CMakeProject::createCbpFile(const QDir &directory)
{
- // TODO create a cbp file.
- // Issue: Where to create it? We want to do that in the build directory
- // but at this stage we don't know the build directory yet
- // So create it in a temp directory?
- // Issue: We want to reuse whatever CMakeCache.txt that is alread there, which
- // would indicate, creating it in the build directory
- // Or we could use a temp directory and use -C builddirectory
+ // We create a cbp file, only if we didn't find a cbp file in the base directory
+ // Yet that can still override cbp files in subdirectories
+ // And we are creating tons of files in the source directories
+ // All of that is not really nice.
+ // The mid term plan is to move away from the CodeBlocks Generator and use our own
+ // QtCreator generator, which actually can be very similar to the CodeBlock Generator
+
+ // TODO we need to pass on the same paremeters as the cmakestep
+ QProcess cmake;
+ cmake.setWorkingDirectory(directory.absolutePath());
+ cmake.start("cmake", QStringList() << "-GCodeBlocks - Unix Makefiles");
+
return QString::null;
}
@@ -227,27 +246,35 @@ QStringList CMakeProject::files(FilesMode fileMode) const
void CMakeProject::saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer)
{
// TODO
- Q_UNUSED(writer);
+ Project::saveSettingsImpl(writer);
}
void CMakeProject::restoreSettingsImpl(ProjectExplorer::PersistentSettingsReader &reader)
{
// TODO
- Q_UNUSED(reader);
+ Project::restoreSettingsImpl(reader);
if (buildConfigurations().isEmpty()) {
// No build configuration, adding those
-
- // TODO do we want to create one build configuration per target?
- // or how do we want to handle that?
-
CMakeStep *cmakeStep = new CMakeStep(this);
MakeStep *makeStep = new MakeStep(this);
insertBuildStep(0, cmakeStep);
insertBuildStep(1, makeStep);
- addBuildConfiguration("all");
+ // Create build configurations of m_targets
+ qDebug()<<"Create build configurations of m_targets";
+ foreach(const CMakeTarget &ct, m_targets) {
+ addBuildConfiguration(ct.title);
+ makeStep->setValue(ct.title, "makeCommand", ct.makeCommand);
+ makeStep->setValue(ct.title, "makeCleanCommand", ct.makeCleanCommand);
+
+ QSharedPointer<ProjectExplorer::RunConfiguration> rc(new CMakeRunConfiguration(this, ct.executable, ct.workingDirectory));
+ // TODO set build configuration to build before it can be run
+ addRunConfiguration(rc);
+ setActiveRunConfiguration(rc); // TODO what exactly shall be the active run configuration?
+ }
setActiveBuildConfiguration("all");
+
}
// Restoring is fine
}
@@ -394,14 +421,16 @@ void CMakeCbpParser::parseBuild()
void CMakeCbpParser::parseTarget()
{
- m_targetOutput.clear();
m_targetType = false;
+ m_target.clear();
+
+ if (attributes().hasAttribute("title"))
+ m_target.title = attributes().value("title").toString();
while(!atEnd()) {
readNext();
if (isEndElement()) {
- if (m_targetType && !m_targetOutput.isEmpty()) {
- qDebug()<<"found target "<<m_targetOutput;
- m_targets.insert(m_targetOutput);
+ if (m_targetType || m_target.title == "all") {
+ m_targets.append(m_target);
}
return;
} else if (name() == "Compiler") {
@@ -417,9 +446,57 @@ void CMakeCbpParser::parseTarget()
void CMakeCbpParser::parseTargetOption()
{
if (attributes().hasAttribute("output"))
- m_targetOutput = attributes().value("output").toString();
+ m_target.executable = attributes().value("output").toString();
else if (attributes().hasAttribute("type") && attributes().value("type") == "1")
m_targetType = true;
+ else if (attributes().hasAttribute("working_dir"))
+ m_target.workingDirectory = attributes().value("working_dir").toString();
+ while(!atEnd()) {
+ readNext();
+ if (isEndElement()) {
+ return;
+ } else if (name() == "MakeCommand") {
+ parseMakeCommand();
+ } else if (isStartElement()) {
+ parseUnknownElement();
+ }
+ }
+}
+
+void CMakeCbpParser::parseMakeCommand()
+{
+ while(!atEnd()) {
+ readNext();
+ if (isEndElement()) {
+ return;
+ } else if (name() == "Build") {
+ parseTargetBuild();
+ } else if (name() == "Clean") {
+ parseTargetClean();
+ } else if (isStartElement()) {
+ parseUnknownElement();
+ }
+ }
+}
+
+void CMakeCbpParser::parseTargetBuild()
+{
+ if (attributes().hasAttribute("command"))
+ m_target.makeCommand = attributes().value("command").toString();
+ while(!atEnd()) {
+ readNext();
+ if (isEndElement()) {
+ return;
+ } else if (isStartElement()) {
+ parseUnknownElement();
+ }
+ }
+}
+
+void CMakeCbpParser::parseTargetClean()
+{
+ if (attributes().hasAttribute("command"))
+ m_target.makeCleanCommand = attributes().value("command").toString();
while(!atEnd()) {
readNext();
if (isEndElement()) {
@@ -497,3 +574,18 @@ QStringList CMakeCbpParser::includeFiles()
{
return m_includeFiles;
}
+
+QList<CMakeTarget> CMakeCbpParser::targets()
+{
+ return m_targets;
+}
+
+void CMakeTarget::clear()
+{
+ executable = QString::null;
+ makeCommand = QString::null;
+ makeCleanCommand = QString::null;
+ workingDirectory = QString::null;
+ title = QString::null;
+}
+
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h
index a0c821ada5..2a0314fda1 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.h
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.h
@@ -49,6 +49,16 @@ namespace Internal{
class CMakeFile;
+struct CMakeTarget
+{
+ QString title;
+ QString executable;
+ QString workingDirectory;
+ QString makeCommand;
+ QString makeCleanCommand;
+ void clear();
+};
+
class CMakeProject : public ProjectExplorer::Project
{
Q_OBJECT
@@ -105,6 +115,7 @@ private:
// TODO probably need a CMake specific node structure
CMakeProjectNode* m_rootNode;
QStringList m_files;
+ QList<CMakeTarget> m_targets;
protected:
virtual void saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer);
@@ -118,23 +129,27 @@ public:
bool parseCbpFile(const QString &fileName);
QList<ProjectExplorer::FileNode *> fileList();
QStringList includeFiles();
+ QList<CMakeTarget> targets();
private:
void parseCodeBlocks_project_file();
void parseProject();
void parseBuild();
void parseTarget();
void parseTargetOption();
+ void parseMakeCommand();
+ void parseTargetBuild();
+ void parseTargetClean();
void parseCompiler();
void parseAdd();
void parseUnit();
void parseUnknownElement();
- QSet<QString> m_targets;
QList<ProjectExplorer::FileNode *> m_fileList;
QStringList m_includeFiles;
- QString m_targetOutput;
+ CMakeTarget m_target;
bool m_targetType;
+ QList<CMakeTarget> m_targets;
};
class CMakeFile : public Core::IFile
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h b/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h
index 4832f17f26..7130058991 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectconstants.h
@@ -41,6 +41,7 @@ const char * const PROJECTCONTEXT = "CMakeProject.ProjectContext";
const char * const CMAKEMIMETYPE = "text/x-cmake"; // TOOD check that this is correct
const char * const CMAKESTEP = "CMakeProjectManager.CMakeStep";
const char * const MAKESTEP = "CMakeProjectManager.MakeStep";
+const char * const CMAKERUNCONFIGURATION = "CMakeProjectManager.CMakeRunConfiguration";
} // namespace Constants
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro
index afca26b265..74f69fea4a 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.pro
@@ -8,11 +8,13 @@ HEADERS = cmakeproject.h \
cmakeprojectconstants.h \
cmakeprojectnodes.h \
cmakestep.h \
- makestep.h
+ makestep.h \
+ cmakerunconfiguration.h
SOURCES = cmakeproject.cpp \
cmakeprojectplugin.cpp \
cmakeprojectmanager.cpp \
cmakeprojectnodes.cpp \
cmakestep.cpp \
- makestep.cpp
+ makestep.cpp \
+ cmakerunconfiguration.cpp
RESOURCES += cmakeproject.qrc
diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp
index 2b59a47c8e..932278a32c 100644
--- a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp
@@ -33,6 +33,7 @@
#include "cmakeprojectplugin.h"
#include "cmakeprojectmanager.h"
+#include "cmakerunconfiguration.h"
#include <coreplugin/icore.h>
#include <coreplugin/mimedatabase.h>
@@ -57,6 +58,7 @@ bool CMakeProjectPlugin::initialize(const QStringList & /*arguments*/, QString *
if (!core->mimeDatabase()->addMimeTypes(QLatin1String(":cmakeproject/CMakeProject.mimetypes.xml"), errorMessage))
return false;
addAutoReleasedObject(new CMakeManager());
+ addAutoReleasedObject(new CMakeRunConfigurationFactory());
return true;
}
diff --git a/src/plugins/cmakeprojectmanager/cmakestep.cpp b/src/plugins/cmakeprojectmanager/cmakestep.cpp
index 0c267ca2c4..adbfe59b6c 100644
--- a/src/plugins/cmakeprojectmanager/cmakestep.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakestep.cpp
@@ -61,6 +61,11 @@ bool CMakeStep::init(const QString &buildConfiguration)
void CMakeStep::run(QFutureInterface<bool> &fi)
{
+ // TODO we want to only run cmake if the command line arguments or
+ // the CmakeLists.txt has actually changed
+ // And we want all of them to share the SAME command line arguments
+ // Shadow building ruins this, hmm, hmm
+ //
AbstractProcessStep::run(fi);
}
diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h
index 8d2e7b45d6..def848765d 100644
--- a/src/plugins/projectexplorer/runconfiguration.h
+++ b/src/plugins/projectexplorer/runconfiguration.h
@@ -80,6 +80,7 @@ public:
void setName(const QString &name);
// Returns the widget used to configure this run configuration. Ownership is transferred to the caller
+ // rename to createConfigurationWidget
virtual QWidget *configurationWidget() = 0;
virtual void save(PersistentSettingsWriter &writer) const;
@@ -112,7 +113,6 @@ public:
// used to translate the types to names to display to the user
virtual QString nameForType(const QString &type) const = 0;
virtual QSharedPointer<RunConfiguration> create(Project *project, const QString &type) = 0;
-
};
class PROJECTEXPLORER_EXPORT IRunConfigurationRunner : public QObject