forked from qt-creator/qt-creator
Fixes: Add ToolChain classes.
Details: These classes replace a number of classes with differing interfaces by just one class. The design isn't quite perfect, but a lot better than what it used to be. Also moved the ToolChain classes to the projectexplorerm so that eventually the cmake plugin can also use them.
This commit is contained in:
@@ -37,7 +37,7 @@
|
||||
#include <QtCore/QDebug>
|
||||
#include <QtCore/QXmlStreamReader>
|
||||
|
||||
using namespace Qt4ProjectManager::Internal;
|
||||
using namespace ProjectExplorer::Internal;
|
||||
using ProjectExplorer::Environment;
|
||||
|
||||
CeSdkInfo::CeSdkInfo()
|
||||
@@ -45,15 +45,13 @@ CeSdkInfo::CeSdkInfo()
|
||||
{
|
||||
}
|
||||
|
||||
Environment CeSdkInfo::addToEnvironment(const Environment &env)
|
||||
void CeSdkInfo::addToEnvironment(Environment &env)
|
||||
{
|
||||
qDebug() << "adding " << name() << "to Environment";
|
||||
Environment e(env);
|
||||
e.set("INCLUDE", m_include);
|
||||
e.set("LIB", m_lib);
|
||||
e.prependOrSetPath(m_bin);
|
||||
env.set("INCLUDE", m_include);
|
||||
env.set("LIB", m_lib);
|
||||
env.prependOrSetPath(m_bin);
|
||||
qDebug()<<e.toStringList();
|
||||
return e;
|
||||
}
|
||||
|
||||
CeSdkHandler::CeSdkHandler()
|
||||
@@ -42,8 +42,7 @@
|
||||
#define VCINSTALL_MACRO "$(VCInstallDir)"
|
||||
#define VSINSTALL_MACRO "$(VSInstallDir)"
|
||||
|
||||
namespace Qt4ProjectManager {
|
||||
namespace Internal {
|
||||
namespace ProjectExplorer {
|
||||
|
||||
class CeSdkInfo
|
||||
{
|
||||
@@ -53,7 +52,7 @@ public:
|
||||
inline QString binPath();
|
||||
inline QString includePath();
|
||||
inline QString libPath();
|
||||
ProjectExplorer::Environment addToEnvironment(const ProjectExplorer::Environment &env);
|
||||
void addToEnvironment(ProjectExplorer::Environment &env);
|
||||
inline bool isValid();
|
||||
inline int majorVersion();
|
||||
inline int minorVersion();
|
||||
@@ -102,7 +101,6 @@ inline QString CeSdkHandler::fixPaths(QString path) const
|
||||
return QDir::toNativeSeparators(QDir::cleanPath(path.replace(VCINSTALL_MACRO, VCInstallDir).replace(VSINSTALL_MACRO, VSInstallDir).replace(QLatin1String(";$(PATH)"), QLatin1String(""))));
|
||||
}
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Qt4ProjectManager
|
||||
|
||||
#endif // CE_SDK_HANDLER_H
|
||||
@@ -52,7 +52,8 @@ HEADERS += projectexplorer.h \
|
||||
removefiledialog.h \
|
||||
nodesvisitor.h \
|
||||
projectmodels.h \
|
||||
currentprojectfind.h
|
||||
currentprojectfind.h \
|
||||
toolchain.h
|
||||
SOURCES += projectexplorer.cpp \
|
||||
projectwindow.cpp \
|
||||
buildmanager.cpp \
|
||||
@@ -93,7 +94,8 @@ SOURCES += projectexplorer.cpp \
|
||||
removefiledialog.cpp \
|
||||
nodesvisitor.cpp \
|
||||
projectmodels.cpp \
|
||||
currentprojectfind.cpp
|
||||
currentprojectfind.cpp \
|
||||
toolchain.cpp
|
||||
FORMS += dependenciespanel.ui \
|
||||
buildsettingspropertiespage.ui \
|
||||
processstep.ui \
|
||||
|
||||
326
src/plugins/projectexplorer/toolchain.cpp
Normal file
326
src/plugins/projectexplorer/toolchain.cpp
Normal file
@@ -0,0 +1,326 @@
|
||||
#include "toolchain.h"
|
||||
#include "cesdkhandler.h"
|
||||
#include <QtCore/QFileInfo>
|
||||
#include <QtCore/QProcess>
|
||||
#include <QtCore/QDebug>
|
||||
#include <QtCore/QSettings>
|
||||
#include <QtCore/QDir>
|
||||
#include <QtCore/QTemporaryFile>
|
||||
#include <QtCore/QString>
|
||||
|
||||
using namespace ProjectExplorer;
|
||||
using namespace ProjectExplorer::Internal;
|
||||
|
||||
bool ToolChain::equals(ToolChain *a, ToolChain *b)
|
||||
{
|
||||
if (a == b)
|
||||
return true;
|
||||
if (a == 0 || b == 0)
|
||||
return false;
|
||||
if (a->type() == b->type())
|
||||
a->equals(b);
|
||||
}
|
||||
|
||||
ToolChain::ToolChain()
|
||||
{
|
||||
}
|
||||
|
||||
ToolChain::~ToolChain()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ToolChain *ToolChain::createGccToolChain(const QString &gcc)
|
||||
{
|
||||
return new GccToolChain(gcc);
|
||||
}
|
||||
|
||||
ToolChain *ToolChain::createMinGWToolChain(const QString &gcc, const QString &mingwPath)
|
||||
{
|
||||
return new MinGWToolChain(gcc, mingwPath);
|
||||
}
|
||||
|
||||
ToolChain *ToolChain::createMSVCToolChain(const QString &name)
|
||||
{
|
||||
return new MSVCToolChain(name);
|
||||
}
|
||||
|
||||
ToolChain *ToolChain::createWinCEToolChain(const QString &name, const QString &platform)
|
||||
{
|
||||
return new WinCEToolChain(name, platform);
|
||||
}
|
||||
|
||||
QStringList ToolChain::availableMSVCVersions()
|
||||
{
|
||||
QSettings registry("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VS7",
|
||||
QSettings::NativeFormat);
|
||||
QStringList versions = registry.allKeys();
|
||||
return versions;
|
||||
}
|
||||
|
||||
GccToolChain::GccToolChain(const QString &gcc)
|
||||
: m_gcc(gcc)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ToolChain::ToolChainType GccToolChain::type() const
|
||||
{
|
||||
return ToolChain::GCC;
|
||||
}
|
||||
|
||||
QByteArray GccToolChain::predefinedMacros()
|
||||
{
|
||||
if (m_predefinedMacros.isEmpty()) {
|
||||
QStringList arguments;
|
||||
arguments << QLatin1String("-xc++")
|
||||
<< QLatin1String("-E")
|
||||
<< QLatin1String("-dM")
|
||||
<< QLatin1String("-");
|
||||
|
||||
QProcess cpp;
|
||||
cpp.start(m_gcc, arguments);
|
||||
cpp.closeWriteChannel();
|
||||
cpp.waitForFinished();
|
||||
m_predefinedMacros = cpp.readAllStandardOutput();
|
||||
}
|
||||
return m_predefinedMacros;
|
||||
}
|
||||
|
||||
QList<HeaderPath> GccToolChain::systemHeaderPaths()
|
||||
{
|
||||
if (m_systemHeaderPaths.isEmpty()) {
|
||||
QStringList arguments;
|
||||
arguments << QLatin1String("-xc++")
|
||||
<< QLatin1String("-E")
|
||||
<< QLatin1String("-v")
|
||||
<< QLatin1String("-");
|
||||
|
||||
QProcess cpp;
|
||||
cpp.setReadChannelMode(QProcess::MergedChannels);
|
||||
cpp.start(m_gcc, arguments);
|
||||
cpp.closeWriteChannel();
|
||||
cpp.waitForFinished();
|
||||
|
||||
QByteArray line;
|
||||
while (cpp.canReadLine()) {
|
||||
line = cpp.readLine();
|
||||
if (line.startsWith("#include"))
|
||||
break;
|
||||
}
|
||||
|
||||
if (! line.isEmpty() && line.startsWith("#include")) {
|
||||
HeaderPath::Kind kind = HeaderPath::UserHeaderPath;
|
||||
while (cpp.canReadLine()) {
|
||||
line = cpp.readLine();
|
||||
if (line.startsWith("#include")) {
|
||||
kind = HeaderPath::GlobalHeaderPath;
|
||||
} else if (! line.isEmpty() && QChar(line.at(0)).isSpace()) {
|
||||
HeaderPath::Kind thisHeaderKind = kind;
|
||||
|
||||
line = line.trimmed();
|
||||
if (line.endsWith('\n'))
|
||||
line.chop(1);
|
||||
|
||||
int index = line.indexOf(" (framework directory)");
|
||||
if (index != -1) {
|
||||
line = line.left(index);
|
||||
thisHeaderKind = HeaderPath::FrameworkHeaderPath;
|
||||
}
|
||||
|
||||
m_systemHeaderPaths.append(HeaderPath(QFile::decodeName(line), thisHeaderKind));
|
||||
} else if (line.startsWith("End of search list.")) {
|
||||
break;
|
||||
} else {
|
||||
qWarning() << "ignore line:" << line;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return m_systemHeaderPaths;
|
||||
}
|
||||
|
||||
void GccToolChain::addToEnvironment(ProjectExplorer::Environment &env)
|
||||
{
|
||||
Q_UNUSED(env)
|
||||
}
|
||||
|
||||
bool GccToolChain::equals(ToolChain *other) const
|
||||
{
|
||||
return (m_gcc == static_cast<GccToolChain *>(other)->m_gcc);
|
||||
}
|
||||
|
||||
MinGWToolChain::MinGWToolChain(const QString &gcc, const QString &mingwPath)
|
||||
: GccToolChain(gcc), m_mingwPath(mingwPath)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ToolChain::ToolChainType MinGWToolChain::type() const
|
||||
{
|
||||
return ToolChain::MinGW;
|
||||
}
|
||||
|
||||
bool MinGWToolChain::equals(ToolChain *other) const
|
||||
{
|
||||
MinGWToolChain *o = static_cast<MinGWToolChain *>(other);
|
||||
return (m_mingwPath == o->m_mingwPath && this->GccToolChain::equals(other));
|
||||
}
|
||||
|
||||
void MinGWToolChain::addToEnvironment(ProjectExplorer::Environment &env)
|
||||
{
|
||||
QString binDir = m_mingwPath + "/bin";
|
||||
if (QFileInfo(binDir).exists())
|
||||
env.prependOrSetPath(binDir);
|
||||
}
|
||||
|
||||
|
||||
MSVCToolChain::MSVCToolChain(const QString &name)
|
||||
: m_name(name), m_valuesSet(false)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ToolChain::ToolChainType MSVCToolChain::type() const
|
||||
{
|
||||
return ToolChain::MSVC;
|
||||
}
|
||||
|
||||
bool MSVCToolChain::equals(ToolChain *other) const
|
||||
{
|
||||
MSVCToolChain *o = static_cast<MSVCToolChain *>(other);
|
||||
return (m_name == o->m_name);
|
||||
}
|
||||
|
||||
QByteArray MSVCToolChain::predefinedMacros()
|
||||
{
|
||||
return "#define __WIN32__\n"
|
||||
"#define __WIN32\n"
|
||||
"#define _WIN32\n"
|
||||
"#define WIN32\n"
|
||||
"#define __WINNT__\n"
|
||||
"#define __WINNT\n"
|
||||
"#define WINNT\n"
|
||||
"#define _X86_\n"
|
||||
"#define __MSVCRT__\n";
|
||||
}
|
||||
|
||||
QList<HeaderPath> MSVCToolChain::systemHeaderPaths()
|
||||
{
|
||||
//TODO fix this code
|
||||
ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
|
||||
addToEnvironment(env);
|
||||
#ifdef QTCREATOR_WITH_MSVC_INCLUDES
|
||||
return env.value("INCLUDE").split(QLatin1Char(';'));
|
||||
#endif
|
||||
return QList<HeaderPath>();
|
||||
}
|
||||
|
||||
void MSVCToolChain::addToEnvironment(ProjectExplorer::Environment &env)
|
||||
{
|
||||
if (!m_valuesSet) {
|
||||
QSettings registry("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VS7",
|
||||
QSettings::NativeFormat);
|
||||
QString path = registry.value(m_name).toString();
|
||||
ProjectExplorer::Environment oldEnv(env);
|
||||
QString desc;
|
||||
QString varsbat = path + "Common7\\Tools\\vsvars32.bat";
|
||||
if (QFileInfo(varsbat).exists()) {
|
||||
QTemporaryFile tf(QDir::tempPath() + "\\XXXXXX.bat");
|
||||
if (!tf.open())
|
||||
return;
|
||||
QString filename = tf.fileName();
|
||||
tf.write("call \"" + varsbat.toLocal8Bit()+"\"\r\n");
|
||||
tf.write(("set > \"" + QDir::tempPath() + "\\qtcreator-msvc-environment.txt\"\r\n").toLocal8Bit());
|
||||
tf.flush();
|
||||
tf.waitForBytesWritten(30000);
|
||||
|
||||
QProcess run;
|
||||
QString cmdPath = env.searchInPath("cmd");
|
||||
run.start(cmdPath, QStringList()<<"/c"<<filename);
|
||||
run.waitForFinished();
|
||||
tf.close();
|
||||
|
||||
QFile vars(QDir::tempPath() + "\\qtcreator-msvc-environment.txt");
|
||||
if (vars.exists() && vars.open(QIODevice::ReadOnly)) {
|
||||
while (!vars.atEnd()) {
|
||||
QByteArray line = vars.readLine();
|
||||
QString line2 = QString::fromLocal8Bit(line);
|
||||
line2 = line2.trimmed();
|
||||
QRegExp regexp("(\\w*)=(.*)");
|
||||
if (regexp.exactMatch(line2)) {
|
||||
QString variable = regexp.cap(1);
|
||||
QString value = regexp.cap(2);
|
||||
value.replace('%' + variable + '%', oldEnv.value(variable));
|
||||
m_values.append(QPair<QString, QString>(variable, value));
|
||||
|
||||
}
|
||||
}
|
||||
vars.close();
|
||||
vars.remove();
|
||||
}
|
||||
}
|
||||
m_valuesSet = true;
|
||||
}
|
||||
|
||||
QList< QPair<QString, QString> >::const_iterator it, end;
|
||||
end = m_values.constEnd();
|
||||
for (it = m_values.constBegin(); it != end; ++it) {
|
||||
env.set((*it).first, (*it).second);
|
||||
qDebug()<<"variable:"<<(*it).first<<"value:"<<(*it).second;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
WinCEToolChain::WinCEToolChain(const QString &name, const QString &platform)
|
||||
: MSVCToolChain(name), m_platform(platform)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ToolChain::ToolChainType WinCEToolChain::type() const
|
||||
{
|
||||
return ToolChain::WINCE;
|
||||
}
|
||||
|
||||
bool WinCEToolChain::equals(ToolChain *other) const
|
||||
{
|
||||
WinCEToolChain *o = static_cast<WinCEToolChain *>(other);
|
||||
return (m_platform == o->m_platform && this->MSVCToolChain::equals(other));
|
||||
}
|
||||
|
||||
QByteArray WinCEToolChain::predefinedMacros()
|
||||
{
|
||||
//TODO
|
||||
return MSVCToolChain::predefinedMacros();
|
||||
}
|
||||
|
||||
QList<HeaderPath> WinCEToolChain::systemHeaderPaths()
|
||||
{
|
||||
//TODO fix this code
|
||||
ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
|
||||
addToEnvironment(env);
|
||||
#ifdef QTCREATOR_WITH_MSVC_INCLUDES
|
||||
return env.value("INCLUDE").split(QLatin1Char(';'));
|
||||
#endif
|
||||
}
|
||||
|
||||
void WinCEToolChain::addToEnvironment(ProjectExplorer::Environment &env)
|
||||
{
|
||||
MSVCToolChain::addToEnvironment(env);
|
||||
QSettings registry("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VS7",
|
||||
QSettings::NativeFormat);
|
||||
QString path = registry.value(m_name).toString();
|
||||
// Find MSVC path
|
||||
|
||||
path += "/";
|
||||
|
||||
// qDebug()<<"MSVC path"<<msvcPath;
|
||||
// qDebug()<<"looking for platform name in"<< path() + "/mkspecs/" + mkspec() +"/qmake.conf";
|
||||
// Find Platform name
|
||||
// qDebug()<<"Platform Name"<<platformName;
|
||||
|
||||
CeSdkHandler cesdkhandler;
|
||||
cesdkhandler.parse(path);
|
||||
cesdkhandler.find(m_platform).addToEnvironment(env);
|
||||
}
|
||||
135
src/plugins/projectexplorer/toolchain.h
Normal file
135
src/plugins/projectexplorer/toolchain.h
Normal file
@@ -0,0 +1,135 @@
|
||||
#ifndef TOOLCHAIN_H
|
||||
#define TOOLCHAIN_H
|
||||
|
||||
#include "environment.h"
|
||||
#include <QtCore/QString>
|
||||
#include <QtCore/QPair>
|
||||
|
||||
namespace ProjectExplorer {
|
||||
|
||||
class PROJECTEXPLORER_EXPORT HeaderPath
|
||||
{
|
||||
public:
|
||||
enum Kind {
|
||||
GlobalHeaderPath,
|
||||
UserHeaderPath,
|
||||
FrameworkHeaderPath
|
||||
};
|
||||
|
||||
HeaderPath()
|
||||
: _kind(GlobalHeaderPath)
|
||||
{ }
|
||||
|
||||
HeaderPath(const QString &path, Kind kind)
|
||||
: _path(path), _kind(kind)
|
||||
{ }
|
||||
|
||||
QString path() const { return _path; }
|
||||
Kind kind() const { return _kind; }
|
||||
|
||||
private:
|
||||
QString _path;
|
||||
Kind _kind;
|
||||
};
|
||||
|
||||
|
||||
|
||||
class PROJECTEXPLORER_EXPORT ToolChain
|
||||
{
|
||||
public:
|
||||
enum ToolChainType
|
||||
{
|
||||
GCC,
|
||||
MinGW,
|
||||
MSVC,
|
||||
WINCE,
|
||||
OTHER,
|
||||
INVALID
|
||||
};
|
||||
|
||||
virtual QByteArray predefinedMacros() = 0;
|
||||
virtual QList<HeaderPath> systemHeaderPaths() = 0;
|
||||
virtual void addToEnvironment(ProjectExplorer::Environment &env) = 0;
|
||||
virtual ToolChainType type() const = 0;
|
||||
|
||||
ToolChain();
|
||||
virtual ~ToolChain();
|
||||
|
||||
static bool equals(ToolChain *, ToolChain *);
|
||||
static ToolChain *createGccToolChain(const QString &gcc);
|
||||
static ToolChain *createMinGWToolChain(const QString &gcc, const QString &mingwPath);
|
||||
static ToolChain *createMSVCToolChain(const QString &name);
|
||||
static ToolChain *createWinCEToolChain(const QString &name, const QString &platform);
|
||||
static QStringList availableMSVCVersions();
|
||||
|
||||
protected:
|
||||
virtual bool equals(ToolChain *other) const = 0;
|
||||
};
|
||||
|
||||
namespace Internal {
|
||||
class GccToolChain : public ToolChain
|
||||
{
|
||||
public:
|
||||
GccToolChain(const QString &gcc);
|
||||
virtual QByteArray predefinedMacros();
|
||||
virtual QList<HeaderPath> systemHeaderPaths();
|
||||
virtual void addToEnvironment(ProjectExplorer::Environment &env);
|
||||
virtual ToolChainType type() const;
|
||||
|
||||
protected:
|
||||
virtual bool equals(ToolChain *other) const;
|
||||
private:
|
||||
QString m_gcc;
|
||||
QByteArray m_predefinedMacros;
|
||||
QList<HeaderPath> m_systemHeaderPaths;
|
||||
};
|
||||
|
||||
// TODO this class needs to fleshed out more
|
||||
class MinGWToolChain : public GccToolChain
|
||||
{
|
||||
public:
|
||||
MinGWToolChain(const QString &gcc, const QString &mingwPath);
|
||||
virtual void addToEnvironment(ProjectExplorer::Environment &env);
|
||||
virtual ToolChainType type() const;
|
||||
protected:
|
||||
virtual bool equals(ToolChain *other) const;
|
||||
private:
|
||||
QString m_mingwPath;
|
||||
};
|
||||
|
||||
// TODO some stuff needs to be moved into this
|
||||
class MSVCToolChain : public ToolChain
|
||||
{
|
||||
public:
|
||||
MSVCToolChain(const QString &name);
|
||||
virtual QByteArray predefinedMacros();
|
||||
virtual QList<HeaderPath> systemHeaderPaths();
|
||||
virtual void addToEnvironment(ProjectExplorer::Environment &env);
|
||||
virtual ToolChainType type() const;
|
||||
protected:
|
||||
virtual bool equals(ToolChain *other) const;
|
||||
QString m_name;
|
||||
private:
|
||||
mutable QList<QPair<QString, QString> > m_values;
|
||||
mutable bool m_valuesSet;
|
||||
};
|
||||
|
||||
// TODO some stuff needs to be moved into here
|
||||
class WinCEToolChain : public MSVCToolChain
|
||||
{
|
||||
public:
|
||||
WinCEToolChain(const QString &name, const QString &platform);
|
||||
virtual QByteArray predefinedMacros();
|
||||
virtual QList<HeaderPath> systemHeaderPaths();
|
||||
virtual void addToEnvironment(ProjectExplorer::Environment &env);
|
||||
virtual ToolChainType type() const;
|
||||
protected:
|
||||
virtual bool equals(ToolChain *other) const;
|
||||
private:
|
||||
QString m_platform;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif // TOOLCHAIN_H
|
||||
@@ -1,128 +0,0 @@
|
||||
/***************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Qt Software Information (qt-info@nokia.com)
|
||||
**
|
||||
**
|
||||
** Non-Open Source Usage
|
||||
**
|
||||
** Licensees may use this file in accordance with the Qt Beta Version
|
||||
** License Agreement, Agreement version 2.2 provided with the Software or,
|
||||
** alternatively, in accordance with the terms contained in a written
|
||||
** agreement between you and Nokia.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
**
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License versions 2.0 or 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the packaging
|
||||
** of this file. Please review the following information to ensure GNU
|
||||
** General Public Licensing requirements will be met:
|
||||
**
|
||||
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt GPL Exception
|
||||
** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
***************************************************************************/
|
||||
|
||||
#include "gccpreprocessor.h"
|
||||
|
||||
#include <QProcess>
|
||||
#include <QString>
|
||||
#include <QFile>
|
||||
#include <QtDebug>
|
||||
|
||||
using namespace Qt4ProjectManager::Internal;
|
||||
|
||||
GCCPreprocessor::GCCPreprocessor(const QString &gcc)
|
||||
: m_gcc(gcc)
|
||||
{ }
|
||||
|
||||
GCCPreprocessor::~GCCPreprocessor()
|
||||
{ }
|
||||
|
||||
void GCCPreprocessor::setGcc(const QString &gcc)
|
||||
{
|
||||
if (m_gcc == gcc)
|
||||
return;
|
||||
m_gcc = gcc;
|
||||
m_predefinedMacros.clear();;
|
||||
m_systemHeaderPaths.clear();;
|
||||
}
|
||||
|
||||
QByteArray GCCPreprocessor::predefinedMacros()
|
||||
{
|
||||
if (m_predefinedMacros.isEmpty()) {
|
||||
QStringList arguments;
|
||||
arguments << QLatin1String("-xc++")
|
||||
<< QLatin1String("-E")
|
||||
<< QLatin1String("-dM")
|
||||
<< QLatin1String("-");
|
||||
|
||||
QProcess cpp;
|
||||
cpp.start(m_gcc, arguments);
|
||||
cpp.closeWriteChannel();
|
||||
cpp.waitForFinished();
|
||||
m_predefinedMacros = cpp.readAllStandardOutput();
|
||||
}
|
||||
return m_predefinedMacros;
|
||||
}
|
||||
|
||||
QList<HeaderPath> GCCPreprocessor::systemHeaderPaths()
|
||||
{
|
||||
if (m_systemHeaderPaths.isEmpty()) {
|
||||
QStringList arguments;
|
||||
arguments << QLatin1String("-xc++")
|
||||
<< QLatin1String("-E")
|
||||
<< QLatin1String("-v")
|
||||
<< QLatin1String("-");
|
||||
|
||||
QProcess cpp;
|
||||
cpp.setReadChannelMode(QProcess::MergedChannels);
|
||||
cpp.start(m_gcc, arguments);
|
||||
cpp.closeWriteChannel();
|
||||
cpp.waitForFinished();
|
||||
|
||||
QByteArray line;
|
||||
while (cpp.canReadLine()) {
|
||||
line = cpp.readLine();
|
||||
if (line.startsWith("#include"))
|
||||
break;
|
||||
}
|
||||
|
||||
if (! line.isEmpty() && line.startsWith("#include")) {
|
||||
HeaderPath::Kind kind = HeaderPath::UserHeaderPath;
|
||||
while (cpp.canReadLine()) {
|
||||
line = cpp.readLine();
|
||||
if (line.startsWith("#include")) {
|
||||
kind = HeaderPath::GlobalHeaderPath;
|
||||
} else if (! line.isEmpty() && QChar(line.at(0)).isSpace()) {
|
||||
HeaderPath::Kind thisHeaderKind = kind;
|
||||
|
||||
line = line.trimmed();
|
||||
if (line.endsWith('\n'))
|
||||
line.chop(1);
|
||||
|
||||
int index = line.indexOf(" (framework directory)");
|
||||
if (index != -1) {
|
||||
line = line.left(index);
|
||||
thisHeaderKind = HeaderPath::FrameworkHeaderPath;
|
||||
}
|
||||
|
||||
m_systemHeaderPaths.append(HeaderPath(QFile::decodeName(line), thisHeaderKind));
|
||||
} else if (line.startsWith("End of search list.")) {
|
||||
break;
|
||||
} else {
|
||||
qWarning() << "ignore line:" << line;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return m_systemHeaderPaths;
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
/***************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Qt Software Information (qt-info@nokia.com)
|
||||
**
|
||||
**
|
||||
** Non-Open Source Usage
|
||||
**
|
||||
** Licensees may use this file in accordance with the Qt Beta Version
|
||||
** License Agreement, Agreement version 2.2 provided with the Software or,
|
||||
** alternatively, in accordance with the terms contained in a written
|
||||
** agreement between you and Nokia.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
**
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License versions 2.0 or 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the packaging
|
||||
** of this file. Please review the following information to ensure GNU
|
||||
** General Public Licensing requirements will be met:
|
||||
**
|
||||
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt GPL Exception
|
||||
** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef GCCPREPROCESSOR_H
|
||||
#define GCCPREPROCESSOR_H
|
||||
|
||||
#include "headerpath.h"
|
||||
#include <QByteArray>
|
||||
#include <QList>
|
||||
|
||||
namespace Qt4ProjectManager {
|
||||
namespace Internal {
|
||||
|
||||
class GCCPreprocessor
|
||||
{
|
||||
public:
|
||||
GCCPreprocessor(const QString &gcc = QLatin1String("g++"));
|
||||
~GCCPreprocessor();
|
||||
|
||||
void setGcc(const QString &gcc);
|
||||
QByteArray predefinedMacros();
|
||||
QList<HeaderPath> systemHeaderPaths();
|
||||
|
||||
private:
|
||||
QString m_gcc;
|
||||
QByteArray m_predefinedMacros;
|
||||
QList<HeaderPath> m_systemHeaderPaths;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Qt4ProjectManager
|
||||
|
||||
#endif // GCCPREPROCESSOR_H
|
||||
@@ -1,71 +0,0 @@
|
||||
/***************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Qt Software Information (qt-info@nokia.com)
|
||||
**
|
||||
**
|
||||
** Non-Open Source Usage
|
||||
**
|
||||
** Licensees may use this file in accordance with the Qt Beta Version
|
||||
** License Agreement, Agreement version 2.2 provided with the Software or,
|
||||
** alternatively, in accordance with the terms contained in a written
|
||||
** agreement between you and Nokia.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
**
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License versions 2.0 or 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the packaging
|
||||
** of this file. Please review the following information to ensure GNU
|
||||
** General Public Licensing requirements will be met:
|
||||
**
|
||||
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt GPL Exception
|
||||
** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef HEADERPATH_H
|
||||
#define HEADERPATH_H
|
||||
|
||||
#include <QString>
|
||||
|
||||
namespace Qt4ProjectManager {
|
||||
namespace Internal {
|
||||
|
||||
class HeaderPath
|
||||
{
|
||||
public:
|
||||
enum Kind {
|
||||
GlobalHeaderPath,
|
||||
UserHeaderPath,
|
||||
FrameworkHeaderPath
|
||||
};
|
||||
|
||||
HeaderPath()
|
||||
: _kind(GlobalHeaderPath)
|
||||
{ }
|
||||
|
||||
HeaderPath(const QString &path, Kind kind)
|
||||
: _path(path), _kind(kind)
|
||||
{ }
|
||||
|
||||
QString path() const { return _path; }
|
||||
Kind kind() const { return _kind; }
|
||||
|
||||
private:
|
||||
QString _path;
|
||||
Kind _kind;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Qt4ProjectManager
|
||||
|
||||
|
||||
#endif // HEADERPATH_H
|
||||
@@ -69,8 +69,8 @@ MakeStep::~MakeStep()
|
||||
ProjectExplorer::BuildParserInterface *MakeStep::buildParser(const QtVersion * const version)
|
||||
{
|
||||
QString buildParser;
|
||||
QtVersion::ToolchainType type = version->toolchainType();
|
||||
if ( type == QtVersion::MSVC || type == QtVersion::WINCE)
|
||||
ProjectExplorer::ToolChain::ToolChainType type = version->toolchainType();
|
||||
if ( type == ProjectExplorer::ToolChain::MSVC || type == ProjectExplorer::ToolChain::WINCE)
|
||||
buildParser = Constants::BUILD_PARSER_MSVC;
|
||||
else
|
||||
buildParser = Constants::BUILD_PARSER_GCC;
|
||||
@@ -129,8 +129,8 @@ bool MakeStep::init(const QString &name)
|
||||
// FIXME doing this without the user having a way to override this is rather bad
|
||||
// so we only do it for unix and if the user didn't override the make command
|
||||
// but for now this is the least invasive change
|
||||
QtVersion::ToolchainType t = qobject_cast<Qt4Project *>(project())->qtVersion(name)->toolchainType();
|
||||
if (t != QtVersion::MSVC && t != QtVersion::WINCE) {
|
||||
ProjectExplorer::ToolChain::ToolChainType t = qobject_cast<Qt4Project *>(project())->qtVersion(name)->toolchainType();
|
||||
if (t != ProjectExplorer::ToolChain::MSVC && t != ProjectExplorer::ToolChain::WINCE) {
|
||||
if (value(name, "makeCmd").toString().isEmpty())
|
||||
args << "-w";
|
||||
}
|
||||
|
||||
@@ -1,158 +0,0 @@
|
||||
/***************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Qt Software Information (qt-info@nokia.com)
|
||||
**
|
||||
**
|
||||
** Non-Open Source Usage
|
||||
**
|
||||
** Licensees may use this file in accordance with the Qt Beta Version
|
||||
** License Agreement, Agreement version 2.2 provided with the Software or,
|
||||
** alternatively, in accordance with the terms contained in a written
|
||||
** agreement between you and Nokia.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
**
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License versions 2.0 or 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the packaging
|
||||
** of this file. Please review the following information to ensure GNU
|
||||
** General Public Licensing requirements will be met:
|
||||
**
|
||||
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt GPL Exception
|
||||
** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
***************************************************************************/
|
||||
|
||||
#include "msvcenvironment.h"
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
#include <QtCore/QFile>
|
||||
#include <QtCore/QProcess>
|
||||
#include <QtCore/QRegExp>
|
||||
#include <QtCore/QSettings>
|
||||
#include <QtCore/QStringList>
|
||||
#include <QtCore/QTemporaryFile>
|
||||
|
||||
using namespace Qt4ProjectManager::Internal;
|
||||
using ProjectExplorer::Environment;
|
||||
|
||||
MSVCEnvironment::MSVCEnvironment(const QString &name, const QString &path)
|
||||
: m_name(name), m_path(path), m_valuesSet(false)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
QString MSVCEnvironment::name() const
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
QString MSVCEnvironment::path() const
|
||||
{
|
||||
return m_path;
|
||||
}
|
||||
|
||||
QList<MSVCEnvironment> MSVCEnvironment::availableVersions()
|
||||
{
|
||||
QList<MSVCEnvironment> result;
|
||||
|
||||
QSettings registry("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\VisualStudio\\SxS\\VS7",
|
||||
QSettings::NativeFormat);
|
||||
QStringList versions = registry.allKeys();
|
||||
foreach (const QString &version, versions) {
|
||||
QString dir = registry.value(version).toString();
|
||||
result << MSVCEnvironment(version, dir);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
QString MSVCEnvironment::description() const
|
||||
{
|
||||
QString desc;
|
||||
desc = "Microsoft Visual Studio " + m_name + " from " + m_path;
|
||||
return desc;
|
||||
}
|
||||
|
||||
// This method is ugly as hell, but that is to be expected
|
||||
// It crates a temporary batch file which first runs vsvars32.bat from MSVC
|
||||
// and then runs *set* to get the environment
|
||||
// We cache that information.
|
||||
Environment MSVCEnvironment::addToEnvironment(const Environment &env) const
|
||||
{
|
||||
Environment e(env);
|
||||
if (!m_valuesSet) {
|
||||
QString desc;
|
||||
QString varsbat = m_path + "Common7\\Tools\\vsvars32.bat";
|
||||
if (QFileInfo(varsbat).exists()) {
|
||||
QTemporaryFile tf(QDir::tempPath() + "\\XXXXXX.bat");
|
||||
if (!tf.open())
|
||||
return e;
|
||||
QString filename = tf.fileName();
|
||||
tf.write("call \"" + varsbat.toLocal8Bit()+"\"\r\n");
|
||||
tf.write(("set > \"" + QDir::tempPath() + "\\qtcreator-msvc-environment.txt\"\r\n").toLocal8Bit());
|
||||
tf.flush();
|
||||
tf.waitForBytesWritten(30000);
|
||||
|
||||
QProcess run;
|
||||
QString cmdPath = e.searchInPath("cmd");
|
||||
run.start(cmdPath, QStringList()<<"/c"<<filename);
|
||||
run.waitForFinished();
|
||||
tf.close();
|
||||
|
||||
QFile vars(QDir::tempPath() + "\\qtcreator-msvc-environment.txt");
|
||||
if (vars.exists() && vars.open(QIODevice::ReadOnly)) {
|
||||
while (!vars.atEnd()) {
|
||||
QByteArray line = vars.readLine();
|
||||
QString line2 = QString::fromLocal8Bit(line);
|
||||
line2 = line2.trimmed();
|
||||
QRegExp regexp("(\\w*)=(.*)");
|
||||
if (regexp.exactMatch(line2)) {
|
||||
QString variable = regexp.cap(1);
|
||||
QString value = regexp.cap(2);
|
||||
value.replace('%' + variable + '%', e.value(variable));
|
||||
m_values.append(QPair<QString, QString>(variable, value));
|
||||
|
||||
}
|
||||
}
|
||||
vars.close();
|
||||
vars.remove();
|
||||
}
|
||||
}
|
||||
m_valuesSet = true;
|
||||
}
|
||||
|
||||
QList< QPair<QString, QString> >::const_iterator it, end;
|
||||
end = m_values.constEnd();
|
||||
for (it = m_values.constBegin(); it != end; ++it) {
|
||||
e.set((*it).first, (*it).second);
|
||||
qDebug()<<"variable:"<<(*it).first<<"value:"<<(*it).second;
|
||||
}
|
||||
|
||||
|
||||
// QFile varsbat(m_path + "Common7\\Tools\\vsvars32.bat");
|
||||
// if (varsbat.exists() && varsbat.open(QIODevice::ReadOnly)) {
|
||||
// while (!varsbat.atEnd()) {
|
||||
// QByteArray line = varsbat.readLine();
|
||||
// QString line2 = QString::fromLocal8Bit(line);
|
||||
// line2 = line2.trimmed();
|
||||
// QRegExp regexp("\\s*@?(S|s)(E|e)(T|t)\\s*(\\w*)=(.*)");
|
||||
// if (regexp.exactMatch(line2)) {
|
||||
// QString variable = regexp.cap(4);
|
||||
// QString value = regexp.cap(5);
|
||||
// value.replace('%' + variable + '%', e.value(variable));
|
||||
// e.set(variable, value);
|
||||
// }
|
||||
// }
|
||||
// varsbat.close();
|
||||
// }
|
||||
|
||||
return e;
|
||||
}
|
||||
@@ -1,66 +0,0 @@
|
||||
/***************************************************************************
|
||||
**
|
||||
** This file is part of Qt Creator
|
||||
**
|
||||
** Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
|
||||
**
|
||||
** Contact: Qt Software Information (qt-info@nokia.com)
|
||||
**
|
||||
**
|
||||
** Non-Open Source Usage
|
||||
**
|
||||
** Licensees may use this file in accordance with the Qt Beta Version
|
||||
** License Agreement, Agreement version 2.2 provided with the Software or,
|
||||
** alternatively, in accordance with the terms contained in a written
|
||||
** agreement between you and Nokia.
|
||||
**
|
||||
** GNU General Public License Usage
|
||||
**
|
||||
** Alternatively, this file may be used under the terms of the GNU General
|
||||
** Public License versions 2.0 or 3.0 as published by the Free Software
|
||||
** Foundation and appearing in the file LICENSE.GPL included in the packaging
|
||||
** of this file. Please review the following information to ensure GNU
|
||||
** General Public Licensing requirements will be met:
|
||||
**
|
||||
** http://www.fsf.org/licensing/licenses/info/GPLv2.html and
|
||||
** http://www.gnu.org/copyleft/gpl.html.
|
||||
**
|
||||
** In addition, as a special exception, Nokia gives you certain additional
|
||||
** rights. These rights are described in the Nokia Qt GPL Exception
|
||||
** version 1.3, included in the file GPL_EXCEPTION.txt in this package.
|
||||
**
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef MSVCENVIRONMENT_H
|
||||
#define MSVCENVIRONMENT_H
|
||||
|
||||
#include <QtCore/QString>
|
||||
#include <QtCore/QList>
|
||||
|
||||
#include <projectexplorer/projectexplorer.h>
|
||||
|
||||
namespace Qt4ProjectManager {
|
||||
namespace Internal {
|
||||
|
||||
class MSVCEnvironment
|
||||
{
|
||||
public:
|
||||
QString name() const;
|
||||
QString path() const;
|
||||
ProjectExplorer::Environment addToEnvironment(const ProjectExplorer::Environment &env) const;
|
||||
QString description() const;
|
||||
|
||||
static QList<MSVCEnvironment> availableVersions();
|
||||
private:
|
||||
|
||||
MSVCEnvironment(const QString &name, const QString &path);
|
||||
QString m_name;
|
||||
QString m_path;
|
||||
mutable QList<QPair<QString, QString> > m_values;
|
||||
mutable bool m_valuesSet;
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
} // namespace Qt4ProjectManager
|
||||
|
||||
#endif // MSVCENVIRONMENT_H
|
||||
@@ -75,7 +75,7 @@
|
||||
<item>
|
||||
<widget class="QLabel" name="label">
|
||||
<property name="text">
|
||||
<string>Arguments:</string>
|
||||
<string>Effective qmake call:</string>
|
||||
</property>
|
||||
<property name="alignment">
|
||||
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
|
||||
@@ -84,6 +84,9 @@
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPlainTextEdit" name="qmakeArgumentsEdit">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
|
||||
@@ -231,6 +231,7 @@ void Qt4ProjectFile::modified(Core::IFile::ReloadBehavior *)
|
||||
*/
|
||||
|
||||
Qt4Project::Qt4Project(Qt4Manager *manager, const QString& fileName) :
|
||||
m_toolChain(0),
|
||||
m_manager(manager),
|
||||
m_rootProjectNode(new Qt4ProFileNode(this, fileName, this)),
|
||||
m_nodesWatcher(new Internal::Qt4NodesWatcher(this)),
|
||||
@@ -265,6 +266,7 @@ Qt4Project::~Qt4Project()
|
||||
{
|
||||
m_manager->unregisterProject(this);
|
||||
delete m_projectFiles;
|
||||
delete m_toolChain;
|
||||
}
|
||||
|
||||
void Qt4Project::defaultQtVersionChanged()
|
||||
@@ -400,6 +402,41 @@ void Qt4Project::scheduleUpdateCodeModel()
|
||||
m_updateCodeModelTimer.start();
|
||||
}
|
||||
|
||||
ProjectExplorer::ToolChain *Qt4Project::toolChain(const QString &buildConfiguration) const
|
||||
{
|
||||
Q_UNUSED(buildConfiguration);
|
||||
ToolChain *m_test;
|
||||
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());
|
||||
} else if(t == ToolChain::MSVC) {
|
||||
m_test = ToolChain::createMSVCToolChain(version->msvcVersion());
|
||||
} else if(t == ToolChain::WINCE) {
|
||||
m_test = ToolChain::createWinCEToolChain(version->msvcVersion(), version->wincePlatform());
|
||||
} else if(t == ToolChain::GCC) {
|
||||
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::createGccToolChain(qmake_cxx);
|
||||
}
|
||||
|
||||
if (m_test == m_toolChain) {
|
||||
delete m_test;
|
||||
} else {
|
||||
delete m_toolChain;
|
||||
m_toolChain = m_test;
|
||||
}
|
||||
return m_toolChain;
|
||||
}
|
||||
|
||||
void Qt4Project::updateCodeModel()
|
||||
{
|
||||
if (debug)
|
||||
@@ -419,40 +456,17 @@ void Qt4Project::updateCodeModel()
|
||||
const QString newQtIncludePath = versionInfo.value(QLatin1String("QT_INSTALL_HEADERS"));
|
||||
const QString newQtLibsPath = versionInfo.value(QLatin1String("QT_INSTALL_LIBS"));
|
||||
|
||||
QByteArray predefinedMacros;
|
||||
QtVersion::ToolchainType t = qtVersion(activeBuildConfiguration())->toolchainType();
|
||||
if (t == QtVersion::MinGW || t == QtVersion::OTHER) {
|
||||
QStringList list = rootProjectNode()->variableValue(Internal::CxxCompilerVar);
|
||||
QString qmake_cxx = list.isEmpty() ? QString::null : list.first();
|
||||
qmake_cxx = environment(activeBuildConfiguration()).searchInPath(qmake_cxx);
|
||||
m_preproc.setGcc(qmake_cxx);
|
||||
predefinedMacros = m_preproc.predefinedMacros();
|
||||
foreach (HeaderPath headerPath, m_preproc.systemHeaderPaths()) {
|
||||
if (headerPath.kind() == HeaderPath::FrameworkHeaderPath)
|
||||
allFrameworkPaths.append(headerPath.path());
|
||||
else
|
||||
allIncludePaths.append(headerPath.path());
|
||||
}
|
||||
|
||||
} else if (t == QtVersion::MSVC || t == QtVersion::WINCE) {
|
||||
#ifdef QTCREATOR_WITH_MSVC_INCLUDES
|
||||
Environment env = environment(activeBuildConfiguration());
|
||||
allIncludePaths.append(env.value("INCLUDE").split(QLatin1Char(';')));
|
||||
#endif
|
||||
predefinedMacros +=
|
||||
"#define __WIN32__\n"
|
||||
"#define __WIN32\n"
|
||||
"#define _WIN32\n"
|
||||
"#define WIN32\n"
|
||||
"#define __WINNT__\n"
|
||||
"#define __WINNT\n"
|
||||
"#define WINNT\n"
|
||||
"#define _X86_\n"
|
||||
"#define __MSVCRT__\n";
|
||||
ToolChain *tc = toolChain(activeBuildConfiguration());
|
||||
QByteArray predefinedMacros = tc->predefinedMacros();
|
||||
QList<HeaderPath> allHeaderPaths = tc->systemHeaderPaths();
|
||||
foreach (HeaderPath headerPath, allHeaderPaths) {
|
||||
if (headerPath.kind() == HeaderPath::FrameworkHeaderPath)
|
||||
allFrameworkPaths.append(headerPath.path());
|
||||
else
|
||||
allIncludePaths.append(headerPath.path());
|
||||
}
|
||||
|
||||
allIncludePaths.append(newQtIncludePath);
|
||||
|
||||
QDir dir(newQtIncludePath);
|
||||
foreach (QFileInfo info, dir.entryInfoList(QDir::Dirs)) {
|
||||
if (! info.fileName().startsWith(QLatin1String("Qt")))
|
||||
@@ -681,7 +695,8 @@ Qt4ProFileNode *Qt4Project::rootProjectNode() const
|
||||
ProjectExplorer::Environment Qt4Project::baseEnvironment(const QString &buildConfiguration) const
|
||||
{
|
||||
Environment env = useSystemEnvironment(buildConfiguration) ? Environment(QProcess::systemEnvironment()) : Environment();
|
||||
env = qtVersion(buildConfiguration)->addToEnvironment(env);
|
||||
qtVersion(buildConfiguration)->addToEnvironment(env);
|
||||
toolChain(buildConfiguration)->addToEnvironment(env);
|
||||
return env;
|
||||
}
|
||||
|
||||
|
||||
@@ -36,13 +36,13 @@
|
||||
|
||||
#include "qtversionmanager.h"
|
||||
#include "qt4nodes.h"
|
||||
#include "gccpreprocessor.h"
|
||||
#include "qmakestep.h"
|
||||
#include "makestep.h"
|
||||
|
||||
#include <coreplugin/ifile.h>
|
||||
#include <projectexplorer/applicationrunconfiguration.h>
|
||||
#include <projectexplorer/projectnodes.h>
|
||||
#include <projectexplorer/toolchain.h>
|
||||
|
||||
#include <QtCore/QObject>
|
||||
#include <QtCore/QList>
|
||||
@@ -214,6 +214,10 @@ private:
|
||||
static void findProFile(const QString& fileName, Internal::Qt4ProFileNode *root, QList<Internal::Qt4ProFileNode *> &list);
|
||||
static bool hasSubNode(Internal::Qt4PriFileNode *root, const QString &path);
|
||||
|
||||
ProjectExplorer::ToolChain *toolChain(const QString &buildConfiguration) const;
|
||||
mutable ProjectExplorer::ToolChain *m_toolChain;
|
||||
|
||||
|
||||
QList<Internal::Qt4ProFileNode *> m_applicationProFileChange;
|
||||
ProjectExplorer::ProjectExplorerPlugin *projectExplorer() const;
|
||||
|
||||
@@ -238,7 +242,6 @@ private:
|
||||
QTimer m_updateCodeModelTimer;
|
||||
QTimer m_addUiFilesTimer;
|
||||
QStringList m_uiFilesToAdd;
|
||||
Internal::GCCPreprocessor m_preproc;
|
||||
|
||||
friend class Qt4ProjectFile;
|
||||
};
|
||||
|
||||
@@ -32,13 +32,9 @@ HEADERS = qt4projectmanagerplugin.h \
|
||||
msvcparser.h \
|
||||
buildparserfactory.h \
|
||||
deployhelper.h \
|
||||
msvcenvironment.h \
|
||||
cesdkhandler.h \
|
||||
embeddedpropertiespage.h \
|
||||
qt4runconfiguration.h \
|
||||
speinfo.h \
|
||||
headerpath.h \
|
||||
gccpreprocessor.h \
|
||||
qt4buildconfigwidget.h \
|
||||
qt4buildenvironmentwidget.h \
|
||||
projectloadwizard.h \
|
||||
@@ -71,12 +67,9 @@ SOURCES = qt4projectmanagerplugin.cpp \
|
||||
msvcparser.cpp \
|
||||
buildparserfactory.cpp \
|
||||
deployhelper.cpp \
|
||||
msvcenvironment.cpp \
|
||||
cesdkhandler.cpp \
|
||||
embeddedpropertiespage.cpp \
|
||||
qt4runconfiguration.cpp \
|
||||
speinfo.cpp \
|
||||
gccpreprocessor.cpp \
|
||||
qt4buildconfigwidget.cpp \
|
||||
qt4buildenvironmentwidget.cpp \
|
||||
projectloadwizard.cpp \
|
||||
|
||||
@@ -34,12 +34,12 @@
|
||||
#include "qtversionmanager.h"
|
||||
|
||||
#include "qt4projectmanagerconstants.h"
|
||||
#include "msvcenvironment.h"
|
||||
#include "cesdkhandler.h"
|
||||
|
||||
#include <coreplugin/icore.h>
|
||||
#include <coreplugin/coreconstants.h>
|
||||
#include <extensionsystem/pluginmanager.h>
|
||||
#include <projectexplorer/cesdkhandler.h>
|
||||
#include <projectexplorer/toolchain.h>
|
||||
#include <help/helpplugin.h>
|
||||
#include <utils/qtcassert.h>
|
||||
|
||||
@@ -495,35 +495,36 @@ void QtDirWidget::showEnvironmentPage(QTreeWidgetItem *item)
|
||||
if (item) {
|
||||
int index = m_ui.qtdirList->indexOfTopLevelItem(item);
|
||||
m_ui.errorLabel->setText("");
|
||||
QtVersion::ToolchainType t = m_versions.at(index)->toolchainType();
|
||||
if (t == QtVersion::MinGW) {
|
||||
ProjectExplorer::ToolChain::ToolChainType t = m_versions.at(index)->toolchainType();
|
||||
if (t == ProjectExplorer::ToolChain::MinGW) {
|
||||
m_ui.msvcComboBox->setVisible(false);
|
||||
m_ui.msvcLabel->setVisible(false);
|
||||
makeMingwVisible(true);
|
||||
m_ui.mingwPath->setPath(m_versions.at(index)->mingwDirectory());
|
||||
} else if (t == QtVersion::MSVC || t == QtVersion::WINCE){
|
||||
} else if (t == ProjectExplorer::ToolChain::MSVC || t == ProjectExplorer::ToolChain::WINCE){
|
||||
m_ui.msvcComboBox->setVisible(false);
|
||||
m_ui.msvcLabel->setVisible(true);
|
||||
makeMingwVisible(false);
|
||||
QList<MSVCEnvironment> msvcenvironments = MSVCEnvironment::availableVersions();
|
||||
if (msvcenvironments.count() == 0) {
|
||||
QStringList msvcEnvironments = ProjectExplorer::ToolChain::availableMSVCVersions();
|
||||
if (msvcEnvironments.count() == 0) {
|
||||
m_ui.msvcLabel->setText(tr("No Visual Studio Installation found"));
|
||||
} else if (msvcenvironments.count() == 1) {
|
||||
m_ui.msvcLabel->setText( msvcenvironments.at(0).description());
|
||||
} else if (msvcEnvironments.count() == 1) {
|
||||
//TODO m_ui.msvcLabel->setText( msvcEnvironments.at(0).description());
|
||||
m_ui.msvcLabel->setText("");
|
||||
} else {
|
||||
m_ui.msvcComboBox->setVisible(true);
|
||||
m_ui.msvcComboBox->clear();
|
||||
bool block = m_ui.msvcComboBox->blockSignals(true);
|
||||
foreach(const MSVCEnvironment msvcenv, msvcenvironments) {
|
||||
m_ui.msvcComboBox->addItem(msvcenv.name());
|
||||
if (msvcenv.name() == m_versions.at(index)->msvcVersion()) {
|
||||
foreach(const QString &msvcenv, msvcEnvironments) {
|
||||
m_ui.msvcComboBox->addItem(msvcenv);
|
||||
if (msvcenv == m_versions.at(index)->msvcVersion()) {
|
||||
m_ui.msvcComboBox->setCurrentIndex(m_ui.msvcComboBox->count() - 1);
|
||||
m_ui.msvcLabel->setText(msvcenv.description());
|
||||
m_ui.msvcLabel->setText(""); //TODO
|
||||
}
|
||||
}
|
||||
m_ui.msvcComboBox->blockSignals(block);
|
||||
}
|
||||
} else if (t == QtVersion::INVALID) {
|
||||
} else if (t == ProjectExplorer::ToolChain::INVALID) {
|
||||
m_ui.msvcComboBox->setVisible(false);
|
||||
m_ui.msvcLabel->setVisible(false);
|
||||
makeMingwVisible(false);
|
||||
@@ -532,7 +533,7 @@ void QtDirWidget::showEnvironmentPage(QTreeWidgetItem *item)
|
||||
.arg(m_versions.at(index)->path()));
|
||||
else
|
||||
m_ui.errorLabel->setText(tr("%1 is not a valid qt directory").arg(m_versions.at(index)->path()));
|
||||
} else { //QtVersion::Other
|
||||
} else { //ProjectExplorer::ToolChain::GCC
|
||||
m_ui.msvcComboBox->setVisible(false);
|
||||
m_ui.msvcLabel->setVisible(false);
|
||||
makeMingwVisible(false);
|
||||
@@ -679,13 +680,14 @@ void QtDirWidget::msvcVersionChanged()
|
||||
m_versions[currentItemIndex]->setMsvcVersion(msvcVersion);
|
||||
|
||||
//get descriptionx
|
||||
QList<MSVCEnvironment> msvcEnvironments = MSVCEnvironment::availableVersions();
|
||||
foreach(const MSVCEnvironment &msvcEnv, msvcEnvironments) {
|
||||
if (msvcEnv.name() == msvcVersion) {
|
||||
m_ui.msvcLabel->setText(msvcEnv.description());
|
||||
break;
|
||||
}
|
||||
}
|
||||
//TODO
|
||||
// QList<MSVCEnvironment> msvcEnvironments = MSVCEnvironment::availableVersions();
|
||||
// foreach(const MSVCEnvironment &msvcEnv, msvcEnvironments) {
|
||||
// if (msvcEnv.name() == msvcVersion) {
|
||||
// m_ui.msvcLabel->setText(msvcEnv.description());
|
||||
// break;
|
||||
// }
|
||||
// }
|
||||
}
|
||||
|
||||
QList<QtVersion *> QtDirWidget::versions() const
|
||||
@@ -1176,21 +1178,21 @@ QString QtVersion::qmakeCommand() const
|
||||
return QString::null;
|
||||
}
|
||||
|
||||
QtVersion::ToolchainType QtVersion::toolchainType() const
|
||||
ProjectExplorer::ToolChain::ToolChainType QtVersion::toolchainType() const
|
||||
{
|
||||
if (!isValid())
|
||||
return INVALID;
|
||||
return ProjectExplorer::ToolChain::INVALID;
|
||||
const QString &spec = mkspec();
|
||||
if (spec.contains("win32-msvc") || spec.contains(QLatin1String("win32-icc")))
|
||||
return MSVC;
|
||||
return ProjectExplorer::ToolChain::MSVC;
|
||||
else if (spec == "win32-g++")
|
||||
return MinGW;
|
||||
return ProjectExplorer::ToolChain::MinGW;
|
||||
else if (spec == QString::null)
|
||||
return INVALID;
|
||||
return ProjectExplorer::ToolChain::INVALID;
|
||||
else if (spec.startsWith("wince"))
|
||||
return WINCE;
|
||||
return ProjectExplorer::ToolChain::WINCE;
|
||||
else
|
||||
return OTHER;
|
||||
return ProjectExplorer::ToolChain::GCC;
|
||||
}
|
||||
|
||||
QString QtVersion::mingwDirectory() const
|
||||
@@ -1218,70 +1220,26 @@ QString QtVersion::msvcVersion() const
|
||||
return m_msvcVersion;
|
||||
}
|
||||
|
||||
QString QtVersion::wincePlatform() const
|
||||
{
|
||||
qDebug()<<"QtVersion::wincePlatform returning"<<ProjectExplorer::CeSdkHandler::platformName(mkspecPath() + "/qmake.conf");
|
||||
return ProjectExplorer::CeSdkHandler::platformName(mkspecPath() + "/qmake.conf");
|
||||
}
|
||||
|
||||
void QtVersion::setMsvcVersion(const QString &version)
|
||||
{
|
||||
m_msvcVersion = version;
|
||||
}
|
||||
|
||||
Environment QtVersion::addToEnvironment(const Environment &env)
|
||||
void QtVersion::addToEnvironment(Environment &env)
|
||||
{
|
||||
Environment e(env);
|
||||
e.set("QTDIR", m_path);
|
||||
env.set("QTDIR", m_path);
|
||||
QString qtdirbin = versionInfo().value("QT_INSTALL_BINS");
|
||||
e.prependOrSetPath(qtdirbin);
|
||||
env.prependOrSetPath(qtdirbin);
|
||||
// add libdir, includedir and bindir
|
||||
// or add Mingw dirs
|
||||
// or do nothing on other
|
||||
QtVersion::ToolchainType t = toolchainType();
|
||||
if (t == QtVersion::MinGW) {
|
||||
QFileInfo mingwFileInfo(m_mingwDirectory + "/bin");
|
||||
if (mingwFileInfo.exists())
|
||||
e.prependOrSetPath(m_mingwDirectory + "/bin");
|
||||
} else if (t == QtVersion::MSVC) {
|
||||
QList<MSVCEnvironment> list = MSVCEnvironment::availableVersions();
|
||||
if (list.count() == 1) {
|
||||
e = list.at(0).addToEnvironment(e);
|
||||
} else {
|
||||
foreach(const MSVCEnvironment &m, list) {
|
||||
if (m.name() == m_msvcVersion) {
|
||||
e = m.addToEnvironment(e);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (t == QtVersion::WINCE) {
|
||||
QString msvcPath;
|
||||
// Find MSVC path
|
||||
QList<MSVCEnvironment> list = MSVCEnvironment::availableVersions();
|
||||
if (list.count() == 1) {
|
||||
msvcPath = list.at(0).path();
|
||||
e = list.at(0).addToEnvironment(e);
|
||||
} else {
|
||||
foreach(const MSVCEnvironment &m, list) {
|
||||
if (m.name() == m_msvcVersion) {
|
||||
e = m.addToEnvironment(e);
|
||||
msvcPath = m.path();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
msvcPath += "/";
|
||||
|
||||
// qDebug()<<"MSVC path"<<msvcPath;
|
||||
// qDebug()<<"looking for platform name in"<< path() + "/mkspecs/" + mkspec() +"/qmake.conf";
|
||||
// Find Platform name
|
||||
|
||||
QString platformName = CeSdkHandler::platformName(path() + "/mkspecs/" + mkspec()+ "/qmake.conf");
|
||||
// qDebug()<<"Platform Name"<<platformName;
|
||||
|
||||
CeSdkHandler cesdkhandler;
|
||||
cesdkhandler.parse(msvcPath);
|
||||
e = cesdkhandler.find(platformName).addToEnvironment(e);
|
||||
} else if (t == QtVersion::OTHER) {
|
||||
if (!m_prependPath.isEmpty())
|
||||
e.prependOrSetPath(m_prependPath);
|
||||
}
|
||||
return e;
|
||||
}
|
||||
|
||||
int QtVersion::uniqueId() const
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
|
||||
#include <coreplugin/dialogs/ioptionspage.h>
|
||||
#include <projectexplorer/projectexplorer.h>
|
||||
#include <projectexplorer/toolchain.h>
|
||||
|
||||
#include <QtCore/QDebug>
|
||||
#include <QtCore/QPointer>
|
||||
@@ -73,17 +74,16 @@ public:
|
||||
// Returns the PREFIX, BINPREFIX, DOCPREFIX and similar information
|
||||
QHash<QString,QString> versionInfo() const;
|
||||
|
||||
enum ToolchainType { MinGW, MSVC, WINCE, OTHER, INVALID };
|
||||
|
||||
ToolchainType toolchainType() const;
|
||||
ProjectExplorer::ToolChain::ToolChainType toolchainType() const;
|
||||
|
||||
QString mingwDirectory() const;
|
||||
void setMingwDirectory(const QString &directory);
|
||||
QString prependPath() const;
|
||||
void setPrependPath(const QString &string);
|
||||
QString msvcVersion() const;
|
||||
QString wincePlatform() const;
|
||||
void setMsvcVersion(const QString &version);
|
||||
ProjectExplorer::Environment addToEnvironment(const ProjectExplorer::Environment &env);
|
||||
void addToEnvironment(ProjectExplorer::Environment &env);
|
||||
|
||||
int uniqueId() const;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user