2009-11-23 12:11:48 +01:00
|
|
|
/**************************************************************************
|
|
|
|
|
**
|
|
|
|
|
** This file is part of Qt Creator
|
|
|
|
|
**
|
|
|
|
|
** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
|
|
|
|
|
**
|
|
|
|
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
|
|
|
|
**
|
|
|
|
|
** Commercial Usage
|
|
|
|
|
**
|
|
|
|
|
** Licensees holding valid Qt Commercial licenses may use this file in
|
|
|
|
|
** accordance with the Qt Commercial License Agreement provided with the
|
|
|
|
|
** Software or, alternatively, in accordance with the terms contained in
|
|
|
|
|
** a written agreement between you and Nokia.
|
|
|
|
|
**
|
|
|
|
|
** GNU Lesser General Public License Usage
|
|
|
|
|
**
|
|
|
|
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
|
|
|
|
** General Public License version 2.1 as published by the Free Software
|
|
|
|
|
** Foundation and appearing in the file LICENSE.LGPL included in the
|
|
|
|
|
** packaging of this file. Please review the following information to
|
|
|
|
|
** ensure the GNU Lesser General Public License version 2.1 requirements
|
|
|
|
|
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
|
|
|
|
**
|
|
|
|
|
** If you are unsure which license is appropriate for your use, please
|
|
|
|
|
** contact the sales department at http://qt.nokia.com/contact.
|
|
|
|
|
**
|
|
|
|
|
**************************************************************************/
|
|
|
|
|
|
|
|
|
|
#include "qt4buildconfiguration.h"
|
2009-11-23 13:29:45 +01:00
|
|
|
#include "qt4project.h"
|
2009-11-23 12:11:48 +01:00
|
|
|
|
|
|
|
|
using namespace Qt4ProjectManager;
|
|
|
|
|
using namespace Qt4ProjectManager::Internal;
|
2009-11-25 18:50:20 +01:00
|
|
|
using namespace ProjectExplorer;
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
bool debug = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
namespace {
|
|
|
|
|
const char * const KEY_QT_VERSION_ID = "QtVersionId";
|
|
|
|
|
}
|
2009-11-23 12:11:48 +01:00
|
|
|
|
2009-11-24 15:36:31 +01:00
|
|
|
Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4Project *pro)
|
|
|
|
|
: BuildConfiguration(pro)
|
2009-11-23 12:11:48 +01:00
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2009-11-24 15:36:31 +01:00
|
|
|
Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BuildConfiguration *source)
|
|
|
|
|
: BuildConfiguration(source)
|
2009-11-23 12:11:48 +01:00
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Qt4BuildConfiguration::~Qt4BuildConfiguration()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
}
|
2009-11-25 18:50:20 +01:00
|
|
|
|
2009-11-26 14:43:27 +01:00
|
|
|
Qt4Project *Qt4BuildConfiguration::qt4Project() const
|
|
|
|
|
{
|
|
|
|
|
return static_cast<Qt4Project *>(project());
|
|
|
|
|
}
|
|
|
|
|
|
2009-11-25 18:50:20 +01:00
|
|
|
ProjectExplorer::Environment Qt4BuildConfiguration::baseEnvironment() const
|
|
|
|
|
{
|
|
|
|
|
Environment env = useSystemEnvironment() ? Environment::systemEnvironment() : Environment();
|
|
|
|
|
qtVersion()->addToEnvironment(env);
|
|
|
|
|
ToolChain *tc = toolChain();
|
|
|
|
|
if (tc)
|
|
|
|
|
tc->addToEnvironment(env);
|
|
|
|
|
return env;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ProjectExplorer::Environment Qt4BuildConfiguration::environment() const
|
|
|
|
|
{
|
|
|
|
|
Environment env = baseEnvironment();
|
|
|
|
|
env.modify(userEnvironmentChanges());
|
|
|
|
|
return env;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Qt4BuildConfiguration::setUseSystemEnvironment(bool b)
|
|
|
|
|
{
|
|
|
|
|
if (useSystemEnvironment() == b)
|
|
|
|
|
return;
|
|
|
|
|
setValue("clearSystemEnvironment", !b);
|
|
|
|
|
emit environmentChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool Qt4BuildConfiguration::useSystemEnvironment() const
|
|
|
|
|
{
|
|
|
|
|
bool b = !(value("clearSystemEnvironment").isValid()
|
|
|
|
|
&& value("clearSystemEnvironment").toBool());
|
|
|
|
|
return b;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QList<ProjectExplorer::EnvironmentItem> Qt4BuildConfiguration::userEnvironmentChanges() const
|
|
|
|
|
{
|
|
|
|
|
return EnvironmentItem::fromStringList(value("userEnvironmentChanges").toStringList());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Qt4BuildConfiguration::setUserEnvironmentChanges(const QList<ProjectExplorer::EnvironmentItem> &diff)
|
|
|
|
|
{
|
|
|
|
|
QStringList list = EnvironmentItem::toStringList(diff);
|
|
|
|
|
if (list == value("userEnvironmentChanges").toStringList())
|
|
|
|
|
return;
|
|
|
|
|
setValue("userEnvironmentChanges", list);
|
|
|
|
|
emit environmentChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString Qt4BuildConfiguration::buildDirectory() const
|
|
|
|
|
{
|
|
|
|
|
QString workingDirectory;
|
|
|
|
|
if (value("useShadowBuild").toBool())
|
|
|
|
|
workingDirectory = value("buildDirectory").toString();
|
|
|
|
|
if (workingDirectory.isEmpty())
|
|
|
|
|
workingDirectory = QFileInfo(project()->file()->fileName()).absolutePath();
|
|
|
|
|
return workingDirectory;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ProjectExplorer::ToolChain *Qt4BuildConfiguration::toolChain() const
|
|
|
|
|
{
|
|
|
|
|
ToolChain::ToolChainType tct = toolChainType();
|
|
|
|
|
return qtVersion()->toolChain(tct);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString Qt4BuildConfiguration::makeCommand() const
|
|
|
|
|
{
|
|
|
|
|
ToolChain *tc = toolChain();
|
|
|
|
|
return tc ? tc->makeCommand() : "make";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef QTCREATOR_WITH_S60
|
|
|
|
|
static inline QString symbianMakeTarget(QtVersion::QmakeBuildConfig buildConfig,
|
|
|
|
|
const QString &type)
|
|
|
|
|
{
|
|
|
|
|
QString rc = (buildConfig & QtVersion::DebugBuild) ?
|
|
|
|
|
QLatin1String("debug-") : QLatin1String("release-");
|
|
|
|
|
rc += type;
|
|
|
|
|
return rc;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
QString Qt4BuildConfiguration::defaultMakeTarget() const
|
|
|
|
|
{
|
|
|
|
|
#ifdef QTCREATOR_WITH_S60
|
|
|
|
|
ToolChain *tc = toolChain();
|
|
|
|
|
if (!tc)
|
|
|
|
|
return QString::null;
|
|
|
|
|
const QtVersion::QmakeBuildConfig buildConfig
|
|
|
|
|
= QtVersion::QmakeBuildConfig(value("buildConfiguration").toInt());
|
|
|
|
|
|
|
|
|
|
switch (tc->type()) {
|
|
|
|
|
case ToolChain::GCCE:
|
|
|
|
|
case ToolChain::GCCE_GNUPOC:
|
|
|
|
|
return symbianMakeTarget(buildConfig, QLatin1String("gcce"));
|
|
|
|
|
case ToolChain::RVCT_ARMV5:
|
|
|
|
|
return symbianMakeTarget(buildConfig, QLatin1String("armv5"));
|
|
|
|
|
case ToolChain::RVCT_ARMV6:
|
|
|
|
|
case ToolChain::RVCT_ARMV6_GNUPOC:
|
|
|
|
|
return symbianMakeTarget(buildConfig, QLatin1String("armv6"));
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
return QString::null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString Qt4BuildConfiguration::qtDir() const
|
|
|
|
|
{
|
|
|
|
|
QtVersion *version = qtVersion();
|
|
|
|
|
if (version)
|
|
|
|
|
return version->versionInfo().value("QT_INSTALL_DATA");
|
|
|
|
|
return QString::null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QtVersion *Qt4BuildConfiguration::qtVersion() const
|
|
|
|
|
{
|
|
|
|
|
return QtVersionManager::instance()->version(qtVersionId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int Qt4BuildConfiguration::qtVersionId() const
|
|
|
|
|
{
|
|
|
|
|
QtVersionManager *vm = QtVersionManager::instance();
|
|
|
|
|
if (debug)
|
|
|
|
|
qDebug()<<"Looking for qtVersion ID of "<<displayName();
|
|
|
|
|
int id = 0;
|
|
|
|
|
QVariant vid = value(KEY_QT_VERSION_ID);
|
|
|
|
|
if (vid.isValid()) {
|
|
|
|
|
id = vid.toInt();
|
|
|
|
|
if (vm->version(id)->isValid()) {
|
|
|
|
|
return id;
|
|
|
|
|
} else {
|
|
|
|
|
const_cast<Qt4BuildConfiguration *>(this)->setValue(KEY_QT_VERSION_ID, 0);
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// Backward compatibilty, we might have just the name:
|
|
|
|
|
QString vname = value("QtVersion").toString();
|
|
|
|
|
if (debug)
|
|
|
|
|
qDebug()<<" Backward compatibility reading QtVersion"<<vname;
|
|
|
|
|
if (!vname.isEmpty()) {
|
|
|
|
|
const QList<QtVersion *> &versions = vm->versions();
|
|
|
|
|
foreach (const QtVersion * const version, versions) {
|
|
|
|
|
if (version->name() == vname) {
|
|
|
|
|
if (debug)
|
|
|
|
|
qDebug()<<"found name in versions";
|
|
|
|
|
const_cast<Qt4BuildConfiguration *>(this)->setValue(KEY_QT_VERSION_ID, version->uniqueId());
|
|
|
|
|
return version->uniqueId();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (debug)
|
|
|
|
|
qDebug()<<" using qtversion with id ="<<id;
|
|
|
|
|
// Nothing found, reset to default
|
|
|
|
|
const_cast<Qt4BuildConfiguration *>(this)->setValue(KEY_QT_VERSION_ID, id);
|
|
|
|
|
return id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Qt4BuildConfiguration::setQtVersion(int id)
|
|
|
|
|
{
|
|
|
|
|
setValue(KEY_QT_VERSION_ID, id);
|
|
|
|
|
emit qtVersionChanged();
|
2009-11-26 14:43:27 +01:00
|
|
|
qt4Project()->updateActiveRunConfiguration();
|
2009-11-25 18:50:20 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Qt4BuildConfiguration::setToolChainType(ProjectExplorer::ToolChain::ToolChainType type)
|
|
|
|
|
{
|
|
|
|
|
setValue("ToolChain", (int)type);
|
2009-11-26 14:43:27 +01:00
|
|
|
qt4Project()->updateActiveRunConfiguration();
|
2009-11-25 18:50:20 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ProjectExplorer::ToolChain::ToolChainType Qt4BuildConfiguration::toolChainType() const
|
|
|
|
|
{
|
|
|
|
|
ToolChain::ToolChainType originalType = ToolChain::ToolChainType(value("ToolChain").toInt());
|
|
|
|
|
ToolChain::ToolChainType type = originalType;
|
|
|
|
|
const QtVersion *version = qtVersion();
|
|
|
|
|
if (!version->possibleToolChainTypes().contains(type)) {
|
|
|
|
|
// Oh no the saved type is not valid for this qt version
|
|
|
|
|
// use default tool chain
|
|
|
|
|
type = version->defaultToolchainType();
|
|
|
|
|
const_cast<Qt4BuildConfiguration *>(this)->setToolChainType(type);
|
|
|
|
|
}
|
|
|
|
|
return type;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QMakeStep *Qt4BuildConfiguration::qmakeStep() const
|
|
|
|
|
{
|
|
|
|
|
QMakeStep *qs = 0;
|
|
|
|
|
foreach(BuildStep *bs, buildSteps())
|
|
|
|
|
if ((qs = qobject_cast<QMakeStep *>(bs)) != 0)
|
|
|
|
|
return qs;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MakeStep *Qt4BuildConfiguration::makeStep() const
|
|
|
|
|
{
|
|
|
|
|
MakeStep *qs = 0;
|
|
|
|
|
foreach(BuildStep *bs, buildSteps())
|
|
|
|
|
if ((qs = qobject_cast<MakeStep *>(bs)) != 0)
|
|
|
|
|
return qs;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// returns true if both are equal
|
|
|
|
|
bool Qt4BuildConfiguration::compareBuildConfigurationToImportFrom(const QString &workingDirectory)
|
|
|
|
|
{
|
|
|
|
|
QMakeStep *qs = qmakeStep();
|
|
|
|
|
if (QDir(workingDirectory).exists(QLatin1String("Makefile")) && qs) {
|
|
|
|
|
QString qmakePath = QtVersionManager::findQMakeBinaryFromMakefile(workingDirectory);
|
|
|
|
|
QtVersion *version = qtVersion();
|
|
|
|
|
if (version->qmakeCommand() == qmakePath) {
|
|
|
|
|
// same qtversion
|
|
|
|
|
QPair<QtVersion::QmakeBuildConfigs, QStringList> result =
|
|
|
|
|
QtVersionManager::scanMakeFile(workingDirectory, version->defaultBuildConfig());
|
|
|
|
|
if (QtVersion::QmakeBuildConfig(value("buildConfiguration").toInt()) == result.first) {
|
|
|
|
|
// The QMake Build Configuration are the same,
|
|
|
|
|
// now compare arguments lists
|
|
|
|
|
// we have to compare without the spec/platform cmd argument
|
|
|
|
|
// and compare that on its own
|
|
|
|
|
QString actualSpec = Qt4Project::extractSpecFromArgumentList(qs->qmakeArguments(), workingDirectory, version);
|
|
|
|
|
if (actualSpec.isEmpty()) {
|
|
|
|
|
// Easy one the user has choosen not to override the settings
|
|
|
|
|
actualSpec = version->mkspec();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QString parsedSpec = Qt4Project::extractSpecFromArgumentList(result.second, workingDirectory, version);
|
|
|
|
|
QStringList actualArgs = Qt4Project::removeSpecFromArgumentList(qs->qmakeArguments());
|
|
|
|
|
QStringList parsedArgs = Qt4Project::removeSpecFromArgumentList(result.second);
|
|
|
|
|
|
|
|
|
|
if (debug) {
|
|
|
|
|
qDebug()<<"Actual args:"<<actualArgs;
|
|
|
|
|
qDebug()<<"Parsed args:"<<parsedArgs;
|
|
|
|
|
qDebug()<<"Actual spec:"<<actualSpec;
|
|
|
|
|
qDebug()<<"Parsed spec:"<<parsedSpec;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (actualArgs == parsedArgs) {
|
|
|
|
|
// Specs match exactly
|
|
|
|
|
if (actualSpec == parsedSpec)
|
|
|
|
|
return true;
|
|
|
|
|
// Actual spec is the default one
|
|
|
|
|
// qDebug()<<"AS vs VS"<<actualSpec<<version->mkspec();
|
|
|
|
|
if ((actualSpec == version->mkspec() || actualSpec == "default")
|
|
|
|
|
&& (parsedSpec == version->mkspec() || parsedSpec == "default" || parsedSpec.isEmpty()))
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|