Profile introduction

Introduce Profiles to store sets of values that describe a system/device.

These profiles are held by a target, getting rid of much of the information
stored in the Build-/Run-/DeployConfigurations, greatly simplifying those.

This is a squash of the wip/profile branch which has been on gerrit for a
while, rebased to current master.

Change-Id: I25956c8dd4d1962b2134bfaa8a8076ae3909460f
Reviewed-by: Daniel Teske <daniel.teske@nokia.com>
This commit is contained in:
Tobias Hunger
2012-04-24 15:49:09 +02:00
parent 8c77b8c9d7
commit 2431456216
379 changed files with 12690 additions and 14437 deletions

View File

@@ -41,6 +41,39 @@
using namespace Utils; using namespace Utils;
FadingWidget::FadingWidget(QWidget *parent) :
FadingPanel(parent),
m_opacityEffect(new QGraphicsOpacityEffect)
{
m_opacityEffect->setOpacity(0);
setGraphicsEffect(m_opacityEffect);
// Workaround for issue with QGraphicsEffect. GraphicsEffect
// currently clears with Window color. Remove if flickering
// no longer occurs on fade-in
QPalette pal;
pal.setBrush(QPalette::All, QPalette::Window, Qt::transparent);
setPalette(pal);
}
void FadingWidget::setOpacity(qreal value)
{
m_opacityEffect->setOpacity(value);
}
void FadingWidget::fadeTo(qreal value)
{
QPropertyAnimation *animation = new QPropertyAnimation(m_opacityEffect, "opacity");
animation->setDuration(200);
animation->setEndValue(value);
animation->start(QAbstractAnimation::DeleteWhenStopped);
}
qreal FadingWidget::opacity()
{
return m_opacityEffect->opacity();
}
DetailsButton::DetailsButton(QWidget *parent) : QAbstractButton(parent), m_fader(0) DetailsButton::DetailsButton(QWidget *parent) : QAbstractButton(parent), m_fader(0)
{ {
setCheckable(true); setCheckable(true);

View File

@@ -38,11 +38,15 @@
#include <QAbstractButton> #include <QAbstractButton>
#include <QPixmap> #include <QPixmap>
#include <QGraphicsOpacityEffect>
QT_FORWARD_DECLARE_CLASS(QGraphicsOpacityEffect) QT_FORWARD_DECLARE_CLASS(QGraphicsOpacityEffect)
namespace Utils { namespace Utils {
class QTCREATOR_UTILS_EXPORT FadingPanel : public QWidget class QTCREATOR_UTILS_EXPORT FadingPanel : public QWidget
{ {
Q_OBJECT
public: public:
FadingPanel(QWidget *parent = 0) FadingPanel(QWidget *parent = 0)
: QWidget(parent) : QWidget(parent)
@@ -51,6 +55,18 @@ public:
virtual void setOpacity(qreal value) = 0; virtual void setOpacity(qreal value) = 0;
}; };
class QTCREATOR_UTILS_EXPORT FadingWidget : public FadingPanel
{
Q_OBJECT
public:
FadingWidget(QWidget *parent = 0);
void fadeTo(qreal value);
qreal opacity();
void setOpacity(qreal value);
protected:
QGraphicsOpacityEffect *m_opacityEffect;
};
class QTCREATOR_UTILS_EXPORT DetailsButton : public QAbstractButton class QTCREATOR_UTILS_EXPORT DetailsButton : public QAbstractButton
{ {
Q_OBJECT Q_OBJECT

View File

@@ -340,9 +340,9 @@ PersistentSettingsWriter::PersistentSettingsWriter()
static void writeVariantValue(QXmlStreamWriter &w, const Context &ctx, static void writeVariantValue(QXmlStreamWriter &w, const Context &ctx,
const QVariant &variant, const QString &key = QString()) const QVariant &variant, const QString &key = QString())
{ {
switch (variant.type()) { switch (static_cast<int>(variant.type())) {
case QVariant::StringList: case static_cast<int>(QVariant::StringList):
case QVariant::List: case static_cast<int>(QVariant::List):
w.writeStartElement(ctx.valueListElement); w.writeStartElement(ctx.valueListElement);
w.writeAttribute(ctx.typeAttribute, QLatin1String(QVariant::typeToName(QVariant::List))); w.writeAttribute(ctx.typeAttribute, QLatin1String(QVariant::typeToName(QVariant::List)));
if (!key.isEmpty()) if (!key.isEmpty())
@@ -351,7 +351,7 @@ static void writeVariantValue(QXmlStreamWriter &w, const Context &ctx,
writeVariantValue(w, ctx, var); writeVariantValue(w, ctx, var);
w.writeEndElement(); w.writeEndElement();
break; break;
case QVariant::Map: { case static_cast<int>(QVariant::Map): {
w.writeStartElement(ctx.valueMapElement); w.writeStartElement(ctx.valueMapElement);
w.writeAttribute(ctx.typeAttribute, QLatin1String(QVariant::typeToName(QVariant::Map))); w.writeAttribute(ctx.typeAttribute, QLatin1String(QVariant::typeToName(QVariant::Map)));
if (!key.isEmpty()) if (!key.isEmpty())
@@ -363,6 +363,9 @@ static void writeVariantValue(QXmlStreamWriter &w, const Context &ctx,
w.writeEndElement(); w.writeEndElement();
} }
break; break;
case static_cast<int>(QMetaType::QObjectStar): // ignore QObjects!
case static_cast<int>(QMetaType::VoidStar): // ignore void pointers!
break;
default: default:
w.writeStartElement(ctx.valueElement); w.writeStartElement(ctx.valueElement);
w.writeAttribute(ctx.typeAttribute, QLatin1String(variant.typeName())); w.writeAttribute(ctx.typeAttribute, QLatin1String(variant.typeName()));

View File

@@ -12,6 +12,7 @@ QT += xml network
HEADERS += \ HEADERS += \
androidconstants.h \ androidconstants.h \
androidconfigurations.h \ androidconfigurations.h \
androidmanager.h \
androidrunconfiguration.h \ androidrunconfiguration.h \
androidruncontrol.h \ androidruncontrol.h \
androidrunfactories.h \ androidrunfactories.h \
@@ -32,14 +33,13 @@ HEADERS += \
androidqtversionfactory.h \ androidqtversionfactory.h \
androidqtversion.h \ androidqtversion.h \
androiddeployconfiguration.h \ androiddeployconfiguration.h \
androidtarget.h \
androidtargetfactory.h \
androidcreatekeystorecertificate.h \ androidcreatekeystorecertificate.h \
javaparser.h \ javaparser.h \
androidplugin.h androidplugin.h
SOURCES += \ SOURCES += \
androidconfigurations.cpp \ androidconfigurations.cpp \
androidmanager.cpp \
androidrunconfiguration.cpp \ androidrunconfiguration.cpp \
androidruncontrol.cpp \ androidruncontrol.cpp \
androidrunfactories.cpp \ androidrunfactories.cpp \
@@ -59,8 +59,6 @@ SOURCES += \
androidqtversionfactory.cpp \ androidqtversionfactory.cpp \
androidqtversion.cpp \ androidqtversion.cpp \
androiddeployconfiguration.cpp \ androiddeployconfiguration.cpp \
androidtarget.cpp \
androidtargetfactory.cpp \
androidcreatekeystorecertificate.cpp \ androidcreatekeystorecertificate.cpp \
javaparser.cpp \ javaparser.cpp \
androidplugin.cpp androidplugin.cpp

View File

@@ -42,6 +42,8 @@ QtcPlugin {
"androiddeploystepwidget.h", "androiddeploystepwidget.h",
"androiddeploystepwidget.ui", "androiddeploystepwidget.ui",
"androidglobal.h", "androidglobal.h",
"androidmanager.h",
"androidmanager.cpp",
"androidpackagecreationfactory.cpp", "androidpackagecreationfactory.cpp",
"androidpackagecreationfactory.h", "androidpackagecreationfactory.h",
"androidpackagecreationstep.cpp", "androidpackagecreationstep.cpp",
@@ -73,10 +75,6 @@ QtcPlugin {
"androidsettingswidget.cpp", "androidsettingswidget.cpp",
"androidsettingswidget.h", "androidsettingswidget.h",
"androidsettingswidget.ui", "androidsettingswidget.ui",
"androidtarget.cpp",
"androidtargetfactory.cpp",
"androidtargetfactory.h",
"androidtarget.h",
"androidtoolchain.cpp", "androidtoolchain.cpp",
"androidtoolchain.h", "androidtoolchain.h",
"javaparser.cpp", "javaparser.cpp",

View File

@@ -124,16 +124,16 @@ QLatin1String AndroidConfigurations::toolsPrefix(ProjectExplorer::Abi::Architect
AndroidConfig::AndroidConfig(const QSettings &settings) AndroidConfig::AndroidConfig(const QSettings &settings)
{ {
// user settings // user settings
armGdbLocation = settings.value(ArmGdbLocationKey).toString(); armGdbLocation = Utils::FileName::fromString(settings.value(ArmGdbLocationKey).toString());
armGdbserverLocation = settings.value(ArmGdbserverLocationKey).toString(); armGdbserverLocation = Utils::FileName::fromString(settings.value(ArmGdbserverLocationKey).toString());
x86GdbLocation = settings.value(X86GdbLocationKey).toString(); x86GdbLocation = Utils::FileName::fromString(settings.value(X86GdbLocationKey).toString());
x86GdbserverLocation = settings.value(X86GdbserverLocationKey).toString(); x86GdbserverLocation = Utils::FileName::fromString(settings.value(X86GdbserverLocationKey).toString());
partitionSize = settings.value(PartitionSizeKey, 1024).toInt(); partitionSize = settings.value(PartitionSizeKey, 1024).toInt();
sdkLocation = settings.value(SDKLocationKey).toString(); sdkLocation = Utils::FileName::fromString(settings.value(SDKLocationKey).toString());
ndkLocation = settings.value(NDKLocationKey).toString(); ndkLocation = Utils::FileName::fromString(settings.value(NDKLocationKey).toString());
antLocation = settings.value(AntLocationKey).toString(); antLocation = Utils::FileName::fromString(settings.value(AntLocationKey).toString());
openJDKLocation = settings.value(OpenJDKLocationKey).toString(); openJDKLocation = Utils::FileName::fromString(settings.value(OpenJDKLocationKey).toString());
keystoreLocation = settings.value(KeystoreLocationKey).toString(); keystoreLocation = Utils::FileName::fromString(settings.value(KeystoreLocationKey).toString());
QRegExp versionRegExp(NDKGccVersionRegExp); QRegExp versionRegExp(NDKGccVersionRegExp);
const QString &value = settings.value(NDKToolchainVersionKey).toString(); const QString &value = settings.value(NDKToolchainVersionKey).toString();
@@ -147,11 +147,11 @@ AndroidConfig::AndroidConfig(const QSettings &settings)
if (reader.load(settingsFileName()) if (reader.load(settingsFileName())
&& settings.value(changeTimeStamp).toInt() != QFileInfo(settingsFileName()).lastModified().toMSecsSinceEpoch() / 1000) { && settings.value(changeTimeStamp).toInt() != QFileInfo(settingsFileName()).lastModified().toMSecsSinceEpoch() / 1000) {
// persisten settings // persisten settings
sdkLocation = reader.restoreValue(SDKLocationKey).toString(); sdkLocation = Utils::FileName::fromString(reader.restoreValue(SDKLocationKey).toString());
ndkLocation = reader.restoreValue(NDKLocationKey).toString(); ndkLocation = Utils::FileName::fromString(reader.restoreValue(NDKLocationKey).toString());
antLocation = reader.restoreValue(AntLocationKey).toString(); antLocation = Utils::FileName::fromString(reader.restoreValue(AntLocationKey).toString());
openJDKLocation = reader.restoreValue(OpenJDKLocationKey).toString(); openJDKLocation = Utils::FileName::fromString(reader.restoreValue(OpenJDKLocationKey).toString());
keystoreLocation = reader.restoreValue(KeystoreLocationKey).toString(); keystoreLocation = Utils::FileName::fromString(reader.restoreValue(KeystoreLocationKey).toString());
QRegExp versionRegExp(NDKGccVersionRegExp); QRegExp versionRegExp(NDKGccVersionRegExp);
const QString &value = reader.restoreValue(NDKToolchainVersionKey).toString(); const QString &value = reader.restoreValue(NDKToolchainVersionKey).toString();
@@ -160,17 +160,17 @@ AndroidConfig::AndroidConfig(const QSettings &settings)
else else
ndkToolchainVersion = value.mid(versionRegExp.indexIn(value)); ndkToolchainVersion = value.mid(versionRegExp.indexIn(value));
if (!armGdbLocation.length()) if (armGdbLocation.isEmpty())
armGdbLocation = reader.restoreValue(ArmGdbLocationKey).toString(); armGdbLocation = Utils::FileName::fromString(reader.restoreValue(ArmGdbLocationKey).toString());
if (!armGdbserverLocation.length()) if (armGdbserverLocation.isEmpty())
armGdbserverLocation = reader.restoreValue(ArmGdbserverLocationKey).toString(); armGdbserverLocation = Utils::FileName::fromString(reader.restoreValue(ArmGdbserverLocationKey).toString());
if (!x86GdbLocation.length()) if (x86GdbLocation.isEmpty())
x86GdbLocation = reader.restoreValue(X86GdbLocationKey).toString(); x86GdbLocation = Utils::FileName::fromString(reader.restoreValue(X86GdbLocationKey).toString());
if (!x86GdbserverLocation.length()) if (x86GdbserverLocation.isEmpty())
x86GdbserverLocation = reader.restoreValue(X86GdbserverLocationKey).toString(); x86GdbserverLocation = Utils::FileName::fromString(reader.restoreValue(X86GdbserverLocationKey).toString());
// persistent settings // persistent settings
} }
@@ -188,16 +188,16 @@ void AndroidConfig::save(QSettings &settings) const
settings.setValue(changeTimeStamp, fileInfo.lastModified().toMSecsSinceEpoch() / 1000); settings.setValue(changeTimeStamp, fileInfo.lastModified().toMSecsSinceEpoch() / 1000);
// user settings // user settings
settings.setValue(SDKLocationKey, sdkLocation); settings.setValue(SDKLocationKey, sdkLocation.toString());
settings.setValue(NDKLocationKey, ndkLocation); settings.setValue(NDKLocationKey, ndkLocation.toString());
settings.setValue(NDKToolchainVersionKey, ndkToolchainVersion); settings.setValue(NDKToolchainVersionKey, ndkToolchainVersion);
settings.setValue(AntLocationKey, antLocation); settings.setValue(AntLocationKey, antLocation.toString());
settings.setValue(OpenJDKLocationKey, openJDKLocation); settings.setValue(OpenJDKLocationKey, openJDKLocation.toString());
settings.setValue(KeystoreLocationKey, keystoreLocation); settings.setValue(KeystoreLocationKey, keystoreLocation.toString());
settings.setValue(ArmGdbLocationKey, armGdbLocation); settings.setValue(ArmGdbLocationKey, armGdbLocation.toString());
settings.setValue(ArmGdbserverLocationKey, armGdbserverLocation); settings.setValue(ArmGdbserverLocationKey, armGdbserverLocation.toString());
settings.setValue(X86GdbLocationKey, x86GdbLocation); settings.setValue(X86GdbLocationKey, x86GdbLocation.toString());
settings.setValue(X86GdbserverLocationKey, x86GdbserverLocation); settings.setValue(X86GdbserverLocationKey, x86GdbserverLocation.toString());
settings.setValue(PartitionSizeKey, partitionSize); settings.setValue(PartitionSizeKey, partitionSize);
// user settings // user settings
@@ -214,7 +214,7 @@ void AndroidConfigurations::setConfig(const AndroidConfig &devConfigs)
void AndroidConfigurations::updateAvailablePlatforms() void AndroidConfigurations::updateAvailablePlatforms()
{ {
m_availablePlatforms.clear(); m_availablePlatforms.clear();
QDirIterator it(m_config.ndkLocation + QLatin1String("/platforms"), QStringList() << QLatin1String("android-*"), QDir::Dirs); QDirIterator it(m_config.ndkLocation.appendPath(QLatin1String("platforms")).toString(), QStringList() << QLatin1String("android-*"), QDir::Dirs);
while (it.hasNext()) { while (it.hasNext()) {
const QString &fileName = it.next(); const QString &fileName = it.next();
m_availablePlatforms.push_back(fileName.mid(fileName.lastIndexOf(QLatin1Char('-')) + 1).toInt()); m_availablePlatforms.push_back(fileName.mid(fileName.lastIndexOf(QLatin1Char('-')) + 1).toInt());
@@ -226,7 +226,7 @@ QStringList AndroidConfigurations::sdkTargets(int minApiLevel) const
{ {
QStringList targets; QStringList targets;
QProcess proc; QProcess proc;
proc.start(androidToolPath(), QStringList() << QLatin1String("list") << QLatin1String("target")); // list avaialbe AVDs proc.start(androidToolPath().toString(), QStringList() << QLatin1String("list") << QLatin1String("target")); // list avaialbe AVDs
if (!proc.waitForFinished(-1)) { if (!proc.waitForFinished(-1)) {
proc.terminate(); proc.terminate();
return targets; return targets;
@@ -248,7 +248,8 @@ QStringList AndroidConfigurations::ndkToolchainVersions() const
{ {
QRegExp versionRegExp(NDKGccVersionRegExp); QRegExp versionRegExp(NDKGccVersionRegExp);
QStringList result; QStringList result;
QDirIterator it(m_config.ndkLocation + QLatin1String("/toolchains"), Utils::FileName path = m_config.ndkLocation;
QDirIterator it(path.appendPath(QLatin1String("toolchains")).toString(),
QStringList() << QLatin1String("*"), QDir::Dirs); QStringList() << QLatin1String("*"), QDir::Dirs);
while (it.hasNext()) { while (it.hasNext()) {
const QString &fileName = it.next(); const QString &fileName = it.next();
@@ -262,66 +263,71 @@ QStringList AndroidConfigurations::ndkToolchainVersions() const
return result; return result;
} }
QString AndroidConfigurations::adbToolPath() const Utils::FileName AndroidConfigurations::adbToolPath() const
{ {
return m_config.sdkLocation + QLatin1String("/platform-tools/adb" ANDROID_EXE_SUFFIX); Utils::FileName path = m_config.sdkLocation;
return path.appendPath(QLatin1String("platform-tools/adb"ANDROID_EXE_SUFFIX));
} }
QString AndroidConfigurations::androidToolPath() const Utils::FileName AndroidConfigurations::androidToolPath() const
{ {
#ifdef Q_OS_WIN32 #ifdef Q_OS_WIN32
// I want to switch from using android.bat to using an executable. All it really does is call // I want to switch from using android.bat to using an executable. All it really does is call
// Java and I've made some progress on it. So if android.exe exists, return that instead. // Java and I've made some progress on it. So if android.exe exists, return that instead.
QFileInfo fi(m_config.sdkLocation + QLatin1String("/tools/android" ANDROID_EXE_SUFFIX)); Utils::FileName path = m_config.sdkLocation;
if (fi.exists()) path.appendPath(QLatin1String("tools/android"ANDROID_EXE_SUFFIX));
return m_config.sdkLocation + QString("/tools/android" ANDROID_EXE_SUFFIX); if (path.toFileInfo().exists())
else return path;
return m_config.sdkLocation + QLatin1String("/tools/android" ANDROID_BAT_SUFFIX); path = m_config.sdkLocation;
return path.appendPath(QLatin1String("tools/android"ANDROID_BAT_SUFFIX));
#else #else
return m_config.sdkLocation + QLatin1String("/tools/android" ANDROID_EXE_SUFFIX); Utils::FileName path = m_config.sdkLocation;
return path.appendPath(QLatin1String("tools/android"ANDROID_EXE_SUFFIX));
#endif #endif
} }
QString AndroidConfigurations::antToolPath() const Utils::FileName AndroidConfigurations::antToolPath() const
{ {
if (m_config.antLocation.length()) if (!m_config.antLocation.isEmpty())
return m_config.antLocation; return m_config.antLocation;
else else
return QLatin1String("ant"); return Utils::FileName::fromString(QLatin1String("ant"));
} }
QString AndroidConfigurations::emulatorToolPath() const Utils::FileName AndroidConfigurations::emulatorToolPath() const
{ {
return m_config.sdkLocation + QLatin1String("/tools/emulator" ANDROID_EXE_SUFFIX); Utils::FileName path = m_config.sdkLocation;
return path.appendPath(QLatin1String("tools/emulator"ANDROID_EXE_SUFFIX));
} }
QString AndroidConfigurations::toolPath(ProjectExplorer::Abi::Architecture architecture) const Utils::FileName AndroidConfigurations::toolPath(ProjectExplorer::Abi::Architecture architecture) const
{ {
return m_config.ndkLocation + QString::fromLatin1("/toolchains/%1-%2/prebuilt/%3/bin/%4") Utils::FileName path = m_config.ndkLocation;
return path.appendPath(QString::fromLatin1("toolchains/%1-%2/prebuilt/%3/bin/%4")
.arg(toolchainPrefix(architecture)) .arg(toolchainPrefix(architecture))
.arg(m_config.ndkToolchainVersion) .arg(m_config.ndkToolchainVersion)
.arg(ToolchainHost) .arg(ToolchainHost)
.arg(toolsPrefix(architecture)); .arg(toolsPrefix(architecture)));
} }
QString AndroidConfigurations::stripPath(ProjectExplorer::Abi::Architecture architecture) const Utils::FileName AndroidConfigurations::stripPath(ProjectExplorer::Abi::Architecture architecture) const
{ {
return toolPath(architecture) + QLatin1String("-strip" ANDROID_EXE_SUFFIX); return toolPath(architecture).append(QLatin1String("-strip"ANDROID_EXE_SUFFIX));
} }
QString AndroidConfigurations::readelfPath(ProjectExplorer::Abi::Architecture architecture) const Utils::FileName AndroidConfigurations::readelfPath(ProjectExplorer::Abi::Architecture architecture) const
{ {
return toolPath(architecture) + QLatin1String("-readelf" ANDROID_EXE_SUFFIX); return toolPath(architecture).append(QLatin1String("-readelf"ANDROID_EXE_SUFFIX));
} }
QString AndroidConfigurations::gccPath(ProjectExplorer::Abi::Architecture architecture) const Utils::FileName AndroidConfigurations::gccPath(ProjectExplorer::Abi::Architecture architecture) const
{ {
return toolPath(architecture) + QLatin1String("-gcc" ANDROID_EXE_SUFFIX); return toolPath(architecture).append(QLatin1String("-gcc"ANDROID_EXE_SUFFIX));
} }
QString AndroidConfigurations::gdbServerPath(ProjectExplorer::Abi::Architecture architecture) const Utils::FileName AndroidConfigurations::gdbServerPath(ProjectExplorer::Abi::Architecture architecture) const
{ {
QString gdbServerPath; Utils::FileName gdbServerPath;
switch (architecture) { switch (architecture) {
case ProjectExplorer::Abi::ArmArchitecture: case ProjectExplorer::Abi::ArmArchitecture:
gdbServerPath = m_config.armGdbserverLocation; gdbServerPath = m_config.armGdbserverLocation;
@@ -330,20 +336,21 @@ QString AndroidConfigurations::gdbServerPath(ProjectExplorer::Abi::Architecture
gdbServerPath = m_config.x86GdbserverLocation; gdbServerPath = m_config.x86GdbserverLocation;
break; break;
default: default:
gdbServerPath = Unknown; gdbServerPath = Utils::FileName::fromString(Unknown);
break; break;
} }
if (gdbServerPath.length()) if (!gdbServerPath.isEmpty())
return gdbServerPath; return gdbServerPath;
return m_config.ndkLocation + QString::fromLatin1("/toolchains/%1-%2/prebuilt/gdbserver") Utils::FileName path = m_config.ndkLocation;
.arg(toolchainPrefix(architecture)) return path.appendPath(QString::fromLatin1("toolchains/%1-%2/prebuilt/gdbserver")
.arg(m_config.ndkToolchainVersion); .arg(toolchainPrefix(architecture))
.arg(m_config.ndkToolchainVersion));
} }
QString AndroidConfigurations::gdbPath(ProjectExplorer::Abi::Architecture architecture) const Utils::FileName AndroidConfigurations::gdbPath(ProjectExplorer::Abi::Architecture architecture) const
{ {
QString gdbPath; Utils::FileName gdbPath;
switch (architecture) { switch (architecture) {
case ProjectExplorer::Abi::ArmArchitecture: case ProjectExplorer::Abi::ArmArchitecture:
gdbPath = m_config.armGdbLocation; gdbPath = m_config.armGdbLocation;
@@ -352,45 +359,47 @@ QString AndroidConfigurations::gdbPath(ProjectExplorer::Abi::Architecture archit
gdbPath = m_config.x86GdbLocation; gdbPath = m_config.x86GdbLocation;
break; break;
default: default:
gdbPath = Unknown; gdbPath = Utils::FileName::fromString(Unknown);
break; break;
} }
if (!gdbPath.isEmpty()) if (!gdbPath.isEmpty())
return gdbPath; return gdbPath;
return toolPath(architecture) + QLatin1String("-gdb" ANDROID_EXE_SUFFIX); return toolPath(architecture).append(QLatin1String("-gdb"ANDROID_EXE_SUFFIX));
} }
QString AndroidConfigurations::openJDKPath() const Utils::FileName AndroidConfigurations::openJDKPath() const
{ {
return m_config.openJDKLocation; return m_config.openJDKLocation;
} }
QString AndroidConfigurations::openJDKBinPath() const Utils::FileName AndroidConfigurations::openJDKBinPath() const
{ {
if (m_config.openJDKLocation.length()) Utils::FileName path = m_config.openJDKLocation;
return m_config.openJDKLocation + QLatin1String("/bin/"); if (!path.isEmpty())
return QString(); return path.appendPath(QLatin1String("bin"));
return path;
} }
QString AndroidConfigurations::keytoolPath() const Utils::FileName AndroidConfigurations::keytoolPath() const
{ {
return openJDKBinPath() + keytoolName; return openJDKBinPath().appendPath(keytoolName);
} }
QString AndroidConfigurations::jarsignerPath() const Utils::FileName AndroidConfigurations::jarsignerPath() const
{ {
return openJDKBinPath() + jarsignerName; return openJDKBinPath().appendPath(jarsignerName);
} }
QString AndroidConfigurations::getDeployDeviceSerialNumber(int *apiLevel) const QString AndroidConfigurations::getDeployDeviceSerialNumber(int *apiLevel) const
{ {
QVector<AndroidDevice> devices = connectedDevices(); QVector<AndroidDevice> devices = connectedDevices();
foreach (AndroidDevice device, devices) foreach (AndroidDevice device, devices) {
if (device.sdk >= *apiLevel) { if (device.sdk >= *apiLevel) {
*apiLevel = device.sdk; *apiLevel = device.sdk;
return device.serialNumber; return device.serialNumber;
} }
}
return startAVD(apiLevel); return startAVD(apiLevel);
} }
@@ -398,7 +407,7 @@ QVector<AndroidDevice> AndroidConfigurations::connectedDevices(int apiLevel) con
{ {
QVector<AndroidDevice> devices; QVector<AndroidDevice> devices;
QProcess adbProc; QProcess adbProc;
adbProc.start(adbToolPath(), QStringList() << QLatin1String("devices")); adbProc.start(adbToolPath().toString(), QStringList() << QLatin1String("devices"));
if (!adbProc.waitForFinished(-1)) { if (!adbProc.waitForFinished(-1)) {
adbProc.terminate(); adbProc.terminate();
return devices; return devices;
@@ -443,7 +452,7 @@ bool AndroidConfigurations::createAVD(int minApiLevel) const
bool AndroidConfigurations::createAVD(const QString &target, const QString &name, int sdcardSize ) const bool AndroidConfigurations::createAVD(const QString &target, const QString &name, int sdcardSize ) const
{ {
QProcess proc; QProcess proc;
proc.start(androidToolPath(), proc.start(androidToolPath().toString(),
QStringList() << QLatin1String("create") << QLatin1String("avd") QStringList() << QLatin1String("create") << QLatin1String("avd")
<< QLatin1String("-a") << QLatin1String("-t") << target << QLatin1String("-a") << QLatin1String("-t") << target
<< QLatin1String("-n") << name << QLatin1String("-n") << name
@@ -461,7 +470,7 @@ bool AndroidConfigurations::createAVD(const QString &target, const QString &name
bool AndroidConfigurations::removeAVD(const QString &name) const bool AndroidConfigurations::removeAVD(const QString &name) const
{ {
QProcess proc; QProcess proc;
proc.start(androidToolPath(), proc.start(androidToolPath().toString(),
QStringList() << QLatin1String("delete") << QLatin1String("avd") QStringList() << QLatin1String("delete") << QLatin1String("avd")
<< QLatin1String("-n") << name); << QLatin1String("-n") << name);
if (!proc.waitForFinished(-1)) { if (!proc.waitForFinished(-1)) {
@@ -475,7 +484,7 @@ QVector<AndroidDevice> AndroidConfigurations::androidVirtualDevices() const
{ {
QVector<AndroidDevice> devices; QVector<AndroidDevice> devices;
QProcess proc; QProcess proc;
proc.start(androidToolPath(), proc.start(androidToolPath().toString(),
QStringList() << QLatin1String("list") << QLatin1String("avd")); // list available AVDs QStringList() << QLatin1String("list") << QLatin1String("avd")); // list available AVDs
if (!proc.waitForFinished(-1)) { if (!proc.waitForFinished(-1)) {
proc.terminate(); proc.terminate();
@@ -540,7 +549,7 @@ QString AndroidConfigurations::startAVD(int *apiLevel, const QString &name) cons
return avdName; return avdName;
// start the emulator // start the emulator
m_avdProcess->start(emulatorToolPath(), m_avdProcess->start(emulatorToolPath().toString(),
QStringList() << QLatin1String("-partition-size") << QString::number(config().partitionSize) QStringList() << QLatin1String("-partition-size") << QString::number(config().partitionSize)
<< QLatin1String("-avd") << avdName); << QLatin1String("-avd") << avdName);
if (!m_avdProcess->waitForStarted(-1)) { if (!m_avdProcess->waitForStarted(-1)) {
@@ -550,7 +559,7 @@ QString AndroidConfigurations::startAVD(int *apiLevel, const QString &name) cons
// wait until the emulator is online // wait until the emulator is online
QProcess proc; QProcess proc;
proc.start(adbToolPath(), QStringList() << QLatin1String("-e") << QLatin1String("wait-for-device")); proc.start(adbToolPath().toString(), QStringList() << QLatin1String("-e") << QLatin1String("wait-for-device"));
if (!proc.waitForFinished(-1)) { if (!proc.waitForFinished(-1)) {
proc.terminate(); proc.terminate();
return QString(); return QString();
@@ -558,7 +567,7 @@ QString AndroidConfigurations::startAVD(int *apiLevel, const QString &name) cons
sleep(5);// wait for pm to start sleep(5);// wait for pm to start
// workaround for stupid adb bug // workaround for stupid adb bug
proc.start(adbToolPath(), QStringList() << QLatin1String("devices")); proc.start(adbToolPath().toString(), QStringList() << QLatin1String("devices"));
if (!proc.waitForFinished(-1)) { if (!proc.waitForFinished(-1)) {
proc.terminate(); proc.terminate();
return QString(); return QString();
@@ -577,7 +586,7 @@ int AndroidConfigurations::getSDKVersion(const QString &device) const
{ {
QProcess adbProc; QProcess adbProc;
adbProc.start(adbToolPath(), adbProc.start(adbToolPath().toString(),
QStringList() << QLatin1String("-s") << device QStringList() << QLatin1String("-s") << device
<< QLatin1String("shell") << QLatin1String("getprop") << QLatin1String("shell") << QLatin1String("getprop")
<< QLatin1String("ro.build.version.sdk")); << QLatin1String("ro.build.version.sdk"));

View File

@@ -67,16 +67,16 @@ public:
AndroidConfig(const QSettings &settings); AndroidConfig(const QSettings &settings);
void save(QSettings &settings) const; void save(QSettings &settings) const;
QString sdkLocation; Utils::FileName sdkLocation;
QString ndkLocation; Utils::FileName ndkLocation;
QString ndkToolchainVersion; QString ndkToolchainVersion;
QString antLocation; Utils::FileName antLocation;
QString armGdbLocation; Utils::FileName armGdbLocation;
QString armGdbserverLocation; Utils::FileName armGdbserverLocation;
QString x86GdbLocation; Utils::FileName x86GdbLocation;
QString x86GdbserverLocation; Utils::FileName x86GdbserverLocation;
QString openJDKLocation; Utils::FileName openJDKLocation;
QString keystoreLocation; Utils::FileName keystoreLocation;
unsigned partitionSize; unsigned partitionSize;
}; };
@@ -97,18 +97,18 @@ public:
void setConfig(const AndroidConfig &config); void setConfig(const AndroidConfig &config);
QStringList sdkTargets(int minApiLevel = 0) const; QStringList sdkTargets(int minApiLevel = 0) const;
QStringList ndkToolchainVersions() const; QStringList ndkToolchainVersions() const;
QString adbToolPath() const; Utils::FileName adbToolPath() const;
QString androidToolPath() const; Utils::FileName androidToolPath() const;
QString antToolPath() const; Utils::FileName antToolPath() const;
QString emulatorToolPath() const; Utils::FileName emulatorToolPath() const;
QString gccPath(ProjectExplorer::Abi::Architecture architecture) const; Utils::FileName gccPath(ProjectExplorer::Abi::Architecture architecture) const;
QString gdbServerPath(ProjectExplorer::Abi::Architecture architecture) const; Utils::FileName gdbServerPath(ProjectExplorer::Abi::Architecture architecture) const;
QString gdbPath(ProjectExplorer::Abi::Architecture architecture) const; Utils::FileName gdbPath(ProjectExplorer::Abi::Architecture architecture) const;
QString openJDKPath() const; Utils::FileName openJDKPath() const;
QString keytoolPath() const; Utils::FileName keytoolPath() const;
QString jarsignerPath() const; Utils::FileName jarsignerPath() const;
QString stripPath(ProjectExplorer::Abi::Architecture architecture) const; Utils::FileName stripPath(ProjectExplorer::Abi::Architecture architecture) const;
QString readelfPath(ProjectExplorer::Abi::Architecture architecture) const; Utils::FileName readelfPath(ProjectExplorer::Abi::Architecture architecture) const;
QString getDeployDeviceSerialNumber(int *apiLevel) const; QString getDeployDeviceSerialNumber(int *apiLevel) const;
bool createAVD(const QString &target, const QString &name, int sdcardSize) const; bool createAVD(const QString &target, const QString &name, int sdcardSize) const;
bool removeAVD(const QString &name) const; bool removeAVD(const QString &name) const;
@@ -127,8 +127,8 @@ public slots:
bool createAVD(int minApiLevel = 0) const; bool createAVD(int minApiLevel = 0) const;
private: private:
QString toolPath(ProjectExplorer::Abi::Architecture architecture) const; Utils::FileName toolPath(ProjectExplorer::Abi::Architecture architecture) const;
QString openJDKBinPath() const; Utils::FileName openJDKBinPath() const;
AndroidConfigurations(QObject *parent); AndroidConfigurations(QObject *parent);
void load(); void load();

View File

@@ -56,18 +56,8 @@ enum AndroidQemuStatus {
#define ANDROID_BAT_SUFFIX "" #define ANDROID_BAT_SUFFIX ""
#endif #endif
static const char ANDROID_RC_ID[] = ANDROID_PREFIX;
static const QLatin1String ANDROID_RC_ID_PREFIX(ANDROID_PREFIX "."); static const QLatin1String ANDROID_RC_ID_PREFIX(ANDROID_PREFIX ".");
static const QLatin1String AndroidArgumentsKey(ANDROID_PREFIX ".Arguments");
static const QLatin1String AndroidSimulatorPathKey(ANDROID_PREFIX ".Simulator");
static const QLatin1String AndroidDeviceIdKey(ANDROID_PREFIX ".DeviceId");
static const QLatin1String AndroidProFileKey(ANDROID_PREFIX ".ProFile");
static const QLatin1String AndroidExportedLocalDirsKey(ANDROID_PREFIX ".ExportedLocalDirs");
static const QLatin1String AndroidBaseEnvironmentBaseKey(ANDROID_PREFIX ".BaseEnvironmentBase");
static const QLatin1String AndroidUserEnvironmentChangesKey(ANDROID_PREFIX ".UserEnvironmentChanges");
static const QLatin1String AndroidUseRemoteGdbKey(ANDROID_PREFIX ".UseRemoteGdb");
} // namespace Internal } // namespace Internal
namespace Constants { namespace Constants {
@@ -77,8 +67,6 @@ const char ANDROID_SETTINGS_TR_CATEGORY[] = QT_TRANSLATE_NOOP("Android", "Androi
const char ANDROID_SETTINGS_CATEGORY_ICON[] = ":/android/images/QtAndroid.png"; const char ANDROID_SETTINGS_CATEGORY_ICON[] = ":/android/images/QtAndroid.png";
const char ANDROID_TOOLCHAIN_ID[] = "Qt4ProjectManager.ToolChain.Android"; const char ANDROID_TOOLCHAIN_ID[] = "Qt4ProjectManager.ToolChain.Android";
const char ANDROIDQT[] = "Qt4ProjectManager.QtVersion.Android"; const char ANDROIDQT[] = "Qt4ProjectManager.QtVersion.Android";
const char ANDROID_PLATFORM[] = "Android";
const char ANDROID_PLATFORM_TR[] = QT_TRANSLATE_NOOP("QtSupport", "Android");
} }
} // namespace Android } // namespace Android

View File

@@ -56,7 +56,7 @@ AndroidCreateKeystoreCertificate::~AndroidCreateKeystoreCertificate()
delete ui; delete ui;
} }
QString AndroidCreateKeystoreCertificate::keystoreFilePath() Utils::FileName AndroidCreateKeystoreCertificate::keystoreFilePath()
{ {
return m_keystoreFilePath; return m_keystoreFilePath;
} }
@@ -155,10 +155,10 @@ void AndroidCreateKeystoreCertificate::on_buttonBox_accepted()
if (!ui->countryLineEdit->text().length()) if (!ui->countryLineEdit->text().length())
ui->countryLineEdit->setFocus(); ui->countryLineEdit->setFocus();
m_keystoreFilePath = QFileDialog::getSaveFileName(this, tr("Keystore file name"), m_keystoreFilePath = Utils::FileName::fromString(QFileDialog::getSaveFileName(this, tr("Keystore file name"),
QDir::homePath() + QLatin1String("/android_release.keystore"), QDir::homePath() + QLatin1String("/android_release.keystore"),
tr("Keystore files (*.keystore *.jks)")); tr("Keystore files (*.keystore *.jks)")));
if (!m_keystoreFilePath.length()) if (m_keystoreFilePath.isEmpty())
return; return;
QString distinguishedNames(QString::fromLatin1("CN=%1, O=%2, L=%3, C=%4") QString distinguishedNames(QString::fromLatin1("CN=%1, O=%2, L=%3, C=%4")
.arg(ui->commonNameLineEdit->text().replace(QLatin1Char(','), QLatin1String("\\,"))) .arg(ui->commonNameLineEdit->text().replace(QLatin1Char(','), QLatin1String("\\,")))
@@ -174,7 +174,7 @@ void AndroidCreateKeystoreCertificate::on_buttonBox_accepted()
QStringList params; QStringList params;
params << QLatin1String("-genkey") << QLatin1String("-keyalg") << QLatin1String("RSA") params << QLatin1String("-genkey") << QLatin1String("-keyalg") << QLatin1String("RSA")
<< QLatin1String("-keystore") << m_keystoreFilePath << QLatin1String("-keystore") << m_keystoreFilePath.toString()
<< QLatin1String("-storepass") << ui->keystorePassLineEdit->text() << QLatin1String("-storepass") << ui->keystorePassLineEdit->text()
<< QLatin1String("-alias") << ui->aliasNameLineEdit->text() << QLatin1String("-alias") << ui->aliasNameLineEdit->text()
<< QLatin1String("-keysize") << ui->keySizeSpinBox->text() << QLatin1String("-keysize") << ui->keySizeSpinBox->text()
@@ -183,7 +183,7 @@ void AndroidCreateKeystoreCertificate::on_buttonBox_accepted()
<< QLatin1String("-dname") << distinguishedNames; << QLatin1String("-dname") << distinguishedNames;
QProcess genKeyCertProc; QProcess genKeyCertProc;
genKeyCertProc.start(AndroidConfigurations::instance().keytoolPath(), params ); genKeyCertProc.start(AndroidConfigurations::instance().keytoolPath().toString(), params );
if (!genKeyCertProc.waitForStarted() || !genKeyCertProc.waitForFinished()) if (!genKeyCertProc.waitForStarted() || !genKeyCertProc.waitForFinished())
return; return;

View File

@@ -33,6 +33,8 @@
#ifndef ANDROIDCREATEKEYSTORECERTIFICATE_H #ifndef ANDROIDCREATEKEYSTORECERTIFICATE_H
#define ANDROIDCREATEKEYSTORECERTIFICATE_H #define ANDROIDCREATEKEYSTORECERTIFICATE_H
#include <utils/fileutils.h>
#include <QDialog> #include <QDialog>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
@@ -54,7 +56,7 @@ class AndroidCreateKeystoreCertificate : public QDialog
public: public:
explicit AndroidCreateKeystoreCertificate(QWidget *parent = 0); explicit AndroidCreateKeystoreCertificate(QWidget *parent = 0);
~AndroidCreateKeystoreCertificate(); ~AndroidCreateKeystoreCertificate();
QString keystoreFilePath(); Utils::FileName keystoreFilePath();
QString keystorePassword(); QString keystorePassword();
QString certificateAlias(); QString certificateAlias();
QString certificatePassword(); QString certificatePassword();
@@ -68,7 +70,7 @@ private slots:
private: private:
Ui::AndroidCreateKeystoreCertificate *ui; Ui::AndroidCreateKeystoreCertificate *ui;
QString m_keystoreFilePath; Utils::FileName m_keystoreFilePath;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -35,17 +35,18 @@
#include "androiddeploystep.h" #include "androiddeploystep.h"
#include "androidglobal.h" #include "androidglobal.h"
#include "androidrunner.h" #include "androidrunner.h"
#include "androidtarget.h" #include "androidmanager.h"
#include <debugger/debuggerplugin.h> #include <debugger/debuggerplugin.h>
#include <debugger/debuggerrunner.h> #include <debugger/debuggerrunner.h>
#include <debugger/debuggerengine.h> #include <debugger/debuggerengine.h>
#include <debugger/debuggerstartparameters.h> #include <debugger/debuggerstartparameters.h>
#include <projectexplorer/target.h>
#include <qt4projectmanager/qt4buildconfiguration.h> #include <qt4projectmanager/qt4buildconfiguration.h>
#include <qt4projectmanager/qt4target.h>
#include <qt4projectmanager/qt4project.h>
#include <qt4projectmanager/qt4nodes.h> #include <qt4projectmanager/qt4nodes.h>
#include <qt4projectmanager/qt4project.h>
#include <qtsupport/qtprofileinformation.h>
#include <QDir> #include <QDir>
@@ -62,6 +63,8 @@ static const char * const qMakeVariables[] = {
"QT_INSTALL_IMPORTS" "QT_INSTALL_IMPORTS"
}; };
static Qt4Project *project(AndroidRunConfiguration *rc)
{ return static_cast<Qt4Project *>(rc->target()->project()); }
RunControl *AndroidDebugSupport::createDebugRunControl(AndroidRunConfiguration *runConfig) RunControl *AndroidDebugSupport::createDebugRunControl(AndroidRunConfiguration *runConfig)
{ {
@@ -69,19 +72,20 @@ RunControl *AndroidDebugSupport::createDebugRunControl(AndroidRunConfiguration *
params.toolChainAbi = runConfig->abi(); params.toolChainAbi = runConfig->abi();
params.dumperLibrary = runConfig->dumperLib(); params.dumperLibrary = runConfig->dumperLib();
params.startMode = AttachToRemoteServer; params.startMode = AttachToRemoteServer;
params.executable = runConfig->androidTarget()->qt4Project()->rootQt4ProjectNode()->buildDir() + QLatin1String("/app_process"); params.executable = project(runConfig)->rootQt4ProjectNode()->buildDir() + QLatin1String("/app_process");
params.debuggerCommand = runConfig->gdbCmd(); params.debuggerCommand = runConfig->gdbCmd().toString();
params.remoteChannel = runConfig->remoteChannel(); params.remoteChannel = runConfig->remoteChannel();
params.displayName = runConfig->androidTarget()->packageName(); params.displayName = AndroidManager::packageName(runConfig->target());
params.solibSearchPath.clear(); params.solibSearchPath.clear();
QList<Qt4ProFileNode *> nodes = runConfig->androidTarget()->qt4Project()->allProFiles(); QList<Qt4ProFileNode *> nodes = project(runConfig)->allProFiles();
foreach (Qt4ProFileNode *node, nodes) foreach (Qt4ProFileNode *node, nodes)
if (node->projectType() == ApplicationTemplate) if (node->projectType() == ApplicationTemplate)
params.solibSearchPath.append(node->targetInformation().buildDir); params.solibSearchPath.append(node->targetInformation().buildDir);
params.solibSearchPath.append(qtSoPaths(runConfig->activeQt4BuildConfiguration()->qtVersion())); QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(runConfig->target()->profile());
params.solibSearchPath.append(qtSoPaths(version));
params.useServerStartScript = true; params.useServerStartScript = true;
params.remoteSetupNeeded = true; params.remoteSetupNeeded = true;
@@ -148,6 +152,9 @@ void AndroidDebugSupport::handleRemoteErrorOutput(const QByteArray &output)
QStringList AndroidDebugSupport::qtSoPaths(QtSupport::BaseQtVersion *qtVersion) QStringList AndroidDebugSupport::qtSoPaths(QtSupport::BaseQtVersion *qtVersion)
{ {
if (!qtVersion)
return QStringList();
QSet<QString> paths; QSet<QString> paths;
for (uint i = 0; i < sizeof qMakeVariables / sizeof qMakeVariables[0]; ++i) { for (uint i = 0; i < sizeof qMakeVariables / sizeof qMakeVariables[0]; ++i) {
if (!qtVersion->versionInfo().contains(QLatin1String(qMakeVariables[i]))) if (!qtVersion->versionInfo().contains(QLatin1String(qMakeVariables[i])))

View File

@@ -34,13 +34,14 @@
#include "androidpackageinstallationstep.h" #include "androidpackageinstallationstep.h"
#include "androidpackagecreationstep.h" #include "androidpackagecreationstep.h"
#include "androiddeployconfiguration.h" #include "androiddeployconfiguration.h"
#include "androidtarget.h" #include "androidmanager.h"
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/target.h> #include <projectexplorer/target.h>
#include <qt4projectmanager/qt4projectmanagerconstants.h>
#include <qt4projectmanager/qt4project.h> #include <qt4projectmanager/qt4project.h>
#include <qtsupport/qtprofileinformation.h>
#include <qtsupport/qtsupportconstants.h>
using namespace Android::Internal; using namespace Android::Internal;
@@ -64,15 +65,11 @@ AndroidDeployConfiguration::AndroidDeployConfiguration(ProjectExplorer::Target *
AndroidDeployConfigurationFactory::AndroidDeployConfigurationFactory(QObject *parent) : AndroidDeployConfigurationFactory::AndroidDeployConfigurationFactory(QObject *parent) :
ProjectExplorer::DeployConfigurationFactory(parent) ProjectExplorer::DeployConfigurationFactory(parent)
{ } { setObjectName(QLatin1String("AndroidDeployConfigurationFactory"));}
bool AndroidDeployConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const bool AndroidDeployConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const
{ {
AndroidTarget *t = qobject_cast<AndroidTarget *>(parent); return availableCreationIds(parent).contains(id);
if (!t || t->id() != Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID)
|| !id.toString().startsWith(QLatin1String(ANDROID_DEPLOYCONFIGURATION_ID)))
return false;
return true;
} }
ProjectExplorer::DeployConfiguration *AndroidDeployConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id) ProjectExplorer::DeployConfiguration *AndroidDeployConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id)
@@ -96,8 +93,7 @@ ProjectExplorer::DeployConfiguration *AndroidDeployConfigurationFactory::restore
{ {
if (!canRestore(parent, map)) if (!canRestore(parent, map))
return 0; return 0;
AndroidTarget *t = static_cast<AndroidTarget *>(parent); AndroidDeployConfiguration *dc = new AndroidDeployConfiguration(parent);
AndroidDeployConfiguration *dc = new AndroidDeployConfiguration(t);
if (dc->fromMap(map)) if (dc->fromMap(map))
return dc; return dc;
@@ -107,7 +103,7 @@ ProjectExplorer::DeployConfiguration *AndroidDeployConfigurationFactory::restore
bool AndroidDeployConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *source) const bool AndroidDeployConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::DeployConfiguration *source) const
{ {
if (!qobject_cast<AndroidTarget *>(parent)) if (!AndroidManager::supportsAndroid(parent))
return false; return false;
return source->id() == Core::Id(ANDROID_DEPLOYCONFIGURATION_ID); return source->id() == Core::Id(ANDROID_DEPLOYCONFIGURATION_ID);
} }
@@ -116,24 +112,24 @@ ProjectExplorer::DeployConfiguration *AndroidDeployConfigurationFactory::clone(P
{ {
if (!canClone(parent, source)) if (!canClone(parent, source))
return 0; return 0;
AndroidTarget *t = static_cast<AndroidTarget *>(parent); return new AndroidDeployConfiguration(parent, source);
return new AndroidDeployConfiguration(t, source);
} }
QList<Core::Id> AndroidDeployConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const QList<Core::Id> AndroidDeployConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const
{ {
AndroidTarget *target = qobject_cast<AndroidTarget *>(parent); if (!AndroidManager::supportsAndroid(parent))
if (!target ||
target->id() != Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID))
return QList<Core::Id>(); return QList<Core::Id>();
QList<Core::Id> result; QList<Core::Id> result;
foreach (const QString &id, target->qt4Project()->applicationProFilePathes(QLatin1String(ANDROID_DC_PREFIX))) Qt4ProjectManager::Qt4Project *project = static_cast<Qt4ProjectManager::Qt4Project *>(parent->project());
foreach (const QString &id, project->applicationProFilePathes(QLatin1String(ANDROID_DC_PREFIX)))
result << Core::Id(id.toUtf8().constData()); result << Core::Id(id.toUtf8().constData());
return result; return result;
} }
QString AndroidDeployConfigurationFactory::displayNameForId(const Core::Id/*id*/) const QString AndroidDeployConfigurationFactory::displayNameForId(const Core::Id id) const
{ {
return tr("Deploy on Android"); if (id.toString().startsWith(ANDROID_DC_PREFIX))
return tr("Deploy on Android");
return QString();
} }

View File

@@ -72,7 +72,6 @@ public:
QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const; QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const;
// used to translate the ids to names to display to the user // used to translate the ids to names to display to the user
QString displayNameForId(const Core::Id id) const; QString displayNameForId(const Core::Id id) const;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -37,16 +37,16 @@
#include "androidglobal.h" #include "androidglobal.h"
#include "androidpackagecreationstep.h" #include "androidpackagecreationstep.h"
#include "androidrunconfiguration.h" #include "androidrunconfiguration.h"
#include "androidtarget.h" #include "androidmanager.h"
#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/target.h> #include <projectexplorer/target.h>
#include <qt4projectmanager/qt4buildconfiguration.h>
#include <qt4projectmanager/qt4project.h> #include <qt4projectmanager/qt4project.h>
#include <qt4projectmanager/qt4target.h>
#include <qt4projectmanager/qt4nodes.h> #include <qt4projectmanager/qt4nodes.h>
#include <qt4projectmanager/qt4buildconfiguration.h> #include <qtsupport/qtprofileinformation.h>
#include <QDir> #include <QDir>
@@ -85,14 +85,8 @@ void AndroidDeployStep::ctor()
bool AndroidDeployStep::init() bool AndroidDeployStep::init()
{ {
AndroidTarget *androidTarget = qobject_cast<AndroidTarget *>(target()); m_packageName = AndroidManager::packageName(target());
if (!androidTarget) { const QString targetSDK = AndroidManager::targetSDK(target());
raiseError(tr("Cannot deploy: current target is not android."));
return false;
}
const Qt4BuildConfiguration *const bc = androidTarget->activeQt4BuildConfiguration();
m_packageName = androidTarget->packageName();
const QString targetSDK = androidTarget->targetSDK();
writeOutput(tr("Please wait, searching for a suitable device for target:%1.").arg(targetSDK)); writeOutput(tr("Please wait, searching for a suitable device for target:%1.").arg(targetSDK));
m_deviceAPILevel = targetSDK.mid(targetSDK.indexOf(QLatin1Char('-')) + 1).toInt(); m_deviceAPILevel = targetSDK.mid(targetSDK.indexOf(QLatin1Char('-')) + 1).toInt();
@@ -103,14 +97,15 @@ bool AndroidDeployStep::init()
return false; return false;
} }
if (!bc->qtVersion()) QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile());
if (!version)
return false; return false;
m_qtVersionSourcePath = bc->qtVersion()->sourcePath().toString(); m_qtVersionSourcePath = version->sourcePath().toString();
m_qtVersionQMakeBuildConfig = bc->qtVersion()->defaultBuildConfig(); m_qtVersionQMakeBuildConfig = version->defaultBuildConfig();
m_androidDirPath = androidTarget->androidDirPath(); m_androidDirPath = AndroidManager::dirPath(target());
m_apkPathDebug = androidTarget->apkPath(AndroidTarget::DebugBuild); m_apkPathDebug = AndroidManager::apkPath(target(), AndroidManager::DebugBuild).toString();
m_apkPathRelease = androidTarget->apkPath(AndroidTarget::ReleaseBuildSigned); m_apkPathRelease = AndroidManager::apkPath(target(), AndroidManager::ReleaseBuildSigned).toString();
m_buildDirectory = androidTarget->qt4Project()->rootQt4ProjectNode()->buildDir(); m_buildDirectory = static_cast<Qt4Project *>(target()->project())->rootQt4ProjectNode()->buildDir();
m_runQASIPackagePath = m_QASIPackagePath; m_runQASIPackagePath = m_QASIPackagePath;
m_runDeployAction = m_deployAction; m_runDeployAction = m_deployAction;
return true; return true;
@@ -205,12 +200,9 @@ int AndroidDeployStep::deviceAPILevel()
return m_deviceAPILevel; return m_deviceAPILevel;
} }
QString AndroidDeployStep::localLibsRulesFilePath() Utils::FileName AndroidDeployStep::localLibsRulesFilePath()
{ {
AndroidTarget *androidTarget = qobject_cast<AndroidTarget *>(target()); return AndroidManager::localLibsRulesFilePath(target());
if (!androidTarget)
return QString();
return androidTarget->localLibsRulesFilePath();
} }
void AndroidDeployStep::copyLibs(const QString &srcPath, const QString &destPath, QStringList &copiedLibs, const QStringList &filter) void AndroidDeployStep::copyLibs(const QString &srcPath, const QString &destPath, QStringList &copiedLibs, const QStringList &filter)
@@ -241,7 +233,7 @@ bool AndroidDeployStep::deployPackage()
if (m_runDeployAction == DeployLocal) { if (m_runDeployAction == DeployLocal) {
writeOutput(tr("Clean old qt libs")); writeOutput(tr("Clean old qt libs"));
runCommand(deployProc, AndroidConfigurations::instance().adbToolPath(), runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(),
QStringList() << QLatin1String("-s") << m_deviceSerialNumber QStringList() << QLatin1String("-s") << m_deviceSerialNumber
<< QLatin1String("shell") << QLatin1String("rm") << QLatin1String("-r") << QLatin1String("/data/local/qt")); << QLatin1String("shell") << QLatin1String("rm") << QLatin1String("-r") << QLatin1String("/data/local/qt"));
@@ -258,7 +250,7 @@ bool AndroidDeployStep::deployPackage()
copyLibs(m_qtVersionSourcePath + QLatin1String("/jar"), copyLibs(m_qtVersionSourcePath + QLatin1String("/jar"),
tempPath + QLatin1String("/jar"), stripFiles); tempPath + QLatin1String("/jar"), stripFiles);
AndroidPackageCreationStep::stripAndroidLibs(stripFiles, target()->activeRunConfiguration()->abi().architecture()); AndroidPackageCreationStep::stripAndroidLibs(stripFiles, target()->activeRunConfiguration()->abi().architecture());
runCommand(deployProc, AndroidConfigurations::instance().adbToolPath(), runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(),
QStringList() << QLatin1String("-s") << m_deviceSerialNumber QStringList() << QLatin1String("-s") << m_deviceSerialNumber
<< QLatin1String("push") << tempPath << QLatin1String("/data/local/qt")); << QLatin1String("push") << tempPath << QLatin1String("/data/local/qt"));
AndroidPackageCreationStep::removeDirectory(tempPath); AndroidPackageCreationStep::removeDirectory(tempPath);
@@ -266,7 +258,7 @@ bool AndroidDeployStep::deployPackage()
} }
if (m_runDeployAction == InstallQASI) { if (m_runDeployAction == InstallQASI) {
if (!runCommand(deployProc, AndroidConfigurations::instance().adbToolPath(), if (!runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(),
QStringList() << QLatin1String("-s") << m_deviceSerialNumber QStringList() << QLatin1String("-s") << m_deviceSerialNumber
<< QLatin1String("install") << QLatin1String("-r ") << m_runQASIPackagePath)) { << QLatin1String("install") << QLatin1String("-r ") << m_runQASIPackagePath)) {
raiseError(tr("Qt Android smart installer instalation failed")); raiseError(tr("Qt Android smart installer instalation failed"));
@@ -276,10 +268,10 @@ bool AndroidDeployStep::deployPackage()
} }
emit resetDelopyAction(); emit resetDelopyAction();
} }
deployProc->setWorkingDirectory(m_androidDirPath); deployProc->setWorkingDirectory(m_androidDirPath.toString());
writeOutput(tr("Installing package onto %1.").arg(m_deviceSerialNumber)); writeOutput(tr("Installing package onto %1.").arg(m_deviceSerialNumber));
runCommand(deployProc, AndroidConfigurations::instance().adbToolPath(), runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(),
QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("uninstall") << m_packageName); QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("uninstall") << m_packageName);
QString package = m_apkPathDebug; QString package = m_apkPathDebug;
@@ -287,7 +279,7 @@ bool AndroidDeployStep::deployPackage()
&& QFile::exists(m_apkPathRelease)) && QFile::exists(m_apkPathRelease))
package = m_apkPathRelease; package = m_apkPathRelease;
if (!runCommand(deployProc, AndroidConfigurations::instance().adbToolPath(), if (!runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(),
QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("install") << package)) { QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("install") << package)) {
raiseError(tr("Package instalation failed")); raiseError(tr("Package instalation failed"));
disconnect(deployProc, 0, this, 0); disconnect(deployProc, 0, this, 0);
@@ -296,11 +288,11 @@ bool AndroidDeployStep::deployPackage()
} }
writeOutput(tr("Pulling files necessary for debugging")); writeOutput(tr("Pulling files necessary for debugging"));
runCommand(deployProc, AndroidConfigurations::instance().adbToolPath(), runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(),
QStringList() << QLatin1String("-s") << m_deviceSerialNumber QStringList() << QLatin1String("-s") << m_deviceSerialNumber
<< QLatin1String("pull") << QLatin1String("/system/bin/app_process") << QLatin1String("pull") << QLatin1String("/system/bin/app_process")
<< QString::fromLatin1("%1/app_process").arg(m_buildDirectory)); << QString::fromLatin1("%1/app_process").arg(m_buildDirectory));
runCommand(deployProc, AndroidConfigurations::instance().adbToolPath(), runCommand(deployProc, AndroidConfigurations::instance().adbToolPath().toString(),
QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("pull") QStringList() << QLatin1String("-s") << m_deviceSerialNumber << QLatin1String("pull")
<< QLatin1String("/system/lib/libc.so") << QLatin1String("/system/lib/libc.so")
<< QString::fromLatin1("%1/libc.so").arg(m_buildDirectory)); << QString::fromLatin1("%1/libc.so").arg(m_buildDirectory));

View File

@@ -70,7 +70,7 @@ public:
QString deviceSerialNumber(); QString deviceSerialNumber();
int deviceAPILevel(); int deviceAPILevel();
QString localLibsRulesFilePath(); Utils::FileName localLibsRulesFilePath();
AndroidDeployAction deployAction(); AndroidDeployAction deployAction();
bool useLocalQtLibs(); bool useLocalQtLibs();
@@ -116,7 +116,7 @@ private:
QString m_packageName; QString m_packageName;
QString m_qtVersionSourcePath; QString m_qtVersionSourcePath;
QtSupport::BaseQtVersion::QmakeBuildConfigs m_qtVersionQMakeBuildConfig; QtSupport::BaseQtVersion::QmakeBuildConfigs m_qtVersionQMakeBuildConfig;
QString m_androidDirPath; Utils::FileName m_androidDirPath;
QString m_apkPathDebug; QString m_apkPathDebug;
QString m_apkPathRelease; QString m_apkPathRelease;
QString m_buildDirectory; QString m_buildDirectory;

View File

@@ -33,11 +33,13 @@
#include "androiddeploystepfactory.h" #include "androiddeploystepfactory.h"
#include "androiddeploystep.h" #include "androiddeploystep.h"
#include "androidmanager.h"
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/target.h> #include <projectexplorer/target.h>
#include <qt4projectmanager/qt4projectmanagerconstants.h> #include <qtsupport/qtsupportconstants.h>
#include <qtsupport/qtprofileinformation.h>
#include <QCoreApplication> #include <QCoreApplication>
@@ -53,27 +55,25 @@ AndroidDeployStepFactory::AndroidDeployStepFactory(QObject *parent)
QList<Core::Id> AndroidDeployStepFactory::availableCreationIds(BuildStepList *parent) const QList<Core::Id> AndroidDeployStepFactory::availableCreationIds(BuildStepList *parent) const
{ {
if (parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY) if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY))
&& parent->target()->id() == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID) return QList<Core::Id>();
&& !parent->contains(AndroidDeployStep::Id)) if (!AndroidManager::supportsAndroid(parent->target()))
return QList<Core::Id>() << AndroidDeployStep::Id; return QList<Core::Id>();
return QList<Core::Id>(); if (parent->contains(AndroidDeployStep::Id))
return QList<Core::Id>();
return QList<Core::Id>() << AndroidDeployStep::Id;
} }
QString AndroidDeployStepFactory::displayNameForId(const Core::Id id) const QString AndroidDeployStepFactory::displayNameForId(const Core::Id id) const
{ {
if (id == AndroidDeployStep::Id) if (id == AndroidDeployStep::Id)
return QCoreApplication::translate("Qt4ProjectManager::Internal::AndroidDeployStepFactory", return tr("Deploy to Android device/emulator");
"Deploy to Android device/emulator");
return QString(); return QString();
} }
bool AndroidDeployStepFactory::canCreate(BuildStepList *parent, const Core::Id id) const bool AndroidDeployStepFactory::canCreate(BuildStepList *parent, const Core::Id id) const
{ {
return parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY) return availableCreationIds(parent).contains(id);
&& id == Core::Id(AndroidDeployStep::Id)
&& parent->target()->id() == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID)
&& !parent->contains(AndroidDeployStep::Id);
} }
BuildStep *AndroidDeployStepFactory::create(BuildStepList *parent, const Core::Id id) BuildStep *AndroidDeployStepFactory::create(BuildStepList *parent, const Core::Id id)

View File

@@ -110,7 +110,7 @@ void AndroidDeployStepWidget::useLocalQtLibsStateChanged(int state)
void AndroidDeployStepWidget::editRulesFile() void AndroidDeployStepWidget::editRulesFile()
{ {
Core::ICore::instance()->openFiles(QStringList() << m_step->localLibsRulesFilePath(), Core::ICore::SwitchMode); Core::ICore::instance()->openFiles(QStringList() << m_step->localLibsRulesFilePath().toString(), Core::ICore::SwitchMode);
} }
} // namespace Internal } // namespace Internal

View File

@@ -0,0 +1,177 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 BogDan Vatra <bog_dan_ro@yahoo.com>
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/
#ifndef ANDROIDMANAGER_H
#define ANDROIDMANAGER_H
#include <utils/fileutils.h>
#include <QDomDocument>
#include <QObject>
#include <QStringList>
namespace ProjectExplorer { class Target; }
namespace Android {
class AndroidPlugin;
namespace Internal {
class AndroidManager : public QObject
{
Q_OBJECT
public:
enum BuildType
{
DebugBuild,
ReleaseBuildUnsigned,
ReleaseBuildSigned
};
static AndroidManager *instance();
~AndroidManager();
static bool supportsAndroid(ProjectExplorer::Target *target);
static QString packageName(ProjectExplorer::Target *target);
static bool setPackageName(ProjectExplorer::Target *target, const QString &name);
static QString applicationName(ProjectExplorer::Target *target);
static bool setApplicationName(ProjectExplorer::Target *target, const QString &name);
static QStringList permissions(ProjectExplorer::Target *target);
static bool setPermissions(ProjectExplorer::Target *target, const QStringList &permissions);
static QString intentName(ProjectExplorer::Target *target);
static QString activityName(ProjectExplorer::Target *target);
static int versionCode(ProjectExplorer::Target *target);
static bool setVersionCode(ProjectExplorer::Target *target, int version);
static QString versionName(ProjectExplorer::Target *target);
static bool setVersionName(ProjectExplorer::Target *target, const QString &version);
static QIcon highDpiIcon(ProjectExplorer::Target *target);
static bool setHighDpiIcon(ProjectExplorer::Target *target, const QString &iconFilePath);
static QIcon mediumDpiIcon(ProjectExplorer::Target *target);
static bool setMediumDpiIcon(ProjectExplorer::Target *target, const QString &iconFilePath);
static QIcon lowDpiIcon(ProjectExplorer::Target *target);
static bool setLowDpiIcon(ProjectExplorer::Target *target, const QString &iconFilePath);
static QStringList availableTargetApplications(ProjectExplorer::Target *target);
static QString targetApplication(ProjectExplorer::Target *target);
static bool setTargetApplication(ProjectExplorer::Target *target, const QString &name);
static QString targetApplicationPath(ProjectExplorer::Target *target);
static QString targetSDK(ProjectExplorer::Target *target);
static bool setTargetSDK(ProjectExplorer::Target *target, const QString &sdk);
static Utils::FileName dirPath(ProjectExplorer::Target *target);
static Utils::FileName manifestPath(ProjectExplorer::Target *target);
static Utils::FileName libsPath(ProjectExplorer::Target *target);
static Utils::FileName stringsPath(ProjectExplorer::Target *target);
static Utils::FileName defaultPropertiesPath(ProjectExplorer::Target *target);
static Utils::FileName srcPath(ProjectExplorer::Target *target);
static Utils::FileName apkPath(ProjectExplorer::Target *target, BuildType buildType);
static bool createAndroidTemplatesIfNecessary(ProjectExplorer::Target *target);
static void updateTarget(ProjectExplorer::Target *target, const QString &targetSDK,
const QString &name = QString());
static Utils::FileName localLibsRulesFilePath(ProjectExplorer::Target *target);
static QString loadLocalLibs(ProjectExplorer::Target *target, int apiLevel);
static QString loadLocalJars(ProjectExplorer::Target *target, int apiLevel);
static QStringList availableQtLibs(ProjectExplorer::Target *target);
static QStringList qtLibs(ProjectExplorer::Target *target);
static bool setQtLibs(ProjectExplorer::Target *target, const QStringList &libs);
static QStringList availablePrebundledLibs(ProjectExplorer::Target *target);
static QStringList prebundledLibs(ProjectExplorer::Target *target);
static bool setPrebundledLibs(ProjectExplorer::Target *target, const QStringList &libs);
private:
explicit AndroidManager(QObject *parent = 0);
static void raiseError(const QString &reason);
static bool openXmlFile(ProjectExplorer::Target *target, QDomDocument &doc,
const Utils::FileName &fileName, bool createAndroidTemplates = false);
static bool saveXmlFile(ProjectExplorer::Target *target, QDomDocument &doc, const Utils::FileName &fileName);
static bool openManifest(ProjectExplorer::Target *target, QDomDocument &doc);
static bool saveManifest(ProjectExplorer::Target *target, QDomDocument &doc);
static bool openLibsXml(ProjectExplorer::Target *target, QDomDocument &doc);
static bool saveLibsXml(ProjectExplorer::Target *target, QDomDocument &doc);
static QStringList libsXml(ProjectExplorer::Target *target, const QString &tag);
static bool setLibsXml(ProjectExplorer::Target *target, const QStringList &libs, const QString &tag);
enum ItemType
{
Lib,
Jar
};
static QString loadLocal(ProjectExplorer::Target *target, int apiLevel, ItemType item);
class Library
{
public:
Library()
{ level = -1; }
int level;
QStringList dependencies;
QString name;
};
typedef QMap<QString, Library> LibrariesMap;
enum IconType
{
HighDPI,
MediumDPI,
LowDPI
};
static QString iconPath(ProjectExplorer::Target *target, IconType type);
static QIcon icon(ProjectExplorer::Target *target, IconType type);
static bool setIcon(ProjectExplorer::Target *target, IconType type, const QString &iconFileName);
static QStringList dependencies(const Utils::FileName &readelfPath, const QString &lib);
static int setLibraryLevel(const QString &library, LibrariesMap &mapLibs);
static bool qtLibrariesLessThan(const Library &a, const Library &b);
static AndroidManager *m_instance;
friend class Android::AndroidPlugin;
};
} // namespace Internal
} // namespace Android
#endif // ANDROIDMANAGER_H

View File

@@ -33,11 +33,14 @@
#include "androidpackagecreationfactory.h" #include "androidpackagecreationfactory.h"
#include "androidpackagecreationstep.h" #include "androidpackagecreationstep.h"
#include "androidmanager.h"
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/target.h> #include <projectexplorer/target.h>
#include <qt4projectmanager/qt4projectmanagerconstants.h> #include <qt4projectmanager/qt4projectmanagerconstants.h>
#include <qtsupport/qtprofileinformation.h>
#include <qtsupport/qtsupportconstants.h>
#include <QCoreApplication> #include <QCoreApplication>
@@ -54,11 +57,13 @@ AndroidPackageCreationFactory::AndroidPackageCreationFactory(QObject *parent)
QList<Core::Id> AndroidPackageCreationFactory::availableCreationIds(ProjectExplorer::BuildStepList *parent) const QList<Core::Id> AndroidPackageCreationFactory::availableCreationIds(ProjectExplorer::BuildStepList *parent) const
{ {
if (parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY) if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY))
&& parent->target()->id() == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID) return QList<Core::Id>();
&& !parent->contains(AndroidPackageCreationStep::CreatePackageId)) if (!AndroidManager::supportsAndroid(parent->target()))
return QList<Core::Id>() << AndroidPackageCreationStep::CreatePackageId; return QList<Core::Id>();
return QList<Core::Id>(); if (parent->contains(AndroidPackageCreationStep::CreatePackageId))
return QList<Core::Id>();
return QList<Core::Id>() << AndroidPackageCreationStep::CreatePackageId;
} }
QString AndroidPackageCreationFactory::displayNameForId(const Core::Id id) const QString AndroidPackageCreationFactory::displayNameForId(const Core::Id id) const
@@ -71,10 +76,7 @@ QString AndroidPackageCreationFactory::displayNameForId(const Core::Id id) const
bool AndroidPackageCreationFactory::canCreate(ProjectExplorer::BuildStepList *parent, const Core::Id id) const bool AndroidPackageCreationFactory::canCreate(ProjectExplorer::BuildStepList *parent, const Core::Id id) const
{ {
return parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY) return availableCreationIds(parent).contains(id);
&& id == Core::Id(AndroidPackageCreationStep::CreatePackageId)
&& parent->target()->id() == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID)
&& !parent->contains(AndroidPackageCreationStep::CreatePackageId);
} }
BuildStep *AndroidPackageCreationFactory::create(ProjectExplorer::BuildStepList *parent, const Core::Id id) BuildStep *AndroidPackageCreationFactory::create(ProjectExplorer::BuildStepList *parent, const Core::Id id)

View File

@@ -36,15 +36,15 @@
#include "androiddeploystep.h" #include "androiddeploystep.h"
#include "androidglobal.h" #include "androidglobal.h"
#include "androidpackagecreationwidget.h" #include "androidpackagecreationwidget.h"
#include "androidtarget.h" #include "androidmanager.h"
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/runconfiguration.h> #include <projectexplorer/runconfiguration.h>
#include <projectexplorer/target.h>
#include <qt4projectmanager/qt4buildconfiguration.h> #include <qt4projectmanager/qt4buildconfiguration.h>
#include <qt4projectmanager/qt4project.h> #include <qt4projectmanager/qt4project.h>
#include <qt4projectmanager/qt4nodes.h> #include <qt4projectmanager/qt4nodes.h>
#include <qt4projectmanager/qt4target.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
#include <coreplugin/fileutils.h> #include <coreplugin/fileutils.h>
@@ -142,35 +142,35 @@ void AndroidPackageCreationStep::ctor()
bool AndroidPackageCreationStep::init() bool AndroidPackageCreationStep::init()
{ {
AndroidTarget *target = androidTarget(); const Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(target()->activeBuildConfiguration());
const Qt4BuildConfiguration *bc = target->activeQt4BuildConfiguration(); if (!bc) {
if (!target) { raiseError(tr("Cannot create android package: current build configuration is not Qt4."));
raiseError(tr("Cannot create android package: current target is not android."));
return false; return false;
} }
m_outputParser.setProjectFileList(target->qt4Project()->files(Project::AllFiles)); Qt4Project *project = static_cast<Qt4Project *>(target()->project());
m_outputParser.setProjectFileList(project->files(Project::AllFiles));
// Copying // Copying
m_androidDir = target->androidDirPath(); m_androidDir = AndroidManager::dirPath(target());
QString androidLibPath; Utils::FileName androidLibPath;
if (target->qt4Project()->rootQt4ProjectNode()->variableValue(Qt4ProjectManager::ConfigVar).contains(QLatin1String("x86"))) if (project->rootQt4ProjectNode()->variableValue(Qt4ProjectManager::ConfigVar).contains(QLatin1String("x86")))
androidLibPath = m_androidDir + QLatin1String("/libs/x86"); androidLibPath = m_androidDir.appendPath(QLatin1String("libs/x86"));
else if (target->qt4Project()->rootQt4ProjectNode() else if (project->rootQt4ProjectNode()
->variableValue(Qt4ProjectManager::ConfigVar).contains(QLatin1String("armeabi-v7a"))) ->variableValue(Qt4ProjectManager::ConfigVar).contains(QLatin1String("armeabi-v7a")))
androidLibPath = m_androidDir + QLatin1String("/libs/armeabi-v7a"); androidLibPath = m_androidDir.appendPath(QLatin1String("libs/armeabi-v7a"));
else else
androidLibPath = m_androidDir + QLatin1String("/libs/armeabi"); androidLibPath = m_androidDir.appendPath(QLatin1String("libs/armeabi"));
m_gdbServerDestination = androidLibPath + QLatin1String("/gdbserver"); m_gdbServerDestination = androidLibPath.appendPath(QLatin1String("gdbserver"));
m_gdbServerSource = AndroidConfigurations::instance().gdbServerPath(target->activeRunConfiguration()->abi().architecture()); m_gdbServerSource = AndroidConfigurations::instance().gdbServerPath(target()->activeRunConfiguration()->abi().architecture());
m_debugBuild = bc->qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild; m_debugBuild = bc->qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild;
if (!target->createAndroidTemplatesIfNecessary()) if (!AndroidManager::createAndroidTemplatesIfNecessary(target()))
return false; return false;
target->updateProject(target->targetSDK(), target->applicationName()); AndroidManager::updateTarget(target(), AndroidManager::targetSDK(target()), AndroidManager::applicationName(target()));
m_antToolPath = AndroidConfigurations::instance().antToolPath(); m_antToolPath = AndroidConfigurations::instance().antToolPath();
m_apkPathUnsigned = target->apkPath(AndroidTarget::ReleaseBuildUnsigned); m_apkPathUnsigned = AndroidManager::apkPath(target(), AndroidManager::ReleaseBuildUnsigned);
m_apkPathSigned = target->apkPath(AndroidTarget::ReleaseBuildSigned); m_apkPathSigned = AndroidManager::apkPath(target(), AndroidManager::ReleaseBuildSigned);
m_keystorePathForRun = m_keystorePath; m_keystorePathForRun = m_keystorePath;
m_certificatePasswdForRun = m_certificatePasswd; m_certificatePasswdForRun = m_certificatePasswd;
m_jarSigner = AndroidConfigurations::instance().jarsignerPath(); m_jarSigner = AndroidConfigurations::instance().jarsignerPath();
@@ -188,15 +188,10 @@ BuildStepConfigWidget *AndroidPackageCreationStep::createConfigWidget()
return new AndroidPackageCreationWidget(this); return new AndroidPackageCreationWidget(this);
} }
AndroidTarget *AndroidPackageCreationStep::androidTarget() const
{
return qobject_cast<AndroidTarget *>(target());
}
void AndroidPackageCreationStep::checkRequiredLibraries() void AndroidPackageCreationStep::checkRequiredLibraries()
{ {
QProcess readelfProc; QProcess readelfProc;
QString appPath = androidTarget()->targetApplicationPath(); QString appPath = AndroidManager::targetApplicationPath(target());
if (!QFile::exists(appPath)) { if (!QFile::exists(appPath)) {
raiseError(tr("Cannot find read elf information"), raiseError(tr("Cannot find read elf information"),
tr("Cannot find '%1'.\n" tr("Cannot find '%1'.\n"
@@ -204,7 +199,7 @@ void AndroidPackageCreationStep::checkRequiredLibraries()
"built successfully and is selected in Application tab ('Run option') ").arg(appPath)); "built successfully and is selected in Application tab ('Run option') ").arg(appPath));
return; return;
} }
readelfProc.start(AndroidConfigurations::instance().readelfPath(androidTarget()->activeRunConfiguration()->abi().architecture()), readelfProc.start(AndroidConfigurations::instance().readelfPath(target()->activeRunConfiguration()->abi().architecture()).toString(),
QStringList() << QLatin1String("-d") << QLatin1String("-W") << appPath); QStringList() << QLatin1String("-d") << QLatin1String("-W") << appPath);
if (!readelfProc.waitForFinished(-1)) { if (!readelfProc.waitForFinished(-1)) {
readelfProc.terminate(); readelfProc.terminate();
@@ -218,44 +213,44 @@ void AndroidPackageCreationStep::checkRequiredLibraries()
libs << QString::fromLatin1(line.mid(pos, line.length() - pos - 1)); libs << QString::fromLatin1(line.mid(pos, line.length() - pos - 1));
} }
} }
QStringList checkedLibs = androidTarget()->qtLibs(); QStringList checkedLibs = AndroidManager::qtLibs(target());
QStringList requiredLibraries; QStringList requiredLibraries;
foreach (const QString &qtLib, androidTarget()->availableQtLibs()) { foreach (const QString &qtLib, AndroidManager::availableQtLibs(target())) {
if (libs.contains(QLatin1String("lib") + qtLib + QLatin1String(".so")) || checkedLibs.contains(qtLib)) if (libs.contains(QLatin1String("lib") + qtLib + QLatin1String(".so")) || checkedLibs.contains(qtLib))
requiredLibraries << qtLib; requiredLibraries << qtLib;
} }
androidTarget()->setQtLibs(requiredLibraries); AndroidManager::setQtLibs(target(), requiredLibraries);
checkedLibs = androidTarget()->prebundledLibs(); checkedLibs = AndroidManager::prebundledLibs(target());
requiredLibraries.clear(); requiredLibraries.clear();
foreach (const QString &qtLib, androidTarget()->availableQtLibs()) { foreach (const QString &qtLib, AndroidManager::availableQtLibs(target())) {
if (libs.contains(qtLib) || checkedLibs.contains(qtLib)) if (libs.contains(qtLib) || checkedLibs.contains(qtLib))
requiredLibraries << qtLib; requiredLibraries << qtLib;
} }
androidTarget()->setPrebundledLibs(requiredLibraries); AndroidManager::setPrebundledLibs(target(), requiredLibraries);
emit updateRequiredLibrariesModels(); emit updateRequiredLibrariesModels();
} }
void AndroidPackageCreationStep::initCheckRequiredLibrariesForRun() void AndroidPackageCreationStep::initCheckRequiredLibrariesForRun()
{ {
m_appPath = androidTarget()->targetApplicationPath(); m_appPath = Utils::FileName::fromString(AndroidManager::targetApplicationPath(target()));
m_readElf = AndroidConfigurations::instance().readelfPath(androidTarget()->activeRunConfiguration()->abi().architecture()); m_readElf = AndroidConfigurations::instance().readelfPath(target()->activeRunConfiguration()->abi().architecture());
m_qtLibs = androidTarget()->qtLibs(); m_qtLibs = AndroidManager::qtLibs(target());
m_availableQtLibs = androidTarget()->availableQtLibs(); m_availableQtLibs = AndroidManager::availableQtLibs(target());
m_prebundledLibs = androidTarget()->prebundledLibs(); m_prebundledLibs = AndroidManager::prebundledLibs(target());
} }
void AndroidPackageCreationStep::checkRequiredLibrariesForRun() void AndroidPackageCreationStep::checkRequiredLibrariesForRun()
{ {
QProcess readelfProc; QProcess readelfProc;
if (!QFile::exists(m_appPath)) { if (!m_appPath.toFileInfo().exists()) {
raiseError(tr("Cannot find read elf information"), raiseError(tr("Can't find read elf information"),
tr("Can't find '%1'.\n" tr("Can't find '%1'.\n"
"Please make sure your application is " "Please make sure your application is "
"built successfully and is selected in Application tab ('Run option') ").arg(m_appPath)); "built successfully and is selected in Application tab ('Run option') ").arg(m_appPath.toUserOutput()));
return; return;
} }
readelfProc.start(m_readElf, QStringList() << QLatin1String("-d") << QLatin1String("-W") << m_appPath); readelfProc.start(m_readElf.toString(), QStringList() << QLatin1String("-d") << QLatin1String("-W") << m_appPath.toUserOutput());
if (!readelfProc.waitForFinished(-1)) { if (!readelfProc.waitForFinished(-1)) {
readelfProc.terminate(); readelfProc.terminate();
return; return;
@@ -290,20 +285,20 @@ void AndroidPackageCreationStep::checkRequiredLibrariesForRun()
void AndroidPackageCreationStep::setQtLibs(const QStringList &qtLibs) void AndroidPackageCreationStep::setQtLibs(const QStringList &qtLibs)
{ {
androidTarget()->setQtLibs(qtLibs); AndroidManager::setQtLibs(target(), qtLibs);
} }
void AndroidPackageCreationStep::setPrebundledLibs(const QStringList &prebundledLibs) void AndroidPackageCreationStep::setPrebundledLibs(const QStringList &prebundledLibs)
{ {
androidTarget()->setPrebundledLibs(prebundledLibs); AndroidManager::setPrebundledLibs(target(), prebundledLibs);
} }
QString AndroidPackageCreationStep::keystorePath() Utils::FileName AndroidPackageCreationStep::keystorePath()
{ {
return m_keystorePath; return m_keystorePath;
} }
void AndroidPackageCreationStep::setKeystorePath(const QString &path) void AndroidPackageCreationStep::setKeystorePath(const Utils::FileName &path)
{ {
m_keystorePath = path; m_keystorePath = path;
m_certificatePasswd.clear(); m_certificatePasswd.clear();
@@ -336,13 +331,13 @@ QAbstractItemModel *AndroidPackageCreationStep::keystoreCertificates()
QProcess keytoolProc; QProcess keytoolProc;
while (!rawCerts.length() || !m_keystorePasswd.length()) { while (!rawCerts.length() || !m_keystorePasswd.length()) {
QStringList params; QStringList params;
params << QLatin1String("-list") << QLatin1String("-v") << QLatin1String("-keystore") << m_keystorePathForRun << QLatin1String("-storepass"); params << QLatin1String("-list") << QLatin1String("-v") << QLatin1String("-keystore") << m_keystorePathForRun.toUserOutput() << QLatin1String("-storepass");
if (!m_keystorePasswd.length()) if (!m_keystorePasswd.length())
keystorePassword(); keystorePassword();
if (!m_keystorePasswd.length()) if (!m_keystorePasswd.length())
return 0; return 0;
params << m_keystorePasswd; params << m_keystorePasswd;
keytoolProc.start(AndroidConfigurations::instance().keytoolPath(), params); keytoolProc.start(AndroidConfigurations::instance().keytoolPath().toString(), params);
if (!keytoolProc.waitForStarted() || !keytoolProc.waitForFinished()) { if (!keytoolProc.waitForStarted() || !keytoolProc.waitForFinished()) {
QMessageBox::critical(0, tr("Error"), QMessageBox::critical(0, tr("Error"),
tr("Failed to run keytool")); tr("Failed to run keytool"));
@@ -363,14 +358,14 @@ bool AndroidPackageCreationStep::fromMap(const QVariantMap &map)
{ {
if (!BuildStep::fromMap(map)) if (!BuildStep::fromMap(map))
return false; return false;
m_keystorePath = map.value(KeystoreLocationKey).toString(); m_keystorePath = Utils::FileName::fromString(map.value(KeystoreLocationKey).toString());
return true; return true;
} }
QVariantMap AndroidPackageCreationStep::toMap() const QVariantMap AndroidPackageCreationStep::toMap() const
{ {
QVariantMap map(BuildStep::toMap()); QVariantMap map(BuildStep::toMap());
map.insert(KeystoreLocationKey, m_keystorePath); map.insert(KeystoreLocationKey, m_keystorePath.toString());
return map; return map;
} }
@@ -382,12 +377,12 @@ bool AndroidPackageCreationStep::createPackage()
QStringList build; QStringList build;
build << QLatin1String("clean"); build << QLatin1String("clean");
QFile::remove(m_gdbServerDestination); QFile::remove(m_gdbServerDestination.toString());
if (m_debugBuild || !m_certificateAlias.length()) { if (m_debugBuild || !m_certificateAlias.length()) {
build << QLatin1String("debug"); build << QLatin1String("debug");
if (!QFile::copy(m_gdbServerSource, m_gdbServerDestination)) { if (!QFile::copy(m_gdbServerSource.toString(), m_gdbServerDestination.toString())) {
raiseError(tr("Cannot copy gdbserver from '%1' to '%2'").arg(m_gdbServerSource) raiseError(tr("Can't copy gdbserver from '%1' to '%2'").arg(m_gdbServerSource.toUserOutput())
.arg(m_gdbServerDestination)); .arg(m_gdbServerDestination.toUserOutput()));
return false; return false;
} }
} else { } else {
@@ -403,9 +398,9 @@ bool AndroidPackageCreationStep::createPackage()
connect(buildProc, SIGNAL(readyReadStandardError()), this, connect(buildProc, SIGNAL(readyReadStandardError()), this,
SLOT(handleBuildStdErrOutput())); SLOT(handleBuildStdErrOutput()));
buildProc->setWorkingDirectory(m_androidDir); buildProc->setWorkingDirectory(m_androidDir.toString());
if (!runCommand(buildProc, m_antToolPath, build)) { if (!runCommand(buildProc, m_antToolPath.toString(), build)) {
disconnect(buildProc, 0, this, 0); disconnect(buildProc, 0, this, 0);
buildProc->deleteLater(); buildProc->deleteLater();
return false; return false;
@@ -425,11 +420,11 @@ bool AndroidPackageCreationStep::createPackage()
QByteArray keyPass = m_certificatePasswdForRun.toUtf8(); QByteArray keyPass = m_certificatePasswdForRun.toUtf8();
build.clear(); build.clear();
build << QLatin1String("-verbose") << QLatin1String("-keystore") << m_keystorePathForRun build << QLatin1String("-verbose") << QLatin1String("-keystore") << m_keystorePathForRun.toUserOutput()
<< QLatin1String("-storepass") << m_keystorePasswd << QLatin1String("-storepass") << m_keystorePasswd
<< m_apkPathUnsigned << m_apkPathUnsigned.toUserOutput()
<< m_certificateAlias; << m_certificateAlias;
buildProc->start(m_jarSigner, build); //TODO buildProc->start(m_jarSigner.toString(), build); //TODO
if (!buildProc->waitForStarted()) { if (!buildProc->waitForStarted()) {
disconnect(buildProc, 0, this, 0); disconnect(buildProc, 0, this, 0);
buildProc->deleteLater(); buildProc->deleteLater();
@@ -446,9 +441,9 @@ bool AndroidPackageCreationStep::createPackage()
emit addOutput(tr("Failed, try again"), ErrorMessageOutput); emit addOutput(tr("Failed, try again"), ErrorMessageOutput);
m_certificatePasswdForRun.clear(); m_certificatePasswdForRun.clear();
} }
if (QFile::rename(m_apkPathUnsigned, m_apkPathSigned)) { if (QFile::rename(m_apkPathUnsigned.toString(), m_apkPathSigned.toString())) {
emit addOutput(tr("Release signed package created to %1") emit addOutput(tr("Release signed package created to %1")
.arg(m_apkPathSigned) .arg(m_apkPathSigned.toUserOutput())
, MessageOutput); , MessageOutput);
if (m_openPackageLocation) if (m_openPackageLocation)
@@ -465,7 +460,8 @@ void AndroidPackageCreationStep::stripAndroidLibs(const QStringList & files, Abi
{ {
QProcess stripProcess; QProcess stripProcess;
foreach (const QString &file, files) { foreach (const QString &file, files) {
stripProcess.start(AndroidConfigurations::instance().stripPath(architecture), QStringList()<<QLatin1String("--strip-unneeded") << file); stripProcess.start(AndroidConfigurations::instance().stripPath(architecture).toString(),
QStringList()<<QLatin1String("--strip-unneeded") << file);
stripProcess.waitForStarted(); stripProcess.waitForStarted();
if (!stripProcess.waitForFinished()) if (!stripProcess.waitForFinished())
stripProcess.terminate(); stripProcess.terminate();
@@ -573,7 +569,7 @@ void AndroidPackageCreationStep::certificatePassword()
void AndroidPackageCreationStep::showInGraphicalShell() void AndroidPackageCreationStep::showInGraphicalShell()
{ {
Core::FileUtils::showInGraphicalShell(Core::ICore::instance()->mainWindow(), m_apkPathSigned); Core::FileUtils::showInGraphicalShell(Core::ICore::instance()->mainWindow(), m_apkPathSigned.toString());
} }
void AndroidPackageCreationStep::raiseError(const QString &shortMsg, void AndroidPackageCreationStep::raiseError(const QString &shortMsg,

View File

@@ -50,7 +50,6 @@ class Qt4BuildConfiguration;
namespace Android { namespace Android {
namespace Internal { namespace Internal {
class AndroidTarget;
class AndroidPackageCreationStep : public ProjectExplorer::BuildStep class AndroidPackageCreationStep : public ProjectExplorer::BuildStep
{ {
@@ -66,14 +65,12 @@ public:
static const QLatin1String DefaultVersionNumber; static const QLatin1String DefaultVersionNumber;
AndroidTarget *androidTarget() const;
void checkRequiredLibraries(); void checkRequiredLibraries();
void initCheckRequiredLibrariesForRun(); void initCheckRequiredLibrariesForRun();
void checkRequiredLibrariesForRun(); void checkRequiredLibrariesForRun();
QString keystorePath(); Utils::FileName keystorePath();
void setKeystorePath(const QString &path); void setKeystorePath(const Utils::FileName &path);
void setKeystorePassword(const QString &pwd); void setKeystorePassword(const QString &pwd);
void setCertificateAlias(const QString &alias); void setCertificateAlias(const QString &alias);
void setCertificatePassword(const QString &pwd); void setCertificatePassword(const QString &pwd);
@@ -110,7 +107,7 @@ private:
static const Core::Id CreatePackageId; static const Core::Id CreatePackageId;
private: private:
QString m_keystorePath; Utils::FileName m_keystorePath;
QString m_keystorePasswd; QString m_keystorePasswd;
QString m_certificateAlias; QString m_certificateAlias;
QString m_certificatePasswd; QString m_certificatePasswd;
@@ -118,19 +115,19 @@ private:
JavaParser m_outputParser; JavaParser m_outputParser;
// members to pass data from init() to run() // members to pass data from init() to run()
QString m_androidDir; Utils::FileName m_androidDir;
QString m_gdbServerSource; Utils::FileName m_gdbServerSource;
QString m_gdbServerDestination; Utils::FileName m_gdbServerDestination;
bool m_debugBuild; bool m_debugBuild;
QString m_antToolPath; Utils::FileName m_antToolPath;
QString m_apkPathUnsigned; Utils::FileName m_apkPathUnsigned;
QString m_apkPathSigned; Utils::FileName m_apkPathSigned;
QString m_keystorePathForRun; Utils::FileName m_keystorePathForRun;
QString m_certificatePasswdForRun; QString m_certificatePasswdForRun;
QString m_jarSigner; Utils::FileName m_jarSigner;
// more for checkLibraries // more for checkLibraries
QString m_appPath; Utils::FileName m_appPath;
QString m_readElf; Utils::FileName m_readElf;
QStringList m_qtLibs; QStringList m_qtLibs;
QStringList m_availableQtLibs; QStringList m_availableQtLibs;
QStringList m_prebundledLibs; QStringList m_prebundledLibs;

View File

@@ -34,7 +34,7 @@
#include "androidpackagecreationstep.h" #include "androidpackagecreationstep.h"
#include "androidconfigurations.h" #include "androidconfigurations.h"
#include "androidcreatekeystorecertificate.h" #include "androidcreatekeystorecertificate.h"
#include "androidtarget.h" #include "androidmanager.h"
#include "ui_androidpackagecreationwidget.h" #include "ui_androidpackagecreationwidget.h"
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
@@ -49,6 +49,7 @@
#include <QTimer> #include <QTimer>
#include <QFileDialog> #include <QFileDialog>
#include <QFileSystemWatcher>
#include <QMessageBox> #include <QMessageBox>
namespace Android { namespace Android {
@@ -203,7 +204,8 @@ int PermissionsModel::rowCount(const QModelIndex &parent) const
AndroidPackageCreationWidget::AndroidPackageCreationWidget(AndroidPackageCreationStep *step) AndroidPackageCreationWidget::AndroidPackageCreationWidget(AndroidPackageCreationStep *step)
: ProjectExplorer::BuildStepConfigWidget(), : ProjectExplorer::BuildStepConfigWidget(),
m_step(step), m_step(step),
m_ui(new Ui::AndroidPackageCreationWidget) m_ui(new Ui::AndroidPackageCreationWidget),
m_fileSystemWatcher(new QFileSystemWatcher(this))
{ {
m_qtLibsModel = new CheckModel(this); m_qtLibsModel = new CheckModel(this);
m_prebundledLibs = new CheckModel(this); m_prebundledLibs = new CheckModel(this);
@@ -219,10 +221,16 @@ AndroidPackageCreationWidget::AndroidPackageCreationWidget(AndroidPackageCreatio
void AndroidPackageCreationWidget::initGui() void AndroidPackageCreationWidget::initGui()
{ {
updateAndroidProjectInfo(); updateAndroidProjectInfo();
AndroidTarget *target = m_step->androidTarget(); ProjectExplorer::Target *target = m_step->target();
connect(target,
SIGNAL(androidDirContentsChanged()), m_fileSystemWatcher->addPath(AndroidManager::dirPath(target).toString());
this, SLOT(updateAndroidProjectInfo())); m_fileSystemWatcher->addPath(AndroidManager::manifestPath(target).toString());
m_fileSystemWatcher->addPath(AndroidManager::srcPath(target).toString());
connect(m_fileSystemWatcher, SIGNAL(directoryChanged(QString)),
this, SIGNAL(updateAndroidProjectInfo()));
connect(m_fileSystemWatcher, SIGNAL(fileChanged(QString)), this,
SIGNAL(updateAndroidProjectInfo()));
m_ui->packageNameLineEdit->setValidator(new QRegExpValidator(QRegExp(packageNameRegExp), this)); m_ui->packageNameLineEdit->setValidator(new QRegExpValidator(QRegExp(packageNameRegExp), this));
connect(m_ui->packageNameLineEdit, SIGNAL(editingFinished()), SLOT(setPackageName())); connect(m_ui->packageNameLineEdit, SIGNAL(editingFinished()), SLOT(setPackageName()));
connect(m_ui->appNameLineEdit, SIGNAL(editingFinished()), SLOT(setApplicationName())); connect(m_ui->appNameLineEdit, SIGNAL(editingFinished()), SLOT(setApplicationName()));
@@ -251,49 +259,50 @@ void AndroidPackageCreationWidget::initGui()
m_ui->qtLibsListView->setModel(m_qtLibsModel); m_ui->qtLibsListView->setModel(m_qtLibsModel);
m_ui->prebundledLibsListView->setModel(m_prebundledLibs); m_ui->prebundledLibsListView->setModel(m_prebundledLibs);
m_ui->permissionsListView->setModel(m_permissionsModel); m_ui->permissionsListView->setModel(m_permissionsModel);
m_ui->KeystoreLocationLineEdit->setText(m_step->keystorePath()); m_ui->KeystoreLocationLineEdit->setText(m_step->keystorePath().toUserOutput());
} }
void AndroidPackageCreationWidget::updateAndroidProjectInfo() void AndroidPackageCreationWidget::updateAndroidProjectInfo()
{ {
AndroidTarget *target = m_step->androidTarget(); ProjectExplorer::Target *target = m_step->target();
const QString packageName = AndroidManager::packageName(target);
m_ui->targetSDKComboBox->clear(); m_ui->targetSDKComboBox->clear();
QStringList targets = AndroidConfigurations::instance().sdkTargets(); QStringList targets = AndroidConfigurations::instance().sdkTargets();
m_ui->targetSDKComboBox->addItems(targets); m_ui->targetSDKComboBox->addItems(targets);
m_ui->targetSDKComboBox->setCurrentIndex(targets.indexOf(target->targetSDK())); m_ui->targetSDKComboBox->setCurrentIndex(targets.indexOf(AndroidManager::targetSDK(target)));
m_ui->packageNameLineEdit->setText(target->packageName()); m_ui->packageNameLineEdit->setText(packageName);
m_ui->appNameLineEdit->setText(target->applicationName()); m_ui->appNameLineEdit->setText(AndroidManager::applicationName(target));
if (!m_ui->appNameLineEdit->text().length()) { if (!m_ui->appNameLineEdit->text().length()) {
QString applicationName = target->project()->displayName(); QString applicationName = target->project()->displayName();
target->setPackageName(target->packageName() + QLatin1Char('.') + applicationName); AndroidManager::setPackageName(target, packageName + QLatin1Char('.') + applicationName);
m_ui->packageNameLineEdit->setText(target->packageName()); m_ui->packageNameLineEdit->setText(packageName);
if (applicationName.length()) if (!applicationName.isEmpty())
applicationName[0] = applicationName[0].toUpper(); applicationName[0] = applicationName[0].toUpper();
m_ui->appNameLineEdit->setText(applicationName); m_ui->appNameLineEdit->setText(applicationName);
target->setApplicationName(applicationName); AndroidManager::setApplicationName(target, applicationName);
} }
m_ui->versionCode->setValue(target->versionCode()); m_ui->versionCode->setValue(AndroidManager::versionCode(target));
m_ui->versionNameLinedit->setText(target->versionName()); m_ui->versionNameLinedit->setText(AndroidManager::versionName(target));
m_qtLibsModel->setAvailableItems(target->availableQtLibs()); m_qtLibsModel->setAvailableItems(AndroidManager::availableQtLibs(target));
m_qtLibsModel->setCheckedItems(target->qtLibs()); m_qtLibsModel->setCheckedItems(AndroidManager::qtLibs(target));
m_prebundledLibs->setAvailableItems(target->availablePrebundledLibs()); m_prebundledLibs->setAvailableItems(AndroidManager::availablePrebundledLibs(target));
m_prebundledLibs->setCheckedItems(target->prebundledLibs()); m_prebundledLibs->setCheckedItems(AndroidManager::prebundledLibs(target));
m_permissionsModel->setPermissions(target->permissions()); m_permissionsModel->setPermissions(AndroidManager::permissions(target));
m_ui->removePermissionButton->setEnabled(m_permissionsModel->permissions().size()); m_ui->removePermissionButton->setEnabled(m_permissionsModel->permissions().size());
targets = target->availableTargetApplications(); targets = AndroidManager::availableTargetApplications(target);
m_ui->targetComboBox->clear(); m_ui->targetComboBox->clear();
m_ui->targetComboBox->addItems(targets); m_ui->targetComboBox->addItems(targets);
m_ui->targetComboBox->setCurrentIndex(targets.indexOf(target->targetApplication())); m_ui->targetComboBox->setCurrentIndex(targets.indexOf(AndroidManager::targetApplication(target)));
if (m_ui->targetComboBox->currentIndex() == -1 && targets.count()) { if (m_ui->targetComboBox->currentIndex() == -1 && targets.count()) {
m_ui->targetComboBox->setCurrentIndex(0); m_ui->targetComboBox->setCurrentIndex(0);
target->setTargetApplication(m_ui->targetComboBox->currentText()); AndroidManager::setTargetApplication(target, m_ui->targetComboBox->currentText());
} }
m_ui->hIconButton->setIcon(target->highDpiIcon()); m_ui->hIconButton->setIcon(AndroidManager::highDpiIcon(target));
m_ui->mIconButton->setIcon(target->mediumDpiIcon()); m_ui->mIconButton->setIcon(AndroidManager::mediumDpiIcon(target));
m_ui->lIconButton->setIcon(target->lowDpiIcon()); m_ui->lIconButton->setIcon(AndroidManager::lowDpiIcon(target));
} }
void AndroidPackageCreationWidget::setPackageName() void AndroidPackageCreationWidget::setPackageName()
@@ -308,26 +317,27 @@ void AndroidPackageCreationWidget::setPackageName()
m_ui->packageNameLineEdit->setFocus(); m_ui->packageNameLineEdit->setFocus();
return; return;
} }
m_step->androidTarget()->setPackageName(packageName); AndroidManager::setPackageName(m_step->target(), packageName);
} }
void AndroidPackageCreationWidget::setApplicationName() void AndroidPackageCreationWidget::setApplicationName()
{ {
m_step->androidTarget()->setApplicationName(m_ui->appNameLineEdit->text()); AndroidManager::setApplicationName(m_step->target(), m_ui->appNameLineEdit->text());
} }
void AndroidPackageCreationWidget::setTargetSDK(const QString &target) void AndroidPackageCreationWidget::setTargetSDK(const QString &sdk)
{ {
m_step->androidTarget()->setTargetSDK(target); AndroidManager::setTargetSDK(m_step->target(), sdk);
Qt4BuildConfiguration *bc = m_step->androidTarget()->activeQt4BuildConfiguration(); Qt4BuildConfiguration *bc = qobject_cast<Qt4BuildConfiguration *>(m_step->target()->activeBuildConfiguration());
ProjectExplorer::BuildManager *bm = ProjectExplorer::ProjectExplorerPlugin::instance()->buildManager(); if (!bc)
return;
QMakeStep *qs = bc->qmakeStep(); QMakeStep *qs = bc->qmakeStep();
if (!qs) if (!qs)
return; return;
qs->setForced(true); qs->setForced(true);
ProjectExplorer::BuildManager *bm = ProjectExplorer::ProjectExplorerPlugin::instance()->buildManager();
bm->buildList(bc->stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)), bm->buildList(bc->stepList(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)),
ProjectExplorer::ProjectExplorerPlugin::displayNameForStepId(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN))); ProjectExplorer::ProjectExplorerPlugin::displayNameForStepId(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)));
bm->appendStep(qs, ProjectExplorer::ProjectExplorerPlugin::displayNameForStepId(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN))); bm->appendStep(qs, ProjectExplorer::ProjectExplorerPlugin::displayNameForStepId(Core::Id(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)));
@@ -341,27 +351,27 @@ void AndroidPackageCreationWidget::setTargetSDK(const QString &target)
void AndroidPackageCreationWidget::setVersionCode() void AndroidPackageCreationWidget::setVersionCode()
{ {
m_step->androidTarget()->setVersionCode(m_ui->versionCode->value()); AndroidManager::setVersionCode(m_step->target(), m_ui->versionCode->value());
} }
void AndroidPackageCreationWidget::setVersionName() void AndroidPackageCreationWidget::setVersionName()
{ {
m_step->androidTarget()->setVersionName(m_ui->versionNameLinedit->text()); AndroidManager::setVersionName(m_step->target(), m_ui->versionNameLinedit->text());
} }
void AndroidPackageCreationWidget::setTarget(const QString &target) void AndroidPackageCreationWidget::setTarget(const QString &target)
{ {
m_step->androidTarget()->setTargetApplication(target); AndroidManager::setTargetApplication(m_step->target(), target);
} }
void AndroidPackageCreationWidget::setQtLibs(QModelIndex, QModelIndex) void AndroidPackageCreationWidget::setQtLibs(QModelIndex, QModelIndex)
{ {
m_step->androidTarget()->setQtLibs(m_qtLibsModel->checkedItems()); AndroidManager::setQtLibs(m_step->target(), m_qtLibsModel->checkedItems());
} }
void AndroidPackageCreationWidget::setPrebundledLibs(QModelIndex, QModelIndex) void AndroidPackageCreationWidget::setPrebundledLibs(QModelIndex, QModelIndex)
{ {
m_step->androidTarget()->setPrebundledLibs(m_prebundledLibs->checkedItems()); AndroidManager::setPrebundledLibs(m_step->target(), m_prebundledLibs->checkedItems());
} }
void AndroidPackageCreationWidget::prebundledLibSelected(const QModelIndex &index) void AndroidPackageCreationWidget::prebundledLibSelected(const QModelIndex &index)
@@ -395,8 +405,8 @@ void AndroidPackageCreationWidget::setHDPIIcon()
QString file = QFileDialog::getOpenFileName(this, tr("Choose High DPI Icon"), QDir::homePath(), tr("png images (*.png)")); QString file = QFileDialog::getOpenFileName(this, tr("Choose High DPI Icon"), QDir::homePath(), tr("png images (*.png)"));
if (!file.length()) if (!file.length())
return; return;
m_step->androidTarget()->setHighDpiIcon(file); AndroidManager::setHighDpiIcon(m_step->target(), file);
m_ui->hIconButton->setIcon(m_step->androidTarget()->highDpiIcon()); m_ui->hIconButton->setIcon(AndroidManager::highDpiIcon(m_step->target()));
} }
void AndroidPackageCreationWidget::setMDPIIcon() void AndroidPackageCreationWidget::setMDPIIcon()
@@ -404,8 +414,8 @@ void AndroidPackageCreationWidget::setMDPIIcon()
QString file = QFileDialog::getOpenFileName(this, tr("Choose Medium DPI Icon"), QDir::homePath(), tr("png images (*.png)")); QString file = QFileDialog::getOpenFileName(this, tr("Choose Medium DPI Icon"), QDir::homePath(), tr("png images (*.png)"));
if (!file.length()) if (!file.length())
return; return;
m_step->androidTarget()->setMediumDpiIcon(file); AndroidManager::setMediumDpiIcon(m_step->target(), file);
m_ui->mIconButton->setIcon(m_step->androidTarget()->mediumDpiIcon()); m_ui->mIconButton->setIcon(AndroidManager::mediumDpiIcon(m_step->target()));
} }
void AndroidPackageCreationWidget::setLDPIIcon() void AndroidPackageCreationWidget::setLDPIIcon()
@@ -413,8 +423,8 @@ void AndroidPackageCreationWidget::setLDPIIcon()
QString file = QFileDialog::getOpenFileName(this, tr("Choose Low DPI Icon"), QDir::homePath(), tr("png images (*.png)")); QString file = QFileDialog::getOpenFileName(this, tr("Choose Low DPI Icon"), QDir::homePath(), tr("png images (*.png)"));
if (!file.length()) if (!file.length())
return; return;
m_step->androidTarget()->setLowDpiIcon(file); AndroidManager::setLowDpiIcon(m_step->target(), file);
m_ui->lIconButton->setIcon(m_step->androidTarget()->lowDpiIcon()); m_ui->lIconButton->setIcon(AndroidManager::lowDpiIcon(m_step->target()));
} }
void AndroidPackageCreationWidget::permissionActivated(QModelIndex index) void AndroidPackageCreationWidget::permissionActivated(QModelIndex index)
@@ -451,21 +461,21 @@ void AndroidPackageCreationWidget::removePermission()
void AndroidPackageCreationWidget::savePermissionsButton() void AndroidPackageCreationWidget::savePermissionsButton()
{ {
setEnabledSaveDiscardButtons(false); setEnabledSaveDiscardButtons(false);
m_step->androidTarget()->setPermissions(m_permissionsModel->permissions()); AndroidManager::setPermissions(m_step->target(), m_permissionsModel->permissions());
} }
void AndroidPackageCreationWidget::discardPermissionsButton() void AndroidPackageCreationWidget::discardPermissionsButton()
{ {
setEnabledSaveDiscardButtons(false); setEnabledSaveDiscardButtons(false);
m_permissionsModel->setPermissions(m_step->androidTarget()->permissions()); m_permissionsModel->setPermissions(AndroidManager::permissions(m_step->target()));
m_ui->permissionsComboBox->setCurrentIndex(-1); m_ui->permissionsComboBox->setCurrentIndex(-1);
m_ui->removePermissionButton->setEnabled(m_permissionsModel->permissions().size()); m_ui->removePermissionButton->setEnabled(m_permissionsModel->permissions().size());
} }
void AndroidPackageCreationWidget::updateRequiredLibrariesModels() void AndroidPackageCreationWidget::updateRequiredLibrariesModels()
{ {
m_qtLibsModel->setCheckedItems(m_step->androidTarget()->qtLibs()); m_qtLibsModel->setCheckedItems(AndroidManager::qtLibs(m_step->target()));
m_prebundledLibs->setCheckedItems(m_step->androidTarget()->prebundledLibs()); m_prebundledLibs->setCheckedItems(AndroidManager::prebundledLibs(m_step->target()));
} }
void AndroidPackageCreationWidget::readElfInfo() void AndroidPackageCreationWidget::readElfInfo()
@@ -502,7 +512,7 @@ void AndroidPackageCreationWidget::on_signPackageCheckBox_toggled(bool checked)
{ {
if (!checked) if (!checked)
return; return;
if (m_step->keystorePath().length()) if (!m_step->keystorePath().isEmpty())
setCertificates(); setCertificates();
} }
@@ -511,7 +521,7 @@ void AndroidPackageCreationWidget::on_KeystoreCreatePushButton_clicked()
AndroidCreateKeystoreCertificate d; AndroidCreateKeystoreCertificate d;
if (d.exec() != QDialog::Accepted) if (d.exec() != QDialog::Accepted)
return; return;
m_ui->KeystoreLocationLineEdit->setText(d.keystoreFilePath()); m_ui->KeystoreLocationLineEdit->setText(d.keystoreFilePath().toUserOutput());
m_step->setKeystorePath(d.keystoreFilePath()); m_step->setKeystorePath(d.keystoreFilePath());
m_step->setKeystorePassword(d.keystorePassword()); m_step->setKeystorePassword(d.keystorePassword());
m_step->setCertificateAlias(d.certificateAlias()); m_step->setCertificateAlias(d.certificateAlias());
@@ -521,13 +531,13 @@ void AndroidPackageCreationWidget::on_KeystoreCreatePushButton_clicked()
void AndroidPackageCreationWidget::on_KeystoreLocationPushButton_clicked() void AndroidPackageCreationWidget::on_KeystoreLocationPushButton_clicked()
{ {
QString keystorePath = m_step->keystorePath(); Utils::FileName keystorePath = m_step->keystorePath();
if (!keystorePath.length()) if (keystorePath.isEmpty())
keystorePath = QDir::homePath(); keystorePath = Utils::FileName::fromString(QDir::homePath());
QString file = QFileDialog::getOpenFileName(this, tr("Select Keystore File"), keystorePath, tr("Keystore files (*.keystore *.jks)")); Utils::FileName file = Utils::FileName::fromString(QFileDialog::getOpenFileName(this, tr("Select keystore file"), keystorePath.toString(), tr("Keystore files (*.keystore *.jks)")));
if (!file.length()) if (file.isEmpty())
return; return;
m_ui->KeystoreLocationLineEdit->setText(file); m_ui->KeystoreLocationLineEdit->setText(file.toUserOutput());
m_step->setKeystorePath(file); m_step->setKeystorePath(file);
m_ui->signPackageCheckBox->setChecked(false); m_ui->signPackageCheckBox->setChecked(false);
} }
@@ -551,6 +561,3 @@ void AndroidPackageCreationWidget::on_openPackageLocationCheckBox_toggled(bool c
} // namespace Internal } // namespace Internal
} // namespace Android } // namespace Android

View File

@@ -38,6 +38,8 @@
#include <QStringList> #include <QStringList>
QT_BEGIN_NAMESPACE QT_BEGIN_NAMESPACE
class QFileSystemWatcher;
namespace Ui { class AndroidPackageCreationWidget; } namespace Ui { class AndroidPackageCreationWidget; }
QT_END_NAMESPACE QT_END_NAMESPACE
@@ -106,7 +108,7 @@ private slots:
void setPackageName(); void setPackageName();
void setApplicationName(); void setApplicationName();
void setTargetSDK(const QString &target); void setTargetSDK(const QString &sdk);
void setVersionCode(); void setVersionCode();
void setVersionName(); void setVersionName();
void setTarget(const QString &target); void setTarget(const QString &target);
@@ -142,6 +144,7 @@ private:
CheckModel *m_qtLibsModel; CheckModel *m_qtLibsModel;
CheckModel *m_prebundledLibs; CheckModel *m_prebundledLibs;
PermissionsModel *m_permissionsModel; PermissionsModel *m_permissionsModel;
QFileSystemWatcher *m_fileSystemWatcher;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -33,11 +33,13 @@
#include "androidpackageinstallationfactory.h" #include "androidpackageinstallationfactory.h"
#include "androidpackageinstallationstep.h" #include "androidpackageinstallationstep.h"
#include "androidmanager.h"
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/target.h> #include <projectexplorer/target.h>
#include <qt4projectmanager/qt4projectmanagerconstants.h> #include <qtsupport/qtprofileinformation.h>
#include <qtsupport/qtsupportconstants.h>
#include <QCoreApplication> #include <QCoreApplication>
@@ -53,11 +55,13 @@ AndroidPackageInstallationFactory::AndroidPackageInstallationFactory(QObject *pa
QList<Core::Id> AndroidPackageInstallationFactory::availableCreationIds(BuildStepList *parent) const QList<Core::Id> AndroidPackageInstallationFactory::availableCreationIds(BuildStepList *parent) const
{ {
if (parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY) if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY))
&& parent->target()->id() == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID) return QList<Core::Id>();
&& !parent->contains(Core::Id(AndroidPackageInstallationStep::Id))) if (!AndroidManager::supportsAndroid(parent->target()))
return QList<Core::Id>() << Core::Id(AndroidPackageInstallationStep::Id); return QList<Core::Id>();
return QList<Core::Id>(); if (parent->contains(AndroidPackageInstallationStep::Id))
return QList<Core::Id>();
return QList<Core::Id>() << AndroidPackageInstallationStep::Id;
} }
QString AndroidPackageInstallationFactory::displayNameForId(const Core::Id id) const QString AndroidPackageInstallationFactory::displayNameForId(const Core::Id id) const
@@ -70,10 +74,7 @@ QString AndroidPackageInstallationFactory::displayNameForId(const Core::Id id) c
bool AndroidPackageInstallationFactory::canCreate(BuildStepList *parent, const Core::Id id) const bool AndroidPackageInstallationFactory::canCreate(BuildStepList *parent, const Core::Id id) const
{ {
return parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_DEPLOY) return availableCreationIds(parent).contains(id);
&& id == Core::Id(AndroidPackageInstallationStep::Id)
&& parent->target()->id() == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID)
&& !parent->contains(AndroidPackageInstallationStep::Id);
} }
BuildStep *AndroidPackageInstallationFactory::create(BuildStepList *parent, const Core::Id id) BuildStep *AndroidPackageInstallationFactory::create(BuildStepList *parent, const Core::Id id)

View File

@@ -31,7 +31,7 @@
**************************************************************************/ **************************************************************************/
#include "androidpackageinstallationstep.h" #include "androidpackageinstallationstep.h"
#include "androidtarget.h" #include "androidmanager.h"
#include <QFileInfo> #include <QFileInfo>
#include <QDir> #include <QDir>
@@ -54,25 +54,13 @@ AndroidPackageInstallationStep::AndroidPackageInstallationStep(ProjectExplorer::
} }
AndroidPackageInstallationStep::AndroidPackageInstallationStep(ProjectExplorer::BuildStepList *bc, AndroidPackageInstallationStep *other): MakeStep(bc, other) AndroidPackageInstallationStep::AndroidPackageInstallationStep(ProjectExplorer::BuildStepList *bc, AndroidPackageInstallationStep *other): MakeStep(bc, other)
{ { }
const QString name = stepDisplayName();
setDefaultDisplayName(name);
setDisplayName(name);
}
AndroidPackageInstallationStep::~AndroidPackageInstallationStep() AndroidPackageInstallationStep::~AndroidPackageInstallationStep()
{ { }
}
bool AndroidPackageInstallationStep::init() bool AndroidPackageInstallationStep::init()
{ {
AndroidTarget *androidTarget = qobject_cast<AndroidTarget *>(target()); setUserArguments(QString::fromLatin1("INSTALL_ROOT=\"%1\" install").arg(AndroidManager::dirPath(target()).toUserOutput()));
if (!androidTarget) {
emit addOutput(tr("Current target is not an Android target"), BuildStep::MessageOutput);
return false;
}
setUserArguments(QString::fromLatin1("INSTALL_ROOT=\"%1\" install").arg(QDir::toNativeSeparators(androidTarget->androidDirPath())));
return MakeStep::init(); return MakeStep::init();
} }

View File

@@ -36,51 +36,50 @@
#include "androidconfigurations.h" #include "androidconfigurations.h"
#include "androiddeploystepfactory.h" #include "androiddeploystepfactory.h"
#include "androidconfigurations.h" #include "androidconfigurations.h"
#include "androidmanager.h"
#include "androidpackagecreationfactory.h" #include "androidpackagecreationfactory.h"
#include "androidpackageinstallationfactory.h" #include "androidpackageinstallationfactory.h"
#include "androidrunfactories.h" #include "androidrunfactories.h"
#include "androidsettingspage.h" #include "androidsettingspage.h"
#include "androidtoolchain.h" #include "androidtoolchain.h"
#include "androidqtversionfactory.h" #include "androidqtversionfactory.h"
#include "androidtargetfactory.h"
#include "androiddeployconfiguration.h" #include "androiddeployconfiguration.h"
#include <QtPlugin> #include <QtPlugin>
using namespace Android; namespace Android {
using namespace Android::Internal;
AndroidPlugin::AndroidPlugin() AndroidPlugin::AndroidPlugin()
{ { }
}
AndroidPlugin::~AndroidPlugin() AndroidPlugin::~AndroidPlugin()
{ { }
}
bool AndroidPlugin::initialize(const QStringList &arguments, bool AndroidPlugin::initialize(const QStringList &arguments,
QString *error_message) QString *error_message)
{ {
Q_UNUSED(arguments) Q_UNUSED(arguments);
Q_UNUSED(error_message) Q_UNUSED(error_message);
AndroidConfigurations::instance(this); Internal::AndroidConfigurations::instance(this);
addAutoReleasedObject(new AndroidRunControlFactory); new Internal::AndroidManager(this);
addAutoReleasedObject(new AndroidRunConfigurationFactory);
addAutoReleasedObject(new AndroidPackageInstallationFactory); addAutoReleasedObject(new Internal::AndroidRunControlFactory);
addAutoReleasedObject(new AndroidPackageCreationFactory); addAutoReleasedObject(new Internal::AndroidRunConfigurationFactory);
addAutoReleasedObject(new AndroidDeployStepFactory); addAutoReleasedObject(new Internal::AndroidPackageInstallationFactory);
addAutoReleasedObject(new AndroidSettingsPage); addAutoReleasedObject(new Internal::AndroidPackageCreationFactory);
addAutoReleasedObject(new AndroidTargetFactory); addAutoReleasedObject(new Internal::AndroidDeployStepFactory);
addAutoReleasedObject(new AndroidQtVersionFactory); addAutoReleasedObject(new Internal::AndroidSettingsPage);
addAutoReleasedObject(new AndroidToolChainFactory); addAutoReleasedObject(new Internal::AndroidQtVersionFactory);
addAutoReleasedObject(new AndroidDeployConfigurationFactory); addAutoReleasedObject(new Internal::AndroidToolChainFactory);
addAutoReleasedObject(new Internal::AndroidDeployConfigurationFactory);
return true; return true;
} }
void AndroidPlugin::extensionsInitialized() void AndroidPlugin::extensionsInitialized()
{ { }
}
} // namespace Android
Q_EXPORT_PLUGIN(Android::AndroidPlugin) Q_EXPORT_PLUGIN(Android::AndroidPlugin)

View File

@@ -30,8 +30,8 @@
** **
**************************************************************************/ **************************************************************************/
#ifndef ANDROIDMANAGER_H #ifndef ANDROIDPLUGIN_H
#define ANDROIDMANAGER_H #define ANDROIDPLUGIN_H
#include <extensionsystem/iplugin.h> #include <extensionsystem/iplugin.h>
@@ -47,8 +47,8 @@ public:
bool initialize(const QStringList &arguments, QString *error_message); bool initialize(const QStringList &arguments, QString *error_message);
void extensionsInitialized(); void extensionsInitialized();
}; };
} // namespace Qt4ProjectManager
#endif // ANDROIDMANAGER_H } // namespace Android
#endif // ANDROIDPLUGIN_H

View File

@@ -90,16 +90,6 @@ QList<ProjectExplorer::Abi> AndroidQtVersion::detectQtAbis() const
32); 32);
} }
bool AndroidQtVersion::supportsTargetId(const Core::Id id) const
{
return id == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID);
}
QSet<Core::Id> AndroidQtVersion::supportedTargetIds() const
{
return QSet<Core::Id>() << Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID);
}
QString AndroidQtVersion::description() const QString AndroidQtVersion::description() const
{ {
return QCoreApplication::translate("QtVersion", "Android", "Qt Version is meant for Android"); return QCoreApplication::translate("QtVersion", "Android", "Qt Version is meant for Android");
@@ -114,10 +104,10 @@ Core::FeatureSet AndroidQtVersion::availableFeatures() const
QString AndroidQtVersion::platformName() const QString AndroidQtVersion::platformName() const
{ {
return QLatin1String(Constants::ANDROID_PLATFORM); return QLatin1String(QtSupport::Constants::ANDROID_PLATFORM);
} }
QString AndroidQtVersion::platformDisplayName() const QString AndroidQtVersion::platformDisplayName() const
{ {
return QLatin1String(Constants::ANDROID_PLATFORM_TR); return QLatin1String(QtSupport::Constants::ANDROID_PLATFORM_TR);
} }

View File

@@ -52,9 +52,6 @@ public:
QList<ProjectExplorer::Abi> detectQtAbis() const; QList<ProjectExplorer::Abi> detectQtAbis() const;
bool supportsTargetId(const Core::Id id) const;
QSet<Core::Id> supportedTargetIds() const;
Core::FeatureSet availableFeatures() const; Core::FeatureSet availableFeatures() const;
QString platformName() const; QString platformName() const;
QString platformDisplayName() const; QString platformDisplayName() const;

View File

@@ -34,14 +34,19 @@
#include "androiddeploystep.h" #include "androiddeploystep.h"
#include "androidglobal.h" #include "androidglobal.h"
#include "androidtoolchain.h" #include "androidtoolchain.h"
#include "androidtarget.h" #include "androidmanager.h"
#include <projectexplorer/profileinformation.h>
#include <projectexplorer/target.h>
#include <qt4projectmanager/qt4buildconfiguration.h> #include <qt4projectmanager/qt4buildconfiguration.h>
#include <qt4projectmanager/qt4project.h> #include <qt4projectmanager/qt4project.h>
#include <qtsupport/qtprofileinformation.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <qtsupport/qtoutputformatter.h> #include <qtsupport/qtoutputformatter.h>
#include <qtsupport/qtprofileinformation.h>
using namespace Qt4ProjectManager; using namespace Qt4ProjectManager;
@@ -50,15 +55,14 @@ namespace Internal {
using namespace ProjectExplorer; using namespace ProjectExplorer;
AndroidRunConfiguration::AndroidRunConfiguration(AndroidTarget *parent, AndroidRunConfiguration::AndroidRunConfiguration(Target *parent, Core::Id id, const QString &path)
const QString &proFilePath) : RunConfiguration(parent, id)
: RunConfiguration(parent, Core::Id(ANDROID_RC_ID)) , m_proFilePath(path)
, m_proFilePath(proFilePath)
{ {
init(); init();
} }
AndroidRunConfiguration::AndroidRunConfiguration(AndroidTarget *parent, AndroidRunConfiguration::AndroidRunConfiguration(ProjectExplorer::Target *parent,
AndroidRunConfiguration *source) AndroidRunConfiguration *source)
: RunConfiguration(parent, source) : RunConfiguration(parent, source)
, m_proFilePath(source->m_proFilePath) , m_proFilePath(source->m_proFilePath)
@@ -75,11 +79,6 @@ AndroidRunConfiguration::~AndroidRunConfiguration()
{ {
} }
AndroidTarget *AndroidRunConfiguration::androidTarget() const
{
return static_cast<AndroidTarget *>(target());
}
Qt4BuildConfiguration *AndroidRunConfiguration::activeQt4BuildConfiguration() const Qt4BuildConfiguration *AndroidRunConfiguration::activeQt4BuildConfiguration() const
{ {
return static_cast<Qt4BuildConfiguration *>(activeBuildConfiguration()); return static_cast<Qt4BuildConfiguration *>(activeBuildConfiguration());
@@ -92,7 +91,7 @@ QWidget *AndroidRunConfiguration::createConfigurationWidget()
Utils::OutputFormatter *AndroidRunConfiguration::createOutputFormatter() const Utils::OutputFormatter *AndroidRunConfiguration::createOutputFormatter() const
{ {
return new QtSupport::QtOutputFormatter(androidTarget()->qt4Project()); return new QtSupport::QtOutputFormatter(target()->project());
} }
QString AndroidRunConfiguration::defaultDisplayName() QString AndroidRunConfiguration::defaultDisplayName()
@@ -105,9 +104,12 @@ AndroidConfig AndroidRunConfiguration::config() const
return AndroidConfigurations::instance().config(); return AndroidConfigurations::instance().config();
} }
const QString AndroidRunConfiguration::gdbCmd() const const Utils::FileName AndroidRunConfiguration::gdbCmd() const
{ {
return AndroidConfigurations::instance().gdbPath(activeQt4BuildConfiguration()->toolChain()->targetAbi().architecture()); ToolChain *tc = ToolChainProfileInformation::toolChain(target()->profile());
if (!tc)
return Utils::FileName();
return AndroidConfigurations::instance().gdbPath(tc->targetAbi().architecture());
} }
AndroidDeployStep *AndroidRunConfiguration::deployStep() const AndroidDeployStep *AndroidRunConfiguration::deployStep() const
@@ -127,8 +129,10 @@ const QString AndroidRunConfiguration::remoteChannel() const
const QString AndroidRunConfiguration::dumperLib() const const QString AndroidRunConfiguration::dumperLib() const
{ {
Qt4BuildConfiguration *qt4bc(activeQt4BuildConfiguration()); QtSupport::BaseQtVersion *version = QtSupport::QtProfileInformation::qtVersion(target()->profile());
return qt4bc->qtVersion()->gdbDebuggingHelperLibrary(); if (!version)
return QString();
return version->gdbDebuggingHelperLibrary();
} }
QString AndroidRunConfiguration::proFilePath() const QString AndroidRunConfiguration::proFilePath() const

View File

@@ -56,7 +56,6 @@ class AndroidDeviceConfigListModel;
class AndroidDeployStep; class AndroidDeployStep;
class AndroidRunConfigurationFactory; class AndroidRunConfigurationFactory;
class AndroidToolChain; class AndroidToolChain;
class AndroidTarget;
class AndroidRunConfiguration : public ProjectExplorer::RunConfiguration class AndroidRunConfiguration : public ProjectExplorer::RunConfiguration
{ {
@@ -71,12 +70,11 @@ public:
enum DebuggingType { DebugCppOnly, DebugQmlOnly, DebugCppAndQml }; enum DebuggingType { DebugCppOnly, DebugQmlOnly, DebugCppAndQml };
AndroidRunConfiguration(AndroidTarget *parent, const QString &proFilePath); AndroidRunConfiguration(ProjectExplorer::Target *parent, Core::Id id, const QString &path);
virtual ~AndroidRunConfiguration(); virtual ~AndroidRunConfiguration();
QWidget *createConfigurationWidget(); QWidget *createConfigurationWidget();
Utils::OutputFormatter *createOutputFormatter() const; Utils::OutputFormatter *createOutputFormatter() const;
AndroidTarget *androidTarget() const;
Qt4ProjectManager::Qt4BuildConfiguration *activeQt4BuildConfiguration() const; Qt4ProjectManager::Qt4BuildConfiguration *activeQt4BuildConfiguration() const;
AndroidDeployStep *deployStep() const; AndroidDeployStep *deployStep() const;
@@ -87,12 +85,12 @@ public:
DebuggingType debuggingType() const; DebuggingType debuggingType() const;
const QString gdbCmd() const; const Utils::FileName gdbCmd() const;
const QString remoteChannel() const; const QString remoteChannel() const;
const QString dumperLib() const; const QString dumperLib() const;
protected: protected:
AndroidRunConfiguration(AndroidTarget *parent, AndroidRunConfiguration *source); AndroidRunConfiguration(ProjectExplorer::Target *parent, AndroidRunConfiguration *source);
QString defaultDisplayName(); QString defaultDisplayName();
private: private:

View File

@@ -36,13 +36,17 @@
#include "androiddebugsupport.h" #include "androiddebugsupport.h"
#include "androidrunconfiguration.h" #include "androidrunconfiguration.h"
#include "androidruncontrol.h" #include "androidruncontrol.h"
#include "androidtarget.h" #include "androidmanager.h"
#include <projectexplorer/project.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/target.h>
#include <debugger/debuggerconstants.h> #include <debugger/debuggerconstants.h>
#include <qt4projectmanager/qt4project.h> #include <qt4projectmanager/qt4project.h>
#include <qt4projectmanager/qt4nodes.h> #include <qt4projectmanager/qt4nodes.h>
#include <qt4projectmanager/qt4projectmanagerconstants.h> #include <qtsupport/customexecutablerunconfiguration.h>
#include <qtsupport/qtprofileinformation.h>
#include <qtsupport/qtsupportconstants.h>
namespace Android { namespace Android {
@@ -55,7 +59,7 @@ namespace {
QString pathFromId(const Core::Id id) QString pathFromId(const Core::Id id)
{ {
QString pathStr = QString::fromUtf8(id.name()); QString pathStr = id.toString();
const QString prefix = QLatin1String(ANDROID_RC_ID_PREFIX); const QString prefix = QLatin1String(ANDROID_RC_ID_PREFIX);
if (!pathStr.startsWith(prefix)) if (!pathStr.startsWith(prefix))
return QString(); return QString();
@@ -65,34 +69,25 @@ QString pathFromId(const Core::Id id)
} // namespace } // namespace
AndroidRunConfigurationFactory::AndroidRunConfigurationFactory(QObject *parent) AndroidRunConfigurationFactory::AndroidRunConfigurationFactory(QObject *parent)
: IRunConfigurationFactory(parent) : QmakeRunConfigurationFactory(parent)
{ { setObjectName(QLatin1String("AndroidRunConfigurationFactory")); }
}
AndroidRunConfigurationFactory::~AndroidRunConfigurationFactory() AndroidRunConfigurationFactory::~AndroidRunConfigurationFactory()
{ }
bool AndroidRunConfigurationFactory::canCreate(Target *parent, const Core::Id id) const
{ {
if (!canHandle(parent))
return false;
return availableCreationIds(parent).contains(id);
} }
bool AndroidRunConfigurationFactory::canCreate(Target *parent, bool AndroidRunConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const
const Core::Id/*id*/) const
{ {
AndroidTarget *target = qobject_cast<AndroidTarget *>(parent); if (!canHandle(parent))
if (!target
|| target->id() != Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID)) {
return false; return false;
} QString id = ProjectExplorer::idFromMap(map).toString();
return true; return id.startsWith(QLatin1String(ANDROID_RC_ID_PREFIX));
}
bool AndroidRunConfigurationFactory::canRestore(Target *parent,
const QVariantMap &map) const
{
Q_UNUSED(parent)
Q_UNUSED(map)
if (!qobject_cast<AndroidTarget *>(parent))
return false;
QString id = QString::fromUtf8(ProjectExplorer::idFromMap(map).name());
return id.startsWith(QLatin1String(ANDROID_RC_ID));
} }
bool AndroidRunConfigurationFactory::canClone(Target *parent, bool AndroidRunConfigurationFactory::canClone(Target *parent,
@@ -104,14 +99,12 @@ bool AndroidRunConfigurationFactory::canClone(Target *parent,
QList<Core::Id> AndroidRunConfigurationFactory::availableCreationIds(Target *parent) const QList<Core::Id> AndroidRunConfigurationFactory::availableCreationIds(Target *parent) const
{ {
QList<Core::Id> ids; QList<Core::Id> ids;
if (AndroidTarget *t = qobject_cast<AndroidTarget *>(parent)) { if (!AndroidManager::supportsAndroid(parent))
if (t->id() == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID)) { return ids;
QList<Qt4ProFileNode *> nodes = t->qt4Project()->allProFiles(); QList<Qt4ProFileNode *> nodes = static_cast<Qt4Project *>(parent->project())->allProFiles();
foreach (Qt4ProFileNode *node, nodes) foreach (Qt4ProFileNode *node, nodes)
if (node->projectType() == ApplicationTemplate || node->projectType() == LibraryTemplate) if (node->projectType() == ApplicationTemplate || node->projectType() == LibraryTemplate)
ids << Core::Id(node->targetInformation().target); ids << Core::Id(node->targetInformation().target);
}
}
return ids; return ids;
} }
@@ -120,14 +113,11 @@ QString AndroidRunConfigurationFactory::displayNameForId(const Core::Id id) cons
return QFileInfo(pathFromId(id)).completeBaseName(); return QFileInfo(pathFromId(id)).completeBaseName();
} }
RunConfiguration *AndroidRunConfigurationFactory::create(Target *parent, RunConfiguration *AndroidRunConfigurationFactory::create(Target *parent, const Core::Id id)
const Core::Id id)
{ {
if (!canCreate(parent, id)) if (!canCreate(parent, id))
return 0; return 0;
AndroidTarget *pqt4parent = static_cast<AndroidTarget *>(parent); return new AndroidRunConfiguration(parent, id, pathFromId(id));
return new AndroidRunConfiguration(pqt4parent, pathFromId(id));
} }
RunConfiguration *AndroidRunConfigurationFactory::restore(Target *parent, RunConfiguration *AndroidRunConfigurationFactory::restore(Target *parent,
@@ -135,8 +125,8 @@ RunConfiguration *AndroidRunConfigurationFactory::restore(Target *parent,
{ {
if (!canRestore(parent, map)) if (!canRestore(parent, map))
return 0; return 0;
AndroidTarget *target = static_cast<AndroidTarget *>(parent); Core::Id id = ProjectExplorer::idFromMap(map);
AndroidRunConfiguration *rc = new AndroidRunConfiguration(target, QString()); AndroidRunConfiguration *rc = new AndroidRunConfiguration(parent, id, pathFromId(id));
if (rc->fromMap(map)) if (rc->fromMap(map))
return rc; return rc;
@@ -144,14 +134,30 @@ RunConfiguration *AndroidRunConfigurationFactory::restore(Target *parent,
return 0; return 0;
} }
RunConfiguration *AndroidRunConfigurationFactory::clone(Target *parent, RunConfiguration *AndroidRunConfigurationFactory::clone(Target *parent, RunConfiguration *source)
RunConfiguration *source)
{ {
if (!canClone(parent, source)) if (!canClone(parent, source))
return 0; return 0;
AndroidRunConfiguration *old = static_cast<AndroidRunConfiguration *>(source); AndroidRunConfiguration *old = static_cast<AndroidRunConfiguration *>(source);
return new AndroidRunConfiguration(static_cast<AndroidTarget *>(parent), old); return new AndroidRunConfiguration(parent, old);
}
bool AndroidRunConfigurationFactory::canHandle(Target *t) const
{
if (!t->project()->supportsProfile(t->profile()))
return false;
return AndroidManager::supportsAndroid(t);
}
QList<RunConfiguration *> AndroidRunConfigurationFactory::runConfigurationsForNode(Target *t, ProjectExplorer::Node *n)
{
QList<ProjectExplorer::RunConfiguration *> result;
foreach (ProjectExplorer::RunConfiguration *rc, t->runConfigurations())
if (AndroidRunConfiguration *qt4c = qobject_cast<AndroidRunConfiguration *>(rc))
if (qt4c->proFilePath() == n->path())
result << rc;
return result;
} }
// #pragma mark -- AndroidRunControlFactory // #pragma mark -- AndroidRunControlFactory

View File

@@ -34,24 +34,26 @@
#define ANDROIDRUNFACTORIES_H #define ANDROIDRUNFACTORIES_H
#include <projectexplorer/runconfiguration.h> #include <projectexplorer/runconfiguration.h>
#include <qt4projectmanager/qmakerunconfigurationfactory.h>
namespace ProjectExplorer { namespace ProjectExplorer {
class RunConfiguration;
class RunControl; class RunControl;
class RunConfigWidget; class RunConfigWidget;
class Target; class Target;
} }
using ProjectExplorer::IRunConfigurationFactory;
using ProjectExplorer::IRunControlFactory; using ProjectExplorer::IRunControlFactory;
using ProjectExplorer::RunConfiguration; using ProjectExplorer::RunConfiguration;
using ProjectExplorer::RunControl; using ProjectExplorer::RunControl;
using ProjectExplorer::RunConfigWidget; using ProjectExplorer::RunConfigWidget;
using ProjectExplorer::Target; using ProjectExplorer::Target;
namespace ProjectExplorer { class Node; }
namespace Android { namespace Android {
namespace Internal { namespace Internal {
class AndroidRunConfigurationFactory : public IRunConfigurationFactory class AndroidRunConfigurationFactory : public Qt4ProjectManager::QmakeRunConfigurationFactory
{ {
Q_OBJECT Q_OBJECT
@@ -70,6 +72,10 @@ public:
bool canClone(Target *parent, RunConfiguration *source) const; bool canClone(Target *parent, RunConfiguration *source) const;
RunConfiguration *clone(Target *parent, RunConfiguration *source); RunConfiguration *clone(Target *parent, RunConfiguration *source);
bool canHandle(ProjectExplorer::Target *t) const;
QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Target *t,
ProjectExplorer::Node *n);
}; };
class AndroidRunControlFactory : public IRunControlFactory class AndroidRunControlFactory : public IRunControlFactory

View File

@@ -36,7 +36,9 @@
#include "androidconfigurations.h" #include "androidconfigurations.h"
#include "androidglobal.h" #include "androidglobal.h"
#include "androidrunconfiguration.h" #include "androidrunconfiguration.h"
#include "androidtarget.h" #include "androidmanager.h"
#include <projectexplorer/target.h>
#include <QTime> #include <QTime>
#include <QtConcurrentRun> #include <QtConcurrentRun>
@@ -49,13 +51,13 @@ AndroidRunner::AndroidRunner(QObject *parent,
: QThread(parent) : QThread(parent)
{ {
m_remoteChannel = runConfig->remoteChannel(); m_remoteChannel = runConfig->remoteChannel();
AndroidTarget * at = runConfig->androidTarget(); ProjectExplorer::Target *target = runConfig->target();
AndroidDeployStep * ds = runConfig->deployStep(); AndroidDeployStep *ds = runConfig->deployStep();
if ((m_useLocalQtLibs = ds->useLocalQtLibs())) { if ((m_useLocalQtLibs = ds->useLocalQtLibs())) {
m_localLibs = at->loadLocalLibs(ds->deviceAPILevel()); m_localLibs = AndroidManager::loadLocalLibs(target, ds->deviceAPILevel());
m_localJars = at->loadLocalJars(ds->deviceAPILevel()); m_localJars = AndroidManager::loadLocalJars(target, ds->deviceAPILevel());
} }
m_intentName = at->intentName(); m_intentName = AndroidManager::intentName(target);
m_debugingMode = debugging; m_debugingMode = debugging;
m_packageName = m_intentName.left(m_intentName.indexOf(QLatin1Char('/'))); m_packageName = m_intentName.left(m_intentName.indexOf(QLatin1Char('/')));
m_deviceSerialNumber = ds->deviceSerialNumber(); m_deviceSerialNumber = ds->deviceSerialNumber();
@@ -74,7 +76,7 @@ AndroidRunner::~AndroidRunner()
void AndroidRunner::checkPID() void AndroidRunner::checkPID()
{ {
QProcess psProc; QProcess psProc;
psProc.start(AndroidConfigurations::instance().adbToolPath(), psProc.start(AndroidConfigurations::instance().adbToolPath().toString(),
QStringList() << QLatin1String("-s") << m_deviceSerialNumber QStringList() << QLatin1String("-s") << m_deviceSerialNumber
<< QLatin1String("shell") << QLatin1String("ps")); << QLatin1String("shell") << QLatin1String("ps"));
if (!psProc.waitForFinished(-1)) { if (!psProc.waitForFinished(-1)) {
@@ -148,7 +150,7 @@ void AndroidRunner::asyncStart()
arguments << QLatin1String("-s") << m_deviceSerialNumber arguments << QLatin1String("-s") << m_deviceSerialNumber
<< QLatin1String("forward") << QString::fromLatin1("tcp%1").arg(m_remoteChannel) << QLatin1String("forward") << QString::fromLatin1("tcp%1").arg(m_remoteChannel)
<< QString::fromLatin1("localfilesystem:/data/data/%1/debug-socket").arg(m_packageName); << QString::fromLatin1("localfilesystem:/data/data/%1/debug-socket").arg(m_packageName);
adbStarProc.start(AndroidConfigurations::instance().adbToolPath(), arguments); adbStarProc.start(AndroidConfigurations::instance().adbToolPath().toString(), arguments);
if (!adbStarProc.waitForStarted()) { if (!adbStarProc.waitForStarted()) {
emit remoteProcessFinished(tr("Failed to forward debugging ports. Reason: $1").arg(adbStarProc.errorString())); emit remoteProcessFinished(tr("Failed to forward debugging ports. Reason: $1").arg(adbStarProc.errorString()));
return; return;
@@ -176,7 +178,7 @@ void AndroidRunner::asyncStart()
if (extraParams.length()) if (extraParams.length())
arguments << extraParams.split(QLatin1Char(' ')); arguments << extraParams.split(QLatin1Char(' '));
adbStarProc.start(AndroidConfigurations::instance().adbToolPath(), arguments); adbStarProc.start(AndroidConfigurations::instance().adbToolPath().toString(), arguments);
if (!adbStarProc.waitForStarted()) { if (!adbStarProc.waitForStarted()) {
emit remoteProcessFinished(tr("Failed to start the activity. Reason: $1").arg(adbStarProc.errorString())); emit remoteProcessFinished(tr("Failed to start the activity. Reason: $1").arg(adbStarProc.errorString()));
return; return;
@@ -209,7 +211,7 @@ void AndroidRunner::asyncStart()
void AndroidRunner::startLogcat() void AndroidRunner::startLogcat()
{ {
m_checkPIDTimer.start(1000); // check if the application is alive every 1 seconds m_checkPIDTimer.start(1000); // check if the application is alive every 1 seconds
m_adbLogcatProcess.start(AndroidConfigurations::instance().adbToolPath(), m_adbLogcatProcess.start(AndroidConfigurations::instance().adbToolPath().toString(),
QStringList() << QLatin1String("-s") << m_deviceSerialNumber QStringList() << QLatin1String("-s") << m_deviceSerialNumber
<< QLatin1String("logcat")); << QLatin1String("logcat"));
emit remoteProcessStarted(5039); emit remoteProcessStarted(5039);
@@ -267,7 +269,7 @@ void AndroidRunner::adbKill(qint64 pid, const QString &device, int timeout, cons
arguments << QLatin1String("kill") << QLatin1String("-9"); arguments << QLatin1String("kill") << QLatin1String("-9");
arguments << QString::number(pid); arguments << QString::number(pid);
process.start(AndroidConfigurations::instance().adbToolPath(), arguments); process.start(AndroidConfigurations::instance().adbToolPath().toString(), arguments);
if (!process.waitForFinished(timeout)) if (!process.waitForFinished(timeout))
process.terminate(); process.terminate();
} }

View File

@@ -149,19 +149,19 @@ void AndroidSettingsWidget::initGui()
m_ui->setupUi(this); m_ui->setupUi(this);
m_ui->toolchainVersionComboBox->clear(); m_ui->toolchainVersionComboBox->clear();
if (checkSDK(m_androidConfig.sdkLocation)) if (checkSDK(m_androidConfig.sdkLocation))
m_ui->SDKLocationLineEdit->setText(m_androidConfig.sdkLocation); m_ui->SDKLocationLineEdit->setText(m_androidConfig.sdkLocation.toUserOutput());
else else
m_androidConfig.sdkLocation.clear(); m_androidConfig.sdkLocation.clear();
if (checkNDK(m_androidConfig.ndkLocation)) if (checkNDK(m_androidConfig.ndkLocation))
m_ui->NDKLocationLineEdit->setText(m_androidConfig.ndkLocation); m_ui->NDKLocationLineEdit->setText(m_androidConfig.ndkLocation.toUserOutput());
else else
m_androidConfig.ndkLocation.clear(); m_androidConfig.ndkLocation.clear();
m_ui->AntLocationLineEdit->setText(m_androidConfig.antLocation); m_ui->AntLocationLineEdit->setText(m_androidConfig.antLocation.toUserOutput());
m_ui->GdbLocationLineEdit->setText(m_androidConfig.armGdbLocation); m_ui->GdbLocationLineEdit->setText(m_androidConfig.armGdbLocation.toUserOutput());
m_ui->GdbserverLocationLineEdit->setText(m_androidConfig.armGdbserverLocation); m_ui->GdbserverLocationLineEdit->setText(m_androidConfig.armGdbserverLocation.toUserOutput());
m_ui->GdbLocationLineEditx86->setText(m_androidConfig.x86GdbLocation); m_ui->GdbLocationLineEditx86->setText(m_androidConfig.x86GdbLocation.toUserOutput());
m_ui->GdbserverLocationLineEditx86->setText(m_androidConfig.x86GdbserverLocation); m_ui->GdbserverLocationLineEditx86->setText(m_androidConfig.x86GdbserverLocation.toUserOutput());
m_ui->OpenJDKLocationLineEdit->setText(m_androidConfig.openJDKLocation); m_ui->OpenJDKLocationLineEdit->setText(m_androidConfig.openJDKLocation.toUserOutput());
m_ui->DataPartitionSizeSpinBox->setValue(m_androidConfig.partitionSize); m_ui->DataPartitionSizeSpinBox->setValue(m_androidConfig.partitionSize);
m_ui->AVDTableView->setModel(&m_AVDModel); m_ui->AVDTableView->setModel(&m_AVDModel);
m_AVDModel.setAvdList(AndroidConfigurations::instance().androidVirtualDevices()); m_AVDModel.setAvdList(AndroidConfigurations::instance().androidVirtualDevices());
@@ -181,33 +181,40 @@ void AndroidSettingsWidget::saveSettings(bool saveNow)
} }
bool AndroidSettingsWidget::checkSDK(const QString &location) bool AndroidSettingsWidget::checkSDK(const Utils::FileName &location)
{ {
if (!location.length()) if (location.isEmpty())
return false; return false;
if (!QFile::exists(location + QLatin1String("/platform-tools/adb" ANDROID_EXE_SUFFIX)) Utils::FileName adb = location;
|| (!QFile::exists(location + QLatin1String("/tools/android" ANDROID_EXE_SUFFIX)) Utils::FileName androidExe = location;
&& !QFile::exists(location + QLatin1String("/tools/android" ANDROID_BAT_SUFFIX))) Utils::FileName androidBat = location;
|| !QFile::exists(location + QLatin1String("/tools/emulator" ANDROID_EXE_SUFFIX))) { Utils::FileName emulator = location;
QMessageBox::critical(this, tr("Android SDK Folder"), tr("\"%1\" doesn't seem to be an Android SDK top folder").arg(location)); if (!adb.appendPath(QLatin1String("platform-tools/adb" ANDROID_EXE_SUFFIX)).toFileInfo().exists()
|| (!androidExe.appendPath(QLatin1String("/tools/android" ANDROID_EXE_SUFFIX)).toFileInfo().exists()
&& !androidBat.appendPath(QLatin1String("/tools/android" ANDROID_BAT_SUFFIX)).toFileInfo().exists())
|| !emulator.appendPath(QLatin1String("/tools/emulator" ANDROID_EXE_SUFFIX)).toFileInfo().exists()) {
QMessageBox::critical(this, tr("Android SDK Folder"), tr("\"%1\" doesn't seem to be an Android SDK top folder").arg(location.toUserOutput()));
return false; return false;
} }
return true; return true;
} }
bool AndroidSettingsWidget::checkNDK(const QString &location) bool AndroidSettingsWidget::checkNDK(const Utils::FileName &location)
{ {
m_ui->toolchainVersionComboBox->setEnabled(false); m_ui->toolchainVersionComboBox->setEnabled(false);
m_ui->GdbLocationLineEdit->setEnabled(false); m_ui->GdbLocationLineEdit->setEnabled(false);
m_ui->GdbLocationPushButton->setEnabled(false); m_ui->GdbLocationPushButton->setEnabled(false);
m_ui->GdbserverLocationLineEdit->setEnabled(false); m_ui->GdbserverLocationLineEdit->setEnabled(false);
m_ui->GdbserverLocationPushButton->setEnabled(false); m_ui->GdbserverLocationPushButton->setEnabled(false);
if (!location.length()) if (location.isEmpty())
return false; return false;
if (!QFile::exists(location + QLatin1String("/platforms")) Utils::FileName platformPath = location;
|| !QFile::exists(location + QLatin1String("/toolchains")) Utils::FileName toolChainPath = location;
|| !QFile::exists(location + QLatin1String("/sources/cxx-stl"))) { Utils::FileName sourcesPath = location;
QMessageBox::critical(this, tr("Android SDK Folder"), tr("\"%1\" doesn't seem to be an Android NDK top folder").arg(location)); if (!platformPath.appendPath(QLatin1String("platforms")).toFileInfo().exists()
|| !toolChainPath.appendPath(QLatin1String("toolchains")).toFileInfo().exists()
|| !sourcesPath.appendPath(QLatin1String("sources/cxx-stl")).toFileInfo().exists()) {
QMessageBox::critical(this, tr("Android SDK Folder"), tr("\"%1\" doesn't seem to be an Android NDK top folder").arg(location.toUserOutput()));
return false; return false;
} }
m_ui->toolchainVersionComboBox->setEnabled(true); m_ui->toolchainVersionComboBox->setEnabled(true);
@@ -222,7 +229,7 @@ bool AndroidSettingsWidget::checkNDK(const QString &location)
void AndroidSettingsWidget::sdkLocationEditingFinished() void AndroidSettingsWidget::sdkLocationEditingFinished()
{ {
QString location = m_ui->SDKLocationLineEdit->text(); Utils::FileName location = Utils::FileName::fromUserInput(m_ui->SDKLocationLineEdit->text());
if (!checkSDK(location)) { if (!checkSDK(location)) {
m_ui->AVDManagerFrame->setEnabled(false); m_ui->AVDManagerFrame->setEnabled(false);
return; return;
@@ -235,8 +242,8 @@ void AndroidSettingsWidget::sdkLocationEditingFinished()
void AndroidSettingsWidget::ndkLocationEditingFinished() void AndroidSettingsWidget::ndkLocationEditingFinished()
{ {
QString location = m_ui->NDKLocationLineEdit->text(); Utils::FileName location = Utils::FileName::fromUserInput(m_ui->NDKLocationLineEdit->text());
if (!checkNDK(location)) if (checkNDK(location))
return; return;
m_androidConfig.ndkLocation = location; m_androidConfig.ndkLocation = location;
saveSettings(true); saveSettings(true);
@@ -264,67 +271,67 @@ void AndroidSettingsWidget::toolchainVersionIndexChanged(QString version)
void AndroidSettingsWidget::antLocationEditingFinished() void AndroidSettingsWidget::antLocationEditingFinished()
{ {
QString location = m_ui->AntLocationLineEdit->text(); Utils::FileName location = Utils::FileName::fromUserInput(m_ui->AntLocationLineEdit->text());
if (!location.length() || !QFile::exists(location)) if (location.isEmpty() || !location.toFileInfo().exists())
return; return;
m_androidConfig.antLocation = location; m_androidConfig.antLocation = location;
} }
void AndroidSettingsWidget::gdbLocationEditingFinished() void AndroidSettingsWidget::gdbLocationEditingFinished()
{ {
QString location = m_ui->GdbLocationLineEdit->text(); Utils::FileName location = Utils::FileName::fromUserInput(m_ui->GdbLocationLineEdit->text());
if (!location.length() || !QFile::exists(location)) if (location.isEmpty() || !location.toFileInfo().exists())
return; return;
m_androidConfig.armGdbLocation = location; m_androidConfig.armGdbLocation = location;
} }
void AndroidSettingsWidget::gdbserverLocationEditingFinished() void AndroidSettingsWidget::gdbserverLocationEditingFinished()
{ {
QString location = m_ui->GdbserverLocationLineEdit->text(); Utils::FileName location = Utils::FileName::fromUserInput(m_ui->GdbserverLocationLineEdit->text());
if (!location.length() || !QFile::exists(location)) if (location.isEmpty() || !location.toFileInfo().exists())
return; return;
m_androidConfig.armGdbserverLocation = location; m_androidConfig.armGdbserverLocation = location;
} }
void AndroidSettingsWidget::gdbLocationX86EditingFinished() void AndroidSettingsWidget::gdbLocationX86EditingFinished()
{ {
QString location = m_ui->GdbLocationLineEditx86->text(); Utils::FileName location = Utils::FileName::fromUserInput(m_ui->GdbLocationLineEditx86->text());
if (!location.length() || !QFile::exists(location)) if (location.isEmpty() || !location.toFileInfo().exists())
return; return;
m_androidConfig.x86GdbLocation = location; m_androidConfig.x86GdbLocation = location;
} }
void AndroidSettingsWidget::gdbserverLocationX86EditingFinished() void AndroidSettingsWidget::gdbserverLocationX86EditingFinished()
{ {
QString location = m_ui->GdbserverLocationLineEditx86->text(); Utils::FileName location = Utils::FileName::fromUserInput(m_ui->GdbserverLocationLineEditx86->text());
if (!location.length() || !QFile::exists(location)) if (location.isEmpty() || !location.toFileInfo().exists())
return; return;
m_androidConfig.x86GdbserverLocation = location; m_androidConfig.x86GdbserverLocation = location;
} }
void AndroidSettingsWidget::openJDKLocationEditingFinished() void AndroidSettingsWidget::openJDKLocationEditingFinished()
{ {
QString location = m_ui->OpenJDKLocationLineEdit->text(); Utils::FileName location = Utils::FileName::fromUserInput(m_ui->OpenJDKLocationLineEdit->text());
if (!location.length() || !QFile::exists(location)) if (location.isEmpty() || !location.toFileInfo().exists())
return; return;
m_androidConfig.openJDKLocation = location; m_androidConfig.openJDKLocation = location;
} }
void AndroidSettingsWidget::browseSDKLocation() void AndroidSettingsWidget::browseSDKLocation()
{ {
QString dir = QFileDialog::getExistingDirectory(this, tr("Select Android SDK Folder")); Utils::FileName dir = Utils::FileName::fromString(QFileDialog::getExistingDirectory(this, tr("Select Android SDK folder")));
if (!checkSDK(dir)) if (!checkSDK(dir))
return; return;
m_ui->SDKLocationLineEdit->setText(dir); m_ui->SDKLocationLineEdit->setText(dir.toUserOutput());
sdkLocationEditingFinished(); sdkLocationEditingFinished();
} }
void AndroidSettingsWidget::browseNDKLocation() void AndroidSettingsWidget::browseNDKLocation()
{ {
QString dir = QFileDialog::getExistingDirectory(this, tr("Select Android NDK Folder")); Utils::FileName dir = Utils::FileName::fromString(QFileDialog::getExistingDirectory(this, tr("Select Android NDK folder")));
if (!checkNDK(dir)) if (!checkNDK(dir))
return; return;
m_ui->NDKLocationLineEdit->setText(dir); m_ui->NDKLocationLineEdit->setText(dir.toUserOutput());
ndkLocationEditingFinished(); ndkLocationEditingFinished();
} }
@@ -350,55 +357,51 @@ void AndroidSettingsWidget::browseAntLocation()
void AndroidSettingsWidget::browseGdbLocation() void AndroidSettingsWidget::browseGdbLocation()
{ {
QString gdbPath = AndroidConfigurations::instance().gdbPath(ProjectExplorer::Abi::ArmArchitecture); Utils::FileName gdbPath = AndroidConfigurations::instance().gdbPath(ProjectExplorer::Abi::ArmArchitecture);
QString file = QFileDialog::getOpenFileName(this, tr("Select gdb Executable"),gdbPath); Utils::FileName file = Utils::FileName::fromString(QFileDialog::getOpenFileName(this, tr("Select gdb executable"), gdbPath.toString()));
if (!file.length()) if (file.isEmpty())
return; return;
m_ui->GdbLocationLineEdit->setText(file); m_ui->GdbLocationLineEdit->setText(file.toUserOutput());
gdbLocationEditingFinished(); gdbLocationEditingFinished();
} }
void AndroidSettingsWidget::browseGdbserverLocation() void AndroidSettingsWidget::browseGdbserverLocation()
{ {
QString gdbserverPath = AndroidConfigurations::instance().gdbServerPath(ProjectExplorer::Abi::ArmArchitecture); Utils::FileName gdbserverPath = AndroidConfigurations::instance().gdbServerPath(ProjectExplorer::Abi::ArmArchitecture);
const QString file = Utils::FileName file = Utils::FileName::fromString(QFileDialog::getOpenFileName(this, tr("Select gdbserver android executable"), gdbserverPath.toString()));
QFileDialog::getOpenFileName(this, tr("Select gdbserver Android Executable"),gdbserverPath); if (file.isEmpty())
if (!file.length())
return; return;
m_ui->GdbserverLocationLineEdit->setText(file); m_ui->GdbserverLocationLineEdit->setText(file.toUserOutput());
gdbserverLocationEditingFinished(); gdbserverLocationEditingFinished();
} }
void AndroidSettingsWidget::browseGdbLocationX86() void AndroidSettingsWidget::browseGdbLocationX86()
{ {
QString gdbPath = AndroidConfigurations::instance().gdbPath(ProjectExplorer::Abi::X86Architecture); Utils::FileName gdbPath = AndroidConfigurations::instance().gdbPath(ProjectExplorer::Abi::X86Architecture);
const QString file = Utils::FileName file = Utils::FileName::fromString(QFileDialog::getOpenFileName(this, tr("Select gdb executable"), gdbPath.toString()));
QFileDialog::getOpenFileName(this, tr("Select gdb Executable"),gdbPath); if (file.isEmpty())
if (!file.length())
return; return;
m_ui->GdbLocationLineEditx86->setText(file); m_ui->GdbLocationLineEditx86->setText(file.toUserOutput());
gdbLocationX86EditingFinished(); gdbLocationX86EditingFinished();
} }
void AndroidSettingsWidget::browseGdbserverLocationX86() void AndroidSettingsWidget::browseGdbserverLocationX86()
{ {
QString gdbserverPath = AndroidConfigurations::instance().gdbServerPath(ProjectExplorer::Abi::X86Architecture); Utils::FileName gdbserverPath = AndroidConfigurations::instance().gdbServerPath(ProjectExplorer::Abi::X86Architecture);
const QString file = Utils::FileName file = Utils::FileName::fromString(QFileDialog::getOpenFileName(this, tr("Select gdbserver android executable"), gdbserverPath.toString()));
QFileDialog::getOpenFileName(this, tr("Select gdbserver Android Executable"), gdbserverPath); if (file.isEmpty())
if (!file.length())
return; return;
m_ui->GdbserverLocationLineEditx86->setText(file); m_ui->GdbserverLocationLineEditx86->setText(file.toUserOutput());
gdbserverLocationX86EditingFinished(); gdbserverLocationX86EditingFinished();
} }
void AndroidSettingsWidget::browseOpenJDKLocation() void AndroidSettingsWidget::browseOpenJDKLocation()
{ {
QString openJDKPath = AndroidConfigurations::instance().openJDKPath(); Utils::FileName openJDKPath = AndroidConfigurations::instance().openJDKPath();
const QString file = Utils::FileName file = Utils::FileName::fromString(QFileDialog::getOpenFileName(this, tr("Select OpenJDK path"), openJDKPath.toString()));
QFileDialog::getOpenFileName(this, tr("Select OpenJDK Path"), openJDKPath); if (file.isEmpty())
if (!file.length())
return; return;
m_ui->OpenJDKLocationLineEdit->setText(file); m_ui->OpenJDKLocationLineEdit->setText(file.toUserOutput());
openJDKLocationEditingFinished(); openJDKLocationEditingFinished();
} }
@@ -436,7 +439,8 @@ void AndroidSettingsWidget::manageAVD()
QProcess *avdProcess = new QProcess(); QProcess *avdProcess = new QProcess();
connect(this, SIGNAL(destroyed()), avdProcess, SLOT(deleteLater())); connect(this, SIGNAL(destroyed()), avdProcess, SLOT(deleteLater()));
connect(avdProcess, SIGNAL(finished(int)), avdProcess, SLOT(deleteLater())); connect(avdProcess, SIGNAL(finished(int)), avdProcess, SLOT(deleteLater()));
avdProcess->start(AndroidConfigurations::instance().androidToolPath(), QStringList() << QLatin1String("avd")); avdProcess->start(AndroidConfigurations::instance().androidToolPath().toString(),
QStringList() << QLatin1String("avd"));
} }

View File

@@ -72,6 +72,7 @@ class AndroidSettingsWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
// Todo: This would be so much simpler if it just used Utils::PathChooser!!!
AndroidSettingsWidget(QWidget *parent); AndroidSettingsWidget(QWidget *parent);
~AndroidSettingsWidget(); ~AndroidSettingsWidget();
@@ -105,8 +106,8 @@ private slots:
private: private:
void initGui(); void initGui();
bool checkSDK(const QString &location); bool checkSDK(const Utils::FileName &location);
bool checkNDK(const QString &location); bool checkNDK(const Utils::FileName &location);
void fillToolchainVersions(); void fillToolchainVersions();
Ui_AndroidSettingsWidget *m_ui; Ui_AndroidSettingsWidget *m_ui;

View File

@@ -1,204 +0,0 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 BogDan Vatra <bog_dan_ro@yahoo.com>
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/
#ifndef ANDROIDTEMPLATESCREATOR_H
#define ANDROIDTEMPLATESCREATOR_H
#include "qt4projectmanager/qt4target.h"
#include "qt4projectmanager/qt4buildconfiguration.h"
#include <QMap>
#include <QIcon>
#include <QDomDocument>
QT_FORWARD_DECLARE_CLASS(QFileSystemWatcher);
namespace ProjectExplorer {
class Project;
class ProjectNode;
class Target;
}
namespace Qt4ProjectManager {
class Qt4Project;
class Qt4Target;
class Qt4ProFileNode;
}
namespace Android {
namespace Internal {
class AndroidTargetFactory;
class AndroidTarget : public Qt4ProjectManager::Qt4BaseTarget
{
friend class AndroidTargetFactory;
Q_OBJECT
enum AndroidIconType
{
HighDPI,
MediumDPI,
LowDPI
};
struct Library
{
Library()
{
level = -1;
}
int level;
QStringList dependencies;
QString name;
};
typedef QMap<QString, Library> LibrariesMap;
public:
enum BuildType
{
DebugBuild,
ReleaseBuildUnsigned,
ReleaseBuildSigned
};
explicit AndroidTarget(Qt4ProjectManager::Qt4Project *parent, const Core::Id id);
virtual ~AndroidTarget();
Qt4ProjectManager::Qt4BuildConfigurationFactory *buildConfigurationFactory() const;
void createApplicationProFiles(bool reparse);
QList<ProjectExplorer::RunConfiguration *> runConfigurationsForNode(ProjectExplorer::Node *n);
static QString defaultDisplayName();
QString packageName() const;
bool setPackageName(const QString &name) const;
QString intentName() const;
QString activityName() const;
QString applicationName() const;
bool setApplicationName(const QString &name) const;
QStringList availableTargetApplications() const;
QString targetApplication() const;
bool setTargetApplication(const QString &name) const;
QString targetApplicationPath() const;
QString targetSDK() const;
bool setTargetSDK(const QString &target) const;
int versionCode() const;
bool setVersionCode(int version) const;
QString versionName() const;
bool setVersionName(const QString &version) const;
QStringList permissions() const;
bool setPermissions(const QStringList &permissions) const;
QStringList availableQtLibs() const;
QStringList qtLibs() const;
bool setQtLibs(const QStringList &qtLibs) const;
QStringList availablePrebundledLibs() const;
QStringList prebundledLibs() const;
bool setPrebundledLibs(const QStringList &qtLibs) const;
QIcon highDpiIcon() const;
bool setHighDpiIcon(const QString &iconFilePath) const;
QIcon mediumDpiIcon() const;
bool setMediumDpiIcon(const QString &iconFilePath) const;
QIcon lowDpiIcon() const;
bool setLowDpiIcon(const QString &iconFilePath) const;
QString androidDirPath() const;
QString androidManifestPath() const;
QString androidLibsPath() const;
QString androidStringsPath() const;
QString androidDefaultPropertiesPath() const;
QString androidSrcPath() const;
QString apkPath(BuildType buildType) const;
QString localLibsRulesFilePath() const;
QString loadLocalLibs(int apiLevel) const;
QString loadLocalJars(int apiLevel) const;
public slots:
bool createAndroidTemplatesIfNecessary() const;
void updateProject(const QString &targetSDK, const QString &name = QString()) const;
signals:
void androidDirContentsChanged();
private slots:
void handleTargetChanged(ProjectExplorer::Target *target);
void handleTargetToBeRemoved(ProjectExplorer::Target *target);
private:
enum ItemType
{
Lib,
Jar
};
QString loadLocal(int apiLevel, ItemType item) const;
void raiseError(const QString &reason) const;
bool openXmlFile(QDomDocument &doc, const QString &fileName, bool createAndroidTemplates = true) const;
bool saveXmlFile(QDomDocument &doc, const QString &fileName) const;
bool openAndroidManifest(QDomDocument &doc) const;
bool saveAndroidManifest(QDomDocument &doc) const;
bool openLibsXml(QDomDocument &doc) const;
bool saveLibsXml(QDomDocument &doc) const;
QIcon androidIcon(AndroidIconType type) const;
bool setAndroidIcon(AndroidIconType type, const QString &iconFileName) const;
QStringList libsXml(const QString &tag) const;
bool setLibsXml(const QStringList &qtLibs, const QString &tag) const;
static bool qtLibrariesLessThan(const AndroidTarget::Library &a, const AndroidTarget::Library &b);
QStringList getDependencies(const QString &readelfPath, const QString &lib) const;
int setLibraryLevel(const QString &library, LibrariesMap &mapLibs) const;
QFileSystemWatcher *const m_androidFilesWatcher;
Qt4ProjectManager::Qt4BuildConfigurationFactory *m_buildConfigurationFactory;
};
} // namespace Internal
} // namespace Android
#endif // ANDROIDTEMPLATESCREATOR_H

View File

@@ -1,185 +0,0 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 BogDan Vatra <bog_dan_ro@yahoo.com>
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/
#include "androidtargetfactory.h"
#include "qt4projectmanager/qt4project.h"
#include "qt4projectmanager/qt4projectmanagerconstants.h"
#include "androiddeploystep.h"
#include "androidglobal.h"
#include "androidpackagecreationstep.h"
#include "androidrunconfiguration.h"
#include "androidtarget.h"
#include "androiddeployconfiguration.h"
#include <projectexplorer/deployconfiguration.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <qt4projectmanager/buildconfigurationinfo.h>
#include <qtsupport/customexecutablerunconfiguration.h>
#include <qtsupport/qtversionmanager.h>
using namespace Qt4ProjectManager;
using namespace Android::Internal;
using ProjectExplorer::idFromMap;
// -------------------------------------------------------------------------
// Qt4AndroidTargetFactory
// -------------------------------------------------------------------------
AndroidTargetFactory::AndroidTargetFactory(QObject *parent) :
Qt4BaseTargetFactory(parent)
{
connect(QtSupport::QtVersionManager::instance(), SIGNAL(qtVersionsChanged(QList<int>,QList<int>,QList<int>)),
this, SIGNAL(canCreateTargetIdsChanged()));
}
AndroidTargetFactory::~AndroidTargetFactory()
{
}
bool AndroidTargetFactory::supportsTargetId(const Core::Id id) const
{
return id == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID);
}
QSet<QString> AndroidTargetFactory::targetFeatures(const Core::Id id) const
{
Q_UNUSED(id);
QSet<QString> features;
features << QLatin1String(Qt4ProjectManager::Constants::MOBILE_TARGETFEATURE_ID);
features << QLatin1String(Qt4ProjectManager::Constants::SHADOWBUILD_TARGETFEATURE_ID);
return features;
}
QList<Core::Id> AndroidTargetFactory::supportedTargetIds() const
{
return QList<Core::Id>() << Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID);
}
QString AndroidTargetFactory::displayNameForId(const Core::Id id) const
{
if (id == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID))
return AndroidTarget::defaultDisplayName();
return QString();
}
QIcon AndroidTargetFactory::iconForId(const Core::Id id) const
{
Q_UNUSED(id)
return QIcon(QLatin1String(Constants::ANDROID_SETTINGS_CATEGORY_ICON));
}
bool AndroidTargetFactory::canCreate(ProjectExplorer::Project *parent, const Core::Id id) const
{
if (!qobject_cast<Qt4Project *>(parent))
return false;
if (!supportsTargetId(id))
return false;
return QtSupport::QtVersionManager::instance()->supportsTargetId(id);
}
bool AndroidTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const
{
return canCreate(parent, idFromMap(map));
}
Qt4BaseTarget *AndroidTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map)
{
if (!canRestore(parent, map))
return 0;
const Core::Id id = idFromMap(map);
AndroidTarget *target = 0;
Qt4Project *qt4project = static_cast<Qt4Project *>(parent);
if (id == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID))
target = new AndroidTarget(qt4project, id);
if (target && target->fromMap(map))
return target;
delete target;
return 0;
}
Qt4BaseTarget *AndroidTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id)
{
if (!canCreate(parent, id))
return 0;
QList<QtSupport::BaseQtVersion *> knownVersions = QtSupport::QtVersionManager::instance()->versionsForTargetId(id);
if (knownVersions.isEmpty())
return 0;
QtSupport::BaseQtVersion *qtVersion = knownVersions.first();
bool buildAll = qtVersion->isValid() && (qtVersion->defaultBuildConfig() & QtSupport::BaseQtVersion::BuildAll);
QtSupport::BaseQtVersion::QmakeBuildConfigs config = buildAll ? QtSupport::BaseQtVersion::BuildAll : QtSupport::BaseQtVersion::QmakeBuildConfig(0);
QList<Qt4ProjectManager::BuildConfigurationInfo> infos;
infos.append(Qt4ProjectManager::BuildConfigurationInfo(qtVersion->uniqueId(), config, QString(), QString()));
infos.append(Qt4ProjectManager::BuildConfigurationInfo(qtVersion->uniqueId(), config ^ QtSupport::BaseQtVersion::DebugBuild, QString(), QString()));
return create(parent, id, infos);
}
Qt4BaseTarget *AndroidTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id,
const QList<Qt4ProjectManager::BuildConfigurationInfo> &infos)
{
if (!canCreate(parent, id))
return 0;
AndroidTarget *target = 0;
if (id == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID))
target = new AndroidTarget(static_cast<Qt4Project *>(parent), id);
Q_ASSERT(target);
foreach (const Qt4ProjectManager::BuildConfigurationInfo &info, infos) {
QString displayName = info.version()->displayName() + QLatin1Char(' ');
displayName += (info.buildConfig & QtSupport::BaseQtVersion::DebugBuild) ? tr("Debug") : tr("Release");
target->addQt4BuildConfiguration(displayName, QString(),
info.version(),
info.buildConfig,
info.additionalArguments,
info.directory,
info.importing);
}
target->addDeployConfiguration(target->createDeployConfiguration(Core::Id(ANDROID_DEPLOYCONFIGURATION_ID)));
target->createApplicationProFiles(false);
if (target->runConfigurations().isEmpty())
target->addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(target));
return target;
}
QString AndroidTargetFactory::buildNameForId(const Core::Id id) const
{
if (id == Core::Id(Qt4ProjectManager::Constants::ANDROID_DEVICE_TARGET_ID))
return QLatin1String("android");
return QString();
}

View File

@@ -1,70 +0,0 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 BogDan Vatra <bog_dan_ro@yahoo.com>
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/
#ifndef QT4ANDROIDTARGETFACTORY_H
#define QT4ANDROIDTARGETFACTORY_H
#include "qt4projectmanager/qt4basetargetfactory.h"
#include "qt4projectmanager/qt4target.h"
namespace Android {
namespace Internal {
class AndroidTargetFactory : public Qt4ProjectManager::Qt4BaseTargetFactory
{
Q_OBJECT
public:
AndroidTargetFactory(QObject *parent = 0);
~AndroidTargetFactory();
QList<Core::Id> supportedTargetIds() const;
QString displayNameForId(const Core::Id id) const;
QIcon iconForId(const Core::Id id) const;
bool canCreate(ProjectExplorer::Project *parent, const Core::Id id) const;
bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const;
Qt4ProjectManager::Qt4BaseTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map);
bool supportsTargetId(const Core::Id id) const;
virtual QSet<QString> targetFeatures(const Core::Id id) const;
Qt4ProjectManager::Qt4BaseTarget *create(ProjectExplorer::Project *parent, const Core::Id id);
Qt4ProjectManager::Qt4BaseTarget *create(ProjectExplorer::Project *parent, const Core::Id id,
const QList<Qt4ProjectManager::BuildConfigurationInfo> &infos);
QString buildNameForId(const Core::Id id) const;
};
} // namespace Internal
} // namespace Android
#endif // QT4ANDROIDTARGETFACTORY_H

View File

@@ -33,7 +33,7 @@
#include "androidtoolchain.h" #include "androidtoolchain.h"
#include "androidconstants.h" #include "androidconstants.h"
#include "androidconfigurations.h" #include "androidconfigurations.h"
#include "androidtarget.h" #include "androidmanager.h"
#include "androidqtversion.h" #include "androidqtversion.h"
#include "qt4projectmanager/qt4projectmanagerconstants.h" #include "qt4projectmanager/qt4projectmanagerconstants.h"
@@ -103,21 +103,17 @@ void AndroidToolChain::addToEnvironment(Utils::Environment &env) const
// this env vars are used by qmake mkspecs to generate makefiles (check QTDIR/mkspecs/android-g++/qmake.conf for more info) // this env vars are used by qmake mkspecs to generate makefiles (check QTDIR/mkspecs/android-g++/qmake.conf for more info)
env.set(QLatin1String("ANDROID_NDK_HOST"), ndk_host); env.set(QLatin1String("ANDROID_NDK_HOST"), ndk_host);
env.set(QLatin1String("ANDROID_NDK_ROOT"), env.set(QLatin1String("ANDROID_NDK_ROOT"), AndroidConfigurations::instance().config().ndkLocation.toUserOutput());
QDir::toNativeSeparators(AndroidConfigurations::instance().config().ndkLocation));
env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_PREFIX"), AndroidConfigurations::toolchainPrefix(targetAbi().architecture())); env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_PREFIX"), AndroidConfigurations::toolchainPrefix(targetAbi().architecture()));
env.set(QLatin1String("ANDROID_NDK_TOOLS_PREFIX"), AndroidConfigurations::toolsPrefix(targetAbi().architecture())); env.set(QLatin1String("ANDROID_NDK_TOOLS_PREFIX"), AndroidConfigurations::toolsPrefix(targetAbi().architecture()));
env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_VERSION"), AndroidConfigurations::instance().config().ndkToolchainVersion); env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_VERSION"), AndroidConfigurations::instance().config().ndkToolchainVersion);
// TODO that is very ugly and likely to be wrong... // TODO that is very ugly and likely to be wrong...
Qt4Project *qt4pro = qobject_cast<Qt4Project *>(ProjectExplorer::ProjectExplorerPlugin::instance()->currentProject()); Qt4Project *qt4pro = qobject_cast<Qt4Project *>(ProjectExplorer::ProjectExplorerPlugin::instance()->currentProject());
if (!qt4pro) if (!qt4pro || !qt4pro->activeTarget())
return;
AndroidTarget *at = qobject_cast<AndroidTarget *>(qt4pro->activeTarget());
if (!at)
return; return;
env.set(QLatin1String("ANDROID_NDK_PLATFORM"), env.set(QLatin1String("ANDROID_NDK_PLATFORM"),
AndroidConfigurations::instance().bestMatch(at->targetSDK())); AndroidConfigurations::instance().bestMatch(AndroidManager::targetSDK(qt4pro->activeTarget())));
} }
bool AndroidToolChain::operator ==(const ProjectExplorer::ToolChain &tc) const bool AndroidToolChain::operator ==(const ProjectExplorer::ToolChain &tc) const
@@ -202,11 +198,6 @@ QList<ProjectExplorer::Abi> AndroidToolChain::detectSupportedAbis() const
return aqv->qtAbis(); return aqv->qtAbis();
} }
QString AndroidToolChain::legacyId() const
{
return QString::fromLatin1("%1:%2").arg(QLatin1String(Constants::ANDROID_TOOLCHAIN_ID)).arg(m_qtVersionId);
}
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// ToolChainConfigWidget // ToolChainConfigWidget
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
@@ -218,7 +209,7 @@ AndroidToolChainConfigWidget::AndroidToolChainConfigWidget(AndroidToolChain *tc)
QLabel *label = new QLabel; QLabel *label = new QLabel;
QtSupport::BaseQtVersion *v = QtSupport::QtVersionManager::instance()->version(tc->qtVersionId()); QtSupport::BaseQtVersion *v = QtSupport::QtVersionManager::instance()->version(tc->qtVersionId());
Q_ASSERT(v); Q_ASSERT(v);
label->setText(tr("NDK Root: %1").arg(AndroidConfigurations::instance().config().ndkLocation)); label->setText(tr("NDK Root: %1").arg(AndroidConfigurations::instance().config().ndkLocation.toUserOutput()));
layout->addWidget(label); layout->addWidget(label);
} }
@@ -323,7 +314,7 @@ QList<ProjectExplorer::ToolChain *> AndroidToolChainFactory::createToolChainList
aTc->setDisplayName(tr("Android GCC (%1-%2)") aTc->setDisplayName(tr("Android GCC (%1-%2)")
.arg(ProjectExplorer::Abi::toString(aTc->targetAbi().architecture())) .arg(ProjectExplorer::Abi::toString(aTc->targetAbi().architecture()))
.arg(AndroidConfigurations::instance().config().ndkToolchainVersion)); .arg(AndroidConfigurations::instance().config().ndkToolchainVersion));
aTc->setCompilerCommand(Utils::FileName::fromString(AndroidConfigurations::instance().gccPath(aTc->targetAbi().architecture()))); aTc->setCompilerCommand(AndroidConfigurations::instance().gccPath(aTc->targetAbi().architecture()));
result.append(aTc); result.append(aTc);
} }
return result; return result;

View File

@@ -67,7 +67,7 @@ public:
void setQtVersionId(int); void setQtVersionId(int);
int qtVersionId() const; int qtVersionId() const;
QString legacyId() const;
protected: protected:
virtual QList<ProjectExplorer::Abi> detectSupportedAbis() const; virtual QList<ProjectExplorer::Abi> detectSupportedAbis() const;

View File

@@ -34,11 +34,11 @@
#include "autogenstep.h" #include "autogenstep.h"
#include "autotoolsproject.h" #include "autotoolsproject.h"
#include "autotoolstarget.h"
#include "autotoolsbuildconfiguration.h" #include "autotoolsbuildconfiguration.h"
#include "autotoolsprojectconstants.h" #include "autotoolsprojectconstants.h"
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/target.h>
#include <projectexplorer/toolchain.h> #include <projectexplorer/toolchain.h>
#include <projectexplorer/gnumakeparser.h> #include <projectexplorer/gnumakeparser.h>
#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorer.h>
@@ -67,9 +67,9 @@ AutogenStepFactory::AutogenStepFactory(QObject *parent) :
QList<Core::Id> AutogenStepFactory::availableCreationIds(BuildStepList *parent) const QList<Core::Id> AutogenStepFactory::availableCreationIds(BuildStepList *parent) const
{ {
if (parent->target()->project()->id() == Core::Id(Constants::AUTOTOOLS_PROJECT_ID)) if (!canHandle(parent))
return QList<Core::Id>() << Core::Id(AUTOGEN_STEP_ID); return QList<Core::Id>();
return QList<Core::Id>(); return QList<Core::Id>() << Core::Id(AUTOGEN_STEP_ID);
} }
QString AutogenStepFactory::displayNameForId(const Core::Id id) const QString AutogenStepFactory::displayNameForId(const Core::Id id) const
@@ -81,13 +81,7 @@ QString AutogenStepFactory::displayNameForId(const Core::Id id) const
bool AutogenStepFactory::canCreate(BuildStepList *parent, const Core::Id id) const bool AutogenStepFactory::canCreate(BuildStepList *parent, const Core::Id id) const
{ {
if (parent->target()->project()->id() != Core::Id(Constants::AUTOTOOLS_PROJECT_ID)) return canHandle(parent) && Core::Id(AUTOGEN_STEP_ID) == id;
return false;
if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD))
return false;
return Core::Id(AUTOGEN_STEP_ID) == id;
} }
BuildStep *AutogenStepFactory::create(BuildStepList *parent, const Core::Id id) BuildStep *AutogenStepFactory::create(BuildStepList *parent, const Core::Id id)
@@ -125,6 +119,13 @@ BuildStep *AutogenStepFactory::restore(BuildStepList *parent, const QVariantMap
return 0; return 0;
} }
bool AutogenStepFactory::canHandle(BuildStepList *parent) const
{
if (parent->target()->project()->id() != Core::Id(Constants::AUTOTOOLS_PROJECT_ID))
return false;
return parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
}
//////////////////////// ////////////////////////
// AutogenStep class // AutogenStep class
//////////////////////// ////////////////////////

View File

@@ -72,6 +72,8 @@ public:
ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source); ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source);
bool canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const; bool canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const;
ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map); ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map);
bool canHandle(ProjectExplorer::BuildStepList *parent) const;
}; };
/////////////////////// ///////////////////////

View File

@@ -34,11 +34,11 @@
#include "autoreconfstep.h" #include "autoreconfstep.h"
#include "autotoolsproject.h" #include "autotoolsproject.h"
#include "autotoolstarget.h"
#include "autotoolsbuildconfiguration.h" #include "autotoolsbuildconfiguration.h"
#include "autotoolsprojectconstants.h" #include "autotoolsprojectconstants.h"
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/target.h>
#include <projectexplorer/toolchain.h> #include <projectexplorer/toolchain.h>
#include <projectexplorer/gnumakeparser.h> #include <projectexplorer/gnumakeparser.h>
#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorer.h>
@@ -66,9 +66,9 @@ AutoreconfStepFactory::AutoreconfStepFactory(QObject *parent) :
QList<Core::Id> AutoreconfStepFactory::availableCreationIds(BuildStepList *parent) const QList<Core::Id> AutoreconfStepFactory::availableCreationIds(BuildStepList *parent) const
{ {
if (parent->target()->project()->id() == Core::Id(Constants::AUTOTOOLS_PROJECT_ID)) if (!canHandle(parent))
return QList<Core::Id>() << Core::Id(AUTORECONF_STEP_ID); return QList<Core::Id>();
return QList<Core::Id>(); return QList<Core::Id>() << Core::Id(AUTORECONF_STEP_ID);
} }
QString AutoreconfStepFactory::displayNameForId(const Core::Id id) const QString AutoreconfStepFactory::displayNameForId(const Core::Id id) const
@@ -80,13 +80,7 @@ QString AutoreconfStepFactory::displayNameForId(const Core::Id id) const
bool AutoreconfStepFactory::canCreate(BuildStepList *parent, const Core::Id id) const bool AutoreconfStepFactory::canCreate(BuildStepList *parent, const Core::Id id) const
{ {
if (parent->target()->project()->id() != Core::Id(Constants::AUTOTOOLS_PROJECT_ID)) return canHandle(parent) && Core::Id(AUTORECONF_STEP_ID) == id;
return false;
if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD))
return false;
return Core::Id(AUTORECONF_STEP_ID) == id;
} }
BuildStep *AutoreconfStepFactory::create(BuildStepList *parent, const Core::Id id) BuildStep *AutoreconfStepFactory::create(BuildStepList *parent, const Core::Id id)
@@ -124,6 +118,13 @@ BuildStep *AutoreconfStepFactory::restore(BuildStepList *parent, const QVariantM
return 0; return 0;
} }
bool AutoreconfStepFactory::canHandle(BuildStepList *parent) const
{
if (parent->target()->project()->id() != Core::Id(Constants::AUTOTOOLS_PROJECT_ID))
return false;
return parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
}
///////////////////////// /////////////////////////
// AutoreconfStep class // AutoreconfStep class
///////////////////////// /////////////////////////

View File

@@ -72,6 +72,8 @@ public:
ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source); ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source);
bool canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const; bool canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const;
ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map); ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map);
bool canHandle(ProjectExplorer::BuildStepList *parent) const;
}; };
///////////////////////// /////////////////////////

View File

@@ -35,15 +35,16 @@
#include "autotoolsbuildconfiguration.h" #include "autotoolsbuildconfiguration.h"
#include "makestep.h" #include "makestep.h"
#include "autotoolsproject.h" #include "autotoolsproject.h"
#include "autotoolstarget.h"
#include "autotoolsprojectconstants.h" #include "autotoolsprojectconstants.h"
#include "autogenstep.h" #include "autogenstep.h"
#include "autoreconfstep.h" #include "autoreconfstep.h"
#include "configurestep.h" #include "configurestep.h"
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/toolchain.h> #include <projectexplorer/profileinformation.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/target.h>
#include <projectexplorer/toolchain.h>
#include <qtsupport/customexecutablerunconfiguration.h> #include <qtsupport/customexecutablerunconfiguration.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -58,18 +59,26 @@ using namespace ProjectExplorer::Constants;
////////////////////////////////////// //////////////////////////////////////
// AutotoolsBuildConfiguration class // AutotoolsBuildConfiguration class
////////////////////////////////////// //////////////////////////////////////
AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(AutotoolsTarget *parent) AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(ProjectExplorer::Target *parent)
: BuildConfiguration(parent, Core::Id(AUTOTOOLS_BC_ID)) : BuildConfiguration(parent, Core::Id(AUTOTOOLS_BC_ID))
{ {
m_buildDirectory = autotoolsTarget()->defaultBuildDirectory(); AutotoolsProject *project = qobject_cast<AutotoolsProject *>(parent->project());
if (project)
m_buildDirectory = project->defaultBuildDirectory();
} }
AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(AutotoolsTarget *parent, const Core::Id id) BuildConfigWidget *AutotoolsBuildConfiguration::createConfigWidget()
{
return new AutotoolsBuildSettingsWidget;
}
AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(ProjectExplorer::Target *parent, const Core::Id id)
: BuildConfiguration(parent, id) : BuildConfiguration(parent, id)
{ {
} }
AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(AutotoolsTarget *parent, AutotoolsBuildConfiguration *source) AutotoolsBuildConfiguration::AutotoolsBuildConfiguration(ProjectExplorer::Target *parent,
AutotoolsBuildConfiguration *source)
: BuildConfiguration(parent, source), : BuildConfiguration(parent, source),
m_buildDirectory(source->m_buildDirectory) m_buildDirectory(source->m_buildDirectory)
{ {
@@ -88,7 +97,7 @@ bool AutotoolsBuildConfiguration::fromMap(const QVariantMap &map)
if (!BuildConfiguration::fromMap(map)) if (!BuildConfiguration::fromMap(map))
return false; return false;
m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY), autotoolsTarget()->defaultBuildDirectory()).toString(); m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY)).toString();
return true; return true;
} }
@@ -105,14 +114,9 @@ void AutotoolsBuildConfiguration::setBuildDirectory(const QString &buildDirector
emit buildDirectoryChanged(); emit buildDirectoryChanged();
} }
AutotoolsTarget *AutotoolsBuildConfiguration::autotoolsTarget() const
{
return static_cast<AutotoolsTarget *>(target());
}
IOutputParser *AutotoolsBuildConfiguration::createOutputParser() const IOutputParser *AutotoolsBuildConfiguration::createOutputParser() const
{ {
ToolChain *tc = autotoolsTarget()->autotoolsProject()->toolChain(); ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile());
if (tc) if (tc)
return tc->outputParser(); return tc->outputParser();
return 0; return 0;
@@ -126,9 +130,9 @@ AutotoolsBuildConfigurationFactory::AutotoolsBuildConfigurationFactory(QObject *
{ {
} }
QList<Core::Id> AutotoolsBuildConfigurationFactory::availableCreationIds(Target *parent) const QList<Core::Id> AutotoolsBuildConfigurationFactory::availableCreationIds(const Target *parent) const
{ {
if (!qobject_cast<AutotoolsTarget *>(parent)) if (!canHandle(parent))
return QList<Core::Id>(); return QList<Core::Id>();
return QList<Core::Id>() << Core::Id(AUTOTOOLS_BC_ID); return QList<Core::Id>() << Core::Id(AUTOTOOLS_BC_ID);
} }
@@ -140,52 +144,45 @@ QString AutotoolsBuildConfigurationFactory::displayNameForId(const Core::Id id)
return QString(); return QString();
} }
bool AutotoolsBuildConfigurationFactory::canCreate(Target *parent, const Core::Id id) const bool AutotoolsBuildConfigurationFactory::canCreate(const Target *parent, const Core::Id id) const
{ {
if (!qobject_cast<AutotoolsTarget *>(parent)) if (!canHandle(parent))
return false; return false;
if (id == Core::Id(AUTOTOOLS_BC_ID)) if (id == Core::Id(AUTOTOOLS_BC_ID))
return true; return true;
return false; return false;
} }
AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::create(Target *parent, const Core::Id id) AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::create(Target *parent, const Core::Id id, const QString &name)
{ {
if (!canCreate(parent, id)) if (!canCreate(parent, id))
return 0; return 0;
AutotoolsTarget *t = static_cast<AutotoolsTarget *>(parent); bool ok = true;
AutotoolsBuildConfiguration *bc = createDefaultConfiguration(t); QString buildConfigurationName = name;
if (buildConfigurationName.isEmpty())
bool ok; buildConfigurationName = QInputDialog::getText(0,
QString buildConfigurationName = QInputDialog::getText(0, tr("New Configuration"),
tr("New Configuration"), tr("New configuration name:"),
tr("New configuration name:"), QLineEdit::Normal,
QLineEdit::Normal, QString(), &ok);
QString(), buildConfigurationName = buildConfigurationName.trimmed();
&ok);
if (!ok || buildConfigurationName.isEmpty()) if (!ok || buildConfigurationName.isEmpty())
return 0; return 0;
AutotoolsBuildConfiguration *bc = createDefaultConfiguration(parent);
bc->setDisplayName(buildConfigurationName); bc->setDisplayName(buildConfigurationName);
t->addBuildConfiguration(bc);
t->addDeployConfiguration(t->createDeployConfiguration(Core::Id(DEFAULT_DEPLOYCONFIGURATION_ID)));
// User needs to choose where the executable file is.
// TODO: Parse the file in *Anjuta style* to be able to add custom RunConfigurations.
t->addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(t));
return bc; return bc;
} }
AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::createDefaultConfiguration(AutotoolsTarget *target) const AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::createDefaultConfiguration(ProjectExplorer::Target *target)
{ {
AutotoolsBuildConfiguration *bc = new AutotoolsBuildConfiguration(target); AutotoolsBuildConfiguration *bc = new AutotoolsBuildConfiguration(target);
BuildStepList *buildSteps = bc->stepList(Core::Id(BUILDSTEPS_BUILD)); BuildStepList *buildSteps = bc->stepList(Core::Id(BUILDSTEPS_BUILD));
// ### Build Steps Build ### // ### Build Steps Build ###
// autogen.sh or autoreconf // autogen.sh or autoreconf
QFile autogenFile(target->autotoolsProject()->projectDirectory() + QLatin1String("/autogen.sh")); QFile autogenFile(target->project()->projectDirectory() + QLatin1String("/autogen.sh"));
if (autogenFile.exists()) { if (autogenFile.exists()) {
AutogenStep *autogenStep = new AutogenStep(buildSteps); AutogenStep *autogenStep = new AutogenStep(buildSteps);
buildSteps->insertStep(0, autogenStep); buildSteps->insertStep(0, autogenStep);
@@ -214,7 +211,14 @@ AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::createDefaultCo
return bc; return bc;
} }
bool AutotoolsBuildConfigurationFactory::canClone(Target *parent, BuildConfiguration *source) const bool AutotoolsBuildConfigurationFactory::canHandle(const Target *t) const
{
if (!t->project()->supportsProfile(t->profile()))
return false;
return t->project()->id() == Core::Id(Constants::AUTOTOOLS_PROJECT_ID);
}
bool AutotoolsBuildConfigurationFactory::canClone(const Target *parent, BuildConfiguration *source) const
{ {
return canCreate(parent, source->id()); return canCreate(parent, source->id());
} }
@@ -225,11 +229,10 @@ AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::clone(Target *p
return 0; return 0;
AutotoolsBuildConfiguration *origin = static_cast<AutotoolsBuildConfiguration *>(source); AutotoolsBuildConfiguration *origin = static_cast<AutotoolsBuildConfiguration *>(source);
AutotoolsTarget *target(static_cast<AutotoolsTarget *>(parent)); return new AutotoolsBuildConfiguration(parent, origin);
return new AutotoolsBuildConfiguration(target, origin);
} }
bool AutotoolsBuildConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const bool AutotoolsBuildConfigurationFactory::canRestore(const Target *parent, const QVariantMap &map) const
{ {
return canCreate(parent, idFromMap(map)); return canCreate(parent, idFromMap(map));
} }
@@ -238,8 +241,7 @@ AutotoolsBuildConfiguration *AutotoolsBuildConfigurationFactory::restore(Target
{ {
if (!canRestore(parent, map)) if (!canRestore(parent, map))
return 0; return 0;
AutotoolsTarget *target(static_cast<AutotoolsTarget *>(parent)); AutotoolsBuildConfiguration *bc = new AutotoolsBuildConfiguration(parent);
AutotoolsBuildConfiguration *bc = new AutotoolsBuildConfiguration(target);
if (bc->fromMap(map)) if (bc->fromMap(map))
return bc; return bc;
delete bc; delete bc;
@@ -251,3 +253,8 @@ BuildConfiguration::BuildType AutotoolsBuildConfiguration::buildType() const
// TODO: Should I return something different from Unknown? // TODO: Should I return something different from Unknown?
return Unknown; return Unknown;
} }
void AutotoolsBuildConfiguration::emitBuildDirectoryInitialized()
{
emit buildDirectoryInitialized();
}

View File

@@ -35,6 +35,8 @@
#ifndef AUTOTOOLSBUILDCONFIGURATION_H #ifndef AUTOTOOLSBUILDCONFIGURATION_H
#define AUTOTOOLSBUILDCONFIGURATION_H #define AUTOTOOLSBUILDCONFIGURATION_H
#include "autotoolsbuildsettingswidget.h"
#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildconfiguration.h>
namespace AutotoolsProjectManager { namespace AutotoolsProjectManager {
@@ -49,18 +51,21 @@ class AutotoolsBuildConfiguration : public ProjectExplorer::BuildConfiguration
friend class AutotoolsBuildConfigurationFactory; friend class AutotoolsBuildConfigurationFactory;
public: public:
explicit AutotoolsBuildConfiguration(AutotoolsTarget *parent); explicit AutotoolsBuildConfiguration(ProjectExplorer::Target *parent);
ProjectExplorer::BuildConfigWidget *createConfigWidget();
AutotoolsTarget *autotoolsTarget() const;
QString buildDirectory() const; QString buildDirectory() const;
void setBuildDirectory(const QString &buildDirectory); void setBuildDirectory(const QString &buildDirectory);
QVariantMap toMap() const; QVariantMap toMap() const;
ProjectExplorer::IOutputParser *createOutputParser() const; ProjectExplorer::IOutputParser *createOutputParser() const;
BuildType buildType() const; BuildType buildType() const;
void emitBuildDirectoryInitialized();
protected: protected:
AutotoolsBuildConfiguration(AutotoolsTarget *parent, const Core::Id id); AutotoolsBuildConfiguration(ProjectExplorer::Target *parent, const Core::Id id);
AutotoolsBuildConfiguration(AutotoolsTarget *parent, AutotoolsBuildConfiguration *source); AutotoolsBuildConfiguration(ProjectExplorer::Target *parent, AutotoolsBuildConfiguration *source);
bool fromMap(const QVariantMap &map); bool fromMap(const QVariantMap &map);
@@ -75,16 +80,20 @@ class AutotoolsBuildConfigurationFactory : public ProjectExplorer::IBuildConfigu
public: public:
explicit AutotoolsBuildConfigurationFactory(QObject *parent = 0); explicit AutotoolsBuildConfigurationFactory(QObject *parent = 0);
QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const; QList<Core::Id> availableCreationIds(const ProjectExplorer::Target *parent) const;
QString displayNameForId(const Core::Id id) const; QString displayNameForId(const Core::Id id) const;
bool canCreate(ProjectExplorer::Target *parent, const Core::Id id) const; bool canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const;
AutotoolsBuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id); AutotoolsBuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name = QString());
AutotoolsBuildConfiguration *createDefaultConfiguration(AutotoolsTarget *target) const; bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const;
bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const;
AutotoolsBuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source); AutotoolsBuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source);
bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const;
AutotoolsBuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); AutotoolsBuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map);
static AutotoolsBuildConfiguration *createDefaultConfiguration(ProjectExplorer::Target *target);
private:
bool canHandle(const ProjectExplorer::Target *t) const;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -37,7 +37,7 @@
#include "autotoolsbuildconfiguration.h" #include "autotoolsbuildconfiguration.h"
#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorer.h>
#include <projectexplorer/toolchainmanager.h> #include <projectexplorer/target.h>
#include <QGridLayout> #include <QGridLayout>
#include <QLabel> #include <QLabel>
@@ -50,10 +50,7 @@ using namespace AutotoolsProjectManager;
using namespace AutotoolsProjectManager::Internal; using namespace AutotoolsProjectManager::Internal;
using namespace ProjectExplorer; using namespace ProjectExplorer;
AutotoolsBuildSettingsWidget::AutotoolsBuildSettingsWidget(AutotoolsTarget *target) : AutotoolsBuildSettingsWidget::AutotoolsBuildSettingsWidget() :
m_target(target),
m_pathChooser(0),
m_toolChainChooser(0),
m_buildConfiguration(0) m_buildConfiguration(0)
{ {
QFormLayout *fl = new QFormLayout(this); QFormLayout *fl = new QFormLayout(this);
@@ -63,23 +60,8 @@ AutotoolsBuildSettingsWidget::AutotoolsBuildSettingsWidget(AutotoolsTarget *targ
m_pathChooser = new Utils::PathChooser(this); m_pathChooser = new Utils::PathChooser(this);
m_pathChooser->setEnabled(true); m_pathChooser->setEnabled(true);
m_pathChooser->setExpectedKind(Utils::PathChooser::Directory); m_pathChooser->setExpectedKind(Utils::PathChooser::Directory);
m_pathChooser->setBaseDirectory(m_target->autotoolsProject()->projectDirectory());
fl->addRow(tr("Build directory:"), m_pathChooser); fl->addRow(tr("Build directory:"), m_pathChooser);
connect(m_pathChooser, SIGNAL(changed(QString)), this, SLOT(buildDirectoryChanged())); connect(m_pathChooser, SIGNAL(changed(QString)), this, SLOT(buildDirectoryChanged()));
// tool chain
m_toolChainChooser = new QComboBox;
m_toolChainChooser->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
updateToolChainList();
fl->addRow(tr("Tool chain:"), m_toolChainChooser);
connect(m_toolChainChooser, SIGNAL(activated(int)), this, SLOT(toolChainSelected(int)));
connect(m_target->autotoolsProject(), SIGNAL(toolChainChanged(ProjectExplorer::ToolChain*)),
this, SLOT(toolChainChanged(ProjectExplorer::ToolChain*)));
connect(ProjectExplorer::ToolChainManager::instance(), SIGNAL(toolChainAdded(ProjectExplorer::ToolChain*)),
this, SLOT(updateToolChainList()));
connect(ProjectExplorer::ToolChainManager::instance(), SIGNAL(toolChainRemoved(ProjectExplorer::ToolChain*)),
this, SLOT(updateToolChainList()));
} }
QString AutotoolsBuildSettingsWidget::displayName() const QString AutotoolsBuildSettingsWidget::displayName() const
@@ -90,6 +72,7 @@ QString AutotoolsBuildSettingsWidget::displayName() const
void AutotoolsBuildSettingsWidget::init(BuildConfiguration *bc) void AutotoolsBuildSettingsWidget::init(BuildConfiguration *bc)
{ {
m_buildConfiguration = static_cast<AutotoolsBuildConfiguration *>(bc); m_buildConfiguration = static_cast<AutotoolsBuildConfiguration *>(bc);
m_pathChooser->setBaseDirectory(bc->target()->project()->projectDirectory());
m_pathChooser->setPath(m_buildConfiguration->buildDirectory()); m_pathChooser->setPath(m_buildConfiguration->buildDirectory());
} }
@@ -97,39 +80,3 @@ void AutotoolsBuildSettingsWidget::buildDirectoryChanged()
{ {
m_buildConfiguration->setBuildDirectory(m_pathChooser->rawPath()); m_buildConfiguration->setBuildDirectory(m_pathChooser->rawPath());
} }
void AutotoolsBuildSettingsWidget::toolChainSelected(int index)
{
using namespace ProjectExplorer;
ToolChain *tc = static_cast<ToolChain *>(m_toolChainChooser->itemData(index).value<void *>());
m_target->autotoolsProject()->setToolChain(tc);
}
void AutotoolsBuildSettingsWidget::toolChainChanged(ProjectExplorer::ToolChain *tc)
{
for (int i = 0; i < m_toolChainChooser->count(); ++i) {
ToolChain *currentTc = static_cast<ToolChain *>(m_toolChainChooser->itemData(i).value<void *>());
if (currentTc != tc)
continue;
m_toolChainChooser->setCurrentIndex(i);
return;
}
}
void AutotoolsBuildSettingsWidget::updateToolChainList()
{
m_toolChainChooser->clear();
QList<ToolChain *> tcs = ToolChainManager::instance()->toolChains();
if (!m_target->autotoolsProject()->toolChain()) {
m_toolChainChooser->addItem(tr("<Invalid tool chain>"), qVariantFromValue(static_cast<void *>(0)));
m_toolChainChooser->setCurrentIndex(0);
}
foreach (ToolChain *tc, tcs) {
m_toolChainChooser->addItem(tc->displayName(), qVariantFromValue(static_cast<void *>(tc)));
if (m_target->autotoolsProject()->toolChain()
&& m_target->autotoolsProject()->toolChain()->id() == tc->id())
m_toolChainChooser->setCurrentIndex(m_toolChainChooser->count() - 1);
}
}

View File

@@ -35,12 +35,10 @@
#ifndef AUTOTOOLSBUILDSETTINGSWIDGET_H #ifndef AUTOTOOLSBUILDSETTINGSWIDGET_H
#define AUTOTOOLSBUILDSETTINGSWIDGET_H #define AUTOTOOLSBUILDSETTINGSWIDGET_H
#include "autotoolstarget.h"
#include "autotoolsbuildconfiguration.h" #include "autotoolsbuildconfiguration.h"
#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
#include <projectexplorer/toolchain.h>
#include <projectexplorer/buildstep.h> #include <projectexplorer/buildstep.h>
#include <utils/pathchooser.h> #include <utils/pathchooser.h>
@@ -51,7 +49,7 @@ QT_END_NAMESPACE
namespace AutotoolsProjectManager { namespace AutotoolsProjectManager {
namespace Internal { namespace Internal {
class AutotoolsProject; class AutotoolsBuildConfiguration;
/** /**
* @brief Implementation of ProjectExplorer::BuildConfigWidget interface. * @brief Implementation of ProjectExplorer::BuildConfigWidget interface.
@@ -63,21 +61,16 @@ class AutotoolsBuildSettingsWidget : public ProjectExplorer::BuildConfigWidget
Q_OBJECT Q_OBJECT
public: public:
explicit AutotoolsBuildSettingsWidget(AutotoolsTarget *target); AutotoolsBuildSettingsWidget();
QString displayName() const; QString displayName() const;
void init(ProjectExplorer::BuildConfiguration *bc); void init(ProjectExplorer::BuildConfiguration *bc);
private slots: private slots:
void buildDirectoryChanged(); void buildDirectoryChanged();
void toolChainSelected(int index);
void toolChainChanged(ProjectExplorer::ToolChain *tc);
void updateToolChainList();
private: private:
AutotoolsTarget *m_target;
Utils::PathChooser *m_pathChooser; Utils::PathChooser *m_pathChooser;
QComboBox *m_toolChainChooser;
AutotoolsBuildConfiguration *m_buildConfiguration; AutotoolsBuildConfiguration *m_buildConfiguration;
}; };

View File

@@ -33,6 +33,7 @@
**************************************************************************/ **************************************************************************/
#include "autotoolsproject.h" #include "autotoolsproject.h"
#include "autotoolsbuildconfiguration.h"
#include "autotoolsprojectconstants.h" #include "autotoolsprojectconstants.h"
#include "autotoolsmanager.h" #include "autotoolsmanager.h"
#include "autotoolsprojectnode.h" #include "autotoolsprojectnode.h"
@@ -43,10 +44,12 @@
#include <projectexplorer/abi.h> #include <projectexplorer/abi.h>
#include <projectexplorer/buildenvironmentwidget.h> #include <projectexplorer/buildenvironmentwidget.h>
#include <projectexplorer/toolchainmanager.h> #include <projectexplorer/profilemanager.h>
#include <projectexplorer/profileinformation.h>
#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/target.h>
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include <cpptools/ModelManagerInterface.h> #include <cpptools/ModelManagerInterface.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
@@ -65,8 +68,6 @@ using namespace AutotoolsProjectManager;
using namespace AutotoolsProjectManager::Internal; using namespace AutotoolsProjectManager::Internal;
using namespace ProjectExplorer; using namespace ProjectExplorer;
const char TOOLCHAIN_KEY[] = "AutotoolsProjectManager.AutotoolsProject.Toolchain";
AutotoolsProject::AutotoolsProject(AutotoolsManager *manager, const QString &fileName) : AutotoolsProject::AutotoolsProject(AutotoolsManager *manager, const QString &fileName) :
m_manager(manager), m_manager(manager),
m_fileName(fileName), m_fileName(fileName),
@@ -75,8 +76,7 @@ AutotoolsProject::AutotoolsProject(AutotoolsManager *manager, const QString &fil
m_rootNode(new AutotoolsProjectNode(this, m_file)), m_rootNode(new AutotoolsProjectNode(this, m_file)),
m_fileWatcher(new Utils::FileSystemWatcher(this)), m_fileWatcher(new Utils::FileSystemWatcher(this)),
m_watchedFiles(), m_watchedFiles(),
m_makefileParserThread(0), m_makefileParserThread(0)
m_toolChain(0)
{ {
setProjectContext(Core::Context(Constants::PROJECT_CONTEXT)); setProjectContext(Core::Context(Constants::PROJECT_CONTEXT));
setProjectLanguage(Core::Context(ProjectExplorer::Constants::LANG_CXX)); setProjectLanguage(Core::Context(ProjectExplorer::Constants::LANG_CXX));
@@ -103,26 +103,6 @@ AutotoolsProject::~AutotoolsProject()
} }
} }
void AutotoolsProject::setToolChain(ToolChain *tc)
{
if (m_toolChain == tc)
return;
m_toolChain = tc;
foreach (Target *t, targets()) {
foreach (BuildConfiguration *bc, t->buildConfigurations())
bc->setToolChain(tc);
}
emit toolChainChanged(m_toolChain);
}
ToolChain *AutotoolsProject::toolChain() const
{
return m_toolChain;
}
QString AutotoolsProject::displayName() const QString AutotoolsProject::displayName() const
{ {
return m_projectName; return m_projectName;
@@ -143,11 +123,6 @@ IProjectManager *AutotoolsProject::projectManager() const
return m_manager; return m_manager;
} }
AutotoolsTarget *AutotoolsProject::activeTarget() const
{
return static_cast<AutotoolsTarget *>(Project::activeTarget());
}
QString AutotoolsProject::defaultBuildDirectory() const QString AutotoolsProject::defaultBuildDirectory() const
{ {
return projectDirectory(); return projectDirectory();
@@ -169,13 +144,6 @@ QStringList AutotoolsProject::files(FilesMode fileMode) const
return m_files; return m_files;
} }
QVariantMap AutotoolsProject::toMap() const
{
QVariantMap map = Project::toMap();
map.insert(QLatin1String(TOOLCHAIN_KEY), m_toolChain ? m_toolChain->id() : QString());
return map;
}
// This function, is called at the very beginning, to // This function, is called at the very beginning, to
// restore the settings if there are some stored. // restore the settings if there are some stored.
bool AutotoolsProject::fromMap(const QVariantMap &map) bool AutotoolsProject::fromMap(const QVariantMap &map)
@@ -183,57 +151,19 @@ bool AutotoolsProject::fromMap(const QVariantMap &map)
if (!Project::fromMap(map)) if (!Project::fromMap(map))
return false; return false;
// Check if this project was already loaded by checking
// if there already exists a .user file.
bool hasUserFile = activeTarget();
if (!hasUserFile) {
AutotoolsTargetFactory *factory =
ExtensionSystem::PluginManager::getObject<AutotoolsTargetFactory>();
AutotoolsTarget *t = factory->create(this, Core::Id(Constants::DEFAULT_AUTOTOOLS_TARGET_ID));
QTC_ASSERT(t, return false);
QTC_ASSERT(t->activeBuildConfiguration(), return false);
// Ask the user for where he/she wants to build it.
QPointer<AutotoolsOpenProjectWizard> wizard = new AutotoolsOpenProjectWizard(m_manager, projectDirectory());
if (!wizard->exec() == QDialog::Accepted)
return false;
AutotoolsBuildConfiguration *bc =
static_cast<AutotoolsBuildConfiguration *>(t->buildConfigurations().at(0));
if (!wizard->buildDirectory().isEmpty())
bc->setBuildDirectory(wizard->buildDirectory());
addTarget(t);
}
// Toolchain
QString id = map.value(QLatin1String(TOOLCHAIN_KEY)).toString();
const ToolChainManager *toolChainManager = ToolChainManager::instance();
if (!id.isNull()) {
setToolChain(toolChainManager->findToolChain(id));
} else {
Abi abi = Abi::hostAbi();
abi = Abi(abi.architecture(), abi.os(), Abi::UnknownFlavor,
abi.binaryFormat(), abi.wordWidth() == 32 ? 32 : 0);
QList<ToolChain *> tcs = toolChainManager->findToolChains(abi);
if (tcs.isEmpty())
tcs = toolChainManager->toolChains();
if (!tcs.isEmpty())
setToolChain(tcs.at(0));
}
connect(m_fileWatcher, SIGNAL(fileChanged(QString)), connect(m_fileWatcher, SIGNAL(fileChanged(QString)),
this, SLOT(onFileChanged(QString))); this, SLOT(onFileChanged(QString)));
// Load the project tree structure. // Load the project tree structure.
loadProjectTree(); evaluateBuildSystem();
if (!activeTarget())
addTarget(createTarget(ProfileManager::instance()->defaultProfile()));
return true; return true;
} }
void AutotoolsProject::loadProjectTree() void AutotoolsProject::evaluateBuildSystem()
{ {
if (m_makefileParserThread != 0) { if (m_makefileParserThread != 0) {
// The thread is still busy parsing a previus configuration. // The thread is still busy parsing a previus configuration.
@@ -325,12 +255,14 @@ void AutotoolsProject::makefileParsingFinished()
m_makefileParserThread->deleteLater(); m_makefileParserThread->deleteLater();
m_makefileParserThread = 0; m_makefileParserThread = 0;
buildSystemEvaluationFinished(true);
} }
void AutotoolsProject::onFileChanged(const QString &file) void AutotoolsProject::onFileChanged(const QString &file)
{ {
Q_UNUSED(file); Q_UNUSED(file);
loadProjectTree(); evaluateBuildSystem();
} }
QStringList AutotoolsProject::buildTargets() const QStringList AutotoolsProject::buildTargets() const
@@ -483,15 +415,20 @@ void AutotoolsProject::updateCppCodeModel()
QStringList allIncludePaths = m_makefileParserThread->includePaths(); QStringList allIncludePaths = m_makefileParserThread->includePaths();
QStringList allFrameworkPaths; QStringList allFrameworkPaths;
QByteArray macros;
if (m_toolChain) { if (activeTarget()) {
const QList<HeaderPath> allHeaderPaths = m_toolChain->systemHeaderPaths(); ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(activeTarget()->profile());
foreach (const HeaderPath &headerPath, allHeaderPaths) { if (tc) {
if (headerPath.kind() == HeaderPath::FrameworkHeaderPath) { const QList<HeaderPath> allHeaderPaths = tc->systemHeaderPaths();
allFrameworkPaths.append(headerPath.path()); foreach (const HeaderPath &headerPath, allHeaderPaths) {
} else { if (headerPath.kind() == HeaderPath::FrameworkHeaderPath)
allIncludePaths.append(headerPath.path()); allFrameworkPaths.append(headerPath.path());
else
allIncludePaths.append(headerPath.path());
} }
macros = tc->predefinedMacros(QStringList());
macros += '\n';
} }
} }
@@ -499,7 +436,7 @@ void AutotoolsProject::updateCppCodeModel()
const bool update = (pinfo.includePaths() != allIncludePaths) const bool update = (pinfo.includePaths() != allIncludePaths)
|| (pinfo.sourceFiles() != m_files) || (pinfo.sourceFiles() != m_files)
|| (pinfo.defines() != m_toolChain->predefinedMacros(QStringList())) || (pinfo.defines() != macros)
|| (pinfo.frameworkPaths() != allFrameworkPaths); || (pinfo.frameworkPaths() != allFrameworkPaths);
if (update) { if (update) {
pinfo.clearProjectParts(); pinfo.clearProjectParts();
@@ -507,8 +444,7 @@ void AutotoolsProject::updateCppCodeModel()
new CPlusPlus::CppModelManagerInterface::ProjectPart); new CPlusPlus::CppModelManagerInterface::ProjectPart);
part->includePaths = allIncludePaths; part->includePaths = allIncludePaths;
part->sourceFiles = m_files; part->sourceFiles = m_files;
if (m_toolChain) part->defines = macros;
part->defines = m_toolChain->predefinedMacros(QStringList());
part->frameworkPaths = allFrameworkPaths; part->frameworkPaths = allFrameworkPaths;
part->language = CPlusPlus::CppModelManagerInterface::CXX; part->language = CPlusPlus::CppModelManagerInterface::CXX;
pinfo.appendProjectPart(part); pinfo.appendProjectPart(part);

View File

@@ -35,10 +35,7 @@
#ifndef AUTOTOOLSPROJECT_H #ifndef AUTOTOOLSPROJECT_H
#define AUTOTOOLSPROJECT_H #define AUTOTOOLSPROJECT_H
#include "autotoolstarget.h"
#include <coreplugin/editormanager/ieditor.h> #include <coreplugin/editormanager/ieditor.h>
#include <projectexplorer/toolchain.h>
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorer.h>
#include <projectexplorer/projectnodes.h> #include <projectexplorer/projectnodes.h>
@@ -47,10 +44,6 @@
#include <QPointer> #include <QPointer>
#include <QDir> #include <QDir>
namespace ProjectExplorer {
class ToolChain;
}
namespace AutotoolsProjectManager { namespace AutotoolsProjectManager {
namespace Internal { namespace Internal {
class AutotoolsConfigurationFactory; class AutotoolsConfigurationFactory;
@@ -80,18 +73,11 @@ public:
Core::Id id() const; Core::Id id() const;
Core::IDocument *document() const; Core::IDocument *document() const;
ProjectExplorer::IProjectManager *projectManager() const; ProjectExplorer::IProjectManager *projectManager() const;
AutotoolsTarget *activeTarget() const;
QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets(); QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets();
ProjectExplorer::ProjectNode *rootProjectNode() const; ProjectExplorer::ProjectNode *rootProjectNode() const;
QStringList files(FilesMode fileMode) const; QStringList files(FilesMode fileMode) const;
QString defaultBuildDirectory() const; QString defaultBuildDirectory() const;
QStringList buildTargets() const; QStringList buildTargets() const;
ProjectExplorer::ToolChain *toolChain() const;
void setToolChain(ProjectExplorer::ToolChain *tc);
QVariantMap toMap() const;
signals:
void toolChainChanged(ProjectExplorer::ToolChain *tc);
protected: protected:
bool fromMap(const QVariantMap &map); bool fromMap(const QVariantMap &map);
@@ -100,7 +86,7 @@ private slots:
/** /**
* Loads the project tree by parsing the makefiles. * Loads the project tree by parsing the makefiles.
*/ */
void loadProjectTree(); void evaluateBuildSystem();
/** /**
* Is invoked when the makefile parsing by m_makefileParserThread has * Is invoked when the makefile parsing by m_makefileParserThread has
@@ -171,8 +157,6 @@ private:
/// Responsible for parsing the makefiles asynchronously in a thread /// Responsible for parsing the makefiles asynchronously in a thread
MakefileParserThread *m_makefileParserThread; MakefileParserThread *m_makefileParserThread;
ProjectExplorer::ToolChain *m_toolChain;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -46,9 +46,6 @@ namespace Constants {
const char AUTOTOOLS_BC_ID[] = "AutotoolsProjectManager.AutotoolsBuildConfiguration"; const char AUTOTOOLS_BC_ID[] = "AutotoolsProjectManager.AutotoolsBuildConfiguration";
const char BUILD_DIRECTORY_KEY[] = "AutotoolsProjectManager.AutotoolsBuildConfiguration.BuildDirectory"; const char BUILD_DIRECTORY_KEY[] = "AutotoolsProjectManager.AutotoolsBuildConfiguration.BuildDirectory";
//Target
const char DEFAULT_AUTOTOOLS_TARGET_ID[] = "AutotoolsProjectManager.DefaultAutotoolsTarget";
//Project //Project
const char AUTOTOOLS_PROJECT_ID[] = "AutotoolsProjectManager.AutotoolsProject"; const char AUTOTOOLS_PROJECT_ID[] = "AutotoolsProjectManager.AutotoolsProject";
const char PROJECT_CONTEXT[] = "AutotoolsProject.ProjectContext"; const char PROJECT_CONTEXT[] = "AutotoolsProject.ProjectContext";

View File

@@ -12,7 +12,6 @@ HEADERS = autotoolsprojectplugin.h\
autotoolsprojectfile.h\ autotoolsprojectfile.h\
autotoolsprojectnode.h\ autotoolsprojectnode.h\
autotoolsproject.h\ autotoolsproject.h\
autotoolstarget.h\
autotoolsbuildsettingswidget.h\ autotoolsbuildsettingswidget.h\
autotoolsbuildconfiguration.h\ autotoolsbuildconfiguration.h\
autotoolsprojectconstants.h\ autotoolsprojectconstants.h\
@@ -28,7 +27,6 @@ SOURCES = autotoolsprojectplugin.cpp\
autotoolsprojectfile.cpp\ autotoolsprojectfile.cpp\
autotoolsprojectnode.cpp\ autotoolsprojectnode.cpp\
autotoolsproject.cpp\ autotoolsproject.cpp\
autotoolstarget.cpp\
autotoolsbuildsettingswidget.cpp\ autotoolsbuildsettingswidget.cpp\
autotoolsbuildconfiguration.cpp\ autotoolsbuildconfiguration.cpp\
makestep.cpp\ makestep.cpp\

View File

@@ -43,8 +43,6 @@ QtcPlugin {
"autotoolsprojectnode.h", "autotoolsprojectnode.h",
"autotoolsprojectplugin.cpp", "autotoolsprojectplugin.cpp",
"autotoolsprojectplugin.h", "autotoolsprojectplugin.h",
"autotoolstarget.cpp",
"autotoolstarget.h",
"configurestep.cpp", "configurestep.cpp",
"configurestep.h", "configurestep.h",
"makefileparser.cpp", "makefileparser.cpp",

View File

@@ -34,7 +34,6 @@
#include "autotoolsprojectplugin.h" #include "autotoolsprojectplugin.h"
#include "autotoolsmanager.h" #include "autotoolsmanager.h"
#include "autotoolstarget.h"
#include "autotoolsbuildconfiguration.h" #include "autotoolsbuildconfiguration.h"
#include "makestep.h" #include "makestep.h"
#include "autogenstep.h" #include "autogenstep.h"
@@ -66,7 +65,7 @@ bool AutotoolsProjectPlugin::initialize(const QStringList &arguments,
if (!Core::ICore::mimeDatabase()->addMimeTypes(QLatin1String(":autotoolsproject/AutotoolsProject.mimetypes.xml"), errorString)) if (!Core::ICore::mimeDatabase()->addMimeTypes(QLatin1String(":autotoolsproject/AutotoolsProject.mimetypes.xml"), errorString))
return false; return false;
addAutoReleasedObject(new AutotoolsTargetFactory); addAutoReleasedObject(new AutotoolsBuildConfigurationFactory);
addAutoReleasedObject(new MakeStepFactory); addAutoReleasedObject(new MakeStepFactory);
addAutoReleasedObject(new AutogenStepFactory); addAutoReleasedObject(new AutogenStepFactory);
addAutoReleasedObject(new ConfigureStepFactory); addAutoReleasedObject(new ConfigureStepFactory);

View File

@@ -1,175 +0,0 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2010-2011 Openismus GmbH.
** Authors: Peter Penz (ppenz@openismus.com)
** Patricia Santana Cruz (patriciasantanacruz@gmail.com)
**
** Contact: Nokia Corporation (info@qt.nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at info@qt.nokia.com.
**
**************************************************************************/
#include "autotoolstarget.h"
#include "autotoolsproject.h"
#include "autotoolsprojectconstants.h"
#include "autotoolsbuildsettingswidget.h"
#include "autotoolsbuildconfiguration.h"
#include "makestep.h"
#include "autogenstep.h"
#include "autoreconfstep.h"
#include "configurestep.h"
#include <projectexplorer/buildsteplist.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <qtsupport/customexecutablerunconfiguration.h>
#include <extensionsystem/pluginmanager.h>
#include <QApplication>
#include <QStyle>
using namespace AutotoolsProjectManager;
using namespace AutotoolsProjectManager::Internal;
using namespace ProjectExplorer;
static QString displayNameForId(const Core::Id id)
{
if (id == Core::Id(AutotoolsProjectManager::Constants::DEFAULT_AUTOTOOLS_TARGET_ID))
return QApplication::translate("AutotoolsProjectManager::Internal::AutotoolsTarget",
"Desktop", "Autotools Default target display name");
return QString();
}
//////////////////////////
// AutotoolsTarget class
//////////////////////////
AutotoolsTarget::AutotoolsTarget(AutotoolsProject *parent) :
Target(parent, Core::Id(Constants::DEFAULT_AUTOTOOLS_TARGET_ID)),
m_buildConfigurationFactory(new AutotoolsBuildConfigurationFactory(this))
{
setDefaultDisplayName(displayNameForId(id()));
setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon));
}
BuildConfigWidget *AutotoolsTarget::createConfigWidget()
{
return new AutotoolsBuildSettingsWidget(this);
}
AutotoolsProject *AutotoolsTarget::autotoolsProject() const
{
return static_cast<AutotoolsProject *>(project());
}
AutotoolsBuildConfiguration *AutotoolsTarget::activeBuildConfiguration() const
{
return static_cast<AutotoolsBuildConfiguration *>(Target::activeBuildConfiguration());
}
AutotoolsBuildConfigurationFactory *AutotoolsTarget::buildConfigurationFactory() const
{
return m_buildConfigurationFactory;
}
QString AutotoolsTarget::defaultBuildDirectory() const
{
return autotoolsProject()->defaultBuildDirectory();
}
bool AutotoolsTarget::fromMap(const QVariantMap &map)
{
return Target::fromMap(map);
}
/////////////////////////////////
// AutotoolsTargetFactory class
/////////////////////////////////
AutotoolsTargetFactory::AutotoolsTargetFactory(QObject *parent) :
ITargetFactory(parent)
{
}
bool AutotoolsTargetFactory::supportsTargetId(const Core::Id id) const
{
return id == Core::Id(Constants::DEFAULT_AUTOTOOLS_TARGET_ID);
}
QList<Core::Id> AutotoolsTargetFactory::supportedTargetIds() const
{
return QList<Core::Id>() << Core::Id(Constants::DEFAULT_AUTOTOOLS_TARGET_ID);
}
QString AutotoolsTargetFactory::displayNameForId(const Core::Id id) const
{
return ::displayNameForId(id);
}
bool AutotoolsTargetFactory::canCreate(Project *parent, const Core::Id id) const
{
if (!qobject_cast<AutotoolsProject *>(parent))
return false;
return id == Core::Id(Constants::DEFAULT_AUTOTOOLS_TARGET_ID);
}
AutotoolsTarget *AutotoolsTargetFactory::create(Project *parent, const Core::Id id)
{
if (!canCreate(parent, id))
return 0;
AutotoolsProject *project(static_cast<AutotoolsProject *>(parent));
AutotoolsTarget *t = new AutotoolsTarget(project);
// Add default build configuration:
AutotoolsBuildConfigurationFactory *bcf = t->buildConfigurationFactory();
AutotoolsBuildConfiguration *bc = bcf->createDefaultConfiguration(t);
bc->setDisplayName(tr("Default Build"));
t->addBuildConfiguration(bc);
t->addDeployConfiguration(t->createDeployConfiguration(Core::Id(ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID)));
// User needs to choose where the executable file is.
// TODO: Parse the file in *Anjuta style* to be able to add custom RunConfigurations.
t->addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(t));
return t;
}
bool AutotoolsTargetFactory::canRestore(Project *parent, const QVariantMap &map) const
{
return canCreate(parent, idFromMap(map));
}
AutotoolsTarget *AutotoolsTargetFactory::restore(Project *parent, const QVariantMap &map)
{
if (!canRestore(parent, map))
return 0;
AutotoolsProject *autotoolsproject(static_cast<AutotoolsProject *>(parent));
AutotoolsTarget *target = new AutotoolsTarget(autotoolsproject);
if (target->fromMap(map))
return target;
delete target;
return 0;
}

View File

@@ -1,99 +0,0 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2010-2011 Openismus GmbH.
** Authors: Peter Penz (ppenz@openismus.com)
** Patricia Santana Cruz (patriciasantanacruz@gmail.com)
**
** Contact: Nokia Corporation (info@qt.nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at info@qt.nokia.com.
**
**************************************************************************/
#ifndef AUTOTOOLSTARGET_H
#define AUTOTOOLSTARGET_H
#include "autotoolsbuildconfiguration.h"
#include <projectexplorer/target.h>
namespace AutotoolsProjectManager {
namespace Internal {
class AutotoolsTargetFactory;
class AutotoolsBuildConfiguration;
class AutotoolsBuildConfigurationFactory;
class AutotoolsProject;
///////////////////////////
//// AutotoolsTarget class
///////////////////////////
class AutotoolsTarget : public ProjectExplorer::Target
{
Q_OBJECT
friend class AutotoolsTargetFactory;
public:
explicit AutotoolsTarget(AutotoolsProject *parent);
ProjectExplorer::BuildConfigWidget *createConfigWidget();
AutotoolsProject *autotoolsProject() const;
AutotoolsBuildConfigurationFactory *buildConfigurationFactory() const;
AutotoolsBuildConfiguration *activeBuildConfiguration() const;
QString defaultBuildDirectory() const;
protected:
bool fromMap(const QVariantMap &map);
private:
AutotoolsBuildConfigurationFactory *m_buildConfigurationFactory;
};
//////////////////////////////////
//// AutotoolsTargetFactory class
//////////////////////////////////
class AutotoolsTargetFactory : public ProjectExplorer::ITargetFactory
{
Q_OBJECT
public:
explicit AutotoolsTargetFactory(QObject *parent = 0);
bool supportsTargetId(const Core::Id id) const;
QList<Core::Id> supportedTargetIds() const;
QString displayNameForId(const Core::Id id) const;
bool canCreate(ProjectExplorer::Project *parent, const Core::Id id) const;
AutotoolsTarget *create(ProjectExplorer::Project *parent, const Core::Id id);
bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const;
AutotoolsTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map);
};
} // namespace Internal
} // namespace AutotoolsProjectManager
#endif // AUTOTOOLSTARGET_H

View File

@@ -34,11 +34,11 @@
#include "configurestep.h" #include "configurestep.h"
#include "autotoolsproject.h" #include "autotoolsproject.h"
#include "autotoolstarget.h"
#include "autotoolsbuildconfiguration.h" #include "autotoolsbuildconfiguration.h"
#include "autotoolsprojectconstants.h" #include "autotoolsprojectconstants.h"
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/target.h>
#include <projectexplorer/toolchain.h> #include <projectexplorer/toolchain.h>
#include <projectexplorer/gnumakeparser.h> #include <projectexplorer/gnumakeparser.h>
#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorer.h>
@@ -67,9 +67,9 @@ ConfigureStepFactory::ConfigureStepFactory(QObject *parent) :
QList<Core::Id> ConfigureStepFactory::availableCreationIds(BuildStepList *parent) const QList<Core::Id> ConfigureStepFactory::availableCreationIds(BuildStepList *parent) const
{ {
if (parent->target()->project()->id() == Core::Id(Constants::AUTOTOOLS_PROJECT_ID)) if (!canHandle(parent))
return QList<Core::Id>() << Core::Id(CONFIGURE_STEP_ID); return QList<Core::Id>();
return QList<Core::Id>(); return QList<Core::Id>() << Core::Id(CONFIGURE_STEP_ID);
} }
QString ConfigureStepFactory::displayNameForId(const Core::Id id) const QString ConfigureStepFactory::displayNameForId(const Core::Id id) const
@@ -81,13 +81,7 @@ QString ConfigureStepFactory::displayNameForId(const Core::Id id) const
bool ConfigureStepFactory::canCreate(BuildStepList *parent, const Core::Id id) const bool ConfigureStepFactory::canCreate(BuildStepList *parent, const Core::Id id) const
{ {
if (parent->target()->project()->id() != Core::Id(Constants::AUTOTOOLS_PROJECT_ID)) return canHandle(parent) && Core::Id(CONFIGURE_STEP_ID) == id;
return false;
if (parent->id() != Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD))
return false;
return Core::Id(CONFIGURE_STEP_ID) == id;
} }
BuildStep *ConfigureStepFactory::create(BuildStepList *parent, const Core::Id id) BuildStep *ConfigureStepFactory::create(BuildStepList *parent, const Core::Id id)
@@ -125,6 +119,13 @@ BuildStep *ConfigureStepFactory::restore(BuildStepList *parent, const QVariantMa
return 0; return 0;
} }
bool ConfigureStepFactory::canHandle(BuildStepList *parent) const
{
if (parent->target()->project()->id() != Core::Id(Constants::AUTOTOOLS_PROJECT_ID))
return false;
return parent->id() == Core::Id(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
}
//////////////////////// ////////////////////////
// ConfigureStep class // ConfigureStep class
//////////////////////// ////////////////////////
@@ -229,6 +230,19 @@ QVariantMap ConfigureStep::toMap() const
return map; return map;
} }
bool ConfigureStep::processSucceeded(int exitCode, QProcess::ExitStatus status)
{
if (exitCode != 0 || status != QProcess::NormalExit)
return false;
AutotoolsBuildConfiguration *bc = qobject_cast<AutotoolsBuildConfiguration *>(buildConfiguration());
if (!bc)
bc = qobject_cast<AutotoolsBuildConfiguration *>(target()->activeBuildConfiguration());
if (!bc)
return true;
bc->emitBuildDirectoryInitialized();
return true;
}
bool ConfigureStep::fromMap(const QVariantMap &map) bool ConfigureStep::fromMap(const QVariantMap &map)
{ {
m_additionalArguments = map.value(QLatin1String(CONFIGURE_ADDITIONAL_ARGUMENTS_KEY)).toString(); m_additionalArguments = map.value(QLatin1String(CONFIGURE_ADDITIONAL_ARGUMENTS_KEY)).toString();

View File

@@ -72,6 +72,8 @@ public:
ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source); ProjectExplorer::BuildStep *clone(ProjectExplorer::BuildStepList *parent, ProjectExplorer::BuildStep *source);
bool canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const; bool canRestore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map) const;
ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map); ProjectExplorer::BuildStep *restore(ProjectExplorer::BuildStepList *parent, const QVariantMap &map);
bool canHandle(ProjectExplorer::BuildStepList *parent) const;
}; };
////////////////////////// //////////////////////////
@@ -104,6 +106,8 @@ public:
QString additionalArguments() const; QString additionalArguments() const;
QVariantMap toMap() const; QVariantMap toMap() const;
bool processSucceeded(int exitCode, QProcess::ExitStatus status);
public slots: public slots:
void setAdditionalArguments(const QString &list); void setAdditionalArguments(const QString &list);

View File

@@ -36,11 +36,12 @@
#include "autotoolsproject.h" #include "autotoolsproject.h"
#include "autotoolsprojectconstants.h" #include "autotoolsprojectconstants.h"
#include "autotoolsbuildconfiguration.h" #include "autotoolsbuildconfiguration.h"
#include "autotoolstarget.h"
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/target.h>
#include <projectexplorer/toolchain.h> #include <projectexplorer/toolchain.h>
#include <projectexplorer/gnumakeparser.h> #include <projectexplorer/gnumakeparser.h>
#include <projectexplorer/profileinformation.h>
#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorer.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <utils/qtcprocess.h> #include <utils/qtcprocess.h>
@@ -65,8 +66,7 @@ const char MAKE_STEP_ADDITIONAL_ARGUMENTS_KEY[] = "AutotoolsProjectManager.MakeS
////////////////////////// //////////////////////////
MakeStepFactory::MakeStepFactory(QObject *parent) : MakeStepFactory::MakeStepFactory(QObject *parent) :
IBuildStepFactory(parent) IBuildStepFactory(parent)
{ { setObjectName(QLatin1String("Autotools::MakeStepFactory")); }
}
QList<Core::Id> MakeStepFactory::availableCreationIds(BuildStepList *parent) const QList<Core::Id> MakeStepFactory::availableCreationIds(BuildStepList *parent) const
{ {
@@ -87,9 +87,6 @@ bool MakeStepFactory::canCreate(BuildStepList *parent, const Core::Id id) const
if (parent->target()->project()->id() != Core::Id(AUTOTOOLS_PROJECT_ID)) if (parent->target()->project()->id() != Core::Id(AUTOTOOLS_PROJECT_ID))
return false; return false;
if (parent->id() != Core::Id(BUILDSTEPS_BUILD))
return false;
return Core::Id(MAKE_STEP_ID) == id; return Core::Id(MAKE_STEP_ID) == id;
} }
@@ -178,16 +175,18 @@ bool MakeStep::init()
setIgnoreReturnValue(m_clean); setIgnoreReturnValue(m_clean);
ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(bc->target()->profile());
ProcessParameters *pp = processParameters(); ProcessParameters *pp = processParameters();
pp->setMacroExpander(bc->macroExpander()); pp->setMacroExpander(bc->macroExpander());
pp->setEnvironment(bc->environment()); pp->setEnvironment(bc->environment());
pp->setWorkingDirectory(bc->buildDirectory()); pp->setWorkingDirectory(bc->buildDirectory());
pp->setCommand(bc->toolChain()->makeCommand()); pp->setCommand(tc ? tc->makeCommand() : QLatin1String("make"));
pp->setArguments(arguments); pp->setArguments(arguments);
setOutputParser(new GnuMakeParser()); setOutputParser(new GnuMakeParser());
if (bc->autotoolsTarget()->autotoolsProject()->toolChain()) if (tc)
appendOutputParser(bc->autotoolsTarget()->autotoolsProject()->toolChain()->outputParser()); appendOutputParser(tc->outputParser());
outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory()); outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory());
return AbstractProcessStep::init(); return AbstractProcessStep::init();
@@ -291,7 +290,7 @@ QString MakeStepConfigWidget::summaryText() const
void MakeStepConfigWidget::updateDetails() void MakeStepConfigWidget::updateDetails()
{ {
AutotoolsBuildConfiguration *bc = m_makeStep->autotoolsBuildConfiguration(); AutotoolsBuildConfiguration *bc = m_makeStep->autotoolsBuildConfiguration();
ToolChain *tc = bc->toolChain(); ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(m_makeStep->target()->profile());
if (tc) { if (tc) {
QString arguments = Utils::QtcProcess::joinArgs(m_makeStep->m_buildTargets); QString arguments = Utils::QtcProcess::joinArgs(m_makeStep->m_buildTargets);
@@ -305,7 +304,7 @@ void MakeStepConfigWidget::updateDetails()
param.setArguments(arguments); param.setArguments(arguments);
m_summaryText = param.summary(displayName()); m_summaryText = param.summary(displayName());
} else { } else {
m_summaryText = tr("<b>Unknown tool chain</b>"); m_summaryText = tr("<b>No tool chain set up for this profile</b>");
} }
emit updateSummary(); emit updateSummary();

View File

@@ -34,12 +34,11 @@
#include "cmakeopenprojectwizard.h" #include "cmakeopenprojectwizard.h"
#include "cmakeproject.h" #include "cmakeproject.h"
#include "cmaketarget.h"
#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/toolchainmanager.h>
#include <projectexplorer/toolchain.h>
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/profileinformation.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/target.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QInputDialog> #include <QInputDialog>
@@ -49,17 +48,19 @@ using namespace Internal;
namespace { namespace {
const char CMAKE_BC_ID[] = "CMakeProjectManager.CMakeBuildConfiguration"; const char CMAKE_BC_ID[] = "CMakeProjectManager.CMakeBuildConfiguration";
const char TOOLCHAIN_KEY[] = "CMakeProjectManager.CMakeBuildConfiguration.ToolChain";
const char BUILD_DIRECTORY_KEY[] = "CMakeProjectManager.CMakeBuildConfiguration.BuildDirectory"; const char BUILD_DIRECTORY_KEY[] = "CMakeProjectManager.CMakeBuildConfiguration.BuildDirectory";
} // namespace } // namespace
CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeTarget *parent) : CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent) :
BuildConfiguration(parent, Core::Id(CMAKE_BC_ID)) BuildConfiguration(parent, Core::Id(CMAKE_BC_ID))
{ {
m_buildDirectory = cmakeTarget()->defaultBuildDirectory(); CMakeProject *project = qobject_cast<CMakeProject *>(parent->project());
if (project)
m_buildDirectory = project->defaultBuildDirectory();
} }
CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeTarget *parent, CMakeBuildConfiguration *source) : CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent,
CMakeBuildConfiguration *source) :
BuildConfiguration(parent, source), BuildConfiguration(parent, source),
m_buildDirectory(source->m_buildDirectory), m_buildDirectory(source->m_buildDirectory),
m_msvcVersion(source->m_msvcVersion) m_msvcVersion(source->m_msvcVersion)
@@ -71,7 +72,6 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(CMakeTarget *parent, CMakeBuild
QVariantMap CMakeBuildConfiguration::toMap() const QVariantMap CMakeBuildConfiguration::toMap() const
{ {
QVariantMap map(ProjectExplorer::BuildConfiguration::toMap()); QVariantMap map(ProjectExplorer::BuildConfiguration::toMap());
map.insert(QLatin1String(TOOLCHAIN_KEY), toolChain() ? toolChain()->id() : QString());
map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory); map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory);
return map; return map;
} }
@@ -81,46 +81,17 @@ bool CMakeBuildConfiguration::fromMap(const QVariantMap &map)
if (!BuildConfiguration::fromMap(map)) if (!BuildConfiguration::fromMap(map))
return false; return false;
setToolChain(ProjectExplorer::ToolChainManager::instance()-> m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY)).toString();
findToolChain(map.value(QLatin1String(TOOLCHAIN_KEY)).toString()));
if (!toolChain()) {
// restoring from older versions?
QList<ProjectExplorer::ToolChain *> list = ProjectExplorer::ToolChainManager::instance()->toolChains();
if (!map.value("CMakeProjectManager.CMakeBuildConfiguration.MsvcVersion").toString().isEmpty()) {
foreach (ProjectExplorer::ToolChain *tc, list) {
if (tc->id().startsWith(ProjectExplorer::Constants::MSVC_TOOLCHAIN_ID)) {
setToolChain(tc);
break;
}
}
} else {
#ifdef Q_OS_WIN
QString toolChainId = ProjectExplorer::Constants::MINGW_TOOLCHAIN_ID;
#else
QString toolChainId = ProjectExplorer::Constants::GCC_TOOLCHAIN_ID;
#endif
foreach (ProjectExplorer::ToolChain *tc, list) {
if (tc->id().startsWith(toolChainId)) {
setToolChain(tc);
break;
}
}
}
}
m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY), cmakeTarget()->defaultBuildDirectory()).toString();
return true; return true;
} }
CMakeBuildConfiguration::~CMakeBuildConfiguration() CMakeBuildConfiguration::~CMakeBuildConfiguration()
{ { }
}
CMakeTarget *CMakeBuildConfiguration::cmakeTarget() const ProjectExplorer::BuildConfigWidget *CMakeBuildConfiguration::createConfigWidget()
{ {
return static_cast<CMakeTarget *>(target()); return new CMakeBuildSettingsWidget;
} }
QString CMakeBuildConfiguration::buildDirectory() const QString CMakeBuildConfiguration::buildDirectory() const
@@ -139,16 +110,16 @@ void CMakeBuildConfiguration::setBuildDirectory(const QString &buildDirectory)
ProjectExplorer::IOutputParser *CMakeBuildConfiguration::createOutputParser() const ProjectExplorer::IOutputParser *CMakeBuildConfiguration::createOutputParser() const
{ {
if (toolChain()) ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile());
return toolChain()->outputParser(); if (tc)
return tc->outputParser();
return 0; return 0;
} }
Utils::Environment CMakeBuildConfiguration::baseEnvironment() const Utils::Environment CMakeBuildConfiguration::baseEnvironment() const
{ {
Utils::Environment env = BuildConfiguration::baseEnvironment(); Utils::Environment env = BuildConfiguration::baseEnvironment();
if (toolChain()) target()->profile()->addToEnvironment(env);
toolChain()->addToEnvironment(env);
return env; return env;
} }
@@ -165,9 +136,9 @@ CMakeBuildConfigurationFactory::~CMakeBuildConfigurationFactory()
{ {
} }
QList<Core::Id> CMakeBuildConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const QList<Core::Id> CMakeBuildConfigurationFactory::availableCreationIds(const ProjectExplorer::Target *parent) const
{ {
if (!qobject_cast<CMakeTarget *>(parent)) if (!canHandle(parent))
return QList<Core::Id>(); return QList<Core::Id>();
return QList<Core::Id>() << Core::Id(CMAKE_BC_ID); return QList<Core::Id>() << Core::Id(CMAKE_BC_ID);
} }
@@ -179,34 +150,37 @@ QString CMakeBuildConfigurationFactory::displayNameForId(const Core::Id id) cons
return QString(); return QString();
} }
bool CMakeBuildConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const bool CMakeBuildConfigurationFactory::canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const
{ {
if (!qobject_cast<CMakeTarget *>(parent)) if (!canHandle(parent))
return false; return false;
if (id == Core::Id(CMAKE_BC_ID)) if (id == Core::Id(CMAKE_BC_ID))
return true; return true;
return false; return false;
} }
CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id) CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name)
{ {
if (!canCreate(parent, id)) if (!canCreate(parent, id))
return 0; return 0;
CMakeTarget *cmtarget = static_cast<CMakeTarget *>(parent); CMakeProject *project = qobject_cast<CMakeProject *>(parent->project());
Q_ASSERT(cmtarget); if (!project)
return 0;
//TODO configuration name should be part of the cmakeopenprojectwizard bool ok = true;
bool ok; QString buildConfigurationName = name;
QString buildConfigurationName = QInputDialog::getText(0, if (buildConfigurationName.isEmpty())
tr("New Configuration"), buildConfigurationName = QInputDialog::getText(0,
tr("New configuration name:"), tr("New Configuration"),
QLineEdit::Normal, tr("New configuration name:"),
QString(), QLineEdit::Normal,
&ok); QString(), &ok);
buildConfigurationName = buildConfigurationName.trimmed();
if (!ok || buildConfigurationName.isEmpty()) if (!ok || buildConfigurationName.isEmpty())
return 0; return 0;
CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(cmtarget);
CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(parent);
bc->setDisplayName(buildConfigurationName); bc->setDisplayName(buildConfigurationName);
ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
@@ -220,28 +194,25 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::create(ProjectExplorer:
cleanMakeStep->setAdditionalArguments("clean"); cleanMakeStep->setAdditionalArguments("clean");
cleanMakeStep->setClean(true); cleanMakeStep->setClean(true);
CMakeOpenProjectWizard copw(cmtarget->cmakeProject()->projectManager(), CMakeOpenProjectWizard copw(project->projectManager(),
cmtarget->project()->projectDirectory(), project->projectDirectory(),
bc->buildDirectory(), bc->buildDirectory(),
bc->environment()); bc->environment());
if (copw.exec() != QDialog::Accepted) { if (copw.exec() != QDialog::Accepted) {
delete bc; delete bc;
return 0; return 0;
} }
bc->setToolChain(copw.toolChain());
cmtarget->addBuildConfiguration(bc); // this also makes the name unique
bc->setBuildDirectory(copw.buildDirectory()); bc->setBuildDirectory(copw.buildDirectory());
cmtarget->cmakeProject()->parseCMakeLists();
// Default to all // Default to all
if (cmtarget->cmakeProject()->hasBuildTarget("all")) if (project->hasBuildTarget("all"))
makeStep->setBuildTarget("all", true); makeStep->setBuildTarget("all", true);
return bc; return bc;
} }
bool CMakeBuildConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const bool CMakeBuildConfigurationFactory::canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const
{ {
return canCreate(parent, source->id()); return canCreate(parent, source->id());
} }
@@ -251,11 +222,10 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::clone(ProjectExplorer::
if (!canClone(parent, source)) if (!canClone(parent, source))
return 0; return 0;
CMakeBuildConfiguration *old = static_cast<CMakeBuildConfiguration *>(source); CMakeBuildConfiguration *old = static_cast<CMakeBuildConfiguration *>(source);
CMakeTarget *cmtarget(static_cast<CMakeTarget *>(parent)); return new CMakeBuildConfiguration(parent, old);
return new CMakeBuildConfiguration(cmtarget, old);
} }
bool CMakeBuildConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const bool CMakeBuildConfigurationFactory::canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const
{ {
return canCreate(parent, ProjectExplorer::idFromMap(map)); return canCreate(parent, ProjectExplorer::idFromMap(map));
} }
@@ -264,14 +234,20 @@ CMakeBuildConfiguration *CMakeBuildConfigurationFactory::restore(ProjectExplorer
{ {
if (!canRestore(parent, map)) if (!canRestore(parent, map))
return 0; return 0;
CMakeTarget *cmtarget(static_cast<CMakeTarget *>(parent)); CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(parent);
CMakeBuildConfiguration *bc = new CMakeBuildConfiguration(cmtarget);
if (bc->fromMap(map)) if (bc->fromMap(map))
return bc; return bc;
delete bc; delete bc;
return 0; return 0;
} }
bool CMakeBuildConfigurationFactory::canHandle(const ProjectExplorer::Target *t) const
{
if (!t->project()->supportsProfile(t->profile()))
return false;
return qobject_cast<CMakeProject *>(t->project());
}
ProjectExplorer::BuildConfiguration::BuildType CMakeBuildConfiguration::buildType() const ProjectExplorer::BuildConfiguration::BuildType CMakeBuildConfiguration::buildType() const
{ {
QString cmakeBuildType; QString cmakeBuildType;
@@ -303,4 +279,3 @@ ProjectExplorer::BuildConfiguration::BuildType CMakeBuildConfiguration::buildTyp
return Unknown; return Unknown;
} }

View File

@@ -43,7 +43,6 @@ class ToolChain;
namespace CMakeProjectManager { namespace CMakeProjectManager {
namespace Internal { namespace Internal {
class CMakeTarget;
class CMakeBuildConfigurationFactory; class CMakeBuildConfigurationFactory;
class CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration class CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration
@@ -52,12 +51,11 @@ class CMakeBuildConfiguration : public ProjectExplorer::BuildConfiguration
friend class CMakeBuildConfigurationFactory; friend class CMakeBuildConfigurationFactory;
public: public:
CMakeBuildConfiguration(CMakeTarget *parent); CMakeBuildConfiguration(ProjectExplorer::Target *parent);
~CMakeBuildConfiguration(); ~CMakeBuildConfiguration();
CMakeTarget *cmakeTarget() const; ProjectExplorer::BuildConfigWidget *createConfigWidget();
QString buildDirectory() const;
virtual QString buildDirectory() const;
void setBuildDirectory(const QString &buildDirectory); void setBuildDirectory(const QString &buildDirectory);
@@ -70,7 +68,7 @@ public:
BuildType buildType() const; BuildType buildType() const;
protected: protected:
CMakeBuildConfiguration(CMakeTarget *parent, CMakeBuildConfiguration *source); CMakeBuildConfiguration(ProjectExplorer::Target *parent, CMakeBuildConfiguration *source);
virtual bool fromMap(const QVariantMap &map); virtual bool fromMap(const QVariantMap &map);
private: private:
@@ -86,15 +84,18 @@ public:
CMakeBuildConfigurationFactory(QObject *parent = 0); CMakeBuildConfigurationFactory(QObject *parent = 0);
~CMakeBuildConfigurationFactory(); ~CMakeBuildConfigurationFactory();
QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const; QList<Core::Id> availableCreationIds(const ProjectExplorer::Target *parent) const;
QString displayNameForId(const Core::Id id) const; QString displayNameForId(const Core::Id id) const;
bool canCreate(ProjectExplorer::Target *parent, const Core::Id id) const; bool canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const;
CMakeBuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id); CMakeBuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name = QString());
bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const;
CMakeBuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source); CMakeBuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source);
bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const;
CMakeBuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); CMakeBuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map);
private:
bool canHandle(const ProjectExplorer::Target *t) const;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -31,12 +31,12 @@
**************************************************************************/ **************************************************************************/
#include "cmakelocatorfilter.h" #include "cmakelocatorfilter.h"
#include "cmaketarget.h"
#include "cmakeproject.h" #include "cmakeproject.h"
#include "makestep.h" #include "makestep.h"
#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorer.h>
#include <projectexplorer/session.h> #include <projectexplorer/session.h>
#include <projectexplorer/target.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>

View File

@@ -34,7 +34,8 @@
#include "cmakeprojectmanager.h" #include "cmakeprojectmanager.h"
#include <utils/pathchooser.h> #include <utils/pathchooser.h>
#include <projectexplorer/toolchainmanager.h> #include <projectexplorer/profileinformation.h>
#include <projectexplorer/profilemanager.h>
#include <projectexplorer/toolchain.h> #include <projectexplorer/toolchain.h>
#include <projectexplorer/abi.h> #include <projectexplorer/abi.h>
#include <texteditor/fontsettings.h> #include <texteditor/fontsettings.h>
@@ -65,8 +66,7 @@ CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, const
: m_cmakeManager(cmakeManager), : m_cmakeManager(cmakeManager),
m_sourceDirectory(sourceDirectory), m_sourceDirectory(sourceDirectory),
m_creatingCbpFiles(false), m_creatingCbpFiles(false),
m_environment(env), m_environment(env)
m_toolChain(0)
{ {
int startid; int startid;
if (hasInSourceBuild()) { if (hasInSourceBuild()) {
@@ -98,8 +98,7 @@ CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, const
: m_cmakeManager(cmakeManager), : m_cmakeManager(cmakeManager),
m_sourceDirectory(sourceDirectory), m_sourceDirectory(sourceDirectory),
m_creatingCbpFiles(true), m_creatingCbpFiles(true),
m_environment(env), m_environment(env)
m_toolChain(0)
{ {
CMakeRunPage::Mode rmode; CMakeRunPage::Mode rmode;
@@ -119,8 +118,7 @@ CMakeOpenProjectWizard::CMakeOpenProjectWizard(CMakeManager *cmakeManager, const
: m_cmakeManager(cmakeManager), : m_cmakeManager(cmakeManager),
m_sourceDirectory(sourceDirectory), m_sourceDirectory(sourceDirectory),
m_creatingCbpFiles(true), m_creatingCbpFiles(true),
m_environment(env), m_environment(env)
m_toolChain(0)
{ {
m_buildDirectory = oldBuildDirectory; m_buildDirectory = oldBuildDirectory;
addPage(new ShadowBuildPage(this, true)); addPage(new ShadowBuildPage(this, true));
@@ -200,17 +198,6 @@ void CMakeOpenProjectWizard::setArguments(const QString &args)
m_arguments = args; m_arguments = args;
} }
ProjectExplorer::ToolChain *CMakeOpenProjectWizard::toolChain() const
{
return m_toolChain;
}
void CMakeOpenProjectWizard::setToolChain(ProjectExplorer::ToolChain *tc)
{
m_toolChain = tc;
}
Utils::Environment CMakeOpenProjectWizard::environment() const Utils::Environment CMakeOpenProjectWizard::environment() const
{ {
return m_environment; return m_environment;
@@ -414,51 +401,50 @@ void CMakeRunPage::initializePage()
Q_UNUSED(cmakeCxxCompiler); Q_UNUSED(cmakeCxxCompiler);
m_generatorComboBox->clear(); m_generatorComboBox->clear();
bool hasCodeBlocksGenerator = m_cmakeWizard->cmakeManager()->hasCodeBlocksMsvcGenerator(); bool hasCodeBlocksGenerator = m_cmakeWizard->cmakeManager()->hasCodeBlocksMsvcGenerator();
ProjectExplorer::Abi abi = ProjectExplorer::Abi::hostAbi();
abi = ProjectExplorer::Abi(abi.architecture(), abi.os(), ProjectExplorer::Abi::UnknownFlavor,
abi.binaryFormat(), 0);
QList<ProjectExplorer::ToolChain *> tcs =
ProjectExplorer::ToolChainManager::instance()->findToolChains(abi);
foreach (ProjectExplorer::ToolChain *tc, tcs) { QList<ProjectExplorer::Profile *> profileList =
ProjectExplorer::ProfileManager::instance()->profiles();
foreach (ProjectExplorer::Profile *p, profileList) {
QVariant profileVariant = qVariantFromValue(static_cast<void *>(p));
ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(p);
ProjectExplorer::Abi targetAbi = tc->targetAbi(); ProjectExplorer::Abi targetAbi = tc->targetAbi();
QVariant tcVariant = qVariantFromValue(static_cast<void *>(tc));
if (targetAbi.os() == ProjectExplorer::Abi::WindowsOS) { if (targetAbi.os() == ProjectExplorer::Abi::WindowsOS) {
if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2005Flavor if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2005Flavor
|| targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2008Flavor || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2008Flavor
|| targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2010Flavor) { || targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMsvc2010Flavor) {
if (hasCodeBlocksGenerator && (cachedGenerator.isEmpty() || cachedGenerator == "NMake Makefiles")) if (hasCodeBlocksGenerator && (cachedGenerator.isEmpty() || cachedGenerator == "NMake Makefiles"))
m_generatorComboBox->addItem(tr("NMake Generator (%1)").arg(tc->displayName()), tcVariant); m_generatorComboBox->addItem(tr("NMake Generator (%1)").arg(p->displayName()), profileVariant);
} else if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMSysFlavor) { } else if (targetAbi.osFlavor() == ProjectExplorer::Abi::WindowsMSysFlavor) {
if (cachedGenerator.isEmpty() || cachedGenerator == "MinGW Makefiles") if (cachedGenerator.isEmpty() || cachedGenerator == "MinGW Makefiles")
m_generatorComboBox->addItem(tr("MinGW Generator (%1)").arg(tc->displayName()), tcVariant); m_generatorComboBox->addItem(tr("MinGW Generator (%1)").arg(p->displayName()), profileVariant);
} }
} else { } else {
// Non windows // Non windows
if (cachedGenerator.isEmpty() || cachedGenerator == "Unix Makefiles") if (cachedGenerator.isEmpty() || cachedGenerator == "Unix Makefiles")
m_generatorComboBox->addItem(tr("Unix Generator (%1)").arg(tc->displayName()), tcVariant); m_generatorComboBox->addItem(tr("Unix Generator (%1)").arg(p->displayName()), profileVariant);
} }
} }
} }
void CMakeRunPage::runCMake() void CMakeRunPage::runCMake()
{ {
if (m_cmakeExecutable) { if (m_cmakeExecutable)
// We asked the user for the cmake executable // We asked the user for the cmake executable
m_cmakeWizard->cmakeManager()->setCMakeExecutable(m_cmakeExecutable->path()); m_cmakeWizard->cmakeManager()->setCMakeExecutable(m_cmakeExecutable->path());
}
int index = m_generatorComboBox->currentIndex(); int index = m_generatorComboBox->currentIndex();
ProjectExplorer::ToolChain *tc = 0; ProjectExplorer::Profile *p = 0;
if (index >= 0) if (index >= 0)
tc = static_cast<ProjectExplorer::ToolChain *>(m_generatorComboBox->itemData(index).value<void *>()); p = static_cast<ProjectExplorer::Profile *>(m_generatorComboBox->itemData(index).value<void *>());
if (!tc) { if (!p) {
m_output->appendPlainText(tr("No generator selected.")); m_output->appendPlainText(tr("No generator selected."));
return; return;
} }
m_cmakeWizard->setToolChain(tc); ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(p);
m_runCMake->setEnabled(false); m_runCMake->setEnabled(false);
m_argumentsLineEdit->setEnabled(false); m_argumentsLineEdit->setEnabled(false);
@@ -473,12 +459,9 @@ void CMakeRunPage::runCMake()
generator = QLatin1String("-GCodeBlocks - NMake Makefiles"); generator = QLatin1String("-GCodeBlocks - NMake Makefiles");
} }
Utils::Environment env = m_cmakeWizard->environment(); Utils::Environment env = m_cmakeWizard->environment();
tc->addToEnvironment(env); tc->addToEnvironment(env);
m_output->clear(); m_output->clear();
if (m_cmakeWizard->cmakeManager()->isCMakeExecutableValid()) { if (m_cmakeWizard->cmakeManager()->isCMakeExecutableValid()) {

View File

@@ -90,8 +90,6 @@ public:
CMakeManager *cmakeManager() const; CMakeManager *cmakeManager() const;
QString arguments() const; QString arguments() const;
void setArguments(const QString &args); void setArguments(const QString &args);
ProjectExplorer::ToolChain *toolChain() const;
void setToolChain(ProjectExplorer::ToolChain *);
Utils::Environment environment() const; Utils::Environment environment() const;
bool existsUpToDateXmlFile() const; bool existsUpToDateXmlFile() const;
@@ -104,7 +102,6 @@ private:
QString m_arguments; QString m_arguments;
bool m_creatingCbpFiles; bool m_creatingCbpFiles;
Utils::Environment m_environment; Utils::Environment m_environment;
ProjectExplorer::ToolChain *m_toolChain;
}; };
class InSourceBuildPage : public QWizardPage class InSourceBuildPage : public QWizardPage

View File

@@ -31,10 +31,11 @@
**************************************************************************/ **************************************************************************/
#include "cmakeproject.h" #include "cmakeproject.h"
#include "cmakebuildconfiguration.h"
#include "cmakeprojectconstants.h" #include "cmakeprojectconstants.h"
#include "cmakeprojectnodes.h" #include "cmakeprojectnodes.h"
#include "cmakerunconfiguration.h" #include "cmakerunconfiguration.h"
#include "cmaketarget.h"
#include "makestep.h" #include "makestep.h"
#include "cmakeopenprojectwizard.h" #include "cmakeopenprojectwizard.h"
#include "cmakebuildconfiguration.h" #include "cmakebuildconfiguration.h"
@@ -46,7 +47,11 @@
#include <projectexplorer/buildenvironmentwidget.h> #include <projectexplorer/buildenvironmentwidget.h>
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/buildmanager.h> #include <projectexplorer/buildmanager.h>
#include <projectexplorer/profileinformation.h>
#include <projectexplorer/profilemanager.h>
#include <projectexplorer/toolchain.h> #include <projectexplorer/toolchain.h>
#include <projectexplorer/target.h>
#include <qtsupport/customexecutablerunconfiguration.h>
#include <cpptools/ModelManagerInterface.h> #include <cpptools/ModelManagerInterface.h>
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -107,6 +112,8 @@ CMakeProject::CMakeProject(CMakeManager *manager, const QString &fileName)
connect(this, SIGNAL(addedTarget(ProjectExplorer::Target*)), connect(this, SIGNAL(addedTarget(ProjectExplorer::Target*)),
SLOT(targetAdded(ProjectExplorer::Target*))); SLOT(targetAdded(ProjectExplorer::Target*)));
connect(this, SIGNAL(buildDirectoryChanged()),
this, SLOT(triggerBuildSystemEvaluation()));
} }
CMakeProject::~CMakeProject() CMakeProject::~CMakeProject()
@@ -130,7 +137,7 @@ void CMakeProject::fileChanged(const QString &fileName)
{ {
Q_UNUSED(fileName) Q_UNUSED(fileName)
parseCMakeLists(); evaluateBuildSystem();
} }
void CMakeProject::changeActiveBuildConfiguration(ProjectExplorer::BuildConfiguration *bc) void CMakeProject::changeActiveBuildConfiguration(ProjectExplorer::BuildConfiguration *bc)
@@ -168,7 +175,7 @@ void CMakeProject::changeActiveBuildConfiguration(ProjectExplorer::BuildConfigur
copw.exec(); copw.exec();
} }
// reparse // reparse
parseCMakeLists(); evaluateBuildSystem();
} }
void CMakeProject::targetAdded(ProjectExplorer::Target *t) void CMakeProject::targetAdded(ProjectExplorer::Target *t)
@@ -183,7 +190,7 @@ void CMakeProject::targetAdded(ProjectExplorer::Target *t)
void CMakeProject::changeBuildDirectory(CMakeBuildConfiguration *bc, const QString &newBuildDirectory) void CMakeProject::changeBuildDirectory(CMakeBuildConfiguration *bc, const QString &newBuildDirectory)
{ {
bc->setBuildDirectory(newBuildDirectory); bc->setBuildDirectory(newBuildDirectory);
parseCMakeLists(); evaluateBuildSystem();
} }
QString CMakeProject::defaultBuildDirectory() const QString CMakeProject::defaultBuildDirectory() const
@@ -191,23 +198,31 @@ QString CMakeProject::defaultBuildDirectory() const
return projectDirectory() + QLatin1String("/qtcreator-build"); return projectDirectory() + QLatin1String("/qtcreator-build");
} }
bool CMakeProject::parseCMakeLists() void CMakeProject::evaluateBuildSystem()
{ {
if (!activeTarget() || if (!activeTarget() ||
!activeTarget()->activeBuildConfiguration()) !activeTarget()->activeBuildConfiguration()) {
return false; buildSystemEvaluationFinished(false);
return;
}
CMakeBuildConfiguration *activeBC = qobject_cast<CMakeBuildConfiguration *>(activeTarget()->activeBuildConfiguration());
if (!activeBC) {
buildSystemEvaluationFinished(false);
return;
}
foreach (Core::IEditor *editor, Core::EditorManager::instance()->openedEditors()) foreach (Core::IEditor *editor, Core::EditorManager::instance()->openedEditors())
if (isProjectFile(editor->document()->fileName())) if (isProjectFile(editor->document()->fileName()))
editor->document()->infoBar()->removeInfo(QLatin1String("CMakeEditor.RunCMake")); editor->document()->infoBar()->removeInfo(QLatin1String("CMakeEditor.RunCMake"));
// Find cbp file // Find cbp file
CMakeBuildConfiguration *activeBC = activeTarget()->activeBuildConfiguration();
QString cbpFile = CMakeManager::findCbpFile(activeBC->buildDirectory()); QString cbpFile = CMakeManager::findCbpFile(activeBC->buildDirectory());
if (cbpFile.isEmpty()) { if (cbpFile.isEmpty()) {
emit buildTargetsChanged(); emit buildTargetsChanged();
return false; buildSystemEvaluationFinished(true);
return;
} }
// setFolderName // setFolderName
@@ -218,7 +233,8 @@ bool CMakeProject::parseCMakeLists()
if (!cbpparser.parseCbpFile(cbpFile)) { if (!cbpparser.parseCbpFile(cbpFile)) {
// TODO report error // TODO report error
emit buildTargetsChanged(); emit buildTargetsChanged();
return false; buildSystemEvaluationFinished(true);
return;
} }
foreach (const QString &file, m_watcher->files()) foreach (const QString &file, m_watcher->files())
@@ -228,8 +244,6 @@ bool CMakeProject::parseCMakeLists()
// how can we ensure that it is completely written? // how can we ensure that it is completely written?
m_watcher->addPath(cbpFile); m_watcher->addPath(cbpFile);
// ToolChain
// activeBC->updateToolChain(cbpparser.compilerName());
m_projectName = cbpparser.projectName(); m_projectName = cbpparser.projectName();
m_rootNode->setDisplayName(cbpparser.projectName()); m_rootNode->setDisplayName(cbpparser.projectName());
@@ -285,22 +299,24 @@ bool CMakeProject::parseCMakeLists()
createUiCodeModelSupport(); createUiCodeModelSupport();
if (!activeBC->toolChain()) ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(activeTarget()->profile());
return true; if (!tc) {
buildSystemEvaluationFinished(true);
return;
}
QStringList allIncludePaths; QStringList allIncludePaths;
// This explicitly adds -I. to the include paths // This explicitly adds -I. to the include paths
allIncludePaths.append(projectDirectory()); allIncludePaths.append(projectDirectory());
allIncludePaths.append(cbpparser.includeFiles()); allIncludePaths.append(cbpparser.includeFiles());
QByteArray allDefines; QByteArray allDefines;
allDefines.append(activeBC->toolChain()->predefinedMacros(QStringList())); allDefines.append(tc->predefinedMacros(QStringList()));
allDefines.append(cbpparser.defines()); allDefines.append(cbpparser.defines());
QStringList allFrameworkPaths; QStringList allFrameworkPaths;
QList<ProjectExplorer::HeaderPath> allHeaderPaths; QList<ProjectExplorer::HeaderPath> allHeaderPaths;
if (activeBC->toolChain()) allHeaderPaths = tc->systemHeaderPaths();
allHeaderPaths = activeBC->toolChain()->systemHeaderPaths();
foreach (const ProjectExplorer::HeaderPath &headerPath, allHeaderPaths) { foreach (const ProjectExplorer::HeaderPath &headerPath, allHeaderPaths) {
if (headerPath.kind() == ProjectExplorer::HeaderPath::FrameworkHeaderPath) if (headerPath.kind() == ProjectExplorer::HeaderPath::FrameworkHeaderPath)
allFrameworkPaths.append(headerPath.path()); allFrameworkPaths.append(headerPath.path());
@@ -333,7 +349,8 @@ bool CMakeProject::parseCMakeLists()
} }
emit buildTargetsChanged(); emit buildTargetsChanged();
emit fileListChanged(); emit fileListChanged();
return true;
buildSystemEvaluationFinished(true);
} }
bool CMakeProject::isProjectFile(const QString &fileName) bool CMakeProject::isProjectFile(const QString &fileName)
@@ -501,11 +518,6 @@ CMakeManager *CMakeProject::projectManager() const
return m_manager; return m_manager;
} }
CMakeTarget *CMakeProject::activeTarget() const
{
return static_cast<CMakeTarget *>(Project::activeTarget());
}
QList<ProjectExplorer::BuildConfigWidget*> CMakeProject::subConfigWidgets() QList<ProjectExplorer::BuildConfigWidget*> CMakeProject::subConfigWidgets()
{ {
QList<ProjectExplorer::BuildConfigWidget*> list; QList<ProjectExplorer::BuildConfigWidget*> list;
@@ -530,74 +542,49 @@ bool CMakeProject::fromMap(const QVariantMap &map)
if (!Project::fromMap(map)) if (!Project::fromMap(map))
return false; return false;
bool hasUserFile = activeTarget(); if (!activeTarget())
if (!hasUserFile) { addTarget(createTarget(ProfileManager::instance()->defaultProfile()));
CMakeTargetFactory *factory =
ExtensionSystem::PluginManager::getObject<CMakeTargetFactory>();
CMakeTarget *t = factory->create(this, Core::Id(DEFAULT_CMAKE_TARGET_ID));
Q_ASSERT(t); // We have a user file, but we could still be missing the cbp file
Q_ASSERT(t->activeBuildConfiguration()); // or simply run createXml with the saved settings
QFileInfo sourceFileInfo(m_fileName);
CMakeBuildConfiguration *activeBC = qobject_cast<CMakeBuildConfiguration *>(activeTarget()->activeBuildConfiguration());
if (!activeBC)
return false;
QString cbpFile = CMakeManager::findCbpFile(QDir(activeBC->buildDirectory()));
QFileInfo cbpFileFi(cbpFile);
// Ask the user for where he wants to build it CMakeOpenProjectWizard::Mode mode = CMakeOpenProjectWizard::Nothing;
// and the cmake command line if (!cbpFileFi.exists())
mode = CMakeOpenProjectWizard::NeedToCreate;
else if (cbpFileFi.lastModified() < sourceFileInfo.lastModified())
mode = CMakeOpenProjectWizard::NeedToUpdate;
CMakeOpenProjectWizard copw(m_manager, projectDirectory(), Utils::Environment::systemEnvironment()); if (mode != CMakeOpenProjectWizard::Nothing) {
CMakeOpenProjectWizard copw(m_manager,
sourceFileInfo.absolutePath(),
activeBC->buildDirectory(),
mode,
activeBC->environment());
if (copw.exec() != QDialog::Accepted) if (copw.exec() != QDialog::Accepted)
return false; return false;
CMakeBuildConfiguration *bc =
static_cast<CMakeBuildConfiguration *>(t->buildConfigurations().at(0));
if (!copw.buildDirectory().isEmpty())
bc->setBuildDirectory(copw.buildDirectory());
bc->setToolChain(copw.toolChain());
addTarget(t);
} else {
// We have a user file, but we could still be missing the cbp file
// or simply run createXml with the saved settings
QFileInfo sourceFileInfo(m_fileName);
CMakeBuildConfiguration *activeBC = activeTarget()->activeBuildConfiguration();
QString cbpFile = CMakeManager::findCbpFile(QDir(activeBC->buildDirectory()));
QFileInfo cbpFileFi(cbpFile);
CMakeOpenProjectWizard::Mode mode = CMakeOpenProjectWizard::Nothing;
if (!cbpFileFi.exists())
mode = CMakeOpenProjectWizard::NeedToCreate;
else if (cbpFileFi.lastModified() < sourceFileInfo.lastModified())
mode = CMakeOpenProjectWizard::NeedToUpdate;
if (mode != CMakeOpenProjectWizard::Nothing) {
CMakeOpenProjectWizard copw(m_manager,
sourceFileInfo.absolutePath(),
activeBC->buildDirectory(),
mode,
activeBC->environment());
if (copw.exec() != QDialog::Accepted)
return false;
activeBC->setToolChain(copw.toolChain());
}
} }
m_watcher = new QFileSystemWatcher(this); m_watcher = new QFileSystemWatcher(this);
connect(m_watcher, SIGNAL(fileChanged(QString)), this, SLOT(fileChanged(QString))); connect(m_watcher, SIGNAL(fileChanged(QString)), this, SLOT(fileChanged(QString)));
if (!parseCMakeLists()) // Gets the directory from the active buildconfiguration triggerBuildSystemEvaluation();
return false;
if (!hasUserFile && hasBuildTarget("all")) { if (hasBuildTarget("all")) {
MakeStep *makeStep = qobject_cast<MakeStep *>( MakeStep *makeStep = qobject_cast<MakeStep *>(
activeTarget()->activeBuildConfiguration()->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD)->at(0)); activeTarget()->activeBuildConfiguration()->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD)->at(0));
Q_ASSERT(makeStep); Q_ASSERT(makeStep);
makeStep->setBuildTarget("all", true); makeStep->setBuildTarget("all", true);
} }
foreach (Target *t, targets()) { foreach (Target *t, targets())
connect(t, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)), connect(t, SIGNAL(activeBuildConfigurationChanged(ProjectExplorer::BuildConfiguration*)),
this, SLOT(changeActiveBuildConfiguration(ProjectExplorer::BuildConfiguration*))); this, SLOT(changeActiveBuildConfiguration(ProjectExplorer::BuildConfiguration*)));
connect(t, SIGNAL(environmentChanged()),
this, SLOT(changeEnvironment()));
}
connect(Core::EditorManager::instance(), SIGNAL(editorAboutToClose(Core::IEditor*)), connect(Core::EditorManager::instance(), SIGNAL(editorAboutToClose(Core::IEditor*)),
this, SLOT(editorAboutToClose(Core::IEditor*))); this, SLOT(editorAboutToClose(Core::IEditor*)));
@@ -817,8 +804,7 @@ bool CMakeFile::reload(QString *errorString, ReloadFlag flag, ChangeType type)
return true; return true;
} }
CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeTarget *target) CMakeBuildSettingsWidget::CMakeBuildSettingsWidget() : m_buildConfiguration(0)
: m_target(target), m_buildConfiguration(0)
{ {
QFormLayout *fl = new QFormLayout(this); QFormLayout *fl = new QFormLayout(this);
fl->setContentsMargins(20, -1, 0, -1); fl->setContentsMargins(20, -1, 0, -1);
@@ -853,7 +839,7 @@ void CMakeBuildSettingsWidget::init(BuildConfiguration *bc)
{ {
m_buildConfiguration = static_cast<CMakeBuildConfiguration *>(bc); m_buildConfiguration = static_cast<CMakeBuildConfiguration *>(bc);
m_pathLineEdit->setText(m_buildConfiguration->buildDirectory()); m_pathLineEdit->setText(m_buildConfiguration->buildDirectory());
if (m_buildConfiguration->buildDirectory() == m_target->cmakeProject()->projectDirectory()) if (m_buildConfiguration->buildDirectory() == bc->target()->project()->projectDirectory())
m_changeButton->setEnabled(false); m_changeButton->setEnabled(false);
else else
m_changeButton->setEnabled(true); m_changeButton->setEnabled(true);
@@ -861,7 +847,9 @@ void CMakeBuildSettingsWidget::init(BuildConfiguration *bc)
void CMakeBuildSettingsWidget::openChangeBuildDirectoryDialog() void CMakeBuildSettingsWidget::openChangeBuildDirectoryDialog()
{ {
CMakeProject *project = m_target->cmakeProject(); CMakeProject *project = qobject_cast<CMakeProject *>(m_buildConfiguration->target()->project());
if (!project)
return;
CMakeOpenProjectWizard copw(project->projectManager(), CMakeOpenProjectWizard copw(project->projectManager(),
project->projectDirectory(), project->projectDirectory(),
m_buildConfiguration->buildDirectory(), m_buildConfiguration->buildDirectory(),
@@ -875,15 +863,16 @@ void CMakeBuildSettingsWidget::openChangeBuildDirectoryDialog()
void CMakeBuildSettingsWidget::runCMake() void CMakeBuildSettingsWidget::runCMake()
{ {
// TODO skip build directory // TODO skip build directory
CMakeProject *project = m_target->cmakeProject(); CMakeProject *project = qobject_cast<CMakeProject *>(m_buildConfiguration->target()->project());
if (!project)
return;
CMakeOpenProjectWizard copw(project->projectManager(), CMakeOpenProjectWizard copw(project->projectManager(),
project->projectDirectory(), project->projectDirectory(),
m_buildConfiguration->buildDirectory(), m_buildConfiguration->buildDirectory(),
CMakeOpenProjectWizard::WantToUpdate, CMakeOpenProjectWizard::WantToUpdate,
m_buildConfiguration->environment()); m_buildConfiguration->environment());
if (copw.exec() == QDialog::Accepted) { if (copw.exec() == QDialog::Accepted)
project->parseCMakeLists(); project->evaluateBuildSystem();
}
} }
///// /////

View File

@@ -36,7 +36,6 @@
#include "cmakeprojectmanager.h" #include "cmakeprojectmanager.h"
#include "cmakeprojectnodes.h" #include "cmakeprojectnodes.h"
#include "cmakebuildconfiguration.h" #include "cmakebuildconfiguration.h"
#include "cmaketarget.h"
#include "makestep.h" #include "makestep.h"
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
@@ -87,8 +86,6 @@ public:
Core::IDocument *document() const; Core::IDocument *document() const;
CMakeManager *projectManager() const; CMakeManager *projectManager() const;
CMakeTarget *activeTarget() const;
QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets(); QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets();
ProjectExplorer::ProjectNode *rootProjectNode() const; ProjectExplorer::ProjectNode *rootProjectNode() const;
@@ -102,12 +99,12 @@ public:
QString defaultBuildDirectory() const; QString defaultBuildDirectory() const;
bool parseCMakeLists();
QString uicCommand() const; QString uicCommand() const;
bool isProjectFile(const QString &fileName); bool isProjectFile(const QString &fileName);
signals: signals:
/// emitted after parsing /// emitted after parsing
void buildTargetsChanged(); void buildTargetsChanged();
@@ -128,12 +125,15 @@ private slots:
void uiEditorContentsChanged(); void uiEditorContentsChanged();
void buildStateChanged(ProjectExplorer::Project *project); void buildStateChanged(ProjectExplorer::Project *project);
private: private:
void evaluateBuildSystem();
void buildTree(CMakeProjectNode *rootNode, QList<ProjectExplorer::FileNode *> list); void buildTree(CMakeProjectNode *rootNode, QList<ProjectExplorer::FileNode *> list);
void gatherFileNodes(ProjectExplorer::FolderNode *parent, QList<ProjectExplorer::FileNode *> &list); void gatherFileNodes(ProjectExplorer::FolderNode *parent, QList<ProjectExplorer::FileNode *> &list);
ProjectExplorer::FolderNode *findOrCreateFolder(CMakeProjectNode *rootNode, QString directory); ProjectExplorer::FolderNode *findOrCreateFolder(CMakeProjectNode *rootNode, QString directory);
void updateCodeModelSupportFromEditor(const QString &uiFileName, const QString &contents); void updateCodeModelSupportFromEditor(const QString &uiFileName, const QString &contents);
void createUiCodeModelSupport(); void createUiCodeModelSupport();
QString uiHeaderFile(const QString &uiFile); QString uiHeaderFile(const QString &uiFile);
void updateRunConfigurations(ProjectExplorer::Target *t);
CMakeManager *m_manager; CMakeManager *m_manager;
QString m_fileName; QString m_fileName;
@@ -228,16 +228,16 @@ class CMakeBuildSettingsWidget : public ProjectExplorer::BuildConfigWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit CMakeBuildSettingsWidget(CMakeTarget *target); CMakeBuildSettingsWidget();
QString displayName() const; QString displayName() const;
// This is called to set up the config widget before showing it // This is called to set up the config widget before showing it
virtual void init(ProjectExplorer::BuildConfiguration *bc); void init(ProjectExplorer::BuildConfiguration *bc);
private slots: private slots:
void openChangeBuildDirectoryDialog(); void openChangeBuildDirectoryDialog();
void runCMake(); void runCMake();
private: private:
CMakeTarget *m_target;
QLineEdit *m_pathLineEdit; QLineEdit *m_pathLineEdit;
QPushButton *m_changeButton; QPushButton *m_changeButton;
CMakeBuildConfiguration *m_buildConfiguration; CMakeBuildConfiguration *m_buildConfiguration;

View File

@@ -45,6 +45,7 @@
#include <coreplugin/actionmanager/actioncontainer.h> #include <coreplugin/actionmanager/actioncontainer.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/projectexplorer.h> #include <projectexplorer/projectexplorer.h>
#include <projectexplorer/target.h>
#include <utils/QtConcurrentTools> #include <utils/QtConcurrentTools>
#include <QtConcurrentRun> #include <QtConcurrentRun>
#include <QCoreApplication> #include <QCoreApplication>
@@ -114,22 +115,21 @@ void CMakeManager::runCMake(ProjectExplorer::Project *project)
if (!project) if (!project)
return; return;
CMakeProject *cmakeProject = qobject_cast<CMakeProject *>(project); CMakeProject *cmakeProject = qobject_cast<CMakeProject *>(project);
if (!cmakeProject) if (!cmakeProject || !cmakeProject->activeTarget() || !cmakeProject->activeTarget()->activeBuildConfiguration())
return; return;
if (!cmakeProject->activeTarget()) CMakeBuildConfiguration *bc
= qobject_cast<CMakeBuildConfiguration *>(cmakeProject->activeTarget()->activeBuildConfiguration());
if (!bc)
return; return;
if (!cmakeProject->activeTarget()->activeBuildConfiguration())
return;
CMakeBuildConfiguration *bc = cmakeProject->activeTarget()->activeBuildConfiguration();
CMakeOpenProjectWizard copw(this, CMakeOpenProjectWizard copw(this,
cmakeProject->projectDirectory(), cmakeProject->projectDirectory(),
bc->buildDirectory(), bc->buildDirectory(),
CMakeOpenProjectWizard::WantToUpdate, CMakeOpenProjectWizard::WantToUpdate,
bc->environment()); bc->environment());
if (copw.exec() == QDialog::Accepted) { if (copw.exec() == QDialog::Accepted)
cmakeProject->parseCMakeLists(); cmakeProject->triggerBuildSystemEvaluation();
}
} }
ProjectExplorer::Project *CMakeManager::openProject(const QString &fileName, QString *errorString) ProjectExplorer::Project *CMakeManager::openProject(const QString &fileName, QString *errorString)

View File

@@ -9,7 +9,6 @@ HEADERS = cmakeproject.h \
cmakeprojectmanager.h \ cmakeprojectmanager.h \
cmakeprojectconstants.h \ cmakeprojectconstants.h \
cmakeprojectnodes.h \ cmakeprojectnodes.h \
cmaketarget.h \
makestep.h \ makestep.h \
cmakerunconfiguration.h \ cmakerunconfiguration.h \
cmakeopenprojectwizard.h \ cmakeopenprojectwizard.h \
@@ -24,7 +23,6 @@ SOURCES = cmakeproject.cpp \
cmakeprojectplugin.cpp \ cmakeprojectplugin.cpp \
cmakeprojectmanager.cpp \ cmakeprojectmanager.cpp \
cmakeprojectnodes.cpp \ cmakeprojectnodes.cpp \
cmaketarget.cpp \
makestep.cpp \ makestep.cpp \
cmakerunconfiguration.cpp \ cmakerunconfiguration.cpp \
cmakeopenprojectwizard.cpp \ cmakeopenprojectwizard.cpp \

View File

@@ -48,8 +48,6 @@ QtcPlugin {
"cmakeprojectplugin.h", "cmakeprojectplugin.h",
"cmakerunconfiguration.cpp", "cmakerunconfiguration.cpp",
"cmakerunconfiguration.h", "cmakerunconfiguration.h",
"cmaketarget.cpp",
"cmaketarget.h",
"cmakeuicodemodelsupport.cpp", "cmakeuicodemodelsupport.cpp",
"cmakeuicodemodelsupport.h", "cmakeuicodemodelsupport.h",
"makestep.cpp", "makestep.cpp",

View File

@@ -32,11 +32,11 @@
#include "cmakeprojectplugin.h" #include "cmakeprojectplugin.h"
#include "cmakeprojectmanager.h" #include "cmakeprojectmanager.h"
#include "cmakebuildconfiguration.h"
#include "cmakerunconfiguration.h" #include "cmakerunconfiguration.h"
#include "cmakeeditorfactory.h" #include "cmakeeditorfactory.h"
#include "makestep.h" #include "makestep.h"
#include "cmakeprojectconstants.h" #include "cmakeprojectconstants.h"
#include "cmaketarget.h"
#include "cmakelocatorfilter.h" #include "cmakelocatorfilter.h"
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
@@ -67,9 +67,9 @@ bool CMakeProjectPlugin::initialize(const QStringList & /*arguments*/, QString *
addAutoReleasedObject(manager); addAutoReleasedObject(manager);
addAutoReleasedObject(new MakeStepFactory); addAutoReleasedObject(new MakeStepFactory);
addAutoReleasedObject(new CMakeRunConfigurationFactory); addAutoReleasedObject(new CMakeRunConfigurationFactory);
addAutoReleasedObject(new CMakeBuildConfigurationFactory);
addAutoReleasedObject(new CMakeEditorFactory(manager)); addAutoReleasedObject(new CMakeEditorFactory(manager));
addAutoReleasedObject(new CMakeTargetFactory);
addAutoReleasedObject(new CMakeLocatorFilter); addAutoReleasedObject(new CMakeLocatorFilter);
return true; return true;

View File

@@ -35,12 +35,12 @@
#include "cmakebuildconfiguration.h" #include "cmakebuildconfiguration.h"
#include "cmakeproject.h" #include "cmakeproject.h"
#include "cmakeprojectconstants.h" #include "cmakeprojectconstants.h"
#include "cmaketarget.h"
#include <coreplugin/coreconstants.h> #include <coreplugin/coreconstants.h>
#include <coreplugin/helpmanager.h> #include <coreplugin/helpmanager.h>
#include <qtsupport/debugginghelper.h> #include <qtsupport/debugginghelper.h>
#include <projectexplorer/environmentwidget.h> #include <projectexplorer/environmentwidget.h>
#include <projectexplorer/target.h>
#include <utils/pathchooser.h> #include <utils/pathchooser.h>
#include <utils/detailswidget.h> #include <utils/detailswidget.h>
@@ -60,7 +60,6 @@ using namespace CMakeProjectManager;
using namespace CMakeProjectManager::Internal; using namespace CMakeProjectManager::Internal;
namespace { namespace {
const char CMAKE_RC_ID[] = "CMakeProjectManager.CMakeRunConfiguration";
const char CMAKE_RC_PREFIX[] = "CMakeProjectManager.CMakeRunConfiguration."; const char CMAKE_RC_PREFIX[] = "CMakeProjectManager.CMakeRunConfiguration.";
const char USER_WORKING_DIRECTORY_KEY[] = "CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory"; const char USER_WORKING_DIRECTORY_KEY[] = "CMakeProjectManager.CMakeRunConfiguration.UserWorkingDirectory";
@@ -86,8 +85,9 @@ Core::Id idFromBuildTarget(const QString &target)
} // namespace } // namespace
CMakeRunConfiguration::CMakeRunConfiguration(CMakeTarget *parent, const QString &target, const QString &workingDirectory, const QString &title) : CMakeRunConfiguration::CMakeRunConfiguration(ProjectExplorer::Target *parent, Core::Id id, const QString &target,
ProjectExplorer::LocalApplicationRunConfiguration(parent, Core::Id(CMAKE_RC_PREFIX)), const QString &workingDirectory, const QString &title) :
ProjectExplorer::LocalApplicationRunConfiguration(parent, id),
m_runMode(Gui), m_runMode(Gui),
m_buildTarget(target), m_buildTarget(target),
m_workingDirectory(workingDirectory), m_workingDirectory(workingDirectory),
@@ -98,7 +98,7 @@ CMakeRunConfiguration::CMakeRunConfiguration(CMakeTarget *parent, const QString
ctor(); ctor();
} }
CMakeRunConfiguration::CMakeRunConfiguration(CMakeTarget *parent, CMakeRunConfiguration *source) : CMakeRunConfiguration::CMakeRunConfiguration(ProjectExplorer::Target *parent, CMakeRunConfiguration *source) :
ProjectExplorer::LocalApplicationRunConfiguration(parent, source), ProjectExplorer::LocalApplicationRunConfiguration(parent, source),
m_runMode(source->m_runMode), m_runMode(source->m_runMode),
m_buildTarget(source->m_buildTarget), m_buildTarget(source->m_buildTarget),
@@ -122,14 +122,9 @@ void CMakeRunConfiguration::ctor()
setDefaultDisplayName(defaultDisplayName()); setDefaultDisplayName(defaultDisplayName());
} }
CMakeTarget *CMakeRunConfiguration::cmakeTarget() const ProjectExplorer::BuildConfiguration *CMakeRunConfiguration::activeBuildConfiguration() const
{ {
return static_cast<CMakeTarget *>(target()); return target()->activeBuildConfiguration();
}
CMakeBuildConfiguration *CMakeRunConfiguration::activeBuildConfiguration() const
{
return cmakeTarget()->activeBuildConfiguration();
} }
QString CMakeRunConfiguration::executable() const QString CMakeRunConfiguration::executable() const
@@ -496,8 +491,7 @@ void CMakeRunConfigurationWidget::setArguments(const QString &args)
// Factory // Factory
CMakeRunConfigurationFactory::CMakeRunConfigurationFactory(QObject *parent) : CMakeRunConfigurationFactory::CMakeRunConfigurationFactory(QObject *parent) :
ProjectExplorer::IRunConfigurationFactory(parent) ProjectExplorer::IRunConfigurationFactory(parent)
{ { setObjectName(QLatin1String("CMakeRunConfigurationFactory")); }
}
CMakeRunConfigurationFactory::~CMakeRunConfigurationFactory() CMakeRunConfigurationFactory::~CMakeRunConfigurationFactory()
{ {
@@ -506,11 +500,11 @@ CMakeRunConfigurationFactory::~CMakeRunConfigurationFactory()
// used to show the list of possible additons to a project, returns a list of ids // used to show the list of possible additons to a project, returns a list of ids
QList<Core::Id> CMakeRunConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const QList<Core::Id> CMakeRunConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const
{ {
CMakeTarget *t(qobject_cast<CMakeTarget *>(parent)); CMakeProject *project = qobject_cast<CMakeProject *>(parent->project());
if (!t) if (!canHandle(parent))
return QList<Core::Id>(); return QList<Core::Id>();
QList<Core::Id> allIds; QList<Core::Id> allIds;
foreach (const QString &buildTarget, t->cmakeProject()->buildTargetTitles()) foreach (const QString &buildTarget, project->buildTargetTitles())
allIds << idFromBuildTarget(buildTarget); allIds << idFromBuildTarget(buildTarget);
return allIds; return allIds;
} }
@@ -521,12 +515,19 @@ QString CMakeRunConfigurationFactory::displayNameForId(const Core::Id id) const
return buildTargetFromId(id); return buildTargetFromId(id);
} }
bool CMakeRunConfigurationFactory::canHandle(ProjectExplorer::Target *parent) const
{
if (!parent->project()->supportsProfile(parent->profile()))
return false;
return qobject_cast<CMakeProject *>(parent->project());
}
bool CMakeRunConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const bool CMakeRunConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const
{ {
CMakeTarget *t(qobject_cast<CMakeTarget *>(parent)); if (!canHandle(parent))
if (!t)
return false; return false;
return t->cmakeProject()->hasBuildTarget(buildTargetFromId(id)); CMakeProject *project = static_cast<CMakeProject *>(parent->project());
return project->hasBuildTarget(buildTargetFromId(id));
} }
ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::create(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::create(ProjectExplorer::Target *parent,
@@ -534,43 +535,41 @@ ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::create(ProjectE
{ {
if (!canCreate(parent, id)) if (!canCreate(parent, id))
return 0; return 0;
CMakeTarget *t(static_cast<CMakeTarget *>(parent)); CMakeProject *project = static_cast<CMakeProject *>(parent->project());
const QString title(buildTargetFromId(id)); const QString title(buildTargetFromId(id));
const CMakeBuildTarget &ct = t->cmakeProject()->buildTargetForTitle(title); const CMakeBuildTarget &ct = project->buildTargetForTitle(title);
return new CMakeRunConfiguration(t, ct.executable, ct.workingDirectory, ct.title); return new CMakeRunConfiguration(parent, id, ct.executable, ct.workingDirectory, ct.title);
} }
bool CMakeRunConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) const bool CMakeRunConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration *source) const
{ {
if (!qobject_cast<CMakeTarget *>(parent)) if (!canHandle(parent))
return false; return false;
return source->id() == Core::Id(CMAKE_RC_ID); return source->id().toString().startsWith(QLatin1String(CMAKE_RC_PREFIX));
} }
ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration * source) ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::clone(ProjectExplorer::Target *parent, ProjectExplorer::RunConfiguration * source)
{ {
if (!canClone(parent, source)) if (!canClone(parent, source))
return 0; return 0;
CMakeTarget *t(static_cast<CMakeTarget *>(parent));
CMakeRunConfiguration *crc(static_cast<CMakeRunConfiguration *>(source)); CMakeRunConfiguration *crc(static_cast<CMakeRunConfiguration *>(source));
return new CMakeRunConfiguration(t, crc); return new CMakeRunConfiguration(parent, crc);
} }
bool CMakeRunConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const bool CMakeRunConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const
{ {
if (!qobject_cast<CMakeTarget *>(parent)) if (!qobject_cast<CMakeProject *>(parent->project()))
return false; return false;
QString id = QString::fromUtf8(ProjectExplorer::idFromMap(map).name()); QString id = QString::fromUtf8(ProjectExplorer::idFromMap(map).name());
return id.startsWith(QLatin1String(CMAKE_RC_ID)); return id.startsWith(QLatin1String(CMAKE_RC_PREFIX));
} }
ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map) ProjectExplorer::RunConfiguration *CMakeRunConfigurationFactory::restore(ProjectExplorer::Target *parent, const QVariantMap &map)
{ {
if (!canRestore(parent, map)) if (!canRestore(parent, map))
return 0; return 0;
CMakeTarget *t(static_cast<CMakeTarget *>(parent)); CMakeRunConfiguration *rc(new CMakeRunConfiguration(parent, ProjectExplorer::idFromMap(map),
CMakeRunConfiguration *rc(new CMakeRunConfiguration(t, QString(), QString(), QString())); QString(), QString(), QString()));
if (rc->fromMap(map)) if (rc->fromMap(map))
return rc; return rc;
delete rc; delete rc;

View File

@@ -62,12 +62,11 @@ class CMakeRunConfiguration : public ProjectExplorer::LocalApplicationRunConfigu
friend class CMakeRunConfigurationFactory; friend class CMakeRunConfigurationFactory;
public: public:
CMakeRunConfiguration(CMakeTarget *parent, const QString &target, CMakeRunConfiguration(ProjectExplorer::Target *parent, Core::Id id, const QString &target,
const QString &workingDirectory, const QString &title); const QString &workingDirectory, const QString &title);
~CMakeRunConfiguration(); ~CMakeRunConfiguration();
CMakeTarget *cmakeTarget() const; ProjectExplorer::BuildConfiguration *activeBuildConfiguration() const;
CMakeBuildConfiguration *activeBuildConfiguration() const;
QString executable() const; QString executable() const;
RunMode runMode() const; RunMode runMode() const;
@@ -101,7 +100,7 @@ private slots:
void setCommandLineArguments(const QString &newText); void setCommandLineArguments(const QString &newText);
protected: protected:
CMakeRunConfiguration(CMakeTarget *parent, CMakeRunConfiguration *source); CMakeRunConfiguration(ProjectExplorer::Target *parent, CMakeRunConfiguration *source);
virtual bool fromMap(const QVariantMap &map); virtual bool fromMap(const QVariantMap &map);
QString defaultDisplayName() const; QString defaultDisplayName() const;
@@ -177,6 +176,8 @@ public:
QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const; QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const;
QString displayNameForId(const Core::Id id) const; QString displayNameForId(const Core::Id id) const;
bool canHandle(ProjectExplorer::Target *parent) const;
}; };
} }

View File

@@ -1,242 +0,0 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/
#include "cmaketarget.h"
#include "cmakeproject.h"
#include "cmakerunconfiguration.h"
#include "cmakebuildconfiguration.h"
#include <projectexplorer/buildsteplist.h>
#include <projectexplorer/deployconfiguration.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <qtsupport/customexecutablerunconfiguration.h>
#include <QApplication>
#include <QStyle>
using namespace CMakeProjectManager;
using namespace CMakeProjectManager::Internal;
namespace {
QString displayNameForId(const Core::Id id) {
if (id == Core::Id(DEFAULT_CMAKE_TARGET_ID))
return QApplication::translate("CMakeProjectManager::Internal::CMakeTarget", "Desktop", "CMake Default target display name");
return QString();
}
} // namespace
// -------------------------------------------------------------------------
// CMakeTarget
// -------------------------------------------------------------------------
CMakeTarget::CMakeTarget(CMakeProject *parent) :
ProjectExplorer::Target(parent, Core::Id(DEFAULT_CMAKE_TARGET_ID)),
m_buildConfigurationFactory(new CMakeBuildConfigurationFactory(this))
{
setDefaultDisplayName(displayNameForId(id()));
setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon));
connect(parent, SIGNAL(buildTargetsChanged()), SLOT(updateRunConfigurations()));
}
CMakeTarget::~CMakeTarget()
{
}
CMakeProject *CMakeTarget::cmakeProject() const
{
return static_cast<CMakeProject *>(project());
}
ProjectExplorer::BuildConfigWidget *CMakeTarget::createConfigWidget()
{
return new CMakeBuildSettingsWidget(this);
}
bool CMakeTargetFactory::supportsTargetId(const Core::Id id) const
{
return id == Core::Id(DEFAULT_CMAKE_TARGET_ID);
}
CMakeBuildConfiguration *CMakeTarget::activeBuildConfiguration() const
{
return static_cast<CMakeBuildConfiguration *>(Target::activeBuildConfiguration());
}
CMakeBuildConfigurationFactory *CMakeTarget::buildConfigurationFactory() const
{
return m_buildConfigurationFactory;
}
QString CMakeTarget::defaultBuildDirectory() const
{
return cmakeProject()->defaultBuildDirectory();
}
bool CMakeTarget::fromMap(const QVariantMap &map)
{
return Target::fromMap(map);
}
void CMakeTarget::updateRunConfigurations()
{
// *Update* runconfigurations:
QMultiMap<QString, CMakeRunConfiguration*> existingRunConfigurations;
QList<ProjectExplorer::RunConfiguration *> toRemove;
foreach (ProjectExplorer::RunConfiguration* rc, runConfigurations()) {
if (CMakeRunConfiguration* cmakeRC = qobject_cast<CMakeRunConfiguration *>(rc))
existingRunConfigurations.insert(cmakeRC->title(), cmakeRC);
QtSupport::CustomExecutableRunConfiguration *ceRC =
qobject_cast<QtSupport::CustomExecutableRunConfiguration *>(rc);
if (ceRC && !ceRC->isConfigured())
toRemove << rc;
}
foreach (const CMakeBuildTarget &ct, cmakeProject()->buildTargets()) {
if (ct.library)
continue;
if (ct.executable.isEmpty())
continue;
if (ct.title.endsWith("/fast"))
continue;
QList<CMakeRunConfiguration *> list = existingRunConfigurations.values(ct.title);
if (!list.isEmpty()) {
// Already exists, so override the settings...
foreach (CMakeRunConfiguration *rc, list) {
rc->setExecutable(ct.executable);
rc->setBaseWorkingDirectory(ct.workingDirectory);
rc->setEnabled(true);
}
existingRunConfigurations.remove(ct.title);
} else {
// Does not exist yet
addRunConfiguration(new CMakeRunConfiguration(this, ct.executable, ct.workingDirectory, ct.title));
}
}
QMultiMap<QString, CMakeRunConfiguration *>::const_iterator it =
existingRunConfigurations.constBegin();
for ( ; it != existingRunConfigurations.constEnd(); ++it) {
CMakeRunConfiguration *rc = it.value();
// The executables for those runconfigurations aren't build by the current buildconfiguration
// We just set a disable flag and show that in the display name
rc->setEnabled(false);
// removeRunConfiguration(rc);
}
foreach (ProjectExplorer::RunConfiguration *rc, toRemove)
removeRunConfiguration(rc);
if (runConfigurations().isEmpty()) {
// Oh no, no run configuration,
// create a custom executable run configuration
addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(this));
}
}
// -------------------------------------------------------------------------
// CMakeTargetFactory
// -------------------------------------------------------------------------
CMakeTargetFactory::CMakeTargetFactory(QObject *parent) :
ITargetFactory(parent)
{
}
CMakeTargetFactory::~CMakeTargetFactory()
{
}
QList<Core::Id> CMakeTargetFactory::supportedTargetIds() const
{
return QList<Core::Id>() << Core::Id(DEFAULT_CMAKE_TARGET_ID);
}
QString CMakeTargetFactory::displayNameForId(const Core::Id id) const
{
return ::displayNameForId(id);
}
bool CMakeTargetFactory::canCreate(ProjectExplorer::Project *parent, const Core::Id id) const
{
if (!qobject_cast<CMakeProject *>(parent))
return false;
return id == Core::Id(DEFAULT_CMAKE_TARGET_ID);
}
CMakeTarget *CMakeTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id)
{
if (!canCreate(parent, id))
return 0;
CMakeProject *cmakeparent(static_cast<CMakeProject *>(parent));
CMakeTarget *t(new CMakeTarget(cmakeparent));
// Add default build configuration:
CMakeBuildConfiguration *bc(new CMakeBuildConfiguration(t));
bc->setDefaultDisplayName("all");
ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
ProjectExplorer::BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN);
// Now create a standard build configuration
buildSteps->insertStep(0, new MakeStep(buildSteps));
MakeStep *cleanMakeStep = new MakeStep(cleanSteps);
cleanSteps->insertStep(0, cleanMakeStep);
cleanMakeStep->setAdditionalArguments("clean");
cleanMakeStep->setClean(true);
t->addBuildConfiguration(bc);
t->addDeployConfiguration(t->createDeployConfiguration(ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID));
t->updateRunConfigurations();
return t;
}
bool CMakeTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const
{
return canCreate(parent, ProjectExplorer::idFromMap(map));
}
CMakeTarget *CMakeTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map)
{
if (!canRestore(parent, map))
return 0;
CMakeProject *cmakeparent(static_cast<CMakeProject *>(parent));
CMakeTarget *t(new CMakeTarget(cmakeparent));
if (t->fromMap(map))
return t;
delete t;
return 0;
}

View File

@@ -1,100 +0,0 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/
#ifndef CMAKETARGET_H
#define CMAKETARGET_H
#include "cmakebuildconfiguration.h"
#include <projectexplorer/target.h>
namespace CMakeProjectManager {
namespace Internal {
const char DEFAULT_CMAKE_TARGET_ID[] = "CMakeProjectManager.DefaultCMakeTarget";
class CMakeBuildConfiguration;
class CMakeBuildConfigurationFactory;
class CMakeProject;
class CMakeTargetFactory;
class CMakeTarget : public ProjectExplorer::Target
{
Q_OBJECT
friend class CMakeTargetFactory;
public:
CMakeTarget(CMakeProject *parent);
~CMakeTarget();
ProjectExplorer::BuildConfigWidget *createConfigWidget();
CMakeProject *cmakeProject() const;
CMakeBuildConfiguration *activeBuildConfiguration() const;
CMakeBuildConfigurationFactory *buildConfigurationFactory() const;
QString defaultBuildDirectory() const;
protected:
bool fromMap(const QVariantMap &map);
private slots:
void updateRunConfigurations();
private:
CMakeBuildConfigurationFactory *m_buildConfigurationFactory;
};
class CMakeTargetFactory : public ProjectExplorer::ITargetFactory
{
Q_OBJECT
public:
CMakeTargetFactory(QObject *parent = 0);
~CMakeTargetFactory();
bool supportsTargetId(const Core::Id id) const;
QList<Core::Id> supportedTargetIds() const;
QString displayNameForId(const Core::Id id) const;
bool canCreate(ProjectExplorer::Project *parent, const Core::Id id) const;
CMakeTarget *create(ProjectExplorer::Project *parent, const Core::Id id);
bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const;
CMakeTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map);
};
} // namespace Internal
} // namespace CMakeProjectManager
#endif // CMAKETARGET_H

View File

@@ -32,10 +32,10 @@
#include "cmakeuicodemodelsupport.h" #include "cmakeuicodemodelsupport.h"
#include "cmakeproject.h" #include "cmakeproject.h"
#include "cmaketarget.h"
#include "cmakebuildconfiguration.h" #include "cmakebuildconfiguration.h"
#include <cpptools/ModelManagerInterface.h> #include <cpptools/ModelManagerInterface.h>
#include <projectexplorer/target.h>
#include <QProcess> #include <QProcess>
@@ -48,14 +48,10 @@ CMakeUiCodeModelSupport::CMakeUiCodeModelSupport(CPlusPlus::CppModelManagerInter
const QString &uiHeaderFile) const QString &uiHeaderFile)
: CppTools::UiCodeModelSupport(modelmanager, source, uiHeaderFile), : CppTools::UiCodeModelSupport(modelmanager, source, uiHeaderFile),
m_project(project) m_project(project)
{ { }
}
CMakeUiCodeModelSupport::~CMakeUiCodeModelSupport() CMakeUiCodeModelSupport::~CMakeUiCodeModelSupport()
{ { }
}
QString CMakeUiCodeModelSupport::uicCommand() const QString CMakeUiCodeModelSupport::uicCommand() const
{ {
@@ -64,6 +60,7 @@ QString CMakeUiCodeModelSupport::uicCommand() const
QStringList CMakeUiCodeModelSupport::environment() const QStringList CMakeUiCodeModelSupport::environment() const
{ {
CMakeBuildConfiguration *bc = m_project->activeTarget()->activeBuildConfiguration(); if (!m_project || !m_project->activeTarget() || !m_project->activeTarget()->activeBuildConfiguration())
return bc->environment().toStringList(); return QStringList();
return m_project->activeTarget()->activeBuildConfiguration()->environment().toStringList();
} }

View File

@@ -34,14 +34,16 @@
#include "cmakeprojectconstants.h" #include "cmakeprojectconstants.h"
#include "cmakeproject.h" #include "cmakeproject.h"
#include "cmaketarget.h"
#include "cmakebuildconfiguration.h" #include "cmakebuildconfiguration.h"
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/toolchain.h> #include <projectexplorer/deployconfiguration.h>
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/gnumakeparser.h> #include <projectexplorer/gnumakeparser.h>
#include <projectexplorer/profileinformation.h>
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/target.h>
#include <projectexplorer/toolchain.h>
#include <utils/qtcprocess.h> #include <utils/qtcprocess.h>
@@ -138,19 +140,20 @@ bool MakeStep::init()
setIgnoreReturnValue(m_clean); setIgnoreReturnValue(m_clean);
ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile());
ProcessParameters *pp = processParameters(); ProcessParameters *pp = processParameters();
pp->setMacroExpander(bc->macroExpander()); pp->setMacroExpander(bc->macroExpander());
pp->setEnvironment(bc->environment()); pp->setEnvironment(bc->environment());
pp->setWorkingDirectory(bc->buildDirectory()); pp->setWorkingDirectory(bc->buildDirectory());
if (bc->toolChain()) if (tc)
pp->setCommand(bc->toolChain()->makeCommand()); pp->setCommand(tc->makeCommand());
else else
pp->setCommand(QLatin1String("make")); pp->setCommand(QLatin1String("make"));
pp->setArguments(arguments); pp->setArguments(arguments);
setOutputParser(new ProjectExplorer::GnuMakeParser()); setOutputParser(new ProjectExplorer::GnuMakeParser());
if (bc->toolChain()) if (tc)
appendOutputParser(bc->toolChain()->outputParser()); appendOutputParser(tc->outputParser());
outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory()); outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory());
return AbstractProcessStep::init(); return AbstractProcessStep::init();
@@ -302,7 +305,13 @@ void MakeStepConfigWidget::updateDetails()
CMakeBuildConfiguration *bc = m_makeStep->cmakeBuildConfiguration(); CMakeBuildConfiguration *bc = m_makeStep->cmakeBuildConfiguration();
if (!bc) if (!bc)
bc = static_cast<CMakeBuildConfiguration *>(m_makeStep->target()->activeBuildConfiguration()); bc = static_cast<CMakeBuildConfiguration *>(m_makeStep->target()->activeBuildConfiguration());
ProjectExplorer::ToolChain *tc = bc->toolChain(); if (!bc) {
m_summaryText = tr("<b>No build configuration found on this target.</b>");
updateSummary();
return;
}
ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(m_makeStep->target()->profile());
if (tc) { if (tc) {
QString arguments = Utils::QtcProcess::joinArgs(m_makeStep->buildTargets()); QString arguments = Utils::QtcProcess::joinArgs(m_makeStep->buildTargets());
Utils::QtcProcess::addArgs(&arguments, m_makeStep->additionalArguments()); Utils::QtcProcess::addArgs(&arguments, m_makeStep->additionalArguments());
@@ -315,7 +324,7 @@ void MakeStepConfigWidget::updateDetails()
param.setArguments(arguments); param.setArguments(arguments);
m_summaryText = param.summary(displayName()); m_summaryText = param.summary(displayName());
} else { } else {
m_summaryText = tr("<b>Unknown tool chain</b>"); m_summaryText = tr("<b>No tool chain set for this target</b>");
} }
emit updateSummary(); emit updateSummary();
} }

View File

@@ -38,6 +38,8 @@ HEADERS += \
debuggerstartparameters.h \ debuggerstartparameters.h \
debuggerstreamops.h \ debuggerstreamops.h \
debuggerstringutils.h \ debuggerstringutils.h \
debuggerprofileconfigwidget.h \
debuggerprofileinformation.h \
disassembleragent.h \ disassembleragent.h \
disassemblerlines.h \ disassemblerlines.h \
loadremotecoredialog.h \ loadremotecoredialog.h \
@@ -92,6 +94,8 @@ SOURCES += \
debuggerplugin.cpp \ debuggerplugin.cpp \
debuggerrunner.cpp \ debuggerrunner.cpp \
debuggerstreamops.cpp \ debuggerstreamops.cpp \
debuggerprofileconfigwidget.cpp \
debuggerprofileinformation.cpp \
disassembleragent.cpp \ disassembleragent.cpp \
disassemblerlines.cpp \ disassemblerlines.cpp \
loadremotecoredialog.cpp \ loadremotecoredialog.cpp \

View File

@@ -36,6 +36,10 @@ QtcPlugin {
"breakcondition.ui", "breakcondition.ui",
"breakpoint.ui", "breakpoint.ui",
"debugger.qrc", "debugger.qrc",
"debuggerprofileconfigwidget.cpp",
"debuggerprofileconfigwidget.h",
"debuggerprofileinformation.cpp",
"debuggerprofileinformation.h",
"attachcoredialog.ui", "attachcoredialog.ui",
"attachexternaldialog.ui", "attachexternaldialog.ui",
"attachtoqmlportdialog.ui", "attachtoqmlportdialog.ui",

View File

@@ -43,6 +43,7 @@
#include "debuggerrunner.h" #include "debuggerrunner.h"
#include "debuggerruncontrolfactory.h" #include "debuggerruncontrolfactory.h"
#include "debuggerstringutils.h" #include "debuggerstringutils.h"
#include "debuggerprofileinformation.h"
#include "memoryagent.h" #include "memoryagent.h"
#include "breakpoint.h" #include "breakpoint.h"
#include "breakhandler.h" #include "breakhandler.h"
@@ -99,6 +100,8 @@
#include <projectexplorer/projectexplorersettings.h> #include <projectexplorer/projectexplorersettings.h>
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
#include <projectexplorer/session.h> #include <projectexplorer/session.h>
#include <projectexplorer/profileinformation.h>
#include <projectexplorer/profilemanager.h>
#include <projectexplorer/target.h> #include <projectexplorer/target.h>
#include <projectexplorer/toolchain.h> #include <projectexplorer/toolchain.h>
#include <projectexplorer/toolchainmanager.h> #include <projectexplorer/toolchainmanager.h>
@@ -2839,18 +2842,27 @@ QString DebuggerPluginPrivate::debuggerForAbi(const Abi &abi, DebuggerEngineType
qDebug() << "debuggerForAbi" << abi.toString() << searchAbis.size() qDebug() << "debuggerForAbi" << abi.toString() << searchAbis.size()
<< searchAbis.front().toString() << et; << searchAbis.front().toString() << et;
foreach (const Abi &searchAbi, searchAbis) { QList<Profile *> profileList = ProfileManager::instance()->profiles();
const QList<ToolChain *> toolchains = // Note: stList is not sorted with autodected first!
ToolChainManager::instance()->findToolChains(searchAbi); QStringList debuggerList;
// Find manually configured ones first foreach (Profile *p, profileList) {
for (int i = toolchains.size() - 1; i >= 0; i--) { if (!p->isValid())
const QString debugger = toolchains.at(i)->debuggerCommand().toString(); continue;
if (debug) ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(p);
qDebug() << i << toolchains.at(i)->displayName() << debugger; if (!tc)
if (!debugger.isEmpty()) continue;
return debugger; if (searchAbis.contains(tc->targetAbi())) {
const QString debugger = DebuggerProfileInformation::debuggerCommand(p).toString();
if (!debugger.isEmpty()) {
if (p->isAutoDetected())
debuggerList.append(debugger);
else
debuggerList.prepend(debugger);
}
} }
} }
if (!debuggerList.isEmpty())
return debuggerList.at(0);
return QString(); return QString();
} }
@@ -3620,6 +3632,8 @@ bool DebuggerPlugin::initialize(const QStringList &arguments, QString *errorMess
mstart->addSeparator(globalcontext, Constants::G_MANUAL_REMOTE); mstart->addSeparator(globalcontext, Constants::G_MANUAL_REMOTE);
mstart->addSeparator(globalcontext, Constants::G_AUTOMATIC_REMOTE); mstart->addSeparator(globalcontext, Constants::G_AUTOMATIC_REMOTE);
ProfileManager::instance()->registerProfileInformation(new DebuggerProfileInformation);
return theDebuggerCore->initialize(arguments, errorMessage); return theDebuggerCore->initialize(arguments, errorMessage);
} }
@@ -3711,35 +3725,23 @@ void DebuggerPluginPrivate::testUnloadProject()
invoke<void>(pe, "unloadProject"); invoke<void>(pe, "unloadProject");
} }
static Project *currentProject()
{
return ProjectExplorerPlugin::instance()->currentProject();
}
static Target *activeTarget() static Target *activeTarget()
{ {
Project *project = currentProject(); Project *project = ProjectExplorerPlugin::instance()->currentProject();
return project->activeTarget(); return project->activeTarget();
} }
static BuildConfiguration *activeBuildConfiguration()
{
return activeTarget()->activeBuildConfiguration();
}
static RunConfiguration *activeRunConfiguration()
{
return activeTarget()->activeRunConfiguration();
}
static ToolChain *currentToolChain() static ToolChain *currentToolChain()
{ {
return activeBuildConfiguration()->toolChain(); Target *t = activeTarget();
if (!t || !t->isEnabled())
return 0;
return ToolChainProfileInformation::toolChain(activeTarget()->profile());
} }
static LocalApplicationRunConfiguration *activeLocalRunConfiguration() static LocalApplicationRunConfiguration *activeLocalRunConfiguration()
{ {
return qobject_cast<LocalApplicationRunConfiguration *>(activeRunConfiguration()); return qobject_cast<LocalApplicationRunConfiguration *>(activeTarget()->activeRunConfiguration());
} }
void DebuggerPluginPrivate::testRunProject(const DebuggerStartParameters &sp, const TestCallBack &cb) void DebuggerPluginPrivate::testRunProject(const DebuggerStartParameters &sp, const TestCallBack &cb)

View File

@@ -0,0 +1,148 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/
#include "debuggerprofileconfigwidget.h"
#include "debuggerprofileinformation.h"
#include <projectexplorer/abi.h>
#include <projectexplorer/profileinformation.h>
#include <utils/pathchooser.h>
#include <utils/qtcassert.h>
#ifdef Q_OS_WIN
#include <utils/winutils.h>
#endif
#include <QUrl>
#include <QDesktopServices>
#include <QHBoxLayout>
#include <QPushButton>
#include <QVBoxLayout>
namespace Debugger {
namespace Internal {
static const char dgbToolsDownloadLink32C[] = "http://www.microsoft.com/whdc/devtools/debugging/installx86.Mspx";
static const char dgbToolsDownloadLink64C[] = "http://www.microsoft.com/whdc/devtools/debugging/install64bit.Mspx";
// -----------------------------------------------------------------------
// DebuggerProfileConfigWidget:
// -----------------------------------------------------------------------
DebuggerProfileConfigWidget::DebuggerProfileConfigWidget(ProjectExplorer::Profile *p,
const DebuggerProfileInformation *pi,
QWidget *parent) :
ProjectExplorer::ProfileConfigWidget(parent),
m_profile(p),
m_info(pi),
m_chooser(new Utils::PathChooser)
{
QVBoxLayout *layout = new QVBoxLayout(this);
layout->setMargin(0);
ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(p);
if (tc && tc->targetAbi().os() == ProjectExplorer::Abi::WindowsOS
&& tc->targetAbi().osFlavor() != ProjectExplorer::Abi::WindowsMSysFlavor) {
QLabel *msvcDebuggerConfigLabel = new QLabel;
#ifdef Q_OS_WIN
const bool is64bit = Utils::winIs64BitSystem();
#else
const bool is64bit = false;
#endif
const QString link = is64bit ? QLatin1String(dgbToolsDownloadLink64C) : QLatin1String(dgbToolsDownloadLink32C);
//: Label text for path configuration. %2 is "x-bit version".
msvcDebuggerConfigLabel->setText(tr("<html><body><p>Specify the path to the "
"<a href=\"%1\">Windows Console Debugger executable</a>"
" (%2) here.</p>"
"</body></html>").arg(link, (is64bit ? tr("64-bit version")
: tr("32-bit version"))));
msvcDebuggerConfigLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);
msvcDebuggerConfigLabel->setOpenExternalLinks(true);
layout->addWidget(msvcDebuggerConfigLabel);
}
m_chooser->setContentsMargins(0, 0, 0, 0);
m_chooser->setExpectedKind(Utils::PathChooser::ExistingCommand);
QPushButton *button = new QPushButton(tr("Auto detect"));
button->setContentsMargins(0, 0, 0, 0);
connect(button, SIGNAL(clicked()), this, SLOT(autoDetectDebugger()));
QHBoxLayout *box = dynamic_cast<QHBoxLayout *>(m_chooser->layout());
QTC_CHECK(box);
if (box)
box->insertWidget(1, button);
layout->addWidget(m_chooser);
discard();
connect(m_chooser, SIGNAL(changed(QString)), this, SIGNAL(dirty()));
}
QString DebuggerProfileConfigWidget::displayName() const
{
return tr("Debugger command:");
}
void DebuggerProfileConfigWidget::makeReadOnly()
{
m_chooser->setEnabled(false);
}
void DebuggerProfileConfigWidget::apply()
{
Utils::FileName fn = m_chooser->fileName();
DebuggerProfileInformation::setDebuggerCommand(m_profile, fn);
}
void DebuggerProfileConfigWidget::discard()
{
m_chooser->setFileName(DebuggerProfileInformation::debuggerCommand(m_profile));
}
bool DebuggerProfileConfigWidget::isDirty() const
{
return m_chooser->fileName() != DebuggerProfileInformation::debuggerCommand(m_profile);
}
void DebuggerProfileConfigWidget::autoDetectDebugger()
{
QVariant v = m_info->defaultValue(m_profile);
m_chooser->setFileName(Utils::FileName::fromString(v.toString()));
}
} // namespace Internal
} // namespace Debugger

View File

@@ -0,0 +1,81 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/
#ifndef DEBUGGER_DEBUGGERPROFILECONFIGWIDGET_H
#define DEBUGGER_DEBUGGERPROFILECONFIGWIDGET_H
#include <projectexplorer/profileconfigwidget.h>
#include <QLabel>
#include <debuggerprofileinformation.h>
namespace ProjectExplorer { class Profile; }
namespace Utils { class PathChooser; }
namespace Debugger {
class DebuggerProfileInformation;
namespace Internal {
// -----------------------------------------------------------------------
// DebuggerProfileConfigWidget:
// -----------------------------------------------------------------------
class DebuggerProfileConfigWidget : public ProjectExplorer::ProfileConfigWidget
{
Q_OBJECT
public:
DebuggerProfileConfigWidget(ProjectExplorer::Profile *p,
const DebuggerProfileInformation *pi,
QWidget *parent = 0);
QString displayName() const;
void makeReadOnly();
void apply();
void discard();
bool isDirty() const;
private slots:
void autoDetectDebugger();
private:
ProjectExplorer::Profile *m_profile;
const DebuggerProfileInformation *m_info;
Utils::PathChooser *m_chooser;
};
} // namespace Internal
} // namespace Debugger
#endif // DEBUGGER_DEBUGGERPROFILEINFORMATION_H

View File

@@ -0,0 +1,208 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/
#include "debuggerprofileinformation.h"
#include "debuggerprofileconfigwidget.h"
#include <projectexplorer/abi.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/toolchain.h>
#include <utils/environment.h>
#include <QDir>
#include <QPair>
// --------------------------------------------------------------------------
// Helpers:
// --------------------------------------------------------------------------
static QPair<QString, QString> autoDetectCdbDebugger()
{
QPair<QString, QString> result;
QList<Utils::FileName> cdbs;
QStringList programDirs;
programDirs.append(QString::fromLocal8Bit(qgetenv("ProgramFiles")));
programDirs.append(QString::fromLocal8Bit(qgetenv("ProgramFiles(x86)")));
programDirs.append(QString::fromLocal8Bit(qgetenv("ProgramW6432")));
foreach (const QString &dirName, programDirs) {
if (dirName.isEmpty())
continue;
QDir dir(dirName);
// Windows SDK's starting from version 8 live in
// "ProgramDir\Windows Kits\<version>"
const QString windowsKitsFolderName = QLatin1String("Windows Kits");
if (dir.exists(windowsKitsFolderName)) {
QDir windowKitsFolder = dir;
if (windowKitsFolder.cd(windowsKitsFolderName)) {
// Check in reverse order (latest first)
const QFileInfoList kitFolders =
windowKitsFolder.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot,
QDir::Time | QDir::Reversed);
foreach (const QFileInfo &kitFolderFi, kitFolders) {
const QString path = kitFolderFi.absoluteFilePath();
const QFileInfo cdb32(path + QLatin1String("/Debuggers/x86/cdb.exe"));
if (cdb32.isExecutable())
cdbs.push_back(Utils::FileName::fromString(cdb32.absoluteFilePath()));
const QFileInfo cdb64(path + QLatin1String("/Debuggers/x64/cdb.exe"));
if (cdb64.isExecutable())
cdbs.push_back(Utils::FileName::fromString(cdb64.absoluteFilePath()));
} // for Kits
} // can cd to "Windows Kits"
} // "Windows Kits" exists
// Pre Windows SDK 8: Check 'Debugging Tools for Windows'
foreach (const QFileInfo &fi, dir.entryInfoList(QStringList(QLatin1String("Debugging Tools for Windows*")),
QDir::Dirs | QDir::NoDotAndDotDot)) {
Utils::FileName filePath(fi);
filePath.appendPath(QLatin1String("cdb.exe"));
if (!cdbs.contains(filePath))
cdbs.append(filePath);
}
}
foreach (const Utils::FileName &cdb, cdbs) {
QList<ProjectExplorer::Abi> abis = ProjectExplorer::Abi::abisOfBinary(cdb);
if (abis.isEmpty())
continue;
if (abis.first().wordWidth() == 32)
result.first = cdb.toString();
else if (abis.first().wordWidth() == 64)
result.second = cdb.toString();
}
// prefer 64bit debugger, even for 32bit binaries:
if (!result.second.isEmpty())
result.first = result.second;
return result;
}
namespace Debugger {
// --------------------------------------------------------------------------
// DebuggerProfileInformation:
// --------------------------------------------------------------------------
static const char DEBUGGER_INFORMATION[] = "Debugger.Information";
DebuggerProfileInformation::DebuggerProfileInformation()
{
setObjectName(QLatin1String("DebuggerProfileInformation"));
}
Core::Id DebuggerProfileInformation::dataId() const
{
static Core::Id id = Core::Id(DEBUGGER_INFORMATION);
return id;
}
unsigned int DebuggerProfileInformation::priority() const
{
return 28000;
}
QVariant DebuggerProfileInformation::defaultValue(ProjectExplorer::Profile *p) const
{
ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(p);
ProjectExplorer::Abi abi = ProjectExplorer::Abi::hostAbi();
if (tc)
abi = tc->targetAbi();
// CDB for windows:
if (abi.os() == ProjectExplorer::Abi::WindowsOS
&& abi.osFlavor() != ProjectExplorer::Abi::WindowsMSysFlavor) {
QPair<QString, QString> cdbs = autoDetectCdbDebugger();
return (abi.wordWidth() == 32) ? cdbs.first : cdbs.second;
}
// Check suggestions from the SDK:
if (tc) {
const QString path = tc->suggestedDebugger().toString();
if (!path.isEmpty())
return path;
}
// fall back to system GDB:
Utils::Environment env = Utils::Environment::systemEnvironment();
return env.searchInPath(QLatin1String("gdb"));
}
QList<ProjectExplorer::Task> DebuggerProfileInformation::validate(ProjectExplorer::Profile *p) const
{
QList<ProjectExplorer::Task> result;
Utils::FileName dbg = debuggerCommand(p);
if (dbg.isEmpty()) {
result << ProjectExplorer::Task(ProjectExplorer::Task::Warning,
tr("No debugger set up."), Utils::FileName(), -1,
Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM));
return result;
}
QFileInfo fi = dbg.toFileInfo();
if (!fi.exists() || fi.isDir())
result << ProjectExplorer::Task(ProjectExplorer::Task::Error,
tr("Debugger not found."), Utils::FileName(), -1,
Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM));
else if (!fi.isExecutable())
result << ProjectExplorer::Task(ProjectExplorer::Task::Error,
tr("Debugger not exectutable."), Utils::FileName(), -1,
Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM));
return result;
}
ProjectExplorer::ProfileConfigWidget *
DebuggerProfileInformation::createConfigWidget(ProjectExplorer::Profile *p) const
{
return new Internal::DebuggerProfileConfigWidget(p, this);
}
ProjectExplorer::ProfileInformation::ItemList DebuggerProfileInformation::toUserOutput(ProjectExplorer::Profile *p) const
{
return ItemList() << qMakePair(tr("Debugger"), debuggerCommand(p).toUserOutput());
}
Utils::FileName DebuggerProfileInformation::debuggerCommand(const ProjectExplorer::Profile *p)
{
return Utils::FileName::fromString(p->value(Core::Id(DEBUGGER_INFORMATION)).toString());
}
void DebuggerProfileInformation::setDebuggerCommand(ProjectExplorer::Profile *p, Utils::FileName &command)
{
p->setValue(Core::Id(DEBUGGER_INFORMATION), command.toString());
}
} // namespace Debugger

View File

@@ -0,0 +1,67 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/
#ifndef DEBUGGER_DEBUGGERPROFILEINFORMATION_H
#define DEBUGGER_DEBUGGERPROFILEINFORMATION_H
#include "debugger_global.h"
#include <projectexplorer/profileinformation.h>
namespace Debugger {
class DEBUGGER_EXPORT DebuggerProfileInformation : public ProjectExplorer::ProfileInformation
{
Q_OBJECT
public:
DebuggerProfileInformation();
Core::Id dataId() const;
unsigned int priority() const; // the higher the closer to the top.
QVariant defaultValue(ProjectExplorer::Profile *p) const;
QList<ProjectExplorer::Task> validate(ProjectExplorer::Profile *p) const;
ProjectExplorer::ProfileConfigWidget *createConfigWidget(ProjectExplorer::Profile *p) const;
ItemList toUserOutput(ProjectExplorer::Profile *p) const;
static Utils::FileName debuggerCommand(const ProjectExplorer::Profile *p);
static void setDebuggerCommand(ProjectExplorer::Profile *p, Utils::FileName &command);
};
} // namespace Debugger
#endif // DEBUGGER_DEBUGGERPROFILEINFORMATION_H

View File

@@ -41,6 +41,7 @@
#include "debuggerplugin.h" #include "debuggerplugin.h"
#include "debuggerstringutils.h" #include "debuggerstringutils.h"
#include "debuggerstartparameters.h" #include "debuggerstartparameters.h"
#include "debuggerprofileinformation.h"
#include "lldb/lldbenginehost.h" #include "lldb/lldbenginehost.h"
#include "debuggertooltipmanager.h" #include "debuggertooltipmanager.h"
#include "qml/qmlengine.h" #include "qml/qmlengine.h"
@@ -905,6 +906,12 @@ static DebuggerStartParameters localStartParameters(RunConfiguration *runConfigu
if (const ProjectExplorer::Target *target = runConfiguration->target()) { if (const ProjectExplorer::Target *target = runConfiguration->target()) {
if (QByteArray(target->metaObject()->className()).contains("Qt4")) { if (QByteArray(target->metaObject()->className()).contains("Qt4")) {
// FIXME: Get this from the profile?
// We could query the QtVersion for this information directly, but then we
// will need to add a dependency on QtSupport to the debugger.
//
// The profile could also get a method to extract the required information from
// its information to avoid this dependecy (as we do for the environment).
const Utils::FileName qmake = Utils::BuildableHelperLibrary::findSystemQt(sp.environment); const Utils::FileName qmake = Utils::BuildableHelperLibrary::findSystemQt(sp.environment);
if (!qmake.isEmpty()) if (!qmake.isEmpty())
sp.qtInstallPath = findQtInstallPath(qmake); sp.qtInstallPath = findQtInstallPath(qmake);
@@ -913,8 +920,8 @@ static DebuggerStartParameters localStartParameters(RunConfiguration *runConfigu
sp.projectSourceDirectory = project->projectDirectory(); sp.projectSourceDirectory = project->projectDirectory();
if (const ProjectExplorer::BuildConfiguration *buildConfig = target->activeBuildConfiguration()) { if (const ProjectExplorer::BuildConfiguration *buildConfig = target->activeBuildConfiguration()) {
sp.projectBuildDirectory = buildConfig->buildDirectory(); sp.projectBuildDirectory = buildConfig->buildDirectory();
if (const ProjectExplorer::ToolChain *tc = buildConfig->toolChain()) const ProjectExplorer::Profile *p = runConfiguration->target()->profile();
sp.debuggerCommand = tc->debuggerCommand().toString(); sp.debuggerCommand = DebuggerProfileInformation::debuggerCommand(p).toString();
} }
sp.projectSourceFiles = project->files(Project::ExcludeGeneratedFiles); sp.projectSourceFiles = project->files(Project::ExcludeGeneratedFiles);
} }

View File

@@ -32,8 +32,10 @@
#include "debuggertoolchaincombobox.h" #include "debuggertoolchaincombobox.h"
#include <projectexplorer/toolchainmanager.h> #include "debuggerprofileinformation.h"
#include <projectexplorer/toolchain.h>
#include <projectexplorer/profileinformation.h>
#include <projectexplorer/profilemanager.h>
#include <projectexplorer/abi.h> #include <projectexplorer/abi.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -58,17 +60,25 @@ DebuggerToolChainComboBox::DebuggerToolChainComboBox(QWidget *parent) :
void DebuggerToolChainComboBox::init(bool hostAbiOnly) void DebuggerToolChainComboBox::init(bool hostAbiOnly)
{ {
const ProjectExplorer::Abi hostAbi = ProjectExplorer::Abi::hostAbi(); const ProjectExplorer::Abi hostAbi = ProjectExplorer::Abi::hostAbi();
foreach (const ProjectExplorer::ToolChain *tc, ProjectExplorer::ToolChainManager::instance()->toolChains()) { foreach (const ProjectExplorer::Profile *st,
ProjectExplorer::ProfileManager::instance()->profiles()) {
if (!st->isValid())
continue;
ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(st);
if (!tc)
continue;
const ProjectExplorer::Abi abi = tc->targetAbi(); const ProjectExplorer::Abi abi = tc->targetAbi();
if (!hostAbiOnly || hostAbi.isCompatibleWith(abi)) { if (hostAbiOnly && hostAbi.os() != abi.os())
const QString debuggerCommand = tc->debuggerCommand().toString(); continue;
if (!debuggerCommand.isEmpty()) {
const AbiDebuggerCommandPair data(abi, debuggerCommand); const QString debuggerCommand = DebuggerProfileInformation::debuggerCommand(st).toString();
const QString completeBase = QFileInfo(debuggerCommand).completeBaseName(); if (debuggerCommand.isEmpty())
const QString name = tr("%1 (%2)").arg(tc->displayName(), completeBase); continue;
addItem(name, qVariantFromValue(data));
} const AbiDebuggerCommandPair data(abi, debuggerCommand);
} const QString completeBase = QFileInfo(debuggerCommand).completeBaseName();
const QString name = tr("%1 (%2)").arg(st->displayName(), completeBase);
addItem(name, qVariantFromValue(data));
} }
setEnabled(count() > 1); setEnabled(count() > 1);
} }

View File

@@ -34,13 +34,15 @@
#include "genericmakestep.h" #include "genericmakestep.h"
#include "genericproject.h" #include "genericproject.h"
#include "generictarget.h"
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/toolchain.h> #include <projectexplorer/profileinformation.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/toolchain.h>
#include <utils/pathchooser.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QFormLayout>
#include <QInputDialog> #include <QInputDialog>
using namespace GenericProjectManager; using namespace GenericProjectManager;
@@ -53,17 +55,17 @@ const char * const GENERIC_BC_ID("GenericProjectManager.GenericBuildConfiguratio
const char * const BUILD_DIRECTORY_KEY("GenericProjectManager.GenericBuildConfiguration.BuildDirectory"); const char * const BUILD_DIRECTORY_KEY("GenericProjectManager.GenericBuildConfiguration.BuildDirectory");
} }
GenericBuildConfiguration::GenericBuildConfiguration(GenericTarget *parent) GenericBuildConfiguration::GenericBuildConfiguration(ProjectExplorer::Target *parent)
: BuildConfiguration(parent, Core::Id(GENERIC_BC_ID)) : BuildConfiguration(parent, Core::Id(GENERIC_BC_ID))
{ {
} }
GenericBuildConfiguration::GenericBuildConfiguration(GenericTarget *parent, const Core::Id id) GenericBuildConfiguration::GenericBuildConfiguration(ProjectExplorer::Target *parent, const Core::Id id)
: BuildConfiguration(parent, id) : BuildConfiguration(parent, id)
{ {
} }
GenericBuildConfiguration::GenericBuildConfiguration(GenericTarget *parent, GenericBuildConfiguration *source) : GenericBuildConfiguration::GenericBuildConfiguration(ProjectExplorer::Target *parent, GenericBuildConfiguration *source) :
BuildConfiguration(parent, source), BuildConfiguration(parent, source),
m_buildDirectory(source->m_buildDirectory) m_buildDirectory(source->m_buildDirectory)
{ {
@@ -112,17 +114,16 @@ void GenericBuildConfiguration::setBuildDirectory(const QString &buildDirectory)
emit buildDirectoryChanged(); emit buildDirectoryChanged();
} }
GenericTarget *GenericBuildConfiguration::genericTarget() const ProjectExplorer::BuildConfigWidget *GenericBuildConfiguration::createConfigWidget()
{ {
return static_cast<GenericTarget *>(target()); return new GenericBuildSettingsWidget;
} }
ProjectExplorer::IOutputParser *GenericBuildConfiguration::createOutputParser() const ProjectExplorer::IOutputParser *GenericBuildConfiguration::createOutputParser() const
{ {
ProjectExplorer::ToolChain *tc = genericTarget()->genericProject()->toolChain(); ProjectExplorer::ToolChain *tc =
if (tc) ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile());
return tc->outputParser(); return tc ? tc->outputParser() : 0;
return 0;
} }
@@ -139,9 +140,9 @@ GenericBuildConfigurationFactory::~GenericBuildConfigurationFactory()
{ {
} }
QList<Core::Id> GenericBuildConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const QList<Core::Id> GenericBuildConfigurationFactory::availableCreationIds(const ProjectExplorer::Target *parent) const
{ {
if (!qobject_cast<GenericTarget *>(parent)) if (!canHandle(parent))
return QList<Core::Id>(); return QList<Core::Id>();
return QList<Core::Id>() << Core::Id(GENERIC_BC_ID); return QList<Core::Id>() << Core::Id(GENERIC_BC_ID);
} }
@@ -153,33 +154,35 @@ QString GenericBuildConfigurationFactory::displayNameForId(const Core::Id id) co
return QString(); return QString();
} }
bool GenericBuildConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const Core::Id id) const bool GenericBuildConfigurationFactory::canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const
{ {
if (!qobject_cast<GenericTarget *>(parent)) if (!canHandle(parent))
return false; return false;
if (id == Core::Id(GENERIC_BC_ID)) if (id == Core::Id(GENERIC_BC_ID))
return true; return true;
return false; return false;
} }
BuildConfiguration *GenericBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id) BuildConfiguration *GenericBuildConfigurationFactory::create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name)
{ {
if (!canCreate(parent, id)) if (!canCreate(parent, id))
return 0; return 0;
GenericTarget *target(static_cast<GenericTarget *>(parent));
//TODO asking for name is duplicated everywhere, but maybe more //TODO asking for name is duplicated everywhere, but maybe more
// wizards will show up, that incorporate choosing the name // wizards will show up, that incorporate choosing the nam
bool ok; bool ok = true;
QString buildConfigurationName = QInputDialog::getText(0, QString buildConfigurationName = name;
tr("New Configuration"), if (buildConfigurationName.isEmpty())
tr("New configuration name:"), buildConfigurationName = QInputDialog::getText(0,
QLineEdit::Normal, tr("New Configuration"),
QString(), tr("New configuration name:"),
&ok); QLineEdit::Normal,
QString(), &ok);
buildConfigurationName = buildConfigurationName.trimmed();
if (!ok || buildConfigurationName.isEmpty()) if (!ok || buildConfigurationName.isEmpty())
return 0; return 0;
GenericBuildConfiguration *bc = new GenericBuildConfiguration(target);
GenericBuildConfiguration *bc = new GenericBuildConfiguration(parent);
bc->setDisplayName(buildConfigurationName); bc->setDisplayName(buildConfigurationName);
ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
@@ -196,11 +199,10 @@ BuildConfiguration *GenericBuildConfigurationFactory::create(ProjectExplorer::Ta
cleanMakeStep->setBuildTarget(QLatin1String("clean"), /* on = */ true); cleanMakeStep->setBuildTarget(QLatin1String("clean"), /* on = */ true);
cleanMakeStep->setClean(true); cleanMakeStep->setClean(true);
target->addBuildConfiguration(bc); // also makes the name unique...
return bc; return bc;
} }
bool GenericBuildConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const bool GenericBuildConfigurationFactory::canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const
{ {
return canCreate(parent, source->id()); return canCreate(parent, source->id());
} }
@@ -209,11 +211,10 @@ BuildConfiguration *GenericBuildConfigurationFactory::clone(ProjectExplorer::Tar
{ {
if (!canClone(parent, source)) if (!canClone(parent, source))
return 0; return 0;
GenericTarget *target(static_cast<GenericTarget *>(parent)); return new GenericBuildConfiguration(parent, qobject_cast<GenericBuildConfiguration *>(source));
return new GenericBuildConfiguration(target, qobject_cast<GenericBuildConfiguration *>(source));
} }
bool GenericBuildConfigurationFactory::canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const bool GenericBuildConfigurationFactory::canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const
{ {
return canCreate(parent, ProjectExplorer::idFromMap(map)); return canCreate(parent, ProjectExplorer::idFromMap(map));
} }
@@ -222,16 +223,53 @@ BuildConfiguration *GenericBuildConfigurationFactory::restore(ProjectExplorer::T
{ {
if (!canRestore(parent, map)) if (!canRestore(parent, map))
return 0; return 0;
GenericTarget *target(static_cast<GenericTarget *>(parent)); GenericBuildConfiguration *bc(new GenericBuildConfiguration(parent));
GenericBuildConfiguration *bc(new GenericBuildConfiguration(target));
if (bc->fromMap(map)) if (bc->fromMap(map))
return bc; return bc;
delete bc; delete bc;
return 0; return 0;
} }
bool GenericBuildConfigurationFactory::canHandle(const ProjectExplorer::Target *t) const
{
if (!t->project()->supportsProfile(t->profile()))
return false;
return qobject_cast<GenericProject *>(t->project());
}
BuildConfiguration::BuildType GenericBuildConfiguration::buildType() const BuildConfiguration::BuildType GenericBuildConfiguration::buildType() const
{ {
return Unknown; return Unknown;
} }
////////////////////////////////////////////////////////////////////////////////////
// GenericBuildSettingsWidget
////////////////////////////////////////////////////////////////////////////////////
GenericBuildSettingsWidget::GenericBuildSettingsWidget() : m_buildConfiguration(0)
{
QFormLayout *fl = new QFormLayout(this);
fl->setContentsMargins(0, -1, 0, -1);
fl->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
// build directory
m_pathChooser = new Utils::PathChooser(this);
m_pathChooser->setEnabled(true);
fl->addRow(tr("Build directory:"), m_pathChooser);
connect(m_pathChooser, SIGNAL(changed(QString)), this, SLOT(buildDirectoryChanged()));
}
QString GenericBuildSettingsWidget::displayName() const
{ return tr("Generic Manager"); }
void GenericBuildSettingsWidget::init(BuildConfiguration *bc)
{
m_buildConfiguration = static_cast<GenericBuildConfiguration *>(bc);
m_pathChooser->setBaseDirectory(bc->target()->project()->projectDirectory());
m_pathChooser->setPath(m_buildConfiguration->rawBuildDirectory());
}
void GenericBuildSettingsWidget::buildDirectoryChanged()
{
m_buildConfiguration->setBuildDirectory(m_pathChooser->rawPath());
}

View File

@@ -34,6 +34,9 @@
#define GENERICBUILDCONFIGURATION_H #define GENERICBUILDCONFIGURATION_H
#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildconfiguration.h>
#include <projectexplorer/buildstep.h> // for BuildConfigWidget
namespace Utils { class PathChooser; }
namespace GenericProjectManager { namespace GenericProjectManager {
namespace Internal { namespace Internal {
@@ -47,11 +50,10 @@ class GenericBuildConfiguration : public ProjectExplorer::BuildConfiguration
friend class GenericBuildConfigurationFactory; friend class GenericBuildConfigurationFactory;
public: public:
explicit GenericBuildConfiguration(GenericTarget *parent); explicit GenericBuildConfiguration(ProjectExplorer::Target *parent);
virtual ~GenericBuildConfiguration(); virtual ~GenericBuildConfiguration();
GenericTarget *genericTarget() const; ProjectExplorer::BuildConfigWidget *createConfigWidget();
virtual QString buildDirectory() const; virtual QString buildDirectory() const;
QString rawBuildDirectory() const; QString rawBuildDirectory() const;
@@ -64,8 +66,8 @@ public:
BuildType buildType() const; BuildType buildType() const;
protected: protected:
GenericBuildConfiguration(GenericTarget *parent, GenericBuildConfiguration *source); GenericBuildConfiguration(ProjectExplorer::Target *parent, GenericBuildConfiguration *source);
GenericBuildConfiguration(GenericTarget *parent, const Core::Id id); GenericBuildConfiguration(ProjectExplorer::Target *parent, const Core::Id id);
virtual bool fromMap(const QVariantMap &map); virtual bool fromMap(const QVariantMap &map);
private: private:
@@ -80,17 +82,39 @@ public:
explicit GenericBuildConfigurationFactory(QObject *parent = 0); explicit GenericBuildConfigurationFactory(QObject *parent = 0);
~GenericBuildConfigurationFactory(); ~GenericBuildConfigurationFactory();
QList<Core::Id> availableCreationIds(ProjectExplorer::Target *parent) const; QList<Core::Id> availableCreationIds(const ProjectExplorer::Target *parent) const;
QString displayNameForId(const Core::Id id) const; QString displayNameForId(const Core::Id id) const;
bool canCreate(ProjectExplorer::Target *parent, const Core::Id id) const; bool canCreate(const ProjectExplorer::Target *parent, const Core::Id id) const;
ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id); ProjectExplorer::BuildConfiguration *create(ProjectExplorer::Target *parent, const Core::Id id, const QString &name = QString());
bool canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const; bool canClone(const ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const;
ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source); ProjectExplorer::BuildConfiguration *clone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source);
bool canRestore(ProjectExplorer::Target *parent, const QVariantMap &map) const; bool canRestore(const ProjectExplorer::Target *parent, const QVariantMap &map) const;
ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map); ProjectExplorer::BuildConfiguration *restore(ProjectExplorer::Target *parent, const QVariantMap &map);
private:
bool canHandle(const ProjectExplorer::Target *t) const;
};
class GenericBuildSettingsWidget : public ProjectExplorer::BuildConfigWidget
{
Q_OBJECT
public:
GenericBuildSettingsWidget();
QString displayName() const;
void init(ProjectExplorer::BuildConfiguration *bc);
private slots:
void buildDirectoryChanged();
private:
Utils::PathChooser *m_pathChooser;
GenericBuildConfiguration *m_buildConfiguration;
}; };
} // namespace GenericProjectManager
} // namespace Internal } // namespace Internal
} // namespace GenericProjectManager
#endif // GENERICBUILDCONFIGURATION_H #endif // GENERICBUILDCONFIGURATION_H

View File

@@ -33,16 +33,16 @@
#include "genericmakestep.h" #include "genericmakestep.h"
#include "genericprojectconstants.h" #include "genericprojectconstants.h"
#include "genericproject.h" #include "genericproject.h"
#include "generictarget.h"
#include "ui_genericmakestep.h" #include "ui_genericmakestep.h"
#include "genericbuildconfiguration.h" #include "genericbuildconfiguration.h"
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include <projectexplorer/buildsteplist.h> #include <projectexplorer/buildsteplist.h>
#include <projectexplorer/toolchain.h>
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/gnumakeparser.h> #include <projectexplorer/gnumakeparser.h>
#include <projectexplorer/profileinformation.h>
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <projectexplorer/toolchain.h>
#include <coreplugin/variablemanager.h> #include <coreplugin/variablemanager.h>
#include <utils/stringutils.h> #include <utils/stringutils.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
@@ -126,8 +126,10 @@ bool GenericMakeStep::init()
setIgnoreReturnValue(m_clean); setIgnoreReturnValue(m_clean);
setOutputParser(new ProjectExplorer::GnuMakeParser()); setOutputParser(new ProjectExplorer::GnuMakeParser());
if (bc->genericTarget()->genericProject()->toolChain()) ProjectExplorer::ToolChain *tc =
appendOutputParser(bc->genericTarget()->genericProject()->toolChain()->outputParser()); ProjectExplorer::ToolChainProfileInformation::toolChain(bc->target()->profile());
if (tc)
appendOutputParser(tc->outputParser());
outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory()); outputParser()->setWorkingDirectory(pp->effectiveWorkingDirectory());
return AbstractProcessStep::init(); return AbstractProcessStep::init();
@@ -175,9 +177,9 @@ QString GenericMakeStep::makeCommand() const
{ {
QString command = m_makeCommand; QString command = m_makeCommand;
if (command.isEmpty()) { if (command.isEmpty()) {
GenericProject *pro = static_cast<GenericProject *>(target()->project()); ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainProfileInformation::toolChain(target()->profile());
if (ProjectExplorer::ToolChain *toolChain = pro->toolChain()) if (tc)
command = toolChain->makeCommand(); command = tc->makeCommand();
else else
command = QLatin1String("make"); command = QLatin1String("make");
} }
@@ -249,7 +251,7 @@ GenericMakeStepConfigWidget::GenericMakeStepConfigWidget(GenericMakeStep *makeSt
connect(ProjectExplorer::ProjectExplorerPlugin::instance(), SIGNAL(settingsChanged()), connect(ProjectExplorer::ProjectExplorerPlugin::instance(), SIGNAL(settingsChanged()),
this, SLOT(updateDetails())); this, SLOT(updateDetails()));
connect(pro, SIGNAL(toolChainChanged(ProjectExplorer::ToolChain*)), connect(m_makeStep->target(), SIGNAL(profileChanged()),
this, SLOT(updateMakeOverrrideLabel())); this, SLOT(updateMakeOverrrideLabel()));
} }

View File

@@ -34,17 +34,19 @@
#include "genericbuildconfiguration.h" #include "genericbuildconfiguration.h"
#include "genericprojectconstants.h" #include "genericprojectconstants.h"
#include "generictarget.h"
#include "genericmakestep.h"
#include <projectexplorer/abi.h> #include <projectexplorer/abi.h>
#include <projectexplorer/buildenvironmentwidget.h> #include <projectexplorer/buildenvironmentwidget.h>
#include <projectexplorer/buildsteplist.h>
#include <projectexplorer/headerpath.h> #include <projectexplorer/headerpath.h>
#include <projectexplorer/toolchainmanager.h> #include <projectexplorer/profileinformation.h>
#include <projectexplorer/profilemanager.h>
#include <projectexplorer/projectexplorerconstants.h> #include <projectexplorer/projectexplorerconstants.h>
#include <qtsupport/customexecutablerunconfiguration.h> #include <qtsupport/customexecutablerunconfiguration.h>
#include <cpptools/ModelManagerInterface.h> #include <cpptools/ModelManagerInterface.h>
#include <extensionsystem/pluginmanager.h> #include <extensionsystem/pluginmanager.h>
#include <utils/pathchooser.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/fileutils.h> #include <utils/fileutils.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
@@ -54,7 +56,6 @@
#include <QDir> #include <QDir>
#include <QProcessEnvironment> #include <QProcessEnvironment>
#include <QFormLayout>
#include <QMainWindow> #include <QMainWindow>
#include <QComboBox> #include <QComboBox>
@@ -62,18 +63,13 @@ using namespace GenericProjectManager;
using namespace GenericProjectManager::Internal; using namespace GenericProjectManager::Internal;
using namespace ProjectExplorer; using namespace ProjectExplorer;
namespace {
const char * const TOOLCHAIN_KEY("GenericProjectManager.GenericProject.Toolchain");
} // end of anonymous namespace
//////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////
// GenericProject // GenericProject
//////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////
GenericProject::GenericProject(Manager *manager, const QString &fileName) GenericProject::GenericProject(Manager *manager, const QString &fileName)
: m_manager(manager), : m_manager(manager),
m_fileName(fileName), m_fileName(fileName)
m_toolChain(0)
{ {
setProjectContext(Core::Context(GenericProjectManager::Constants::PROJECTCONTEXT)); setProjectContext(Core::Context(GenericProjectManager::Constants::PROJECTCONTEXT));
setProjectLanguage(Core::Context(ProjectExplorer::Constants::LANG_CXX)); setProjectLanguage(Core::Context(ProjectExplorer::Constants::LANG_CXX));
@@ -107,12 +103,6 @@ GenericProject::~GenericProject()
m_manager->unregisterProject(this); m_manager->unregisterProject(this);
delete m_rootNode; delete m_rootNode;
// do not delete m_toolChain
}
GenericTarget *GenericProject::activeTarget() const
{
return static_cast<GenericTarget *>(Project::activeTarget());
} }
QString GenericProject::filesFileName() const QString GenericProject::filesFileName() const
@@ -261,11 +251,13 @@ void GenericProject::refresh(RefreshOptions options)
CPlusPlus::CppModelManagerInterface::ProjectPart::Ptr part( CPlusPlus::CppModelManagerInterface::ProjectPart::Ptr part(
new CPlusPlus::CppModelManagerInterface::ProjectPart); new CPlusPlus::CppModelManagerInterface::ProjectPart);
if (m_toolChain) { ToolChain *tc = activeTarget() ?
part->defines = m_toolChain->predefinedMacros(QStringList()); ProjectExplorer::ToolChainProfileInformation::toolChain(activeTarget()->profile()) : 0;
if (tc) {
part->defines = tc->predefinedMacros(QStringList());
part->defines += '\n'; part->defines += '\n';
foreach (const HeaderPath &headerPath, m_toolChain->systemHeaderPaths()) { foreach (const HeaderPath &headerPath, tc->systemHeaderPaths()) {
if (headerPath.kind() == HeaderPath::FrameworkHeaderPath) if (headerPath.kind() == HeaderPath::FrameworkHeaderPath)
part->frameworkPaths.append(headerPath.path()); part->frameworkPaths.append(headerPath.path());
else else
@@ -389,27 +381,6 @@ QByteArray GenericProject::defines() const
return m_defines; return m_defines;
} }
void GenericProject::setToolChain(ToolChain *tc)
{
if (m_toolChain == tc)
return;
m_toolChain = tc;
refresh(Configuration);
foreach (Target *t, targets()) {
foreach (BuildConfiguration *bc, t->buildConfigurations())
bc->setToolChain(tc);
}
emit toolChainChanged(m_toolChain);
}
ToolChain *GenericProject::toolChain() const
{
return m_toolChain;
}
QString GenericProject::displayName() const QString GenericProject::displayName() const
{ {
return m_projectName; return m_projectName;
@@ -456,18 +427,14 @@ QStringList GenericProject::buildTargets() const
return targets; return targets;
} }
QVariantMap GenericProject::toMap() const
{
QVariantMap map(Project::toMap());
map.insert(QLatin1String(TOOLCHAIN_KEY), m_toolChain ? m_toolChain->id() : QString());
return map;
}
bool GenericProject::fromMap(const QVariantMap &map) bool GenericProject::fromMap(const QVariantMap &map)
{ {
if (!Project::fromMap(map)) if (!Project::fromMap(map))
return false; return false;
if (!activeTarget())
addTarget(createTarget(ProfileManager::instance()->defaultProfile()));
// Sanity check: We need both a buildconfiguration and a runconfiguration! // Sanity check: We need both a buildconfiguration and a runconfiguration!
QList<Target *> targetList = targets(); QList<Target *> targetList = targets();
foreach (Target *t, targetList) { foreach (Target *t, targetList) {
@@ -480,119 +447,16 @@ bool GenericProject::fromMap(const QVariantMap &map)
t->addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(t)); t->addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(t));
} }
// Add default setup:
if (targets().isEmpty()) {
GenericTargetFactory *factory =
ExtensionSystem::PluginManager::getObject<GenericTargetFactory>();
addTarget(factory->create(this, Core::Id(GENERIC_DESKTOP_TARGET_ID)));
}
QString id = map.value(QLatin1String(TOOLCHAIN_KEY)).toString();
const ToolChainManager *toolChainManager = ToolChainManager::instance();
if (!id.isNull()) {
setToolChain(toolChainManager->findToolChain(id));
} else {
ProjectExplorer::Abi abi = ProjectExplorer::Abi::hostAbi();
abi = ProjectExplorer::Abi(abi.architecture(), abi.os(), ProjectExplorer::Abi::UnknownFlavor,
abi.binaryFormat(), abi.wordWidth() == 32 ? 32 : 0);
QList<ToolChain *> tcs = toolChainManager->findToolChains(abi);
if (tcs.isEmpty())
tcs = toolChainManager->toolChains();
if (!tcs.isEmpty())
setToolChain(tcs.at(0));
}
setIncludePaths(allIncludePaths()); setIncludePaths(allIncludePaths());
refresh(Everything); evaluateBuildSystem();
return true; return true;
} }
//////////////////////////////////////////////////////////////////////////////////// void GenericProject::evaluateBuildSystem()
// GenericBuildSettingsWidget
////////////////////////////////////////////////////////////////////////////////////
GenericBuildSettingsWidget::GenericBuildSettingsWidget(GenericTarget *target)
: m_target(target), m_toolChainChooser(0), m_buildConfiguration(0)
{ {
QFormLayout *fl = new QFormLayout(this); refresh(Everything);
fl->setContentsMargins(0, -1, 0, -1); buildSystemEvaluationFinished(true);
fl->setFieldGrowthPolicy(QFormLayout::ExpandingFieldsGrow);
// build directory
m_pathChooser = new Utils::PathChooser(this);
m_pathChooser->setEnabled(true);
m_pathChooser->setBaseDirectory(m_target->genericProject()->projectDirectory());
fl->addRow(tr("Build directory:"), m_pathChooser);
connect(m_pathChooser, SIGNAL(changed(QString)), this, SLOT(buildDirectoryChanged()));
// tool chain
m_toolChainChooser = new QComboBox;
m_toolChainChooser->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
updateToolChainList();
fl->addRow(tr("Tool chain:"), m_toolChainChooser);
connect(m_toolChainChooser, SIGNAL(activated(int)), this, SLOT(toolChainSelected(int)));
connect(m_target->genericProject(), SIGNAL(toolChainChanged(ProjectExplorer::ToolChain*)),
this, SLOT(toolChainChanged(ProjectExplorer::ToolChain*)));
connect(ProjectExplorer::ToolChainManager::instance(), SIGNAL(toolChainAdded(ProjectExplorer::ToolChain*)),
this, SLOT(updateToolChainList()));
connect(ProjectExplorer::ToolChainManager::instance(), SIGNAL(toolChainRemoved(ProjectExplorer::ToolChain*)),
this, SLOT(updateToolChainList()));
}
GenericBuildSettingsWidget::~GenericBuildSettingsWidget()
{ }
QString GenericBuildSettingsWidget::displayName() const
{ return tr("Generic Manager"); }
void GenericBuildSettingsWidget::init(BuildConfiguration *bc)
{
m_buildConfiguration = static_cast<GenericBuildConfiguration *>(bc);
m_pathChooser->setPath(m_buildConfiguration->rawBuildDirectory());
}
void GenericBuildSettingsWidget::buildDirectoryChanged()
{
m_buildConfiguration->setBuildDirectory(m_pathChooser->rawPath());
}
void GenericBuildSettingsWidget::toolChainSelected(int index)
{
using namespace ProjectExplorer;
ToolChain *tc = static_cast<ToolChain *>(m_toolChainChooser->itemData(index).value<void *>());
m_target->genericProject()->setToolChain(tc);
}
void GenericBuildSettingsWidget::toolChainChanged(ProjectExplorer::ToolChain *tc)
{
for (int i = 0; i < m_toolChainChooser->count(); ++i) {
ToolChain * currentTc = static_cast<ToolChain *>(m_toolChainChooser->itemData(i).value<void *>());
if (currentTc != tc)
continue;
m_toolChainChooser->setCurrentIndex(i);
return;
}
}
void GenericBuildSettingsWidget::updateToolChainList()
{
m_toolChainChooser->clear();
QList<ToolChain *> tcs = ToolChainManager::instance()->toolChains();
if (!m_target->genericProject()->toolChain()) {
m_toolChainChooser->addItem(tr("<Invalid tool chain>"), qVariantFromValue(static_cast<void *>(0)));
m_toolChainChooser->setCurrentIndex(0);
}
foreach (ToolChain *tc, tcs) {
m_toolChainChooser->addItem(tc->displayName(), qVariantFromValue(static_cast<void *>(tc)));
if (m_target->genericProject()->toolChain()
&& m_target->genericProject()->toolChain()->id() == tc->id())
m_toolChainChooser->setCurrentIndex(m_toolChainChooser->count() - 1);
}
} }
//////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////

View File

@@ -35,13 +35,11 @@
#include "genericprojectmanager.h" #include "genericprojectmanager.h"
#include "genericprojectnodes.h" #include "genericprojectnodes.h"
#include "generictarget.h"
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
#include <projectexplorer/projectnodes.h> #include <projectexplorer/projectnodes.h>
#include <projectexplorer/target.h> #include <projectexplorer/target.h>
#include <projectexplorer/toolchain.h> #include <projectexplorer/toolchain.h>
#include <projectexplorer/buildstep.h>
#include <projectexplorer/buildconfiguration.h> #include <projectexplorer/buildconfiguration.h>
#include <coreplugin/idocument.h> #include <coreplugin/idocument.h>
@@ -51,13 +49,7 @@ QT_BEGIN_NAMESPACE
class QComboBox; class QComboBox;
QT_END_NAMESPACE QT_END_NAMESPACE
namespace Utils { namespace ProjectExplorer { class ToolChain; }
class PathChooser;
}
namespace ProjectExplorer {
class ToolChain;
}
namespace GenericProjectManager { namespace GenericProjectManager {
namespace Internal { namespace Internal {
@@ -84,7 +76,6 @@ public:
Core::Id id() const; Core::Id id() const;
Core::IDocument *document() const; Core::IDocument *document() const;
ProjectExplorer::IProjectManager *projectManager() const; ProjectExplorer::IProjectManager *projectManager() const;
GenericTarget *activeTarget() const;
QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets(); QList<ProjectExplorer::BuildConfigWidget*> subConfigWidgets();
@@ -114,18 +105,12 @@ public:
QStringList projectIncludePaths() const; QStringList projectIncludePaths() const;
QStringList files() const; QStringList files() const;
QStringList generated() const; QStringList generated() const;
ProjectExplorer::ToolChain *toolChain() const;
void setToolChain(ProjectExplorer::ToolChain *tc);
QVariantMap toMap() const;
signals:
void toolChainChanged(ProjectExplorer::ToolChain *);
protected: protected:
virtual bool fromMap(const QVariantMap &map); bool fromMap(const QVariantMap &map);
private: private:
void evaluateBuildSystem();
bool saveRawFileList(const QStringList &rawFileList); bool saveRawFileList(const QStringList &rawFileList);
void parseProject(RefreshOptions options); void parseProject(RefreshOptions options);
QStringList processEntries(const QStringList &paths, QStringList processEntries(const QStringList &paths,
@@ -150,7 +135,6 @@ private:
QByteArray m_defines; QByteArray m_defines;
GenericProjectNode *m_rootNode; GenericProjectNode *m_rootNode;
ProjectExplorer::ToolChain *m_toolChain;
QFuture<void> m_codeModelFuture; QFuture<void> m_codeModelFuture;
}; };
@@ -182,31 +166,6 @@ private:
GenericProject::RefreshOptions m_options; GenericProject::RefreshOptions m_options;
}; };
class GenericBuildSettingsWidget : public ProjectExplorer::BuildConfigWidget
{
Q_OBJECT
public:
GenericBuildSettingsWidget(GenericTarget *target);
virtual ~GenericBuildSettingsWidget();
virtual QString displayName() const;
virtual void init(ProjectExplorer::BuildConfiguration *bc);
private Q_SLOTS:
void buildDirectoryChanged();
void toolChainSelected(int index);
void toolChainChanged(ProjectExplorer::ToolChain *);
void updateToolChainList();
private:
GenericTarget *m_target;
Utils::PathChooser *m_pathChooser;
QComboBox *m_toolChainChooser;
GenericBuildConfiguration *m_buildConfiguration;
};
} // namespace Internal } // namespace Internal
} // namespace GenericProjectManager } // namespace GenericProjectManager

View File

@@ -4,7 +4,6 @@ include(../../qtcreatorplugin.pri)
include(genericprojectmanager_dependencies.pri) include(genericprojectmanager_dependencies.pri)
HEADERS = genericproject.h \ HEADERS = genericproject.h \
genericprojectplugin.h \ genericprojectplugin.h \
generictarget.h \
genericprojectmanager.h \ genericprojectmanager.h \
genericprojectconstants.h \ genericprojectconstants.h \
genericprojectnodes.h \ genericprojectnodes.h \
@@ -17,7 +16,6 @@ HEADERS = genericproject.h \
filesselectionwizardpage.h filesselectionwizardpage.h
SOURCES = genericproject.cpp \ SOURCES = genericproject.cpp \
genericprojectplugin.cpp \ genericprojectplugin.cpp \
generictarget.cpp \
genericprojectmanager.cpp \ genericprojectmanager.cpp \
genericprojectnodes.cpp \ genericprojectnodes.cpp \
genericprojectwizard.cpp \ genericprojectwizard.cpp \

View File

@@ -25,7 +25,6 @@ QtcPlugin {
files: [ files: [
"genericproject.h", "genericproject.h",
"genericprojectplugin.h", "genericprojectplugin.h",
"generictarget.h",
"genericprojectmanager.h", "genericprojectmanager.h",
"genericprojectconstants.h", "genericprojectconstants.h",
"genericprojectnodes.h", "genericprojectnodes.h",
@@ -38,7 +37,6 @@ QtcPlugin {
"filesselectionwizardpage.h", "filesselectionwizardpage.h",
"genericproject.cpp", "genericproject.cpp",
"genericprojectplugin.cpp", "genericprojectplugin.cpp",
"generictarget.cpp",
"genericprojectmanager.cpp", "genericprojectmanager.cpp",
"genericprojectnodes.cpp", "genericprojectnodes.cpp",
"genericprojectwizard.cpp", "genericprojectwizard.cpp",

View File

@@ -31,12 +31,13 @@
**************************************************************************/ **************************************************************************/
#include "genericprojectplugin.h" #include "genericprojectplugin.h"
#include "genericbuildconfiguration.h"
#include "genericprojectmanager.h" #include "genericprojectmanager.h"
#include "genericprojectwizard.h" #include "genericprojectwizard.h"
#include "genericprojectconstants.h" #include "genericprojectconstants.h"
#include "genericprojectfileseditor.h" #include "genericprojectfileseditor.h"
#include "genericmakestep.h" #include "genericmakestep.h"
#include "generictarget.h"
#include "genericproject.h" #include "genericproject.h"
#include "selectablefilesmodel.h" #include "selectablefilesmodel.h"
@@ -92,7 +93,7 @@ bool GenericProjectPlugin::initialize(const QStringList &, QString *errorMessage
addAutoReleasedObject(manager); addAutoReleasedObject(manager);
addAutoReleasedObject(new GenericMakeStepFactory); addAutoReleasedObject(new GenericMakeStepFactory);
addAutoReleasedObject(new GenericProjectWizard); addAutoReleasedObject(new GenericProjectWizard);
addAutoReleasedObject(new GenericTargetFactory); addAutoReleasedObject(new GenericBuildConfigurationFactory);
const Core::Context projectContext(Constants::PROJECTCONTEXT); const Core::Context projectContext(Constants::PROJECTCONTEXT);
Core::ActionContainer *mproject = Core::ActionContainer *mproject =

View File

@@ -1,176 +0,0 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/
#include "generictarget.h"
#include "genericbuildconfiguration.h"
#include "genericproject.h"
#include "genericmakestep.h"
#include <projectexplorer/buildsteplist.h>
#include <projectexplorer/deployconfiguration.h>
#include <projectexplorer/projectexplorerconstants.h>
#include <qtsupport/customexecutablerunconfiguration.h>
#include <QApplication>
#include <QStyle>
const char GENERIC_DESKTOP_TARGET_DISPLAY_NAME[] = "Desktop";
using namespace GenericProjectManager;
using namespace GenericProjectManager::Internal;
////////////////////////////////////////////////////////////////////////////////////
// GenericTarget
////////////////////////////////////////////////////////////////////////////////////
GenericTarget::GenericTarget(GenericProject *parent) :
ProjectExplorer::Target(parent, Core::Id(GENERIC_DESKTOP_TARGET_ID)),
m_buildConfigurationFactory(new GenericBuildConfigurationFactory(this))
{
setDefaultDisplayName(QApplication::translate("GenericProjectManager::GenericTarget",
GENERIC_DESKTOP_TARGET_DISPLAY_NAME));
setIcon(qApp->style()->standardIcon(QStyle::SP_ComputerIcon));
}
ProjectExplorer::BuildConfigWidget *GenericTarget::createConfigWidget()
{
return new GenericBuildSettingsWidget(this);
}
GenericProject *GenericTarget::genericProject() const
{
return static_cast<GenericProject *>(project());
}
GenericBuildConfigurationFactory *GenericTarget::buildConfigurationFactory() const
{
return m_buildConfigurationFactory;
}
GenericBuildConfiguration *GenericTarget::activeBuildConfiguration() const
{
return static_cast<GenericBuildConfiguration *>(Target::activeBuildConfiguration());
}
bool GenericTarget::fromMap(const QVariantMap &map)
{
return Target::fromMap(map);
}
////////////////////////////////////////////////////////////////////////////////////
// GenericTargetFactory
////////////////////////////////////////////////////////////////////////////////////
GenericTargetFactory::GenericTargetFactory(QObject *parent) :
ITargetFactory(parent)
{
}
bool GenericTargetFactory::supportsTargetId(const Core::Id id) const
{
return id == Core::Id(GENERIC_DESKTOP_TARGET_ID);
}
QList<Core::Id> GenericTargetFactory::supportedTargetIds() const
{
return QList<Core::Id>() << Core::Id(GENERIC_DESKTOP_TARGET_ID);
}
QString GenericTargetFactory::displayNameForId(const Core::Id id) const
{
if (id == Core::Id(GENERIC_DESKTOP_TARGET_ID))
return QCoreApplication::translate("GenericProjectManager::GenericTarget",
GENERIC_DESKTOP_TARGET_DISPLAY_NAME,
"Generic desktop target display name");
return QString();
}
bool GenericTargetFactory::canCreate(ProjectExplorer::Project *parent, const Core::Id id) const
{
if (!qobject_cast<GenericProject *>(parent))
return false;
return id == Core::Id(GENERIC_DESKTOP_TARGET_ID);
}
GenericTarget *GenericTargetFactory::create(ProjectExplorer::Project *parent, const Core::Id id)
{
if (!canCreate(parent, id))
return 0;
GenericProject *genericproject = static_cast<GenericProject *>(parent);
GenericTarget *t = new GenericTarget(genericproject);
// Set up BuildConfiguration:
GenericBuildConfiguration *bc = new GenericBuildConfiguration(t);
bc->setDisplayName(QLatin1String("all"));
ProjectExplorer::BuildStepList *buildSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
ProjectExplorer::BuildStepList *cleanSteps = bc->stepList(ProjectExplorer::Constants::BUILDSTEPS_CLEAN);
GenericMakeStep *makeStep = new GenericMakeStep(buildSteps);
buildSteps->insertStep(0, makeStep);
makeStep->setBuildTarget(QLatin1String("all"), /* on = */ true);
GenericMakeStep *cleanMakeStep = new GenericMakeStep(cleanSteps);
cleanSteps->insertStep(0, cleanMakeStep);
cleanMakeStep->setBuildTarget(QLatin1String("clean"), /* on = */ true);
cleanMakeStep->setClean(true);
bc->setBuildDirectory(genericproject->projectDirectory());
t->addBuildConfiguration(bc);
t->addDeployConfiguration(t->createDeployConfiguration(ProjectExplorer::Constants::DEFAULT_DEPLOYCONFIGURATION_ID));
// Add a runconfiguration. The CustomExecutableRC one will query the user
// for its settings, so it is a good choice here.
t->addRunConfiguration(new QtSupport::CustomExecutableRunConfiguration(t));
return t;
}
bool GenericTargetFactory::canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const
{
return canCreate(parent, ProjectExplorer::idFromMap(map));
}
GenericTarget *GenericTargetFactory::restore(ProjectExplorer::Project *parent, const QVariantMap &map)
{
if (!canRestore(parent, map))
return 0;
GenericProject *genericproject = static_cast<GenericProject *>(parent);
GenericTarget *target = new GenericTarget(genericproject);
if (target->fromMap(map))
return target;
delete target;
return 0;
}

View File

@@ -1,100 +0,0 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/
#ifndef GENERICTARGET_H
#define GENERICTARGET_H
#include <projectexplorer/target.h>
#include "genericbuildconfiguration.h"
#include <QStringList>
#include <QVariantMap>
namespace ProjectExplorer {
class IBuildConfigurationFactory;
} // namespace ProjectExplorer
namespace GenericProjectManager {
namespace Internal {
const char GENERIC_DESKTOP_TARGET_ID[] = "GenericProjectManager.GenericTarget";
class GenericProject;
class GenericRunConfiguration;
class GenericTargetFactory;
class GenericTarget : public ProjectExplorer::Target
{
Q_OBJECT
friend class GenericTargetFactory;
public:
explicit GenericTarget(GenericProject *parent);
ProjectExplorer::BuildConfigWidget *createConfigWidget();
GenericProject *genericProject() const;
GenericBuildConfigurationFactory *buildConfigurationFactory() const;
GenericBuildConfiguration *activeBuildConfiguration() const;
protected:
bool fromMap(const QVariantMap &map);
private:
GenericBuildConfigurationFactory *m_buildConfigurationFactory;
};
class GenericTargetFactory : public ProjectExplorer::ITargetFactory
{
Q_OBJECT
public:
explicit GenericTargetFactory(QObject *parent = 0);
bool supportsTargetId(const Core::Id id) const;
QList<Core::Id> supportedTargetIds() const;
QString displayNameForId(const Core::Id id) const;
bool canCreate(ProjectExplorer::Project *parent, const Core::Id id) const;
GenericTarget *create(ProjectExplorer::Project *parent, const Core::Id id);
bool canRestore(ProjectExplorer::Project *parent, const QVariantMap &map) const;
GenericTarget *restore(ProjectExplorer::Project *parent, const QVariantMap &map);
};
} // namespace Internal
} // namespace GenericProjectManager
#endif // GENERICTARGET_H

View File

@@ -0,0 +1,728 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/
#include "debianmanager.h"
#include "maddedevice.h"
#include "maemoconstants.h"
#include "maemoglobal.h"
#include "maemopackagecreationstep.h"
#include <coreplugin/documentmanager.h>
#include <projectexplorer/project.h>
#include <projectexplorer/target.h>
#include <qt4projectmanager/qt4buildconfiguration.h>
#include <qtsupport/qtprofileinformation.h>
#include <utils/filesystemwatcher.h>
#include <utils/qtcassert.h>
#include <QBuffer>
#include <QByteArray>
#include <QDateTime>
#include <QDir>
#include <QProcess>
#include <QMessageBox>
// -----------------------------------------------------------------------
// Helpers:
// -----------------------------------------------------------------------
namespace {
const QByteArray IconFieldName("XB-Maemo-Icon-26");
const QByteArray NameFieldName("Package");
const QByteArray ShortDescriptionFieldName("Description");
const QLatin1String PackagingDirName("qtc_packaging");
// The QDateTime API can only deliver these in localized form...
QString shortMonthName(const QDateTime &dt)
{
switch (dt.date().month()) {
case 1: return QLatin1String("Jan");
case 2: return QLatin1String("Feb");
case 3: return QLatin1String("Mar");
case 4: return QLatin1String("Apr");
case 5: return QLatin1String("May");
case 6: return QLatin1String("Jun");
case 7: return QLatin1String("Jul");
case 8: return QLatin1String("Aug");
case 9: return QLatin1String("Sep");
case 10: return QLatin1String("Oct");
case 11: return QLatin1String("Nov");
case 12: return QLatin1String("Dec");
default: QTC_ASSERT(false, return QString());
}
}
QString shortDayOfWeekName(const QDateTime &dt)
{
switch (dt.date().dayOfWeek()) {
case Qt::Monday: return QLatin1String("Mon");
case Qt::Tuesday: return QLatin1String("Tue");
case Qt::Wednesday: return QLatin1String("Wed");
case Qt::Thursday: return QLatin1String("Thu");
case Qt::Friday: return QLatin1String("Fri");
case Qt::Saturday: return QLatin1String("Sat");
case Qt::Sunday: return QLatin1String("Sun");
default: QTC_ASSERT(false, return QString());
}
}
QByteArray packageManagerNameFieldName(Core::Id deviceType)
{
if (deviceType == Core::Id(Madde::Internal::Maemo5OsType))
return QByteArray("XB-Maemo-Display-Name");
return QByteArray("XSBC-Maemo-Display-Name");
}
QList<QPair<QByteArray, QByteArray> > additionalFields(Core::Id deviceType, const QString &projectName)
{
QList<QPair<QByteArray, QByteArray> > fields;
if (deviceType == Core::Id(Madde::Internal::HarmattanOsType))
fields << qMakePair(QByteArray("XB-Maemo-Flags"), QByteArray("visible"))
<< qMakePair(QByteArray("XB-MeeGo-Desktop-Entry-Filename"),
QString::fromLatin1("%1_harmattan").arg(projectName).toUtf8())
<< qMakePair(QByteArray("XB-MeeGo-Desktop-Entry"),
QString::fromLatin1("\n [Desktop Entry]\n Type=Application\n Name=%1\n Icon=/usr/share/icons/hicolor/80x80/apps/%1%2.png")
.arg(projectName).arg(80).toUtf8());
return fields;
}
QByteArray section(Core::Id deviceType) {
if (deviceType == Core::Id(Madde::Internal::Maemo5OsType))
return "user/hidden";
else if (deviceType == Core::Id(Madde::Internal::HarmattanOsType))
return "user/other";
return QByteArray();
}
void raiseError(const QString &reason)
{
QMessageBox::critical(0, QCoreApplication::translate("Madde::DebianManager",
"Error creating debian project templates"), reason);
}
QString defaultPackageFileName(ProjectExplorer::Project *project)
{
QString packageName = project->displayName().toLower();
// We also replace dots later, because OVI store chokes on them (for the N900).
QRegExp illegalLetter(QLatin1String("[^a-z0-9+-]"), Qt::CaseSensitive, QRegExp::WildcardUnix);
return packageName.replace(illegalLetter, QLatin1String("-"));
}
bool adaptTagValue(QByteArray &document, const QByteArray &fieldName,
const QByteArray &newFieldValue, bool caseSensitive)
{
QByteArray adaptedLine = fieldName + ": " + newFieldValue;
const QByteArray completeTag = fieldName + ':';
const int lineOffset = caseSensitive ? document.indexOf(completeTag)
: document.toLower().indexOf(completeTag.toLower());
if (lineOffset == -1) {
document.append(adaptedLine).append('\n');
return true;
}
int newlineOffset = document.indexOf('\n', lineOffset);
bool updated = false;
if (newlineOffset == -1) {
newlineOffset = document.length();
adaptedLine += '\n';
updated = true;
}
const int replaceCount = newlineOffset - lineOffset;
if (!updated && document.mid(lineOffset, replaceCount) != adaptedLine)
updated = true;
if (updated)
document.replace(lineOffset, replaceCount, adaptedLine);
return updated;
}
QByteArray controlFileFieldValue(const Utils::FileName &control, const QString &key, bool multiLine)
{
QByteArray value;
Utils::FileReader reader;
if (!reader.fetch(control.toString()))
return value;
const QByteArray &contents = reader.data();
const int keyPos = contents.indexOf(key.toUtf8() + ':');
if (keyPos == -1)
return value;
int valueStartPos = keyPos + key.length() + 1;
int valueEndPos = contents.indexOf('\n', keyPos);
if (valueEndPos == -1)
valueEndPos = contents.count();
value = contents.mid(valueStartPos, valueEndPos - valueStartPos).trimmed();
if (multiLine) {
Q_FOREVER {
valueStartPos = valueEndPos + 1;
if (valueStartPos >= contents.count())
break;
const char firstChar = contents.at(valueStartPos);
if (firstChar == '#' || isspace(firstChar)) {
valueEndPos = contents.indexOf('\n', valueStartPos);
if (valueEndPos == -1)
valueEndPos = contents.count();
if (firstChar != '#') {
value += contents.mid(valueStartPos,
valueEndPos - valueStartPos).trimmed();
}
} else {
break;
}
}
}
return value;
}
bool setControlFieldValue(const Utils::FileName &control, const QByteArray &fieldName,
const QByteArray &fieldValue)
{
Utils::FileReader reader;
if (!reader.fetch(control.toString()))
return false;
QByteArray contents = reader.data();
if (!adaptTagValue(contents, fieldName, fieldValue, true))
return false;
Core::FileChangeBlocker update(control.toString());
Utils::FileSaver saver(control.toString());
saver.write(contents);
return saver.finalize();
}
bool adaptRulesFile(const Utils::FileName &rulesPath)
{
Utils::FileReader reader;
if (!reader.fetch(rulesPath.toString())) {
raiseError(reader.errorString());
return false;
}
QByteArray rulesContents = reader.data();
const QByteArray comment("# Uncomment this line for use without Qt Creator");
rulesContents.replace("DESTDIR", "INSTALL_ROOT");
rulesContents.replace("dh_shlibdeps", "# dh_shlibdeps " + comment);
rulesContents.replace("# Add here commands to configure the package.",
"# qmake PREFIX=/usr" + comment);
rulesContents.replace("$(MAKE)\n", "# $(MAKE) " + comment + '\n');
// Would be the right solution, but does not work (on Windows),
// because dpkg-genchanges doesn't know about it (and can't be told).
// rulesContents.replace("dh_builddeb", "dh_builddeb --destdir=.");
Utils::FileSaver saver(rulesPath.toString());
saver.write(rulesContents);
if (!saver.finalize()) {
raiseError(saver.errorString());
return false;
}
return true;
}
bool adaptControlFile(const Utils::FileName &controlPath, Qt4ProjectManager::Qt4BuildConfiguration *bc,
const QByteArray &section, const QByteArray &packageManagerNameField,
QList<QPair<QByteArray, QByteArray> > additionalFields)
{
Utils::FileReader reader;
if (!reader.fetch(controlPath.toString())) {
raiseError(reader.errorString());
return false;
}
QByteArray controlContents = reader.data();
adaptTagValue(controlContents, "Section", section, true);
adaptTagValue(controlContents, "Priority", "optional", true);
adaptTagValue(controlContents, packageManagerNameField,
bc->target()->project()->displayName().toUtf8(), true);
const int buildDependsOffset = controlContents.indexOf("Build-Depends:");
if (buildDependsOffset == -1) {
qDebug("Unexpected: no Build-Depends field in debian control file.");
} else {
int buildDependsNewlineOffset
= controlContents.indexOf('\n', buildDependsOffset);
if (buildDependsNewlineOffset == -1) {
controlContents += '\n';
buildDependsNewlineOffset = controlContents.length() - 1;
}
controlContents.insert(buildDependsNewlineOffset,
", libqt4-dev");
}
for (int i = 0; i < additionalFields.count(); ++i)
adaptTagValue(controlContents, additionalFields.at(i).first, additionalFields.at(i).second, true);
Utils::FileSaver saver(controlPath.toString());
saver.write(controlContents);
if (!saver.finalize()) {
raiseError(saver.errorString());
return false;
}
return true;
}
} // namespace
namespace Madde {
namespace Internal {
// -----------------------------------------------------------------------
// DebianManager:
// -----------------------------------------------------------------------
DebianManager *DebianManager::m_instance = 0;
DebianManager::DebianManager(QObject *parent) :
QObject(parent),
m_watcher(new Utils::FileSystemWatcher(this))
{
m_instance = this;
m_watcher->setObjectName("Madde::DebianManager");
connect(m_watcher, SIGNAL(directoryChanged(QString)),
this, SLOT(directoryWasChanged(QString)));
}
DebianManager::~DebianManager()
{ }
DebianManager *DebianManager::instance()
{
return m_instance;
}
void DebianManager::monitor(const Utils::FileName &debianDir)
{
QFileInfo fi = debianDir.toFileInfo();
if (!fi.isDir())
return;
if (!m_watches.contains(debianDir)) {
m_watches.insert(debianDir, 1);
m_watcher->addDirectory(debianDir.toString(), Utils::FileSystemWatcher::WatchAllChanges);
WatchableFile *controlFile = new WatchableFile(controlFilePath(debianDir).toString(), this);
connect(controlFile, SIGNAL(modified()), this, SLOT(controlWasChanged()));
WatchableFile *changelogFile = new WatchableFile(changelogFilePath(debianDir).toString(), this);
connect(changelogFile, SIGNAL(modified()), SLOT(changelogWasChanged()));
Core::DocumentManager::addDocuments(QList<Core::IDocument *>() << controlFile << changelogFile);
}
}
bool DebianManager::isMonitoring(const Utils::FileName &debianDir)
{
return m_watches.contains(debianDir);
}
void DebianManager::ignore(const Utils::FileName &debianDir)
{
int count = m_watches.value(debianDir, 0) - 1;
if (count < 0)
return;
if (count > 0) {
m_watches[debianDir] = 0;
} else {
m_watches.remove(debianDir);
m_watcher->removeDirectory(debianDir.toString());
}
}
QString DebianManager::projectVersion(const Utils::FileName &debianDir, QString *error)
{
Utils::FileName path = changelogFilePath(debianDir);
QFile changelog(path.toString());
if (!changelog.open(QIODevice::ReadOnly)) {
if (error)
*error = tr("Failed to open debian changelog \"%1\" file for reading.").arg(path.toUserOutput());
return QString();
}
const QByteArray &firstLine = changelog.readLine();
const int openParenPos = firstLine.indexOf('(');
if (openParenPos == -1) {
if (error)
*error = tr("Debian changelog file '%1' has unexpected format.").arg(path.toUserOutput());
return QString();
}
const int closeParenPos = firstLine.indexOf(')', openParenPos);
if (closeParenPos == -1) {
if (error)
*error = tr("Debian changelog file '%1' has unexpected format.").arg(path.toUserOutput());
return QString();
}
return QString::fromUtf8(firstLine.mid(openParenPos + 1, closeParenPos - openParenPos - 1).data());
}
bool DebianManager::setProjectVersion(const Utils::FileName &debianDir, const QString &version, QString *error)
{
const Utils::FileName filePath = changelogFilePath(debianDir);
Utils::FileReader reader;
if (!reader.fetch(filePath.toString(), error))
return false;
QString content = QString::fromUtf8(reader.data());
if (content.contains(QLatin1Char('(') + version + QLatin1Char(')'))) {
if (error)
*error = tr("Refusing to update changelog file: Already contains version '%1'.").arg(version);
return false;
}
int maintainerOffset = content.indexOf(QLatin1String("\n -- "));
const int eolOffset = content.indexOf(QLatin1Char('\n'), maintainerOffset + 1);
if (maintainerOffset == -1 || eolOffset == -1) {
if (error)
*error = tr("Cannot update changelog: Invalid format (no maintainer entry found).");
return false;
}
++maintainerOffset;
const QDateTime currentDateTime = QDateTime::currentDateTime();
QDateTime utcDateTime = QDateTime(currentDateTime);
utcDateTime.setTimeSpec(Qt::UTC);
int utcOffsetSeconds = currentDateTime.secsTo(utcDateTime);
QChar sign;
if (utcOffsetSeconds < 0) {
utcOffsetSeconds = -utcOffsetSeconds;
sign = QLatin1Char('-');
} else {
sign = QLatin1Char('+');
}
const int utcOffsetMinutes = (utcOffsetSeconds / 60) % 60;
const int utcOffsetHours = utcOffsetSeconds / 3600;
const QString dateString = QString::fromLatin1("%1, %2 %3 %4 %5%6%7")
.arg(shortDayOfWeekName(currentDateTime))
.arg(currentDateTime.toString(QLatin1String("dd")))
.arg(shortMonthName(currentDateTime))
.arg(currentDateTime.toString(QLatin1String("yyyy hh:mm:ss"))).arg(sign)
.arg(utcOffsetHours, 2, 10, QLatin1Char('0'))
.arg(utcOffsetMinutes, 2, 10, QLatin1Char('0'));
const QString maintainerLine = content.mid(maintainerOffset, eolOffset - maintainerOffset + 1)
.replace(QRegExp(QLatin1String("> [^\\n]*\n")),
QString::fromLatin1("> %1").arg(dateString));
QString versionLine = content.left(content.indexOf(QLatin1Char('\n')))
.replace(QRegExp(QLatin1String("\\([a-zA-Z0-9_\\.]+\\)")),
QLatin1Char('(') + version + QLatin1Char(')'));
const QString newEntry = versionLine + QLatin1String("\n * <Add change description here>\n\n")
+ maintainerLine + QLatin1String("\n\n");
content.prepend(newEntry);
Core::FileChangeBlocker update(filePath.toString());
Utils::FileSaver saver(filePath.toString());
saver.write(content.toUtf8());
return saver.finalize(error);
}
QString DebianManager::packageName(const Utils::FileName &debianDir)
{
return QString::fromUtf8(controlFileFieldValue(controlFilePath(debianDir), NameFieldName, false));
}
bool DebianManager::setPackageName(const Utils::FileName &debianDir, const QString &newName)
{
const QString oldPackageName = packageName(debianDir);
Utils::FileName controlPath = controlFilePath(debianDir);
if (!setControlFieldValue(controlPath, NameFieldName, newName.toUtf8()))
return false;
if (!setControlFieldValue(controlPath, "Source", newName.toUtf8()))
return false;
Utils::FileName changelogPath = changelogFilePath(debianDir);
Utils::FileReader reader;
if (!reader.fetch(changelogPath.toString()))
return false;
QString changelogContents = QString::fromUtf8(reader.data());
QRegExp pattern(QLatin1String("[^\\s]+( \\(\\d\\.\\d\\.\\d\\))"));
changelogContents.replace(pattern, newName + QLatin1String("\\1"));
Core::FileChangeBlocker updateChangelog(changelogPath.toString());
Utils::FileSaver saver(changelogPath.toString());
saver.write(changelogContents.toUtf8());
if (!saver.finalize())
return false;
Utils::FileName rulesPath = rulesFilePath(debianDir);
if (!reader.fetch(rulesPath.toString()))
return false;
QByteArray rulesContents = reader.data();
const QString oldString = QLatin1String("debian/") + oldPackageName;
const QString newString = QLatin1String("debian/") + newName;
rulesContents.replace(oldString.toUtf8(), newString.toUtf8());
Core::FileChangeBlocker updateRules(rulesPath.toString());
Utils::FileSaver rulesSaver(rulesPath.toString());
rulesSaver.write(rulesContents);
return rulesSaver.finalize();
}
QString DebianManager::shortDescription(const Utils::FileName &debianDir)
{
return QString::fromUtf8(controlFileFieldValue(controlFilePath(debianDir), ShortDescriptionFieldName, false));
}
bool DebianManager::setShortDescription(const Utils::FileName &debianDir, const QString &description)
{
return setControlFieldValue(controlFilePath(debianDir), ShortDescriptionFieldName, description.toUtf8());
}
QString DebianManager::packageManagerName(const Utils::FileName &debianDir, Core::Id deviceType)
{
return QString::fromUtf8(controlFileFieldValue(controlFilePath(debianDir),
packageManagerNameFieldName(deviceType), false));
}
bool DebianManager::setPackageManagerName(const Utils::FileName &debianDir, Core::Id deviceType, const QString &name)
{
return setControlFieldValue(controlFilePath(debianDir), packageManagerNameFieldName(deviceType),
name.toUtf8());
}
QIcon DebianManager::packageManagerIcon(const Utils::FileName &debianDir, QString *error)
{
const QByteArray &base64Icon = controlFileFieldValue(debianDir, IconFieldName, true);
if (base64Icon.isEmpty())
return QIcon();
QPixmap pixmap;
if (!pixmap.loadFromData(QByteArray::fromBase64(base64Icon))) {
if (error)
*error = tr("Invalid icon data in Debian control file.");
return QIcon();
}
return QIcon(pixmap);
}
bool DebianManager::setPackageManagerIcon(const Utils::FileName &debianDir, Core::Id deviceType,
const Utils::FileName &iconPath, QString *error)
{
const Utils::FileName filePath = controlFilePath(debianDir);
Utils::FileReader reader;
if (!reader.fetch(filePath.toString(), error))
return false;
const QPixmap pixmap(iconPath.toString());
if (pixmap.isNull()) {
if (error)
*error = tr("Could not read image file '%1'.").arg(iconPath.toUserOutput());
return false;
}
QByteArray iconAsBase64;
QBuffer buffer(&iconAsBase64);
buffer.open(QIODevice::WriteOnly);
if (!pixmap.scaled(MaddeDevice::packageManagerIconSize(deviceType))
.save(&buffer, iconPath.toFileInfo().suffix().toAscii())) {
if (error)
*error = tr("Could not export image file '%1'.").arg(iconPath.toUserOutput());
return false;
}
buffer.close();
iconAsBase64 = iconAsBase64.toBase64();
QByteArray contents = reader.data();
const QByteArray iconFieldNameWithColon = IconFieldName + ':';
const int iconFieldPos = contents.startsWith(iconFieldNameWithColon)
? 0 : contents.indexOf('\n' + iconFieldNameWithColon);
if (iconFieldPos == -1) {
if (!contents.endsWith('\n'))
contents += '\n';
contents.append(iconFieldNameWithColon).append(' ').append(iconAsBase64)
.append('\n');
} else {
const int oldIconStartPos = (iconFieldPos != 0) + iconFieldPos
+ iconFieldNameWithColon.length();
int nextEolPos = contents.indexOf('\n', oldIconStartPos);
while (nextEolPos != -1 && nextEolPos != contents.length() - 1
&& contents.at(nextEolPos + 1) != '\n'
&& (contents.at(nextEolPos + 1) == '#'
|| std::isspace(contents.at(nextEolPos + 1))))
nextEolPos = contents.indexOf('\n', nextEolPos + 1);
if (nextEolPos == -1)
nextEolPos = contents.length();
contents.replace(oldIconStartPos, nextEolPos - oldIconStartPos,
' ' + iconAsBase64);
}
Core::FileChangeBlocker update(filePath.toString());
Utils::FileSaver saver(filePath.toString());
saver.write(contents);
return saver.finalize(error);
}
bool DebianManager::hasPackageManagerIcon(const Utils::FileName &debianDir)
{
return !packageManagerIcon(debianDir).isNull();
}
Utils::FileName DebianManager::packageFileName(const Utils::FileName &debianDir)
{
return Utils::FileName::fromString(packageName(debianDir)
+ QLatin1Char('_') + projectVersion(debianDir)
+ QLatin1String("_armel.deb"));
}
DebianManager::ActionStatus DebianManager::createTemplate(Qt4ProjectManager::Qt4BuildConfiguration *bc,
const Utils::FileName &debianDir)
{
if (debianDir.toFileInfo().exists())
return NoActionRequired;
Utils::FileName location = debianDir.parentDir();
if (!location.toFileInfo().isDir()) {
if (!QDir::home().mkpath(location.toString())) {
raiseError(tr("Failed to create directory \"%1\".")
.arg(location.toUserOutput()));
return ActionFailed;
}
}
QProcess dh_makeProc;
QString error;
AbstractMaemoPackageCreationStep::preparePackagingProcess(&dh_makeProc, bc, location.toString());
const QString packageName = defaultPackageFileName(bc->target()->project());
const QStringList dh_makeArgs =
QStringList() << QLatin1String("dh_make")
<< QLatin1String("-s") << QLatin1String("-n") << QLatin1String("-p")
<< (packageName + QLatin1Char('_')
+ AbstractMaemoPackageCreationStep::DefaultVersionNumber);
QtSupport::BaseQtVersion *lqt = QtSupport::QtProfileInformation::qtVersion(bc->target()->profile());
if (!lqt) {
raiseError(tr("Unable to create Debian templates: No Qt version set."));
return ActionFailed;
}
if (!MaemoGlobal::callMad(dh_makeProc, dh_makeArgs, lqt->qmakeCommand().toString(), true)
|| !dh_makeProc.waitForStarted()) {
raiseError(tr("Unable to create Debian templates: dh_make failed (%1).")
.arg(dh_makeProc.errorString()));
return ActionFailed;
}
dh_makeProc.write("\n"); // Needs user input.
dh_makeProc.waitForFinished(-1);
if (dh_makeProc.error() != QProcess::UnknownError
|| dh_makeProc.exitCode() != 0) {
raiseError(tr("Unable to create debian templates: dh_make failed (%1).")
.arg(dh_makeProc.errorString()));
return ActionFailed;
}
if (!QFile::rename(location.appendPath(QLatin1String("debian")).toString(), debianDir.toString())) {
raiseError(tr("Unable to move new debian directory to '%1'.").arg(debianDir.toUserOutput()));
Utils::FileUtils::removeRecursively(location.toString(), &error);
return ActionFailed;
}
QDir debian(debianDir.toString());
const QStringList &files = debian.entryList(QDir::Files);
foreach (const QString &fileName, files) {
if (fileName.endsWith(QLatin1String(".ex"), Qt::CaseInsensitive)
|| fileName.compare(QLatin1String("README.debian"), Qt::CaseInsensitive) == 0
|| fileName.compare(QLatin1String("dirs"), Qt::CaseInsensitive) == 0
|| fileName.compare(QLatin1String("docs"), Qt::CaseInsensitive) == 0) {
debian.remove(fileName);
}
}
setPackageName(debianDir, packageName);
Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(bc->target()->profile());
const QByteArray sec = section(deviceType);
const QByteArray nameField = packageManagerNameFieldName(deviceType);
QList<QPair<QByteArray, QByteArray> > fields
= additionalFields(deviceType, bc->target()->project()->displayName());
return adaptRulesFile(rulesFilePath(debianDir))
&& adaptControlFile(controlFilePath(debianDir), bc, sec, nameField, fields)
? ActionSuccessful : ActionFailed;
}
QStringList DebianManager::debianFiles(const Utils::FileName &debianDir)
{
return QDir(debianDir.toString()).entryList(QDir::Files, QDir::Name | QDir::IgnoreCase);
}
Utils::FileName DebianManager::debianDirectory(ProjectExplorer::Target *target)
{
Utils::FileName path = Utils::FileName::fromString(target->project()->projectDirectory());
path.appendPath(PackagingDirName);
Core::Id deviceType = ProjectExplorer::DeviceTypeProfileInformation::deviceTypeId(target->profile());
if (deviceType == Core::Id(HarmattanOsType))
path.appendPath(QLatin1String("debian_harmattan"));
else if (deviceType == Core::Id(Maemo5OsType))
path.appendPath(QLatin1String("debian_fremantle"));
else
path.clear();
return path;
}
void DebianManager::directoryWasChanged(const QString &path)
{
Utils::FileName fn = Utils::FileName::fromString(path);
QTC_ASSERT(m_watches.contains(fn), return);
emit debianDirectoryChanged(fn);
}
void DebianManager::controlWasChanged()
{
WatchableFile *file = qobject_cast<WatchableFile *>(sender());
if (!file)
return;
emit controlChanged(Utils::FileName::fromString(file->fileName()));
}
void DebianManager::changelogWasChanged()
{
WatchableFile *file = qobject_cast<WatchableFile *>(sender());
if (!file)
return;
emit changelogChanged(Utils::FileName::fromString(file->fileName()));
}
Utils::FileName DebianManager::changelogFilePath(const Utils::FileName &debianDir)
{
Utils::FileName result = debianDir;
return result.appendPath("changelog");
}
Utils::FileName DebianManager::controlFilePath(const Utils::FileName &debianDir)
{
Utils::FileName result = debianDir;
return result.appendPath("control");
}
Utils::FileName DebianManager::rulesFilePath(const Utils::FileName &debianDir)
{
Utils::FileName result = debianDir;
return result.appendPath("rules");
}
} // namespace Internal
} // namespace Madde

View File

@@ -0,0 +1,114 @@
/**************************************************************************
**
** This file is part of Qt Creator
**
** Copyright (c) 2012 Nokia Corporation and/or its subsidiary(-ies).
**
** Contact: Nokia Corporation (qt-info@nokia.com)
**
**
** GNU Lesser General Public License Usage
**
** 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.
**
** In addition, as a special exception, Nokia gives you certain additional
** rights. These rights are described in the Nokia Qt LGPL Exception
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
**
** Other Usage
**
** Alternatively, this file may be used in accordance with the terms and
** conditions contained in a signed written agreement between you and Nokia.
**
** If you have questions regarding the use of this file, please contact
** Nokia at qt-info@nokia.com.
**
**************************************************************************/
#ifndef DEBIANMANAGER_H
#define DEBIANMANAGER_H
#include <coreplugin/id.h>
#include <utils/fileutils.h>
#include <QObject>
#include <QHash>
namespace Utils { class FileSystemWatcher; }
namespace ProjectExplorer { class Target; }
namespace Qt4ProjectManager { class Qt4BuildConfiguration; }
namespace Madde {
namespace Internal {
class MaddePlugin;
class DebianManager : public QObject
{
Q_OBJECT
public:
~DebianManager();
static DebianManager *instance();
// ref counted:
void monitor(const Utils::FileName &debianDir);
bool isMonitoring(const Utils::FileName &debianDir);
void ignore(const Utils::FileName &debianDir);
static QString projectVersion(const Utils::FileName &debianDir, QString *error = 0);
static bool setProjectVersion(const Utils::FileName &debianDir, const QString &version, QString *error = 0);
static QString packageName(const Utils::FileName &debianDir);
static bool setPackageName(const Utils::FileName &debianDir, const QString &packageName);
static QString shortDescription(const Utils::FileName &debianDir);
static bool setShortDescription(const Utils::FileName &debianDir, const QString &description);
static QString packageManagerName(const Utils::FileName &debianDir, Core::Id deviceType);
static bool setPackageManagerName(const Utils::FileName &debianDir, Core::Id deviceType, const QString &name);
static QIcon packageManagerIcon(const Utils::FileName &debianDir, QString *error = 0);
static bool setPackageManagerIcon(const Utils::FileName &debianDir, Core::Id deviceType,
const Utils::FileName &iconPath, QString *error = 0);
static bool hasPackageManagerIcon(const Utils::FileName &debianDir);
static Utils::FileName packageFileName(const Utils::FileName &debianDir);
enum ActionStatus { NoActionRequired, ActionSuccessful, ActionFailed };
// will not start to monitor this new dir!
static ActionStatus createTemplate(Qt4ProjectManager::Qt4BuildConfiguration *bc,
const Utils::FileName &debianDir);
static QStringList debianFiles(const Utils::FileName &debianDir);
static Utils::FileName debianDirectory(ProjectExplorer::Target *target);
signals:
void debianDirectoryChanged(const Utils::FileName &dir);
void changelogChanged(const Utils::FileName &dir);
void controlChanged(const Utils::FileName &dir);
private slots:
void directoryWasChanged(const QString &path);
void controlWasChanged();
void changelogWasChanged();
private:
explicit DebianManager(QObject *parent = 0);
static Utils::FileName changelogFilePath(const Utils::FileName &debianDir);
static Utils::FileName controlFilePath(const Utils::FileName &debianDir);
static Utils::FileName rulesFilePath(const Utils::FileName &debianDir);
Utils::FileSystemWatcher *m_watcher;
QHash<Utils::FileName, int> m_watches;
static DebianManager *m_instance;
friend class MaddePlugin;
};
} // namespace Internal
} // namespace Madde
#endif // DEBIANMANAGER_H

View File

@@ -8,12 +8,12 @@ include(madde_dependencies.pri)
HEADERS += \ HEADERS += \
madde_exports.h \ madde_exports.h \
maddeplugin.h \ maddeplugin.h \
debianmanager.h \
maemoconstants.h \ maemoconstants.h \
maemorunconfigurationwidget.h \ maemorunconfigurationwidget.h \
maemoruncontrol.h \ maemoruncontrol.h \
maemorunfactories.h \ maemorunfactories.h \
maemosettingspages.h \ maemosettingspages.h \
maemotoolchain.h \
maemopackagecreationstep.h \ maemopackagecreationstep.h \
maemopackagecreationfactory.h \ maemopackagecreationfactory.h \
maemopackagecreationwidget.h \ maemopackagecreationwidget.h \
@@ -37,8 +37,6 @@ HEADERS += \
maemoqemuruntimeparser.h \ maemoqemuruntimeparser.h \
maemoqemusettingswidget.h \ maemoqemusettingswidget.h \
maemoqemusettings.h \ maemoqemusettings.h \
qt4maemotargetfactory.h \
qt4maemotarget.h \
qt4maemodeployconfiguration.h \ qt4maemodeployconfiguration.h \
maemodeviceconfigwizard.h \ maemodeviceconfigwizard.h \
maemodeployconfigurationwidget.h \ maemodeployconfigurationwidget.h \
@@ -53,15 +51,16 @@ HEADERS += \
maemodeploybymountsteps.h \ maemodeploybymountsteps.h \
maddedevicetester.h \ maddedevicetester.h \
maddedeviceconfigurationfactory.h \ maddedeviceconfigurationfactory.h \
maddedevice.h maddedevice.h \
rpmmanager.h
SOURCES += \ SOURCES += \
maddeplugin.cpp \ maddeplugin.cpp \
debianmanager.cpp \
maemorunconfigurationwidget.cpp \ maemorunconfigurationwidget.cpp \
maemoruncontrol.cpp \ maemoruncontrol.cpp \
maemorunfactories.cpp \ maemorunfactories.cpp \
maemosettingspages.cpp \ maemosettingspages.cpp \
maemotoolchain.cpp \
maemopackagecreationstep.cpp \ maemopackagecreationstep.cpp \
maemopackagecreationfactory.cpp \ maemopackagecreationfactory.cpp \
maemopackagecreationwidget.cpp \ maemopackagecreationwidget.cpp \
@@ -84,8 +83,6 @@ SOURCES += \
maemoqemuruntimeparser.cpp \ maemoqemuruntimeparser.cpp \
maemoqemusettingswidget.cpp \ maemoqemusettingswidget.cpp \
maemoqemusettings.cpp \ maemoqemusettings.cpp \
qt4maemotargetfactory.cpp \
qt4maemotarget.cpp \
qt4maemodeployconfiguration.cpp \ qt4maemodeployconfiguration.cpp \
maemodeviceconfigwizard.cpp \ maemodeviceconfigwizard.cpp \
maemodeployconfigurationwidget.cpp \ maemodeployconfigurationwidget.cpp \
@@ -100,7 +97,8 @@ SOURCES += \
maemodeploybymountsteps.cpp \ maemodeploybymountsteps.cpp \
maddedevicetester.cpp \ maddedevicetester.cpp \
maemorunconfiguration.cpp \ maemorunconfiguration.cpp \
maddedevice.cpp maddedevice.cpp \
rpmmanager.cpp
FORMS += \ FORMS += \
maemopackagecreationwidget.ui \ maemopackagecreationwidget.ui \

Some files were not shown because too many files have changed in this diff Show More