2009-02-25 09:15:00 +01:00
|
|
|
/**************************************************************************
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
|
|
|
** This file is part of Qt Creator
|
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
|
|
|
** Contact: Qt Software Information (qt-info@nokia.com)
|
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** Commercial Usage
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** Licensees holding valid Qt Commercial licenses may use this file in
|
|
|
|
** accordance with the Qt Commercial License Agreement provided with the
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
|
|
** a written agreement between you and Nokia.
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** GNU Lesser General Public License Usage
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
|
|
** General Public License version 2.1 as published by the Free Software
|
|
|
|
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
|
|
** packaging of this file. Please review the following information to
|
|
|
|
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
|
|
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
2008-12-02 14:17:16 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
** If you are unsure which license is appropriate for your use, please
|
|
|
|
** contact the sales department at qt-sales@nokia.com.
|
2008-12-02 12:01:29 +01:00
|
|
|
**
|
2009-02-25 09:15:00 +01:00
|
|
|
**************************************************************************/
|
2008-12-02 16:19:05 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include "qt4project.h"
|
2008-12-02 16:19:05 +01:00
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
#include "qt4projectmanager.h"
|
|
|
|
#include "profilereader.h"
|
2008-12-02 18:14:06 +01:00
|
|
|
#include "prowriter.h"
|
2008-12-02 12:01:29 +01:00
|
|
|
#include "makestep.h"
|
|
|
|
#include "qmakestep.h"
|
|
|
|
#include "deployhelper.h"
|
|
|
|
#include "qt4runconfiguration.h"
|
|
|
|
#include "qtversionmanager.h"
|
|
|
|
#include "qt4nodes.h"
|
|
|
|
#include "qt4buildconfigwidget.h"
|
|
|
|
#include "qt4buildenvironmentwidget.h"
|
|
|
|
#include "qt4projectmanagerconstants.h"
|
|
|
|
#include "projectloadwizard.h"
|
|
|
|
|
2009-01-20 11:52:04 +01:00
|
|
|
#include <coreplugin/icore.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <coreplugin/messagemanager.h>
|
|
|
|
#include <coreplugin/coreconstants.h>
|
|
|
|
#include <cpptools/cppmodelmanagerinterface.h>
|
2009-01-19 12:39:20 +01:00
|
|
|
#include <extensionsystem/pluginmanager.h>
|
2008-12-02 12:01:29 +01:00
|
|
|
#include <projectexplorer/nodesvisitor.h>
|
|
|
|
#include <projectexplorer/project.h>
|
|
|
|
#include <projectexplorer/customexecutablerunconfiguration.h>
|
|
|
|
|
|
|
|
#include <QtCore/QDebug>
|
2009-01-19 12:39:20 +01:00
|
|
|
#include <QtCore/QDir>
|
|
|
|
#include <QtGui/QFileDialog>
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
using namespace Qt4ProjectManager;
|
|
|
|
using namespace Qt4ProjectManager::Internal;
|
|
|
|
using namespace ProjectExplorer;
|
|
|
|
|
|
|
|
enum { debug = 0 };
|
|
|
|
|
|
|
|
namespace Qt4ProjectManager {
|
|
|
|
namespace Internal {
|
|
|
|
|
|
|
|
// Qt4ProjectFiles: Struct for (Cached) lists of files in a project
|
|
|
|
struct Qt4ProjectFiles {
|
|
|
|
void clear();
|
|
|
|
bool equals(const Qt4ProjectFiles &f) const;
|
|
|
|
|
|
|
|
QStringList files[ProjectExplorer::FileTypeSize];
|
|
|
|
QStringList generatedFiles[ProjectExplorer::FileTypeSize];
|
|
|
|
QStringList proFiles;
|
|
|
|
};
|
|
|
|
|
|
|
|
void Qt4ProjectFiles::clear()
|
|
|
|
{
|
|
|
|
for (int i = 0; i < FileTypeSize; ++i) {
|
|
|
|
files[i].clear();
|
|
|
|
generatedFiles[i].clear();
|
|
|
|
}
|
|
|
|
proFiles.clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Qt4ProjectFiles::equals(const Qt4ProjectFiles &f) const
|
|
|
|
{
|
|
|
|
for (int i = 0; i < FileTypeSize; ++i)
|
|
|
|
if (files[i] != f.files[i] || generatedFiles[i] != f.generatedFiles[i])
|
|
|
|
return false;
|
|
|
|
if (proFiles != f.proFiles)
|
|
|
|
return false;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
inline bool operator==(const Qt4ProjectFiles &f1, const Qt4ProjectFiles &f2)
|
|
|
|
{ return f1.equals(f2); }
|
|
|
|
|
|
|
|
inline bool operator!=(const Qt4ProjectFiles &f1, const Qt4ProjectFiles &f2)
|
|
|
|
{ return !f1.equals(f2); }
|
|
|
|
|
|
|
|
QDebug operator<<(QDebug d, const Qt4ProjectFiles &f)
|
|
|
|
{
|
|
|
|
QDebug nsp = d.nospace();
|
|
|
|
nsp << "Qt4ProjectFiles: proFiles=" << f.proFiles << '\n';
|
|
|
|
for (int i = 0; i < FileTypeSize; ++i)
|
|
|
|
nsp << "Type " << i << " files=" << f.files[i] << " generated=" << f.generatedFiles[i] << '\n';
|
|
|
|
return d;
|
|
|
|
}
|
|
|
|
|
|
|
|
// A visitor to collect all files of a project in a Qt4ProjectFiles struct
|
|
|
|
class ProjectFilesVisitor : public ProjectExplorer::NodesVisitor
|
|
|
|
{
|
|
|
|
Q_DISABLE_COPY(ProjectFilesVisitor)
|
|
|
|
ProjectFilesVisitor(Qt4ProjectFiles *files);
|
|
|
|
public:
|
|
|
|
|
|
|
|
static void findProjectFiles(Qt4ProFileNode *rootNode, Qt4ProjectFiles *files);
|
|
|
|
|
|
|
|
void visitProjectNode(ProjectNode *projectNode);
|
|
|
|
void visitFolderNode(FolderNode *folderNode);
|
|
|
|
|
|
|
|
private:
|
|
|
|
Qt4ProjectFiles *m_files;
|
|
|
|
};
|
|
|
|
|
|
|
|
ProjectFilesVisitor::ProjectFilesVisitor(Qt4ProjectFiles *files) :
|
|
|
|
m_files(files)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
void ProjectFilesVisitor::findProjectFiles(Qt4ProFileNode *rootNode, Qt4ProjectFiles *files)
|
|
|
|
{
|
|
|
|
files->clear();
|
|
|
|
ProjectFilesVisitor visitor(files);
|
|
|
|
rootNode->accept(&visitor);
|
|
|
|
for (int i = 0; i < FileTypeSize; ++i) {
|
|
|
|
qSort(files->files[i]);
|
|
|
|
qSort(files->generatedFiles[i]);
|
|
|
|
}
|
|
|
|
qSort(files->proFiles);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ProjectFilesVisitor::visitProjectNode(ProjectNode *projectNode)
|
|
|
|
{
|
|
|
|
const QString path = projectNode->path();
|
|
|
|
if (!m_files->proFiles.contains(path))
|
|
|
|
m_files->proFiles.append(path);
|
|
|
|
visitFolderNode(projectNode);
|
|
|
|
}
|
|
|
|
|
|
|
|
void ProjectFilesVisitor::visitFolderNode(FolderNode *folderNode)
|
|
|
|
{
|
|
|
|
foreach (FileNode *fileNode, folderNode->fileNodes()) {
|
|
|
|
const QString path = fileNode->path();
|
|
|
|
const int type = fileNode->fileType();
|
|
|
|
QStringList &targetList = fileNode->isGenerated() ? m_files->generatedFiles[type] : m_files->files[type];
|
|
|
|
if (!targetList.contains(path))
|
|
|
|
targetList.push_back(path);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// ----------- Qt4ProjectFile
|
|
|
|
Qt4ProjectFile::Qt4ProjectFile(Qt4Project *project, const QString &filePath, QObject *parent)
|
|
|
|
: Core::IFile(parent),
|
|
|
|
m_mimeType(QLatin1String(Qt4ProjectManager::Constants::PROFILE_MIMETYPE)),
|
|
|
|
m_project(project),
|
|
|
|
m_filePath(filePath)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Qt4ProjectFile::save(const QString &)
|
|
|
|
{
|
2008-12-05 14:29:18 +01:00
|
|
|
// This is never used
|
|
|
|
return false;
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
QString Qt4ProjectFile::fileName() const
|
|
|
|
{
|
|
|
|
return m_filePath;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString Qt4ProjectFile::defaultPath() const
|
|
|
|
{
|
|
|
|
return QString();
|
|
|
|
}
|
|
|
|
|
|
|
|
QString Qt4ProjectFile::suggestedFileName() const
|
|
|
|
{
|
|
|
|
return QString();
|
|
|
|
}
|
|
|
|
|
|
|
|
QString Qt4ProjectFile::mimeType() const
|
|
|
|
{
|
|
|
|
return m_mimeType;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Qt4ProjectFile::isModified() const
|
|
|
|
{
|
2008-12-05 14:29:18 +01:00
|
|
|
return false; // we save after changing anyway
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
bool Qt4ProjectFile::isReadOnly() const
|
|
|
|
{
|
2008-12-02 18:14:06 +01:00
|
|
|
QFileInfo fi(m_filePath);
|
|
|
|
return !fi.isWritable();
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
bool Qt4ProjectFile::isSaveAsAllowed() const
|
|
|
|
{
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4ProjectFile::modified(Core::IFile::ReloadBehavior *)
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
/class Qt4Project
|
|
|
|
|
|
|
|
Qt4Project manages information about an individual Qt 4 (.pro) project file.
|
|
|
|
*/
|
|
|
|
|
|
|
|
Qt4Project::Qt4Project(Qt4Manager *manager, const QString& fileName) :
|
2009-02-10 15:34:25 +01:00
|
|
|
m_toolChain(0),
|
2008-12-02 12:01:29 +01:00
|
|
|
m_manager(manager),
|
2009-03-12 15:01:01 +01:00
|
|
|
m_rootProjectNode(0),
|
2008-12-02 12:01:29 +01:00
|
|
|
m_nodesWatcher(new Internal::Qt4NodesWatcher(this)),
|
|
|
|
m_fileInfo(new Qt4ProjectFile(this, fileName, this)),
|
|
|
|
m_isApplication(true),
|
|
|
|
m_projectFiles(new Qt4ProjectFiles)
|
|
|
|
{
|
2008-12-02 18:14:06 +01:00
|
|
|
m_manager->registerProject(this);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
connect(qt4ProjectManager()->versionManager(), SIGNAL(defaultQtVersionChanged()),
|
|
|
|
this, SLOT(defaultQtVersionChanged()));
|
|
|
|
connect(qt4ProjectManager()->versionManager(), SIGNAL(qtVersionsChanged()),
|
|
|
|
this, SLOT(qtVersionsChanged()));
|
|
|
|
|
|
|
|
m_updateCodeModelTimer.setSingleShot(true);
|
|
|
|
m_updateCodeModelTimer.setInterval(20);
|
|
|
|
connect(&m_updateCodeModelTimer, SIGNAL(timeout()), this, SLOT(updateCodeModel()));
|
2009-01-28 18:14:01 +01:00
|
|
|
|
|
|
|
m_addUiFilesTimer.setSingleShot(true);
|
|
|
|
m_addUiFilesTimer.setInterval(20);
|
|
|
|
connect(&m_addUiFilesTimer, SIGNAL(timeout()), this, SLOT(addUiFiles()));
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
Qt4Project::~Qt4Project()
|
|
|
|
{
|
2008-12-02 18:14:06 +01:00
|
|
|
m_manager->unregisterProject(this);
|
2008-12-02 12:01:29 +01:00
|
|
|
delete m_projectFiles;
|
2009-02-10 15:34:25 +01:00
|
|
|
delete m_toolChain;
|
2009-03-16 17:33:05 +01:00
|
|
|
m_toolChain = 0;
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::defaultQtVersionChanged()
|
|
|
|
{
|
|
|
|
if (qtVersionId(activeBuildConfiguration()) == 0)
|
2008-12-09 17:17:12 +01:00
|
|
|
m_rootProjectNode->update();
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::qtVersionsChanged()
|
|
|
|
{
|
|
|
|
foreach (QString bc, buildConfigurations()) {
|
|
|
|
if (!qt4ProjectManager()->versionManager()->version(qtVersionId(bc))->isValid()) {
|
|
|
|
setQtVersion(bc, 0);
|
2008-12-09 11:07:24 +01:00
|
|
|
if (bc == activeBuildConfiguration())
|
2008-12-09 17:17:12 +01:00
|
|
|
m_rootProjectNode->update();
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::updateFileList()
|
|
|
|
{
|
|
|
|
Qt4ProjectFiles newFiles;
|
|
|
|
ProjectFilesVisitor::findProjectFiles(m_rootProjectNode, &newFiles);
|
|
|
|
if (newFiles != *m_projectFiles) {
|
|
|
|
*m_projectFiles = newFiles;
|
|
|
|
emit fileListChanged();
|
|
|
|
if (debug)
|
|
|
|
qDebug() << Q_FUNC_INFO << *m_projectFiles;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::restoreSettingsImpl(PersistentSettingsReader &settingsReader)
|
|
|
|
{
|
|
|
|
Project::restoreSettingsImpl(settingsReader);
|
|
|
|
|
|
|
|
addDefaultBuild();
|
|
|
|
|
|
|
|
// Ensure that the qt version in each build configuration is valid
|
|
|
|
// or if not, is reset to the default
|
|
|
|
foreach (const QString &bc, buildConfigurations())
|
|
|
|
qtVersionId(bc);
|
|
|
|
|
2009-03-12 15:01:01 +01:00
|
|
|
m_rootProjectNode = new Qt4ProFileNode(this, m_fileInfo->fileName(), this);
|
|
|
|
m_rootProjectNode->registerWatcher(m_nodesWatcher);
|
|
|
|
connect(m_nodesWatcher, SIGNAL(foldersAdded()), this, SLOT(updateFileList()));
|
|
|
|
connect(m_nodesWatcher, SIGNAL(foldersRemoved()), this, SLOT(updateFileList()));
|
|
|
|
connect(m_nodesWatcher, SIGNAL(filesAdded()), this, SLOT(updateFileList()));
|
|
|
|
connect(m_nodesWatcher, SIGNAL(filesRemoved()), this, SLOT(updateFileList()));
|
|
|
|
connect(m_nodesWatcher, SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode *)),
|
|
|
|
this, SLOT(scheduleUpdateCodeModel()));
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
update();
|
|
|
|
|
|
|
|
// restored old runconfigurations
|
|
|
|
if (runConfigurations().isEmpty()) {
|
|
|
|
// Oha no runConfigurations, add some
|
|
|
|
QList<Qt4ProFileNode *> list;
|
|
|
|
collectApplicationProFiles(list, m_rootProjectNode);
|
|
|
|
|
|
|
|
if (!list.isEmpty()) {
|
|
|
|
foreach (Qt4ProFileNode *node, list) {
|
|
|
|
QSharedPointer<RunConfiguration> rc(new Qt4RunConfiguration(this, node->path()));
|
|
|
|
addRunConfiguration(rc);
|
|
|
|
}
|
|
|
|
setActiveRunConfiguration(runConfigurations().first());
|
|
|
|
} else {
|
|
|
|
QSharedPointer<RunConfiguration> rc(new ProjectExplorer::CustomExecutableRunConfiguration(this));
|
|
|
|
addRunConfiguration(rc);
|
|
|
|
setActiveRunConfiguration(rc);
|
|
|
|
m_isApplication = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Now connect
|
|
|
|
connect(m_nodesWatcher, SIGNAL(foldersAboutToBeAdded(FolderNode *, const QList<FolderNode*> &)),
|
|
|
|
this, SLOT(foldersAboutToBeAdded(FolderNode *, const QList<FolderNode*> &)));
|
|
|
|
connect(m_nodesWatcher, SIGNAL(foldersAdded()), this, SLOT(checkForNewApplicationProjects()));
|
|
|
|
|
|
|
|
connect(m_nodesWatcher, SIGNAL(foldersRemoved()), this, SLOT(checkForDeletedApplicationProjects()));
|
|
|
|
|
|
|
|
connect(m_nodesWatcher, SIGNAL(projectTypeChanged(Qt4ProjectManager::Internal::Qt4ProFileNode *,
|
|
|
|
const Qt4ProjectManager::Internal::Qt4ProjectType,
|
|
|
|
const Qt4ProjectManager::Internal::Qt4ProjectType)),
|
|
|
|
this, SLOT(projectTypeChanged(Qt4ProjectManager::Internal::Qt4ProFileNode *,
|
|
|
|
const Qt4ProjectManager::Internal::Qt4ProjectType,
|
|
|
|
const Qt4ProjectManager::Internal::Qt4ProjectType)));
|
|
|
|
|
|
|
|
connect(m_nodesWatcher, SIGNAL(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode *)),
|
|
|
|
this, SLOT(proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode *)));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::saveSettingsImpl(ProjectExplorer::PersistentSettingsWriter &writer)
|
|
|
|
{
|
|
|
|
Project::saveSettingsImpl(writer);
|
|
|
|
}
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
class FindQt4ProFiles: protected ProjectExplorer::NodesVisitor {
|
|
|
|
QList<Qt4ProFileNode *> m_proFiles;
|
|
|
|
|
|
|
|
public:
|
|
|
|
QList<Qt4ProFileNode *> operator()(ProjectNode *root)
|
|
|
|
{
|
|
|
|
m_proFiles.clear();
|
|
|
|
root->accept(this);
|
|
|
|
return m_proFiles;
|
|
|
|
}
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual void visitProjectNode(ProjectNode *projectNode)
|
|
|
|
{
|
|
|
|
if (Qt4ProFileNode *pro = qobject_cast<Qt4ProFileNode *>(projectNode))
|
|
|
|
m_proFiles.append(pro);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2009-01-28 18:14:01 +01:00
|
|
|
void Qt4Project::addUiFilesToCodeModel(const QStringList &files)
|
|
|
|
{
|
|
|
|
// if we already have a full updateCodeModel() scheduled
|
|
|
|
// then we don't need to this seperately
|
|
|
|
// since that one will add also all the ui files
|
|
|
|
if (m_updateCodeModelTimer.isActive())
|
|
|
|
return;
|
|
|
|
m_addUiFilesTimer.start();
|
|
|
|
m_uiFilesToAdd << files;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::addUiFiles()
|
|
|
|
{
|
|
|
|
if (m_updateCodeModelTimer.isActive())
|
|
|
|
return;
|
|
|
|
CppTools::CppModelManagerInterface *modelManager =
|
|
|
|
ExtensionSystem::PluginManager::instance()->getObject<CppTools::CppModelManagerInterface>();
|
|
|
|
modelManager->updateSourceFiles(m_uiFilesToAdd);
|
|
|
|
m_uiFilesToAdd.clear();
|
|
|
|
}
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
void Qt4Project::scheduleUpdateCodeModel()
|
|
|
|
{
|
|
|
|
m_updateCodeModelTimer.start();
|
|
|
|
}
|
|
|
|
|
2009-03-16 18:13:45 +01:00
|
|
|
QString Qt4Project::makeCommand(const QString &buildConfiguration) const
|
|
|
|
{
|
|
|
|
return toolChain(buildConfiguration)->makeCommand();
|
|
|
|
}
|
|
|
|
|
2009-02-10 15:34:25 +01:00
|
|
|
ProjectExplorer::ToolChain *Qt4Project::toolChain(const QString &buildConfiguration) const
|
|
|
|
{
|
2009-02-13 15:54:50 +01:00
|
|
|
if (debug)
|
|
|
|
qDebug()<<"Qt4Project::toolChain() for buildconfiguration:"<<buildConfiguration;
|
2009-02-10 15:34:25 +01:00
|
|
|
Q_UNUSED(buildConfiguration);
|
2009-02-13 12:02:58 +01:00
|
|
|
ToolChain *m_test= 0;
|
2009-02-10 15:34:25 +01:00
|
|
|
QtVersion *version = qtVersion(activeBuildConfiguration());
|
|
|
|
ToolChain::ToolChainType t = version->toolchainType();
|
|
|
|
if (t == ToolChain::MinGW) {
|
|
|
|
QStringList list = rootProjectNode()->variableValue(Internal::CxxCompilerVar);
|
|
|
|
QString qmake_cxx = list.isEmpty() ? QString::null : list.first();
|
|
|
|
Environment env = Environment::systemEnvironment();
|
|
|
|
qtVersion(activeBuildConfiguration())->addToEnvironment(env);
|
|
|
|
qmake_cxx = env.searchInPath(qmake_cxx);
|
|
|
|
m_test = ToolChain::createMinGWToolChain(qmake_cxx, version->mingwDirectory());
|
2009-03-16 18:13:45 +01:00
|
|
|
//qDebug()<<"Mingw ToolChain";
|
2009-02-10 15:34:25 +01:00
|
|
|
} else if(t == ToolChain::MSVC) {
|
|
|
|
m_test = ToolChain::createMSVCToolChain(version->msvcVersion());
|
2009-02-12 16:09:23 +01:00
|
|
|
//qDebug()<<"MSVC ToolChain ("<<version->msvcVersion()<<")";
|
2009-02-10 15:34:25 +01:00
|
|
|
} else if(t == ToolChain::WINCE) {
|
|
|
|
m_test = ToolChain::createWinCEToolChain(version->msvcVersion(), version->wincePlatform());
|
2009-02-12 16:09:23 +01:00
|
|
|
//qDebug()<<"WinCE ToolChain ("<<version->msvcVersion()<<","<<version->wincePlatform()<<")";
|
2009-02-12 12:44:49 +01:00
|
|
|
} else if(t == ToolChain::GCC || t == ToolChain::LinuxICC) {
|
2009-02-10 15:34:25 +01:00
|
|
|
QStringList list = rootProjectNode()->variableValue(Internal::CxxCompilerVar);
|
|
|
|
QString qmake_cxx = list.isEmpty() ? QString::null : list.first();
|
|
|
|
Environment env = Environment::systemEnvironment();
|
|
|
|
qtVersion(activeBuildConfiguration())->addToEnvironment(env);
|
|
|
|
qmake_cxx = env.searchInPath(qmake_cxx);
|
2009-03-02 12:28:01 +01:00
|
|
|
if (qmake_cxx.isEmpty()) {
|
|
|
|
// macx-xcode mkspec resets the value of QMAKE_CXX.
|
|
|
|
// Unfortunately, we need a valid QMAKE_CXX to configure the parser.
|
|
|
|
qmake_cxx = QLatin1String("cc");
|
|
|
|
}
|
2009-02-10 15:34:25 +01:00
|
|
|
m_test = ToolChain::createGccToolChain(qmake_cxx);
|
2009-02-12 16:09:23 +01:00
|
|
|
//qDebug()<<"GCC ToolChain ("<<qmake_cxx<<")";
|
|
|
|
} else {
|
|
|
|
qDebug()<<"Could not detect ToolChain for"<<version->mkspec();
|
|
|
|
qDebug()<<"Qt Creator doesn't know about the system includes, nor the systems defines.";
|
2009-02-10 15:34:25 +01:00
|
|
|
}
|
|
|
|
|
2009-02-13 12:02:58 +01:00
|
|
|
if (ToolChain::equals(m_test, m_toolChain)) {
|
2009-02-10 15:34:25 +01:00
|
|
|
delete m_test;
|
|
|
|
} else {
|
|
|
|
delete m_toolChain;
|
|
|
|
m_toolChain = m_test;
|
|
|
|
}
|
|
|
|
return m_toolChain;
|
|
|
|
}
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
void Qt4Project::updateCodeModel()
|
|
|
|
{
|
|
|
|
if (debug)
|
|
|
|
qDebug()<<"Qt4Project::updateCodeModel()";
|
|
|
|
|
|
|
|
CppTools::CppModelManagerInterface *modelmanager =
|
2009-01-20 15:31:33 +01:00
|
|
|
ExtensionSystem::PluginManager::instance()
|
|
|
|
->getObject<CppTools::CppModelManagerInterface>();
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2009-01-20 15:31:33 +01:00
|
|
|
if (!modelmanager)
|
2008-12-02 12:01:29 +01:00
|
|
|
return;
|
|
|
|
|
|
|
|
QStringList allIncludePaths;
|
|
|
|
QStringList allFrameworkPaths;
|
|
|
|
|
|
|
|
const QHash<QString, QString> versionInfo = qtVersion(activeBuildConfiguration())->versionInfo();
|
|
|
|
const QString newQtIncludePath = versionInfo.value(QLatin1String("QT_INSTALL_HEADERS"));
|
|
|
|
const QString newQtLibsPath = versionInfo.value(QLatin1String("QT_INSTALL_LIBS"));
|
|
|
|
|
2009-02-10 15:34:25 +01:00
|
|
|
ToolChain *tc = toolChain(activeBuildConfiguration());
|
2009-02-12 12:39:19 +01:00
|
|
|
QByteArray predefinedMacros;
|
|
|
|
QList<HeaderPath> allHeaderPaths;
|
|
|
|
if (tc) {
|
|
|
|
predefinedMacros = tc->predefinedMacros();
|
|
|
|
allHeaderPaths = tc->systemHeaderPaths();
|
2009-02-12 16:09:23 +01:00
|
|
|
//qDebug()<<"Predifined Macros";
|
|
|
|
//qDebug()<<tc->predefinedMacros();
|
|
|
|
//qDebug()<<"";
|
|
|
|
//qDebug()<<"System Header Paths";
|
|
|
|
//foreach(const HeaderPath &hp, tc->systemHeaderPaths())
|
|
|
|
// qDebug()<<hp.path();
|
2009-02-12 12:39:19 +01:00
|
|
|
}
|
2009-02-10 15:34:25 +01:00
|
|
|
foreach (HeaderPath headerPath, allHeaderPaths) {
|
|
|
|
if (headerPath.kind() == HeaderPath::FrameworkHeaderPath)
|
|
|
|
allFrameworkPaths.append(headerPath.path());
|
|
|
|
else
|
|
|
|
allIncludePaths.append(headerPath.path());
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
allIncludePaths.append(newQtIncludePath);
|
|
|
|
QDir dir(newQtIncludePath);
|
|
|
|
foreach (QFileInfo info, dir.entryInfoList(QDir::Dirs)) {
|
|
|
|
if (! info.fileName().startsWith(QLatin1String("Qt")))
|
|
|
|
continue;
|
|
|
|
allIncludePaths.append(info.absoluteFilePath());
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef Q_OS_MAC
|
|
|
|
allFrameworkPaths.append(newQtLibsPath);
|
|
|
|
// put QtXXX.framework/Headers directories in include path since that qmake's behavior
|
|
|
|
QDir frameworkDir(newQtLibsPath);
|
|
|
|
foreach (QFileInfo info, frameworkDir.entryInfoList(QDir::Dirs)) {
|
|
|
|
if (! info.fileName().startsWith(QLatin1String("Qt")))
|
|
|
|
continue;
|
|
|
|
allIncludePaths.append(info.absoluteFilePath()+"/Headers");
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
FindQt4ProFiles findQt4ProFiles;
|
|
|
|
QList<Qt4ProFileNode *> proFiles = findQt4ProFiles(rootProjectNode());
|
|
|
|
QByteArray definedMacros;
|
|
|
|
|
|
|
|
foreach (Qt4ProFileNode *pro, proFiles) {
|
|
|
|
foreach (const QString def, pro->variableValue(DefinesVar)) {
|
|
|
|
definedMacros += "#define ";
|
|
|
|
const int index = def.indexOf(QLatin1Char('='));
|
|
|
|
if (index == -1) {
|
|
|
|
definedMacros += def.toLatin1();
|
|
|
|
definedMacros += " 1\n";
|
|
|
|
} else {
|
|
|
|
const QString name = def.left(index);
|
|
|
|
const QString value = def.mid(index + 1);
|
|
|
|
definedMacros += name.toLatin1();
|
|
|
|
definedMacros += ' ';
|
|
|
|
definedMacros += value.toLocal8Bit();
|
|
|
|
definedMacros += '\n';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
const QStringList proIncludePaths = pro->variableValue(IncludePathVar);
|
|
|
|
foreach (QString includePath, proIncludePaths) {
|
|
|
|
if (allIncludePaths.contains(includePath))
|
|
|
|
continue;
|
|
|
|
|
|
|
|
allIncludePaths.append(includePath);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-12-08 12:44:28 +01:00
|
|
|
// Add mkspec directory
|
|
|
|
allIncludePaths.append(qtVersion(activeBuildConfiguration())->mkspecPath());
|
|
|
|
|
2008-12-02 12:01:29 +01:00
|
|
|
QStringList files;
|
|
|
|
files += m_projectFiles->files[HeaderType];
|
|
|
|
files += m_projectFiles->generatedFiles[HeaderType];
|
|
|
|
files += m_projectFiles->files[SourceType];
|
|
|
|
files += m_projectFiles->generatedFiles[SourceType];
|
|
|
|
|
2008-12-08 10:44:56 +01:00
|
|
|
CppTools::CppModelManagerInterface::ProjectInfo pinfo = modelmanager->projectInfo(this);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
2008-12-08 10:44:56 +01:00
|
|
|
if (pinfo.defines == predefinedMacros &&
|
|
|
|
pinfo.includePaths == allIncludePaths &&
|
|
|
|
pinfo.frameworkPaths == allFrameworkPaths &&
|
|
|
|
pinfo.sourceFiles == files) {
|
|
|
|
modelmanager->updateProjectInfo(pinfo);
|
2008-12-02 12:01:29 +01:00
|
|
|
} else {
|
2008-12-08 10:44:56 +01:00
|
|
|
pinfo.defines = predefinedMacros;
|
2008-12-02 12:01:29 +01:00
|
|
|
// pinfo->defines += definedMacros; // ### FIXME: me
|
2008-12-08 10:44:56 +01:00
|
|
|
pinfo.includePaths = allIncludePaths;
|
|
|
|
pinfo.frameworkPaths = allFrameworkPaths;
|
|
|
|
pinfo.sourceFiles = files;
|
|
|
|
|
|
|
|
modelmanager->updateProjectInfo(pinfo);
|
|
|
|
modelmanager->updateSourceFiles(pinfo.sourceFiles);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2008-12-09 17:17:12 +01:00
|
|
|
///*!
|
|
|
|
// Updates complete project
|
|
|
|
// */
|
2008-12-02 12:01:29 +01:00
|
|
|
void Qt4Project::update()
|
|
|
|
{
|
|
|
|
// TODO Maybe remove this method completely?
|
|
|
|
m_rootProjectNode->update();
|
|
|
|
//updateCodeModel();
|
|
|
|
}
|
|
|
|
|
|
|
|
ProFileReader *Qt4Project::createProFileReader() const
|
|
|
|
{
|
2008-12-02 18:14:06 +01:00
|
|
|
ProFileReader *reader = new ProFileReader();
|
2008-12-02 12:01:29 +01:00
|
|
|
connect(reader, SIGNAL(errorFound(const QString&)),
|
|
|
|
this, SLOT(proFileParseError(const QString&)));
|
|
|
|
QtVersion *version = qtVersion(activeBuildConfiguration());
|
|
|
|
if (version->isValid()) {
|
|
|
|
reader->setQtVersion(version);
|
|
|
|
}
|
|
|
|
return reader;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
Returns whether the project is an application, or has an application as a subproject.
|
|
|
|
*/
|
|
|
|
bool Qt4Project::isApplication() const
|
|
|
|
{
|
|
|
|
return m_isApplication;
|
|
|
|
}
|
|
|
|
|
|
|
|
ProjectExplorer::ProjectExplorerPlugin *Qt4Project::projectExplorer() const
|
|
|
|
{
|
|
|
|
return m_manager->projectExplorer();
|
|
|
|
}
|
|
|
|
|
|
|
|
ProjectExplorer::IProjectManager *Qt4Project::projectManager() const
|
|
|
|
{
|
|
|
|
return m_manager;
|
|
|
|
}
|
|
|
|
|
|
|
|
Qt4Manager *Qt4Project::qt4ProjectManager() const
|
|
|
|
{
|
|
|
|
return m_manager;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString Qt4Project::name() const
|
|
|
|
{
|
|
|
|
return QFileInfo(file()->fileName()).completeBaseName();
|
|
|
|
}
|
|
|
|
|
|
|
|
Core::IFile *Qt4Project::file() const
|
|
|
|
{
|
|
|
|
return m_fileInfo;
|
|
|
|
}
|
|
|
|
|
|
|
|
QStringList Qt4Project::files(FilesMode fileMode) const
|
|
|
|
{
|
|
|
|
QStringList files;
|
|
|
|
for (int i = 0; i < FileTypeSize; ++i) {
|
|
|
|
files += m_projectFiles->files[i];
|
|
|
|
if (fileMode == AllFiles)
|
|
|
|
files += m_projectFiles->generatedFiles[i];
|
|
|
|
}
|
|
|
|
return files;
|
|
|
|
}
|
|
|
|
|
|
|
|
QList<ProjectExplorer::Project*> Qt4Project::dependsOn()
|
|
|
|
{
|
|
|
|
// NBS implement dependsOn
|
|
|
|
return QList<Project *>();
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::addDefaultBuild()
|
|
|
|
{
|
|
|
|
if (buildConfigurations().isEmpty()) {
|
|
|
|
// We don't have any buildconfigurations, so this is a new project
|
|
|
|
// The Project Load Wizard is a work of art
|
|
|
|
// It will ask the user what kind of build setup he want
|
|
|
|
// It will add missing Qt Versions
|
|
|
|
// And get the project into a buildable state
|
|
|
|
|
|
|
|
//TODO have a better check wheter there is already a configuration?
|
|
|
|
QMakeStep *qmakeStep = 0;
|
|
|
|
MakeStep *makeStep = 0;
|
|
|
|
|
|
|
|
qmakeStep = new QMakeStep(this);
|
|
|
|
qmakeStep->setValue("mkspec", "");
|
|
|
|
insertBuildStep(1, qmakeStep);
|
|
|
|
|
|
|
|
makeStep = new MakeStep(this);
|
|
|
|
insertBuildStep(2, makeStep);
|
|
|
|
|
|
|
|
MakeStep* cleanStep = new MakeStep(this);
|
|
|
|
cleanStep->setValue("clean", true);
|
2009-01-16 13:25:38 +01:00
|
|
|
insertCleanStep(1, cleanStep);
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
ProjectLoadWizard wizard(this);
|
|
|
|
wizard.execDialog();
|
|
|
|
} else {
|
|
|
|
// Restoring configuration
|
2008-12-15 12:36:05 +01:00
|
|
|
foreach(const QString &bc, buildConfigurations()) {
|
|
|
|
setValue(bc, "addQDumper", QVariant());
|
|
|
|
}
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::newBuildConfiguration(const QString &buildConfiguration)
|
|
|
|
{
|
|
|
|
Q_UNUSED(buildConfiguration);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::proFileParseError(const QString &errorMessage)
|
|
|
|
{
|
2009-01-20 15:31:33 +01:00
|
|
|
Core::ICore::instance()->messageManager()->printToOutputPane(errorMessage);
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
Qt4ProFileNode *Qt4Project::rootProjectNode() const
|
|
|
|
{
|
|
|
|
return m_rootProjectNode;
|
|
|
|
}
|
|
|
|
|
|
|
|
ProjectExplorer::Environment Qt4Project::baseEnvironment(const QString &buildConfiguration) const
|
|
|
|
{
|
|
|
|
Environment env = useSystemEnvironment(buildConfiguration) ? Environment(QProcess::systemEnvironment()) : Environment();
|
2009-02-10 15:34:25 +01:00
|
|
|
qtVersion(buildConfiguration)->addToEnvironment(env);
|
2009-02-13 11:12:52 +01:00
|
|
|
ToolChain *tc = toolChain(buildConfiguration);
|
|
|
|
if (tc)
|
|
|
|
tc->addToEnvironment(env);
|
2008-12-02 12:01:29 +01:00
|
|
|
return env;
|
|
|
|
}
|
|
|
|
|
|
|
|
ProjectExplorer::Environment Qt4Project::environment(const QString &buildConfiguration) const
|
|
|
|
{
|
|
|
|
Environment env = baseEnvironment(buildConfiguration);
|
|
|
|
env.modify(userEnvironmentChanges(buildConfiguration));
|
|
|
|
return env;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString Qt4Project::buildDirectory(const QString &buildConfiguration) const
|
|
|
|
{
|
|
|
|
QString workingDirectory;
|
|
|
|
if (value(buildConfiguration, "useShadowBuild").toBool())
|
|
|
|
workingDirectory = value(buildConfiguration, "buildDirectory").toString();
|
2008-12-09 11:07:24 +01:00
|
|
|
if (workingDirectory.isEmpty())
|
2008-12-02 12:01:29 +01:00
|
|
|
workingDirectory = QFileInfo(file()->fileName()).absolutePath();
|
|
|
|
return workingDirectory;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::setUseSystemEnvironment(const QString &buildConfiguration, bool b)
|
|
|
|
{
|
|
|
|
setValue(buildConfiguration, "clearSystemEnvironment", !b);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool Qt4Project::useSystemEnvironment(const QString &buildConfiguration) const
|
|
|
|
{
|
|
|
|
bool b = !(value(buildConfiguration, "clearSystemEnvironment").isValid() && value(buildConfiguration, "clearSystemEnvironment").toBool());
|
|
|
|
return b;
|
|
|
|
}
|
|
|
|
|
|
|
|
QString Qt4Project::qtDir(const QString &buildConfiguration) const
|
|
|
|
{
|
|
|
|
QtVersion *version = qtVersion(buildConfiguration);
|
|
|
|
if (version)
|
|
|
|
return version->path();
|
|
|
|
return QString::null;
|
|
|
|
}
|
|
|
|
|
|
|
|
QtVersion *Qt4Project::qtVersion(const QString &buildConfiguration) const
|
|
|
|
{
|
|
|
|
return m_manager->versionManager()->version(qtVersionId(buildConfiguration));
|
|
|
|
}
|
|
|
|
|
|
|
|
int Qt4Project::qtVersionId(const QString &buildConfiguration) const
|
|
|
|
{
|
|
|
|
if (debug)
|
|
|
|
qDebug()<<"Looking for qtVersion ID of "<<buildConfiguration;
|
|
|
|
int id = 0;
|
|
|
|
QVariant vid = value(buildConfiguration, "QtVersionId");
|
2008-12-09 11:07:24 +01:00
|
|
|
if (vid.isValid()) {
|
2008-12-02 12:01:29 +01:00
|
|
|
id = vid.toInt();
|
|
|
|
if (m_manager->versionManager()->version(id)->isValid()) {
|
|
|
|
return id;
|
|
|
|
} else {
|
|
|
|
const_cast<Qt4Project *>(this)->setValue(buildConfiguration, "QtVersionId", 0);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Backward compatibilty, we might have just the name:
|
|
|
|
QString vname = value(buildConfiguration, "QtVersion").toString();
|
|
|
|
if (debug)
|
|
|
|
qDebug()<<" Backward compatibility reading QtVersion"<<vname;
|
2008-12-09 11:07:24 +01:00
|
|
|
if (!vname.isEmpty()) {
|
2008-12-02 12:01:29 +01:00
|
|
|
const QList<QtVersion *> &versions = m_manager->versionManager()->versions();
|
|
|
|
foreach (const QtVersion * const version, versions) {
|
2008-12-09 11:07:24 +01:00
|
|
|
if (version->name() == vname) {
|
2008-12-02 12:01:29 +01:00
|
|
|
if (debug)
|
|
|
|
qDebug()<<"found name in versions";
|
|
|
|
const_cast<Qt4Project *>(this)->setValue(buildConfiguration, "QtVersionId", version->uniqueId());
|
|
|
|
return version->uniqueId();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (debug)
|
|
|
|
qDebug()<<" using qtversion with id ="<<id;
|
|
|
|
// Nothing found, reset to default
|
|
|
|
const_cast<Qt4Project *>(this)->setValue(buildConfiguration, "QtVersionId", id);
|
|
|
|
return id;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::setQtVersion(const QString &buildConfiguration, int id)
|
|
|
|
{
|
|
|
|
setValue(buildConfiguration, "QtVersionId", id);
|
|
|
|
}
|
|
|
|
|
|
|
|
BuildStepConfigWidget *Qt4Project::createConfigWidget()
|
|
|
|
{
|
|
|
|
return new Qt4BuildConfigWidget(this);
|
|
|
|
}
|
|
|
|
|
|
|
|
QList<BuildStepConfigWidget*> Qt4Project::subConfigWidgets()
|
|
|
|
{
|
|
|
|
QList<BuildStepConfigWidget*> subWidgets;
|
|
|
|
subWidgets << new Qt4BuildEnvironmentWidget(this);
|
|
|
|
return subWidgets;
|
|
|
|
}
|
|
|
|
|
|
|
|
QList<ProjectExplorer::EnvironmentItem> Qt4Project::userEnvironmentChanges(const QString &buildConfig) const
|
|
|
|
{
|
|
|
|
return EnvironmentItem::fromStringList(value(buildConfig, "userEnvironmentChanges").toStringList());
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::setUserEnvironmentChanges(const QString &buildConfig, const QList<ProjectExplorer::EnvironmentItem> &diff)
|
|
|
|
{
|
|
|
|
setValue(buildConfig, "userEnvironmentChanges", EnvironmentItem::toStringList(diff));
|
|
|
|
}
|
|
|
|
|
|
|
|
/// **************************
|
|
|
|
/// Qt4ProjectBuildConfigWidget
|
|
|
|
/// **************************
|
|
|
|
|
|
|
|
|
|
|
|
void Qt4Project::collectApplicationProFiles(QList<Qt4ProFileNode *> &list, Qt4ProFileNode *node)
|
|
|
|
{
|
|
|
|
if (node->projectType() == Internal::ApplicationTemplate
|
|
|
|
|| node->projectType() == Internal::ScriptTemplate) {
|
|
|
|
list.append(node);
|
|
|
|
}
|
|
|
|
foreach (ProjectNode *n, node->subProjectNodes()) {
|
|
|
|
Qt4ProFileNode *qt4ProFileNode = qobject_cast<Qt4ProFileNode *>(n);
|
|
|
|
if (qt4ProFileNode)
|
|
|
|
collectApplicationProFiles(list, qt4ProFileNode);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::foldersAboutToBeAdded(FolderNode *, const QList<FolderNode*> &nodes)
|
|
|
|
{
|
|
|
|
QList<Qt4ProFileNode *> list;
|
|
|
|
foreach (FolderNode *node, nodes) {
|
|
|
|
Qt4ProFileNode *qt4ProFileNode = qobject_cast<Qt4ProFileNode *>(node);
|
|
|
|
if (qt4ProFileNode)
|
|
|
|
collectApplicationProFiles(list, qt4ProFileNode);
|
|
|
|
}
|
|
|
|
m_applicationProFileChange = list;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::checkForNewApplicationProjects()
|
|
|
|
{
|
|
|
|
// Check all new project nodes
|
|
|
|
// against all runConfigurations
|
|
|
|
|
|
|
|
foreach (Qt4ProFileNode *qt4proFile, m_applicationProFileChange) {
|
|
|
|
bool found = false;
|
|
|
|
foreach (QSharedPointer<RunConfiguration> rc, runConfigurations()) {
|
|
|
|
QSharedPointer<Qt4RunConfiguration> qtrc = rc.dynamicCast<Qt4RunConfiguration>();
|
|
|
|
if (qtrc && qtrc->proFilePath() == qt4proFile->path()) {
|
|
|
|
found = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!found) {
|
|
|
|
QSharedPointer<Qt4RunConfiguration> newRc(new Qt4RunConfiguration(this, qt4proFile->path()));
|
|
|
|
addRunConfiguration(newRc);
|
|
|
|
m_isApplication = true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::checkForDeletedApplicationProjects()
|
|
|
|
{
|
|
|
|
QStringList paths;
|
|
|
|
foreach (Qt4ProFileNode * node, applicationProFiles())
|
|
|
|
paths.append(node->path());
|
|
|
|
|
2009-02-12 16:09:23 +01:00
|
|
|
// qDebug()<<"Still existing paths :"<<paths;
|
2008-12-02 12:01:29 +01:00
|
|
|
|
|
|
|
QList<QSharedPointer<Qt4RunConfiguration> > removeList;
|
|
|
|
foreach (QSharedPointer<RunConfiguration> rc, runConfigurations()) {
|
|
|
|
if (QSharedPointer<Qt4RunConfiguration> qt4rc = rc.dynamicCast<Qt4RunConfiguration>()) {
|
|
|
|
if (!paths.contains(qt4rc->proFilePath())) {
|
|
|
|
removeList.append(qt4rc);
|
2009-02-12 16:09:23 +01:00
|
|
|
// qDebug()<<"Removing runConfiguration for "<<qt4rc->proFilePath();
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
bool resetActiveRunConfiguration = false;
|
|
|
|
QSharedPointer<RunConfiguration> rc(new ProjectExplorer::CustomExecutableRunConfiguration(this));
|
2008-12-09 11:07:24 +01:00
|
|
|
foreach (QSharedPointer<Qt4RunConfiguration> qt4rc, removeList) {
|
2008-12-02 12:01:29 +01:00
|
|
|
removeRunConfiguration(qt4rc);
|
|
|
|
if (activeRunConfiguration() == qt4rc)
|
|
|
|
resetActiveRunConfiguration = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (runConfigurations().isEmpty()) {
|
|
|
|
QSharedPointer<RunConfiguration> rc(new ProjectExplorer::CustomExecutableRunConfiguration(this));
|
|
|
|
addRunConfiguration(rc);
|
|
|
|
setActiveRunConfiguration(rc);
|
|
|
|
m_isApplication = false;
|
|
|
|
} else if (resetActiveRunConfiguration) {
|
|
|
|
setActiveRunConfiguration(runConfigurations().first());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
QList<Qt4ProFileNode *> Qt4Project::applicationProFiles() const
|
|
|
|
{
|
|
|
|
QList<Qt4ProFileNode *> list;
|
|
|
|
collectApplicationProFiles(list, rootProjectNode());
|
|
|
|
return list;
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::projectTypeChanged(Qt4ProFileNode *node, const Qt4ProjectType oldType, const Qt4ProjectType newType)
|
|
|
|
{
|
|
|
|
if (oldType == Internal::ApplicationTemplate
|
|
|
|
|| oldType == Internal::ScriptTemplate) {
|
|
|
|
// check wheter we need to delete a Run Configuration
|
|
|
|
checkForDeletedApplicationProjects();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (newType == Internal::ApplicationTemplate
|
|
|
|
|| newType == Internal::ScriptTemplate) {
|
|
|
|
// add a new Run Configuration
|
|
|
|
m_applicationProFileChange.clear();
|
|
|
|
m_applicationProFileChange.append(node);
|
|
|
|
checkForNewApplicationProjects();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::proFileUpdated(Qt4ProjectManager::Internal::Qt4ProFileNode *node)
|
|
|
|
{
|
|
|
|
foreach (QSharedPointer<RunConfiguration> rc, runConfigurations()) {
|
|
|
|
if (QSharedPointer<Qt4RunConfiguration> qt4rc = rc.dynamicCast<Qt4RunConfiguration>()) {
|
|
|
|
if (qt4rc->proFilePath() == node->path()) {
|
2009-03-19 15:04:43 +01:00
|
|
|
qt4rc->invalidateCachedTargetInformation();
|
2008-12-02 12:01:29 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
QMakeStep *Qt4Project::qmakeStep() const
|
|
|
|
{
|
|
|
|
QMakeStep *qs = 0;
|
|
|
|
foreach(BuildStep *bs, buildSteps())
|
|
|
|
if ( (qs = qobject_cast<QMakeStep *>(bs)) != 0)
|
|
|
|
return qs;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
MakeStep *Qt4Project::makeStep() const
|
|
|
|
{
|
|
|
|
MakeStep *qs = 0;
|
|
|
|
foreach(BuildStep *bs, buildSteps())
|
|
|
|
if ((qs = qobject_cast<MakeStep *>(bs)) != 0)
|
|
|
|
return qs;
|
|
|
|
return 0;
|
|
|
|
}
|
2008-12-02 18:14:06 +01:00
|
|
|
|
2008-12-05 14:29:18 +01:00
|
|
|
bool Qt4Project::hasSubNode(Qt4PriFileNode *root, const QString &path)
|
2008-12-02 18:14:06 +01:00
|
|
|
{
|
2008-12-05 14:29:18 +01:00
|
|
|
if (root->path() == path)
|
|
|
|
return true;
|
|
|
|
foreach (FolderNode *fn, root->subFolderNodes()) {
|
|
|
|
if (qobject_cast<Qt4ProFileNode *>(fn)) {
|
|
|
|
// we aren't interested in pro file nodes
|
2008-12-09 11:07:24 +01:00
|
|
|
} else if (Qt4PriFileNode *qt4prifilenode = qobject_cast<Qt4PriFileNode *>(fn)) {
|
2008-12-05 14:29:18 +01:00
|
|
|
if (hasSubNode(qt4prifilenode, path))
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
2008-12-02 18:14:06 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::findProFile(const QString& fileName, Qt4ProFileNode *root, QList<Qt4ProFileNode *> &list)
|
|
|
|
{
|
2008-12-05 14:29:18 +01:00
|
|
|
if (hasSubNode(root, fileName))
|
2008-12-02 18:14:06 +01:00
|
|
|
list.append(root);
|
|
|
|
|
|
|
|
foreach (FolderNode *fn, root->subFolderNodes())
|
|
|
|
if (Qt4ProFileNode *qt4proFileNode = qobject_cast<Qt4ProFileNode *>(fn))
|
|
|
|
findProFile(fileName, qt4proFileNode, list);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Qt4Project::notifyChanged(const QString &name)
|
|
|
|
{
|
2008-12-05 14:29:18 +01:00
|
|
|
if (files(Qt4Project::ExcludeGeneratedFiles).contains(name)) {
|
|
|
|
QList<Qt4ProFileNode *> list;
|
|
|
|
findProFile(name, rootProjectNode(), list);
|
|
|
|
foreach(Qt4ProFileNode *node, list)
|
|
|
|
node->update();
|
|
|
|
}
|
2008-12-02 18:14:06 +01:00
|
|
|
}
|
2009-03-19 15:04:43 +01:00
|
|
|
|
|
|
|
void Qt4Project::invalidateCachedTargetInformation()
|
|
|
|
{
|
|
|
|
foreach(QSharedPointer<RunConfiguration> rc, runConfigurations()) {
|
|
|
|
QSharedPointer<Qt4RunConfiguration> qt4rc = rc.dynamicCast<Qt4RunConfiguration>();
|
|
|
|
if (qt4rc) {
|
|
|
|
qt4rc->invalidateCachedTargetInformation();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*!
|
|
|
|
Handle special case were a subproject of the qt directory is opened, and
|
|
|
|
qt was configured to be built as a shadow build -> also build in the sub-
|
|
|
|
project in the correct shadow build directory.
|
|
|
|
*/
|
|
|
|
|
|
|
|
// TODO this function should be called on project first load
|
|
|
|
// and it should check against all configured qt versions ?
|
|
|
|
//void Qt4Project::detectQtShadowBuild(const QString &buildConfiguration) const
|
|
|
|
//{
|
|
|
|
// if (project()->activeBuildConfiguration() == buildConfiguration)
|
|
|
|
// return;
|
|
|
|
//
|
|
|
|
// const QString currentQtDir = static_cast<Qt4Project *>(project())->qtDir(buildConfiguration);
|
|
|
|
// const QString qtSourceDir = static_cast<Qt4Project *>(project())->qtVersion(buildConfiguration)->sourcePath();
|
|
|
|
//
|
|
|
|
// // if the project is a sub-project of Qt and Qt was shadow-built then automatically
|
|
|
|
// // adjust the build directory of the sub-project.
|
|
|
|
// if (project()->file()->fileName().startsWith(qtSourceDir) && qtSourceDir != currentQtDir) {
|
|
|
|
// project()->setValue(buildConfiguration, "useShadowBuild", true);
|
|
|
|
// QString buildDir = QFileInfo(project()->file()->fileName()).absolutePath();
|
|
|
|
// buildDir.replace(qtSourceDir, currentQtDir);
|
|
|
|
// project()->setValue(buildConfiguration, "buildDirectory", buildDir);
|
|
|
|
// project()->setValue(buildConfiguration, "autoShadowBuild", true);
|
|
|
|
// }
|
|
|
|
//}
|
|
|
|
|
|
|
|
|