2009-11-23 12:11:48 +01:00
|
|
|
/**************************************************************************
|
|
|
|
|
**
|
|
|
|
|
** This file is part of Qt Creator
|
|
|
|
|
**
|
2011-01-11 16:28:15 +01:00
|
|
|
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
2009-11-23 12:11:48 +01:00
|
|
|
**
|
2011-04-13 08:42:33 +02:00
|
|
|
** Contact: Nokia Corporation (info@qt.nokia.com)
|
2009-11-23 12:11:48 +01:00
|
|
|
**
|
|
|
|
|
**
|
|
|
|
|
** GNU Lesser General Public License Usage
|
|
|
|
|
**
|
2011-04-13 08:42:33 +02:00
|
|
|
** 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.
|
2009-11-23 12:11:48 +01:00
|
|
|
**
|
2010-12-17 16:01:08 +01:00
|
|
|
** In addition, as a special exception, Nokia gives you certain additional
|
2011-04-13 08:42:33 +02:00
|
|
|
** rights. These rights are described in the Nokia Qt LGPL Exception
|
2010-12-17 16:01:08 +01:00
|
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
|
|
|
**
|
2011-04-13 08:42:33 +02:00
|
|
|
** 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.
|
|
|
|
|
**
|
2010-12-17 16:01:08 +01:00
|
|
|
** If you have questions regarding the use of this file, please contact
|
2011-05-06 15:05:37 +02:00
|
|
|
** Nokia at info@qt.nokia.com.
|
2009-11-23 12:11:48 +01:00
|
|
|
**
|
|
|
|
|
**************************************************************************/
|
|
|
|
|
|
|
|
|
|
#include "qt4buildconfiguration.h"
|
2010-01-07 18:17:24 +01:00
|
|
|
|
2009-11-23 13:29:45 +01:00
|
|
|
#include "qt4project.h"
|
2010-02-08 15:50:06 +01:00
|
|
|
#include "qt4target.h"
|
2010-02-25 16:51:27 +01:00
|
|
|
#include "qt4projectmanagerconstants.h"
|
2010-03-17 17:45:33 +01:00
|
|
|
#include "qt4nodes.h"
|
|
|
|
|
#include "qmakestep.h"
|
|
|
|
|
#include "makestep.h"
|
2011-05-04 13:14:46 +02:00
|
|
|
#include "qt4basetargetfactory.h"
|
2009-11-23 12:11:48 +01:00
|
|
|
|
2010-01-07 18:17:24 +01:00
|
|
|
#include <utils/qtcassert.h>
|
2010-10-19 11:14:03 +02:00
|
|
|
#include <utils/qtcprocess.h>
|
2010-09-09 17:00:26 +02:00
|
|
|
#include <limits>
|
2010-07-16 14:00:41 +02:00
|
|
|
#include <projectexplorer/buildsteplist.h>
|
|
|
|
|
#include <projectexplorer/projectexplorerconstants.h>
|
2011-02-01 18:36:00 +01:00
|
|
|
#include <projectexplorer/toolchainmanager.h>
|
2011-05-20 21:40:53 +02:00
|
|
|
#include <qtsupport/qtversionfactory.h>
|
|
|
|
|
#include <qtsupport/baseqtversion.h>
|
2010-01-07 18:17:24 +01:00
|
|
|
|
2010-02-19 10:51:40 +01:00
|
|
|
#include <QtCore/QDebug>
|
|
|
|
|
|
2010-01-07 18:17:24 +01:00
|
|
|
#include <QtGui/QInputDialog>
|
|
|
|
|
|
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 {
|
2010-01-18 12:11:04 +01:00
|
|
|
const char * const QT4_BC_ID_PREFIX("Qt4ProjectManager.Qt4BuildConfiguration.");
|
|
|
|
|
const char * const QT4_BC_ID("Qt4ProjectManager.Qt4BuildConfiguration");
|
2009-11-25 18:50:20 +01:00
|
|
|
|
2010-01-18 12:11:04 +01:00
|
|
|
const char * const USE_SHADOW_BUILD_KEY("Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild");
|
|
|
|
|
const char * const BUILD_DIRECTORY_KEY("Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory");
|
|
|
|
|
const char * const BUILD_CONFIGURATION_KEY("Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration");
|
|
|
|
|
const char * const QT_VERSION_ID_KEY("Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId");
|
2010-01-19 13:41:02 +01:00
|
|
|
|
2010-01-19 16:33:44 +01:00
|
|
|
enum { debug = 0 };
|
2009-11-25 18:50:20 +01:00
|
|
|
}
|
2009-11-23 12:11:48 +01:00
|
|
|
|
2010-12-10 19:02:19 +01:00
|
|
|
Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BaseTarget *target) :
|
2010-02-08 15:50:06 +01:00
|
|
|
BuildConfiguration(target, QLatin1String(QT4_BC_ID)),
|
2010-03-25 11:55:29 +01:00
|
|
|
m_shadowBuild(true),
|
2011-01-19 15:46:01 +01:00
|
|
|
m_isEnabled(false),
|
2010-02-08 15:50:06 +01:00
|
|
|
m_qtVersionId(-1),
|
2010-01-13 18:00:02 +01:00
|
|
|
m_qmakeBuildConfiguration(0),
|
|
|
|
|
m_subNodeBuild(0)
|
2009-11-23 12:11:48 +01:00
|
|
|
{
|
2010-01-18 12:11:04 +01:00
|
|
|
ctor();
|
2009-11-23 12:11:48 +01:00
|
|
|
}
|
|
|
|
|
|
2010-12-10 19:02:19 +01:00
|
|
|
Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BaseTarget *target, const QString &id) :
|
2010-02-08 15:50:06 +01:00
|
|
|
BuildConfiguration(target, id),
|
2010-03-25 11:55:29 +01:00
|
|
|
m_shadowBuild(true),
|
2011-01-19 15:46:01 +01:00
|
|
|
m_isEnabled(false),
|
2010-02-08 15:50:06 +01:00
|
|
|
m_qtVersionId(-1),
|
2010-01-18 12:11:04 +01:00
|
|
|
m_qmakeBuildConfiguration(0),
|
|
|
|
|
m_subNodeBuild(0)
|
2009-12-08 12:21:11 +01:00
|
|
|
{
|
2010-01-18 12:11:04 +01:00
|
|
|
ctor();
|
2009-12-08 12:21:11 +01:00
|
|
|
}
|
|
|
|
|
|
2010-12-10 19:02:19 +01:00
|
|
|
Qt4BuildConfiguration::Qt4BuildConfiguration(Qt4BaseTarget *target, Qt4BuildConfiguration *source) :
|
2010-02-08 15:50:06 +01:00
|
|
|
BuildConfiguration(target, source),
|
2009-12-08 12:21:11 +01:00
|
|
|
m_shadowBuild(source->m_shadowBuild),
|
2011-01-19 15:46:01 +01:00
|
|
|
m_isEnabled(false),
|
2009-12-08 12:21:11 +01:00
|
|
|
m_buildDirectory(source->m_buildDirectory),
|
2010-02-08 15:50:06 +01:00
|
|
|
m_qtVersionId(source->m_qtVersionId),
|
2010-01-13 18:00:02 +01:00
|
|
|
m_qmakeBuildConfiguration(source->m_qmakeBuildConfiguration),
|
|
|
|
|
m_subNodeBuild(0) // temporary value, so not copied
|
2009-11-23 12:11:48 +01:00
|
|
|
{
|
2010-02-08 15:50:06 +01:00
|
|
|
cloneSteps(source);
|
2010-01-18 12:11:04 +01:00
|
|
|
ctor();
|
2009-11-23 12:11:48 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Qt4BuildConfiguration::~Qt4BuildConfiguration()
|
|
|
|
|
{
|
2010-01-18 12:11:04 +01:00
|
|
|
}
|
2009-11-23 12:11:48 +01:00
|
|
|
|
2010-01-18 12:11:04 +01:00
|
|
|
QVariantMap Qt4BuildConfiguration::toMap() const
|
|
|
|
|
{
|
|
|
|
|
QVariantMap map(BuildConfiguration::toMap());
|
|
|
|
|
map.insert(QLatin1String(USE_SHADOW_BUILD_KEY), m_shadowBuild);
|
|
|
|
|
map.insert(QLatin1String(BUILD_DIRECTORY_KEY), m_buildDirectory);
|
2010-02-08 15:50:06 +01:00
|
|
|
map.insert(QLatin1String(QT_VERSION_ID_KEY), m_qtVersionId);
|
2010-01-18 12:11:04 +01:00
|
|
|
map.insert(QLatin1String(BUILD_CONFIGURATION_KEY), int(m_qmakeBuildConfiguration));
|
|
|
|
|
return map;
|
2009-11-23 12:11:48 +01:00
|
|
|
}
|
2009-11-25 18:50:20 +01:00
|
|
|
|
2011-05-20 21:40:53 +02:00
|
|
|
static inline QString msgBuildConfigNotApplicable(const QString &d, const QtSupport::BaseQtVersion *qtVersion,
|
2011-02-28 12:29:41 +01:00
|
|
|
const Target *target)
|
|
|
|
|
{
|
|
|
|
|
return QString::fromLatin1("Warning: Buildconfiguration '%1' : Qt '%2' from %3 not supported by target '%4'").
|
|
|
|
|
arg(d, qtVersion->displayName(), qtVersion->qmakeCommand(), target->id());
|
|
|
|
|
}
|
2010-01-18 12:11:04 +01:00
|
|
|
|
|
|
|
|
bool Qt4BuildConfiguration::fromMap(const QVariantMap &map)
|
2009-12-08 12:21:11 +01:00
|
|
|
{
|
2010-02-08 15:50:06 +01:00
|
|
|
if (!BuildConfiguration::fromMap(map))
|
|
|
|
|
return false;
|
|
|
|
|
|
2010-03-25 11:55:29 +01:00
|
|
|
m_shadowBuild = map.value(QLatin1String(USE_SHADOW_BUILD_KEY), true).toBool();
|
2010-02-08 15:50:06 +01:00
|
|
|
m_qtVersionId = map.value(QLatin1String(QT_VERSION_ID_KEY)).toInt();
|
2011-04-14 14:52:28 +02:00
|
|
|
ProjectExplorer::ToolChain *tc = toolChain();
|
2011-05-20 21:40:53 +02:00
|
|
|
m_qmakeBuildConfiguration = QtSupport::BaseQtVersion::QmakeBuildConfigs(map.value(QLatin1String(BUILD_CONFIGURATION_KEY)).toInt());
|
2011-03-23 13:32:42 +01:00
|
|
|
m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY), defaultShadowBuildDirectory()).toString();
|
|
|
|
|
|
2010-02-19 10:51:40 +01:00
|
|
|
// Pick a Qt version if the default version is used:
|
2010-09-09 17:00:26 +02:00
|
|
|
// We assume that the default Qt version was used in earlier versions of Qt creator.
|
2011-05-04 13:14:46 +02:00
|
|
|
// Pick a Qt version that supports this target (usually desktop)
|
2010-02-10 17:00:14 +01:00
|
|
|
if (m_qtVersionId == 0) {
|
2011-05-20 21:40:53 +02:00
|
|
|
QList<QtSupport::BaseQtVersion *> versions = QtSupport::QtVersionManager::instance()->versionsForTargetId(target()->id());
|
|
|
|
|
foreach (QtSupport::BaseQtVersion *v, versions) {
|
2011-05-04 13:14:46 +02:00
|
|
|
if (v->isValid()) {
|
2010-02-10 17:00:14 +01:00
|
|
|
m_qtVersionId = v->uniqueId();
|
|
|
|
|
break;
|
2010-02-19 10:51:40 +01:00
|
|
|
}
|
2010-02-10 17:00:14 +01:00
|
|
|
}
|
|
|
|
|
if (m_qtVersionId == 0)
|
2011-05-04 13:14:46 +02:00
|
|
|
m_qtVersionId = -1;
|
2010-02-10 17:00:14 +01:00
|
|
|
}
|
|
|
|
|
|
2011-05-20 21:40:53 +02:00
|
|
|
QtSupport::BaseQtVersion *version = QtSupport::QtVersionManager::instance()->version(m_qtVersionId);
|
2011-05-04 13:14:46 +02:00
|
|
|
if (!version || !version->supportsTargetId(target()->id())) {
|
|
|
|
|
m_qtVersionId = -1;
|
|
|
|
|
version = 0;
|
2010-02-19 10:51:40 +01:00
|
|
|
}
|
2010-02-08 15:50:06 +01:00
|
|
|
|
2011-05-04 13:14:46 +02:00
|
|
|
m_lastEmmitedBuildDirectory = buildDirectory();
|
|
|
|
|
|
|
|
|
|
if (version && version->isValid()) {
|
|
|
|
|
if (tc && !qt4Target()->possibleToolChains(this).contains(tc))
|
|
|
|
|
setToolChain(0);
|
|
|
|
|
if (!toolChain())
|
2011-02-01 18:36:00 +01:00
|
|
|
tc = qt4Target()->preferredToolChain(this);
|
2010-09-09 17:00:26 +02:00
|
|
|
m_shadowBuild = (m_shadowBuild && version->supportsShadowBuilds());
|
2011-02-01 18:36:00 +01:00
|
|
|
}
|
2010-03-10 16:13:53 +01:00
|
|
|
|
2011-02-01 18:36:00 +01:00
|
|
|
if (!toolChain()) {
|
2011-05-04 13:14:46 +02:00
|
|
|
if (version && version->isValid()) {
|
2011-03-16 17:59:43 +01:00
|
|
|
qWarning("Warning: No tool chain available for '%s' from %s used in '%s'.",
|
2011-02-28 12:29:41 +01:00
|
|
|
qPrintable(version->displayName()), qPrintable(version->qmakeCommand()),
|
|
|
|
|
qPrintable(target()->id()));
|
|
|
|
|
} else {
|
2011-03-16 17:59:43 +01:00
|
|
|
qWarning("Warning: No tool chain available for invalid Qt version used in '%s'.",
|
2011-02-28 12:29:41 +01:00
|
|
|
qPrintable(target()->id()));
|
|
|
|
|
}
|
2010-02-19 10:51:40 +01:00
|
|
|
}
|
2010-09-22 15:14:07 +02:00
|
|
|
|
2010-02-08 15:50:06 +01:00
|
|
|
return true;
|
2009-12-08 12:21:11 +01:00
|
|
|
}
|
|
|
|
|
|
2010-01-18 12:11:04 +01:00
|
|
|
void Qt4BuildConfiguration::ctor()
|
2009-12-03 18:37:27 +01:00
|
|
|
{
|
2010-10-06 13:47:01 +02:00
|
|
|
connect(this, SIGNAL(environmentChanged()),
|
|
|
|
|
this, SLOT(emitBuildDirectoryChanged()));
|
2011-04-20 21:16:17 +02:00
|
|
|
connect(this, SIGNAL(environmentChanged()),
|
|
|
|
|
this, SLOT(emitProFileEvaluteNeeded()));
|
2010-10-06 13:47:01 +02:00
|
|
|
|
2011-05-20 21:40:53 +02:00
|
|
|
QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance();
|
2009-12-03 18:37:27 +01:00
|
|
|
connect(vm, SIGNAL(qtVersionsChanged(QList<int>)),
|
|
|
|
|
this, SLOT(qtVersionsChanged(QList<int>)));
|
|
|
|
|
}
|
|
|
|
|
|
2010-10-06 13:47:01 +02:00
|
|
|
void Qt4BuildConfiguration::emitBuildDirectoryChanged()
|
|
|
|
|
{
|
|
|
|
|
if (buildDirectory() != m_lastEmmitedBuildDirectory) {
|
|
|
|
|
m_lastEmmitedBuildDirectory = buildDirectory();
|
|
|
|
|
emit buildDirectoryChanged();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-12-10 19:02:19 +01:00
|
|
|
Qt4BaseTarget *Qt4BuildConfiguration::qt4Target() const
|
2009-11-26 14:43:27 +01:00
|
|
|
{
|
2010-12-10 19:02:19 +01:00
|
|
|
return static_cast<Qt4BaseTarget *>(target());
|
2009-11-26 14:43:27 +01:00
|
|
|
}
|
|
|
|
|
|
2010-09-23 10:35:23 +02:00
|
|
|
Utils::Environment Qt4BuildConfiguration::baseEnvironment() const
|
2009-11-25 18:50:20 +01:00
|
|
|
{
|
2010-09-23 10:35:23 +02:00
|
|
|
Utils::Environment env = BuildConfiguration::baseEnvironment();
|
2011-05-04 13:14:46 +02:00
|
|
|
if (qtVersion())
|
|
|
|
|
qtVersion()->addToEnvironment(env);
|
2010-10-06 13:47:01 +02:00
|
|
|
|
2009-11-25 18:50:20 +01:00
|
|
|
ToolChain *tc = toolChain();
|
|
|
|
|
if (tc)
|
|
|
|
|
tc->addToEnvironment(env);
|
|
|
|
|
return env;
|
|
|
|
|
}
|
|
|
|
|
|
2011-03-23 13:32:42 +01:00
|
|
|
QString Qt4BuildConfiguration::defaultShadowBuildDirectory() const
|
|
|
|
|
{
|
|
|
|
|
Qt4BaseTargetFactory *factory = Qt4BaseTargetFactory::qt4BaseTargetFactoryForId(qt4Target()->id());
|
|
|
|
|
// todo displayName isn't ideal
|
|
|
|
|
return factory->shadowBuildDirectory(qt4Target()->qt4Project()->file()->fileName(), qt4Target()->id(), displayName());
|
|
|
|
|
}
|
|
|
|
|
|
2010-10-06 13:47:01 +02:00
|
|
|
/// returns the unexpanded build directory
|
|
|
|
|
QString Qt4BuildConfiguration::rawBuildDirectory() const
|
2009-11-25 18:50:20 +01:00
|
|
|
{
|
|
|
|
|
QString workingDirectory;
|
2010-05-19 13:41:52 +02:00
|
|
|
if (m_shadowBuild) {
|
|
|
|
|
if (!m_buildDirectory.isEmpty())
|
|
|
|
|
workingDirectory = m_buildDirectory;
|
|
|
|
|
else
|
2011-03-23 13:32:42 +01:00
|
|
|
workingDirectory = defaultShadowBuildDirectory();
|
2010-05-19 13:41:52 +02:00
|
|
|
}
|
2009-11-25 18:50:20 +01:00
|
|
|
if (workingDirectory.isEmpty())
|
2010-03-25 13:19:27 +01:00
|
|
|
workingDirectory = target()->project()->projectDirectory();
|
2009-11-25 18:50:20 +01:00
|
|
|
return workingDirectory;
|
|
|
|
|
}
|
|
|
|
|
|
2010-10-06 13:47:01 +02:00
|
|
|
/// returns the build directory
|
|
|
|
|
QString Qt4BuildConfiguration::buildDirectory() const
|
|
|
|
|
{
|
|
|
|
|
return QDir::cleanPath(environment().expandVariables(rawBuildDirectory()));
|
|
|
|
|
}
|
|
|
|
|
|
2010-01-13 18:00:02 +01:00
|
|
|
/// If only a sub tree should be build this function returns which sub node
|
|
|
|
|
/// should be build
|
|
|
|
|
/// \see Qt4BuildConfiguration::setSubNodeBuild
|
2011-05-25 11:23:25 +02:00
|
|
|
Qt4ProjectManager::Qt4ProFileNode *Qt4BuildConfiguration::subNodeBuild() const
|
2010-01-13 18:00:02 +01:00
|
|
|
{
|
|
|
|
|
return m_subNodeBuild;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// A sub node build on builds a sub node of the project
|
|
|
|
|
/// That is triggered by a right click in the project explorer tree
|
|
|
|
|
/// The sub node to be build is set via this function immediately before
|
|
|
|
|
/// calling BuildManager::buildProject( BuildConfiguration * )
|
|
|
|
|
/// and reset immediately afterwards
|
|
|
|
|
/// That is m_subNodesBuild is set only temporarly
|
2011-05-25 11:23:25 +02:00
|
|
|
void Qt4BuildConfiguration::setSubNodeBuild(Qt4ProjectManager::Qt4ProFileNode *node)
|
2010-01-13 18:00:02 +01:00
|
|
|
{
|
|
|
|
|
m_subNodeBuild = node;
|
|
|
|
|
}
|
|
|
|
|
|
2009-12-07 15:55:00 +01:00
|
|
|
/// returns whether this is a shadow build configuration or not
|
|
|
|
|
/// note, even if shadowBuild() returns true, it might be using the
|
2010-01-11 10:22:55 +01:00
|
|
|
/// source directory as the shadow build directory, thus it
|
|
|
|
|
/// still is a in-source build
|
2009-12-07 15:55:00 +01:00
|
|
|
bool Qt4BuildConfiguration::shadowBuild() const
|
|
|
|
|
{
|
2009-12-08 12:21:11 +01:00
|
|
|
return m_shadowBuild;
|
2009-12-07 15:55:00 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// returns the shadow build directory if set
|
|
|
|
|
/// \note buildDirectory() is probably the function you want to call
|
|
|
|
|
QString Qt4BuildConfiguration::shadowBuildDirectory() const
|
|
|
|
|
{
|
2010-05-19 13:41:52 +02:00
|
|
|
if (m_buildDirectory.isEmpty())
|
2011-03-23 13:32:42 +01:00
|
|
|
return defaultShadowBuildDirectory();
|
2009-12-08 12:21:11 +01:00
|
|
|
return m_buildDirectory;
|
2009-12-07 15:55:00 +01:00
|
|
|
}
|
|
|
|
|
|
2009-12-03 18:37:27 +01:00
|
|
|
void Qt4BuildConfiguration::setShadowBuildAndDirectory(bool shadowBuild, const QString &buildDirectory)
|
|
|
|
|
{
|
2011-05-20 21:40:53 +02:00
|
|
|
QtSupport::BaseQtVersion *version = qtVersion();
|
2010-10-06 13:47:01 +02:00
|
|
|
QString directoryToSet = buildDirectory;
|
2011-05-04 13:14:46 +02:00
|
|
|
bool toSet = (shadowBuild && version && version->isValid() && version->supportsShadowBuilds());
|
2010-03-10 16:13:53 +01:00
|
|
|
if (m_shadowBuild == toSet && m_buildDirectory == directoryToSet)
|
2009-12-07 15:55:00 +01:00
|
|
|
return;
|
2010-03-10 16:55:37 +01:00
|
|
|
|
2010-03-10 16:13:53 +01:00
|
|
|
m_shadowBuild = toSet;
|
|
|
|
|
m_buildDirectory = directoryToSet;
|
2010-09-22 15:14:07 +02:00
|
|
|
|
|
|
|
|
emit environmentChanged();
|
2010-10-06 13:47:01 +02:00
|
|
|
emitBuildDirectoryChanged();
|
2010-03-10 16:55:37 +01:00
|
|
|
emit proFileEvaluateNeeded(this);
|
2009-12-03 18:37:27 +01:00
|
|
|
}
|
|
|
|
|
|
2009-11-25 18:50:20 +01:00
|
|
|
QString Qt4BuildConfiguration::makeCommand() const
|
|
|
|
|
{
|
|
|
|
|
ToolChain *tc = toolChain();
|
|
|
|
|
return tc ? tc->makeCommand() : "make";
|
|
|
|
|
}
|
|
|
|
|
|
2011-05-20 21:40:53 +02:00
|
|
|
static inline QString symbianMakeTarget(QtSupport::BaseQtVersion::QmakeBuildConfigs buildConfig,
|
2009-11-25 18:50:20 +01:00
|
|
|
const QString &type)
|
|
|
|
|
{
|
2011-05-20 21:40:53 +02:00
|
|
|
QString rc = (buildConfig & QtSupport::BaseQtVersion::DebugBuild) ?
|
2009-11-25 18:50:20 +01:00
|
|
|
QLatin1String("debug-") : QLatin1String("release-");
|
|
|
|
|
rc += type;
|
|
|
|
|
return rc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString Qt4BuildConfiguration::defaultMakeTarget() const
|
|
|
|
|
{
|
|
|
|
|
ToolChain *tc = toolChain();
|
2011-02-01 18:36:00 +01:00
|
|
|
if (!tc || target()->id() != Constants::S60_DEVICE_TARGET_ID)
|
2010-02-02 17:09:41 +01:00
|
|
|
return QString();
|
2011-05-20 21:40:53 +02:00
|
|
|
const QtSupport::BaseQtVersion::QmakeBuildConfigs buildConfig = qmakeBuildConfiguration();
|
2009-11-25 18:50:20 +01:00
|
|
|
|
2011-02-01 18:36:00 +01:00
|
|
|
return symbianMakeTarget(buildConfig, tc->defaultMakeTarget());
|
2009-11-25 18:50:20 +01:00
|
|
|
}
|
|
|
|
|
|
2010-10-05 17:38:45 +02:00
|
|
|
QString Qt4BuildConfiguration::makefile() const
|
|
|
|
|
{
|
|
|
|
|
return qt4Target()->qt4Project()->rootProjectNode()->makefile();
|
|
|
|
|
}
|
|
|
|
|
|
2011-05-20 21:40:53 +02:00
|
|
|
QtSupport::BaseQtVersion *Qt4BuildConfiguration::qtVersion() const
|
2009-11-25 18:50:20 +01:00
|
|
|
{
|
2011-05-20 21:40:53 +02:00
|
|
|
QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance();
|
2010-02-08 15:50:06 +01:00
|
|
|
return vm->version(m_qtVersionId);
|
2009-11-25 18:50:20 +01:00
|
|
|
}
|
|
|
|
|
|
2011-05-20 21:40:53 +02:00
|
|
|
void Qt4BuildConfiguration::setQtVersion(QtSupport::BaseQtVersion *version)
|
2009-11-25 18:50:20 +01:00
|
|
|
{
|
2011-05-04 13:14:46 +02:00
|
|
|
if (version == 0) {
|
|
|
|
|
m_qtVersionId = -1;
|
|
|
|
|
m_shadowBuild = false;
|
|
|
|
|
setToolChain(0);
|
|
|
|
|
emit proFileEvaluateNeeded(this);
|
|
|
|
|
emit qtVersionChanged();
|
|
|
|
|
emit environmentChanged();
|
|
|
|
|
emitBuildDirectoryChanged();
|
2010-01-18 12:11:04 +01:00
|
|
|
return;
|
2011-05-04 13:14:46 +02:00
|
|
|
}
|
|
|
|
|
if (m_qtVersionId == version->uniqueId())
|
|
|
|
|
return;
|
2010-01-18 12:11:04 +01:00
|
|
|
|
2010-02-08 15:50:06 +01:00
|
|
|
m_qtVersionId = version->uniqueId();
|
2010-04-14 13:37:08 +02:00
|
|
|
|
2011-02-01 18:36:00 +01:00
|
|
|
if (!qt4Target()->possibleToolChains(this).contains(toolChain()))
|
|
|
|
|
setToolChain(qt4Target()->preferredToolChain(this));
|
2010-09-09 17:00:26 +02:00
|
|
|
m_shadowBuild = m_shadowBuild && qtVersion()->supportsShadowBuilds();
|
|
|
|
|
|
2010-03-10 16:55:37 +01:00
|
|
|
emit proFileEvaluateNeeded(this);
|
2009-11-25 18:50:20 +01:00
|
|
|
emit qtVersionChanged();
|
2009-12-08 14:41:56 +01:00
|
|
|
emit environmentChanged();
|
2010-10-06 13:47:01 +02:00
|
|
|
emitBuildDirectoryChanged();
|
2009-11-25 18:50:20 +01:00
|
|
|
}
|
|
|
|
|
|
2011-02-01 18:36:00 +01:00
|
|
|
void Qt4BuildConfiguration::setToolChain(ProjectExplorer::ToolChain *tc)
|
2009-11-25 18:50:20 +01:00
|
|
|
{
|
2011-03-24 11:58:40 +01:00
|
|
|
if (tc != 0 && !qt4Target()->possibleToolChains(this).contains(tc))
|
2009-12-03 18:37:27 +01:00
|
|
|
return;
|
2010-04-14 13:37:08 +02:00
|
|
|
|
2011-02-01 18:36:00 +01:00
|
|
|
BuildConfiguration::setToolChain(tc);
|
2010-03-10 16:55:37 +01:00
|
|
|
|
|
|
|
|
emit proFileEvaluateNeeded(this);
|
2010-10-06 13:47:01 +02:00
|
|
|
emitBuildDirectoryChanged();
|
2009-11-25 18:50:20 +01:00
|
|
|
}
|
|
|
|
|
|
2011-05-20 21:40:53 +02:00
|
|
|
QtSupport::BaseQtVersion::QmakeBuildConfigs Qt4BuildConfiguration::qmakeBuildConfiguration() const
|
2009-12-03 18:37:27 +01:00
|
|
|
{
|
2009-12-08 12:21:11 +01:00
|
|
|
return m_qmakeBuildConfiguration;
|
2009-12-03 18:37:27 +01:00
|
|
|
}
|
|
|
|
|
|
2011-05-20 21:40:53 +02:00
|
|
|
void Qt4BuildConfiguration::setQMakeBuildConfiguration(QtSupport::BaseQtVersion::QmakeBuildConfigs config)
|
2009-12-03 18:37:27 +01:00
|
|
|
{
|
2009-12-08 12:21:11 +01:00
|
|
|
if (m_qmakeBuildConfiguration == config)
|
2009-12-03 18:37:27 +01:00
|
|
|
return;
|
2009-12-08 12:21:11 +01:00
|
|
|
m_qmakeBuildConfiguration = config;
|
2010-03-10 16:55:37 +01:00
|
|
|
|
|
|
|
|
emit proFileEvaluateNeeded(this);
|
2009-12-03 18:37:27 +01:00
|
|
|
emit qmakeBuildConfigurationChanged();
|
2011-03-23 13:32:42 +01:00
|
|
|
emitBuildDirectoryChanged();
|
2009-12-03 18:37:27 +01:00
|
|
|
}
|
|
|
|
|
|
2010-09-01 12:33:53 +02:00
|
|
|
void Qt4BuildConfiguration::emitProFileEvaluteNeeded()
|
|
|
|
|
{
|
|
|
|
|
emit proFileEvaluateNeeded(this);
|
|
|
|
|
}
|
|
|
|
|
|
2010-01-12 17:20:15 +01:00
|
|
|
void Qt4BuildConfiguration::emitQMakeBuildConfigurationChanged()
|
|
|
|
|
{
|
|
|
|
|
emit qmakeBuildConfigurationChanged();
|
|
|
|
|
}
|
|
|
|
|
|
2010-02-15 17:33:56 +01:00
|
|
|
void Qt4BuildConfiguration::emitBuildDirectoryInitialized()
|
|
|
|
|
{
|
|
|
|
|
emit buildDirectoryInitialized();
|
|
|
|
|
}
|
|
|
|
|
|
2010-05-21 14:12:53 +02:00
|
|
|
void Qt4BuildConfiguration::emitS60CreatesSmartInstallerChanged()
|
|
|
|
|
{
|
|
|
|
|
emit s60CreatesSmartInstallerChanged();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2010-09-01 12:33:53 +02:00
|
|
|
QStringList Qt4BuildConfiguration::configCommandLineArguments() const
|
2009-12-03 18:37:27 +01:00
|
|
|
{
|
2010-09-01 12:33:53 +02:00
|
|
|
QStringList result;
|
2011-05-24 19:08:31 +02:00
|
|
|
QtSupport::BaseQtVersion::QmakeBuildConfigs defaultBuildConfiguration = qtVersion() ? qtVersion()->defaultBuildConfig() : (QtSupport::BaseQtVersion::DebugBuild | QtSupport::BaseQtVersion::BuildAll);
|
2011-05-20 21:40:53 +02:00
|
|
|
QtSupport::BaseQtVersion::QmakeBuildConfigs userBuildConfiguration = m_qmakeBuildConfiguration;
|
|
|
|
|
if ((defaultBuildConfiguration & QtSupport::BaseQtVersion::BuildAll) && !(userBuildConfiguration & QtSupport::BaseQtVersion::BuildAll))
|
2010-09-01 12:33:53 +02:00
|
|
|
result << "CONFIG-=debug_and_release";
|
|
|
|
|
|
2011-05-20 21:40:53 +02:00
|
|
|
if (!(defaultBuildConfiguration & QtSupport::BaseQtVersion::BuildAll) && (userBuildConfiguration & QtSupport::BaseQtVersion::BuildAll))
|
2010-09-01 12:33:53 +02:00
|
|
|
result << "CONFIG+=debug_and_release";
|
2011-05-24 19:08:31 +02:00
|
|
|
if ((defaultBuildConfiguration & QtSupport::BaseQtVersion::DebugBuild) && !(userBuildConfiguration & QtSupport::BaseQtVersion::DebugBuild))
|
2010-09-01 12:33:53 +02:00
|
|
|
result << "CONFIG+=release";
|
2011-05-24 19:08:31 +02:00
|
|
|
if (!(defaultBuildConfiguration & QtSupport::BaseQtVersion::DebugBuild) && (userBuildConfiguration & QtSupport::BaseQtVersion::DebugBuild))
|
2010-09-01 12:33:53 +02:00
|
|
|
result << "CONFIG+=debug";
|
|
|
|
|
return result;
|
2009-12-03 18:37:27 +01:00
|
|
|
}
|
2009-11-25 18:50:20 +01:00
|
|
|
|
|
|
|
|
QMakeStep *Qt4BuildConfiguration::qmakeStep() const
|
|
|
|
|
{
|
|
|
|
|
QMakeStep *qs = 0;
|
2010-07-16 14:00:41 +02:00
|
|
|
BuildStepList *bsl = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
|
|
|
|
|
Q_ASSERT(bsl);
|
|
|
|
|
for (int i = 0; i < bsl->count(); ++i)
|
|
|
|
|
if ((qs = qobject_cast<QMakeStep *>(bsl->at(i))) != 0)
|
2009-11-25 18:50:20 +01:00
|
|
|
return qs;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
MakeStep *Qt4BuildConfiguration::makeStep() const
|
|
|
|
|
{
|
2010-07-16 14:00:41 +02:00
|
|
|
MakeStep *ms = 0;
|
|
|
|
|
BuildStepList *bsl = stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
|
|
|
|
|
Q_ASSERT(bsl);
|
|
|
|
|
for (int i = 0; i < bsl->count(); ++i)
|
|
|
|
|
if ((ms = qobject_cast<MakeStep *>(bsl->at(i))) != 0)
|
|
|
|
|
return ms;
|
2009-11-25 18:50:20 +01:00
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2009-12-03 18:37:27 +01:00
|
|
|
void Qt4BuildConfiguration::qtVersionsChanged(const QList<int> &changedVersions)
|
|
|
|
|
{
|
2011-04-15 12:34:06 +02:00
|
|
|
if (!changedVersions.contains(m_qtVersionId))
|
2010-02-08 15:50:06 +01:00
|
|
|
return;
|
2011-04-19 15:42:14 +02:00
|
|
|
emit environmentChanged(); // Our qt version changed, that might have changed the environment
|
2009-12-03 18:37:27 +01:00
|
|
|
}
|
|
|
|
|
|
2009-11-25 18:50:20 +01:00
|
|
|
// returns true if both are equal
|
2010-10-05 17:38:45 +02:00
|
|
|
bool Qt4BuildConfiguration::compareToImportFrom(const QString &makefile)
|
2009-11-25 18:50:20 +01:00
|
|
|
{
|
|
|
|
|
QMakeStep *qs = qmakeStep();
|
2010-10-05 17:38:45 +02:00
|
|
|
if (QFileInfo(makefile).exists() && qs) {
|
2011-05-20 21:40:53 +02:00
|
|
|
QString qmakePath = QtSupport::QtVersionManager::findQMakeBinaryFromMakefile(makefile);
|
|
|
|
|
QtSupport::BaseQtVersion *version = qtVersion();
|
2011-05-04 13:14:46 +02:00
|
|
|
if (!version)
|
|
|
|
|
return false;
|
2009-11-25 18:50:20 +01:00
|
|
|
if (version->qmakeCommand() == qmakePath) {
|
|
|
|
|
// same qtversion
|
2011-05-20 21:40:53 +02:00
|
|
|
QPair<QtSupport::BaseQtVersion::QmakeBuildConfigs, QString> result =
|
|
|
|
|
QtSupport::QtVersionManager::scanMakeFile(makefile, version->defaultBuildConfig());
|
2009-12-02 17:43:43 +01:00
|
|
|
if (qmakeBuildConfiguration() == result.first) {
|
2010-02-16 13:53:29 +01:00
|
|
|
// The qmake Build Configuration are the same,
|
2009-11-25 18:50:20 +01:00
|
|
|
// now compare arguments lists
|
|
|
|
|
// we have to compare without the spec/platform cmd argument
|
|
|
|
|
// and compare that on its own
|
2010-10-05 17:38:45 +02:00
|
|
|
QString workingDirectory = QFileInfo(makefile).absolutePath();
|
2010-10-19 11:14:03 +02:00
|
|
|
QString userArgs = qs->userArguments();
|
|
|
|
|
QStringList actualArgs;
|
|
|
|
|
QString actualSpec = extractSpecFromArguments(&userArgs, workingDirectory, version, &actualArgs);
|
2009-11-25 18:50:20 +01:00
|
|
|
if (actualSpec.isEmpty()) {
|
2010-01-11 10:22:55 +01:00
|
|
|
// Easy one: the user has chosen not to override the settings
|
2009-11-25 18:50:20 +01:00
|
|
|
actualSpec = version->mkspec();
|
|
|
|
|
}
|
2010-10-19 11:14:03 +02:00
|
|
|
actualArgs += qs->moreArguments();
|
2009-11-25 18:50:20 +01:00
|
|
|
|
2010-10-19 11:14:03 +02:00
|
|
|
QString qmakeArgs = result.second;
|
|
|
|
|
QStringList parsedArgs;
|
|
|
|
|
QString parsedSpec = extractSpecFromArguments(&qmakeArgs, workingDirectory, version, &parsedArgs);
|
2009-11-25 18:50:20 +01:00
|
|
|
|
|
|
|
|
if (debug) {
|
|
|
|
|
qDebug()<<"Actual args:"<<actualArgs;
|
|
|
|
|
qDebug()<<"Parsed args:"<<parsedArgs;
|
|
|
|
|
qDebug()<<"Actual spec:"<<actualSpec;
|
|
|
|
|
qDebug()<<"Parsed spec:"<<parsedSpec;
|
|
|
|
|
}
|
|
|
|
|
|
2010-08-30 16:41:59 +02:00
|
|
|
// Comparing the sorted list is obviously wrong
|
|
|
|
|
// Though haven written a more complete version
|
|
|
|
|
// that managed had around 200 lines and yet faild
|
|
|
|
|
// to be actually foolproof at all, I think it's
|
|
|
|
|
// not feasible without actually taking the qmake
|
|
|
|
|
// command line parsing code
|
|
|
|
|
|
|
|
|
|
// Things, sorting gets wrong:
|
|
|
|
|
// parameters to positional parameters matter
|
|
|
|
|
// e.g. -o -spec is different from -spec -o
|
|
|
|
|
// -o 1 -spec 2 is diffrent from -spec 1 -o 2
|
|
|
|
|
// variable assignment order matters
|
|
|
|
|
// variable assignment vs -after
|
|
|
|
|
// -norecursive vs. recursive
|
|
|
|
|
actualArgs.sort();
|
|
|
|
|
parsedArgs.sort();
|
2009-11-25 18:50:20 +01:00
|
|
|
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;
|
|
|
|
|
}
|
2010-08-30 14:49:58 +02:00
|
|
|
} else if (debug) {
|
|
|
|
|
qDebug()<<"different qmake buildconfigurations buildconfiguration:"<<qmakeBuildConfiguration()<<" Makefile:"<<result.first;
|
2009-11-25 18:50:20 +01:00
|
|
|
}
|
2010-08-30 14:49:58 +02:00
|
|
|
} else if (debug) {
|
|
|
|
|
qDebug()<<"diffrent qt versions, buildconfiguration:"<<version->qmakeCommand()<<" Makefile:"<<qmakePath;
|
2009-11-25 18:50:20 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2009-11-26 16:49:45 +01:00
|
|
|
|
2010-10-19 11:14:03 +02:00
|
|
|
void Qt4BuildConfiguration::removeQMLInspectorFromArguments(QString *args)
|
2010-08-30 13:24:34 +02:00
|
|
|
{
|
2010-10-19 11:14:03 +02:00
|
|
|
for (Utils::QtcProcess::ArgIterator ait(args); ait.next(); )
|
2011-01-12 16:24:00 +01:00
|
|
|
if (ait.value().contains(QLatin1String(Constants::QMAKEVAR_QMLJSDEBUGGER_PATH)))
|
2010-10-19 11:14:03 +02:00
|
|
|
ait.deleteArg();
|
2010-08-30 13:24:34 +02:00
|
|
|
}
|
|
|
|
|
|
2010-10-19 11:14:03 +02:00
|
|
|
QString Qt4BuildConfiguration::extractSpecFromArguments(QString *args,
|
2011-05-20 21:40:53 +02:00
|
|
|
const QString &directory, const QtSupport::BaseQtVersion *version,
|
2010-10-19 11:14:03 +02:00
|
|
|
QStringList *outArgs)
|
2009-11-26 16:49:45 +01:00
|
|
|
{
|
2010-10-19 11:14:03 +02:00
|
|
|
QString parsedSpec;
|
|
|
|
|
|
2009-11-26 16:49:45 +01:00
|
|
|
bool ignoreNext = false;
|
2010-10-19 11:14:03 +02:00
|
|
|
bool nextIsSpec = false;
|
|
|
|
|
for (Utils::QtcProcess::ArgIterator ait(args); ait.next(); ) {
|
2009-11-26 16:49:45 +01:00
|
|
|
if (ignoreNext) {
|
|
|
|
|
ignoreNext = false;
|
2010-10-19 11:14:03 +02:00
|
|
|
ait.deleteArg();
|
|
|
|
|
} else if (nextIsSpec) {
|
|
|
|
|
nextIsSpec = false;
|
|
|
|
|
parsedSpec = QDir::cleanPath(ait.value());
|
|
|
|
|
ait.deleteArg();
|
|
|
|
|
} else if (ait.value() == QLatin1String("-spec") || ait.value() == QLatin1String("-platform")) {
|
|
|
|
|
nextIsSpec = true;
|
|
|
|
|
ait.deleteArg();
|
|
|
|
|
} else if (ait.value() == QLatin1String("-cache")) {
|
|
|
|
|
// We ignore -cache, because qmake contained a bug that it didn't
|
|
|
|
|
// mention the -cache in the Makefile.
|
|
|
|
|
// That means changing the -cache option in the additional arguments
|
|
|
|
|
// does not automatically rerun qmake. Alas, we could try more
|
|
|
|
|
// intelligent matching for -cache, but i guess people rarely
|
|
|
|
|
// do use that.
|
2009-11-26 16:49:45 +01:00
|
|
|
ignoreNext = true;
|
2010-10-19 11:14:03 +02:00
|
|
|
ait.deleteArg();
|
|
|
|
|
} else if (outArgs && ait.isSimple()) {
|
|
|
|
|
outArgs->append(ait.value());
|
2009-11-26 16:49:45 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-10-19 11:14:03 +02:00
|
|
|
if (parsedSpec.isEmpty())
|
2009-11-26 16:49:45 +01:00
|
|
|
return QString();
|
|
|
|
|
|
|
|
|
|
QString baseMkspecDir = version->versionInfo().value("QMAKE_MKSPECS");
|
|
|
|
|
if (baseMkspecDir.isEmpty())
|
|
|
|
|
baseMkspecDir = version->versionInfo().value("QT_INSTALL_DATA") + "/mkspecs";
|
|
|
|
|
|
|
|
|
|
#ifdef Q_OS_WIN
|
|
|
|
|
baseMkspecDir = baseMkspecDir.toLower();
|
|
|
|
|
parsedSpec = parsedSpec.toLower();
|
|
|
|
|
#endif
|
|
|
|
|
// if the path is relative it can be
|
|
|
|
|
// relative to the working directory (as found in the Makefiles)
|
|
|
|
|
// or relatively to the mkspec directory
|
|
|
|
|
// if it is the former we need to get the canonical form
|
|
|
|
|
// for the other one we don't need to do anything
|
|
|
|
|
if (QFileInfo(parsedSpec).isRelative()) {
|
2010-02-01 12:43:56 +01:00
|
|
|
if(QFileInfo(directory + QLatin1Char('/') + parsedSpec).exists()) {
|
|
|
|
|
parsedSpec = QDir::cleanPath(directory + QLatin1Char('/') + parsedSpec);
|
2009-11-26 16:49:45 +01:00
|
|
|
#ifdef Q_OS_WIN
|
|
|
|
|
parsedSpec = parsedSpec.toLower();
|
|
|
|
|
#endif
|
|
|
|
|
} else {
|
2010-02-01 12:43:56 +01:00
|
|
|
parsedSpec = baseMkspecDir + QLatin1Char('/') + parsedSpec;
|
2009-11-26 16:49:45 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QFileInfo f2(parsedSpec);
|
|
|
|
|
while (f2.isSymLink()) {
|
|
|
|
|
parsedSpec = f2.symLinkTarget();
|
|
|
|
|
f2.setFile(parsedSpec);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (parsedSpec.startsWith(baseMkspecDir)) {
|
|
|
|
|
parsedSpec = parsedSpec.mid(baseMkspecDir.length() + 1);
|
|
|
|
|
} else {
|
|
|
|
|
QString sourceMkSpecPath = version->sourcePath() + "/mkspecs";
|
|
|
|
|
if (parsedSpec.startsWith(sourceMkSpecPath)) {
|
|
|
|
|
parsedSpec = parsedSpec.mid(sourceMkSpecPath.length() + 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#ifdef Q_OS_WIN
|
|
|
|
|
parsedSpec = parsedSpec.toLower();
|
|
|
|
|
#endif
|
|
|
|
|
return parsedSpec;
|
2009-12-02 17:43:43 +01:00
|
|
|
}
|
2010-01-07 18:17:24 +01:00
|
|
|
|
2010-07-07 16:32:23 +02:00
|
|
|
ProjectExplorer::IOutputParser *Qt4BuildConfiguration::createOutputParser() const
|
|
|
|
|
{
|
|
|
|
|
ToolChain *tc = toolChain();
|
|
|
|
|
if (tc)
|
|
|
|
|
return toolChain()->outputParser();
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
|
2011-01-19 15:46:01 +01:00
|
|
|
bool Qt4BuildConfiguration::isEnabled() const
|
|
|
|
|
{
|
|
|
|
|
return m_isEnabled;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Qt4BuildConfiguration::setEnabled(bool enabled)
|
|
|
|
|
{
|
|
|
|
|
if (m_isEnabled == enabled)
|
|
|
|
|
return;
|
|
|
|
|
m_isEnabled = enabled;
|
|
|
|
|
emit enabledChanged();
|
|
|
|
|
}
|
|
|
|
|
|
2010-01-07 18:17:24 +01:00
|
|
|
/*!
|
|
|
|
|
\class Qt4BuildConfigurationFactory
|
|
|
|
|
*/
|
|
|
|
|
|
2010-01-18 12:11:04 +01:00
|
|
|
Qt4BuildConfigurationFactory::Qt4BuildConfigurationFactory(QObject *parent) :
|
|
|
|
|
ProjectExplorer::IBuildConfigurationFactory(parent)
|
2010-01-07 18:17:24 +01:00
|
|
|
{
|
|
|
|
|
update();
|
|
|
|
|
|
2011-05-20 21:40:53 +02:00
|
|
|
QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance();
|
2010-01-07 18:17:24 +01:00
|
|
|
connect(vm, SIGNAL(qtVersionsChanged(QList<int>)),
|
|
|
|
|
this, SLOT(update()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Qt4BuildConfigurationFactory::~Qt4BuildConfigurationFactory()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Qt4BuildConfigurationFactory::update()
|
|
|
|
|
{
|
|
|
|
|
m_versions.clear();
|
2011-05-20 21:40:53 +02:00
|
|
|
QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance();
|
|
|
|
|
foreach (QtSupport::BaseQtVersion *version, vm->validVersions()) {
|
2011-05-04 13:14:46 +02:00
|
|
|
QString key = QString::fromLatin1(QT4_BC_ID_PREFIX)
|
|
|
|
|
+ QString::fromLatin1("Qt%1").arg(version->uniqueId());
|
|
|
|
|
VersionInfo info(tr("Using Qt Version \"%1\"").arg(version->displayName()), version->uniqueId());
|
|
|
|
|
m_versions.insert(key, info);
|
2010-01-07 18:17:24 +01:00
|
|
|
}
|
|
|
|
|
emit availableCreationIdsChanged();
|
|
|
|
|
}
|
|
|
|
|
|
2010-02-08 15:50:06 +01:00
|
|
|
QStringList Qt4BuildConfigurationFactory::availableCreationIds(ProjectExplorer::Target *parent) const
|
2010-01-07 18:17:24 +01:00
|
|
|
{
|
2010-12-10 19:02:19 +01:00
|
|
|
if (!qobject_cast<Qt4BaseTarget *>(parent))
|
2010-01-18 12:11:04 +01:00
|
|
|
return QStringList();
|
2010-02-08 15:50:06 +01:00
|
|
|
|
|
|
|
|
QStringList results;
|
2011-05-20 21:40:53 +02:00
|
|
|
QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance();
|
2010-02-08 15:50:06 +01:00
|
|
|
for (QMap<QString, VersionInfo>::const_iterator i = m_versions.constBegin();
|
|
|
|
|
i != m_versions.constEnd(); ++i) {
|
2011-04-27 14:55:36 +02:00
|
|
|
if (vm->version(i.value().versionId)->supportsTargetId(parent->id())
|
|
|
|
|
&& vm->version(i.value().versionId)->toolChainAvailable(parent->id()))
|
2010-02-08 15:50:06 +01:00
|
|
|
results.append(i.key());
|
|
|
|
|
}
|
|
|
|
|
return results;
|
2010-01-07 18:17:24 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QString Qt4BuildConfigurationFactory::displayNameForId(const QString &id) const
|
|
|
|
|
{
|
2010-01-18 12:11:04 +01:00
|
|
|
if (!m_versions.contains(id))
|
|
|
|
|
return QString();
|
|
|
|
|
return m_versions.value(id).displayName;
|
2010-01-07 18:17:24 +01:00
|
|
|
}
|
|
|
|
|
|
2010-02-08 15:50:06 +01:00
|
|
|
bool Qt4BuildConfigurationFactory::canCreate(ProjectExplorer::Target *parent, const QString &id) const
|
2010-01-07 18:17:24 +01:00
|
|
|
{
|
2010-12-10 19:02:19 +01:00
|
|
|
if (!qobject_cast<Qt4BaseTarget *>(parent))
|
2010-01-18 12:11:04 +01:00
|
|
|
return false;
|
|
|
|
|
if (!m_versions.contains(id))
|
|
|
|
|
return false;
|
2010-01-07 18:17:24 +01:00
|
|
|
const VersionInfo &info = m_versions.value(id);
|
2011-05-20 21:40:53 +02:00
|
|
|
QtSupport::BaseQtVersion *version = QtSupport::QtVersionManager::instance()->version(info.versionId);
|
2010-02-08 15:50:06 +01:00
|
|
|
if (!version ||
|
|
|
|
|
!version->supportsTargetId(parent->id()))
|
2010-01-07 18:17:24 +01:00
|
|
|
return false;
|
2010-01-18 12:11:04 +01:00
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2010-02-08 15:50:06 +01:00
|
|
|
BuildConfiguration *Qt4BuildConfigurationFactory::create(ProjectExplorer::Target *parent, const QString &id)
|
2010-01-18 12:11:04 +01:00
|
|
|
{
|
|
|
|
|
if (!canCreate(parent, id))
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
const VersionInfo &info = m_versions.value(id);
|
2011-05-20 21:40:53 +02:00
|
|
|
QtSupport::BaseQtVersion *version = QtSupport::QtVersionManager::instance()->version(info.versionId);
|
2010-01-18 12:11:04 +01:00
|
|
|
Q_ASSERT(version);
|
|
|
|
|
|
2010-12-10 19:02:19 +01:00
|
|
|
Qt4BaseTarget *qt4Target = static_cast<Qt4BaseTarget *>(parent);
|
2010-01-18 12:11:04 +01:00
|
|
|
|
2010-01-07 18:17:24 +01:00
|
|
|
bool ok;
|
|
|
|
|
QString buildConfigurationName = QInputDialog::getText(0,
|
2010-09-14 14:51:50 +02:00
|
|
|
tr("New Configuration"),
|
|
|
|
|
tr("New configuration name:"),
|
2010-01-07 18:17:24 +01:00
|
|
|
QLineEdit::Normal,
|
|
|
|
|
version->displayName(),
|
|
|
|
|
&ok);
|
2010-10-04 17:50:55 +02:00
|
|
|
buildConfigurationName = buildConfigurationName.trimmed();
|
2010-01-07 18:17:24 +01:00
|
|
|
if (!ok || buildConfigurationName.isEmpty())
|
2010-07-16 14:00:41 +02:00
|
|
|
return 0;
|
2010-01-07 18:17:24 +01:00
|
|
|
|
2011-02-18 09:59:49 +01:00
|
|
|
//: Debug build configuration. We recommend not translating it.
|
2011-05-20 12:52:59 +02:00
|
|
|
QString defaultDebugName = tr("%1 Debug").arg(version->displayName());
|
|
|
|
|
QString customDebugName;
|
|
|
|
|
if (buildConfigurationName != version->displayName())
|
|
|
|
|
customDebugName = tr("%1 Debug").arg(buildConfigurationName);
|
|
|
|
|
|
|
|
|
|
BuildConfiguration *bc = qt4Target->addQt4BuildConfiguration(defaultDebugName, customDebugName,
|
2010-02-08 15:50:06 +01:00
|
|
|
version,
|
2011-05-20 21:40:53 +02:00
|
|
|
(version->defaultBuildConfig() | QtSupport::BaseQtVersion::DebugBuild),
|
2010-10-19 11:14:03 +02:00
|
|
|
QString(), QString());
|
2011-05-04 13:14:46 +02:00
|
|
|
|
2011-05-06 13:43:27 +02:00
|
|
|
if (qt4Target->id() != Constants::S60_EMULATOR_TARGET_ID) {
|
2011-04-27 14:55:36 +02:00
|
|
|
//: Release build configuration. We recommend not translating it.
|
2011-05-20 12:52:59 +02:00
|
|
|
QString defaultReleaseName = tr("%1 Release").arg(version->displayName());
|
|
|
|
|
QString customReleaseName;
|
|
|
|
|
if (buildConfigurationName != version->displayName())
|
|
|
|
|
customReleaseName = tr("%1 Release").arg(buildConfigurationName);
|
|
|
|
|
|
|
|
|
|
bc = qt4Target->addQt4BuildConfiguration(defaultReleaseName, customReleaseName,
|
2011-04-27 14:55:36 +02:00
|
|
|
version,
|
2011-05-20 21:40:53 +02:00
|
|
|
(version->defaultBuildConfig() & ~QtSupport::BaseQtVersion::DebugBuild),
|
2011-04-27 14:55:36 +02:00
|
|
|
QString(), QString());
|
|
|
|
|
}
|
2010-01-07 18:17:24 +01:00
|
|
|
return bc;
|
|
|
|
|
}
|
|
|
|
|
|
2010-02-08 15:50:06 +01:00
|
|
|
bool Qt4BuildConfigurationFactory::canClone(ProjectExplorer::Target *parent, ProjectExplorer::BuildConfiguration *source) const
|
2010-01-07 18:17:24 +01:00
|
|
|
{
|
2010-12-10 19:02:19 +01:00
|
|
|
if (!qobject_cast<Qt4BaseTarget *>(parent))
|
2010-02-08 15:50:06 +01:00
|
|
|
return false;
|
|
|
|
|
Qt4BuildConfiguration *qt4bc(qobject_cast<Qt4BuildConfiguration *>(source));
|
|
|
|
|
if (!qt4bc)
|
|
|
|
|
return false;
|
|
|
|
|
|
2011-05-20 21:40:53 +02:00
|
|
|
QtSupport::BaseQtVersion *version = qt4bc->qtVersion();
|
2010-02-08 15:50:06 +01:00
|
|
|
if (!version ||
|
|
|
|
|
!version->supportsTargetId(parent->id()))
|
|
|
|
|
return false;
|
|
|
|
|
return true;
|
2010-01-07 18:17:24 +01:00
|
|
|
}
|
|
|
|
|
|
2010-02-08 15:50:06 +01:00
|
|
|
BuildConfiguration *Qt4BuildConfigurationFactory::clone(Target *parent, BuildConfiguration *source)
|
2010-01-07 18:17:24 +01:00
|
|
|
{
|
2010-01-18 12:11:04 +01:00
|
|
|
if (!canClone(parent, source))
|
|
|
|
|
return 0;
|
2010-12-10 19:02:19 +01:00
|
|
|
Qt4BaseTarget *target = static_cast<Qt4BaseTarget *>(parent);
|
2010-01-18 12:11:04 +01:00
|
|
|
Qt4BuildConfiguration *oldbc(static_cast<Qt4BuildConfiguration *>(source));
|
2010-02-08 15:50:06 +01:00
|
|
|
return new Qt4BuildConfiguration(target, oldbc);
|
2010-01-18 12:11:04 +01:00
|
|
|
}
|
|
|
|
|
|
2010-02-08 15:50:06 +01:00
|
|
|
bool Qt4BuildConfigurationFactory::canRestore(Target *parent, const QVariantMap &map) const
|
2010-01-18 12:11:04 +01:00
|
|
|
{
|
2010-12-10 19:02:19 +01:00
|
|
|
QString id = ProjectExplorer::idFromMap(map);
|
|
|
|
|
if (!qobject_cast<Qt4BaseTarget *>(parent))
|
2010-01-18 12:11:04 +01:00
|
|
|
return false;
|
|
|
|
|
return id.startsWith(QLatin1String(QT4_BC_ID_PREFIX)) ||
|
|
|
|
|
id == QLatin1String(QT4_BC_ID);
|
2010-01-07 18:17:24 +01:00
|
|
|
}
|
|
|
|
|
|
2010-02-08 15:50:06 +01:00
|
|
|
BuildConfiguration *Qt4BuildConfigurationFactory::restore(Target *parent, const QVariantMap &map)
|
2010-01-18 12:11:04 +01:00
|
|
|
{
|
|
|
|
|
if (!canRestore(parent, map))
|
|
|
|
|
return 0;
|
2010-12-10 19:02:19 +01:00
|
|
|
Qt4BaseTarget *target = static_cast<Qt4BaseTarget *>(parent);
|
|
|
|
|
Qt4BuildConfiguration *bc = new Qt4BuildConfiguration(target);
|
2010-01-18 12:11:04 +01:00
|
|
|
if (bc->fromMap(map))
|
|
|
|
|
return bc;
|
|
|
|
|
delete bc;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
2011-01-13 13:38:43 +01:00
|
|
|
|
|
|
|
|
void Qt4BuildConfiguration::importFromBuildDirectory()
|
|
|
|
|
{
|
|
|
|
|
QString directory = buildDirectory();
|
|
|
|
|
if (!directory.isEmpty()) {
|
|
|
|
|
QString mkfile = directory;
|
|
|
|
|
if (makefile().isEmpty())
|
|
|
|
|
mkfile.append("/Makefile");
|
|
|
|
|
else
|
|
|
|
|
mkfile.append(makefile());
|
|
|
|
|
|
2011-05-20 21:40:53 +02:00
|
|
|
QString qmakePath = QtSupport::QtVersionManager::findQMakeBinaryFromMakefile(mkfile);
|
2011-01-13 13:38:43 +01:00
|
|
|
if (!qmakePath.isEmpty()) {
|
2011-05-20 21:40:53 +02:00
|
|
|
QtSupport::QtVersionManager *vm = QtSupport::QtVersionManager::instance();
|
|
|
|
|
QtSupport::BaseQtVersion *version = vm->qtVersionForQMakeBinary(qmakePath);
|
2011-01-13 13:38:43 +01:00
|
|
|
if (!version) {
|
2011-05-20 21:40:53 +02:00
|
|
|
version = QtSupport::QtVersionFactory::createQtVersionFromQMakePath(qmakePath);
|
2011-01-13 13:38:43 +01:00
|
|
|
vm->addVersion(version);
|
|
|
|
|
}
|
|
|
|
|
|
2011-05-20 21:40:53 +02:00
|
|
|
QPair<QtSupport::BaseQtVersion::QmakeBuildConfigs, QString> result =
|
|
|
|
|
QtSupport::QtVersionManager::scanMakeFile(mkfile, version->defaultBuildConfig());
|
|
|
|
|
QtSupport::BaseQtVersion::QmakeBuildConfigs qmakeBuildConfig = result.first;
|
2011-01-13 13:38:43 +01:00
|
|
|
|
|
|
|
|
QString aa = result.second;
|
|
|
|
|
QString parsedSpec = Qt4BuildConfiguration::extractSpecFromArguments(&aa, directory, version);
|
|
|
|
|
QString versionSpec = version->mkspec();
|
|
|
|
|
QString additionalArguments;
|
|
|
|
|
if (parsedSpec.isEmpty() || parsedSpec == versionSpec || parsedSpec == "default") {
|
|
|
|
|
// using the default spec, don't modify additional arguments
|
|
|
|
|
} else {
|
|
|
|
|
additionalArguments = "-spec " + Utils::QtcProcess::quoteArg(parsedSpec);
|
|
|
|
|
}
|
|
|
|
|
Utils::QtcProcess::addArgs(&additionalArguments, aa);
|
|
|
|
|
|
|
|
|
|
Qt4BuildConfiguration::removeQMLInspectorFromArguments(&additionalArguments);
|
|
|
|
|
|
|
|
|
|
// So we got all the information now apply it...
|
|
|
|
|
setQtVersion(version);
|
|
|
|
|
|
|
|
|
|
qmakeStep()->setUserArguments(additionalArguments);
|
|
|
|
|
|
|
|
|
|
setQMakeBuildConfiguration(qmakeBuildConfig);
|
|
|
|
|
// Adjust command line arguments, this is ugly as hell
|
|
|
|
|
// If we are switching to BuildAll we want "release" in there and no "debug"
|
|
|
|
|
// or "debug" in there and no "release"
|
2011-05-20 13:43:36 +02:00
|
|
|
// If we are switching to not BuildAll we want neither "release" nor "debug" in there
|
2011-05-20 21:40:53 +02:00
|
|
|
bool debug = qmakeBuildConfig & QtSupport::BaseQtVersion::DebugBuild;
|
|
|
|
|
bool haveTag = !(qmakeBuildConfig & QtSupport::BaseQtVersion::BuildAll);
|
2011-01-13 13:38:43 +01:00
|
|
|
QString makeCmdArguments = makeStep()->userArguments();
|
|
|
|
|
Utils::QtcProcess::ArgIterator ait(&makeCmdArguments);
|
|
|
|
|
while (ait.next()) {
|
|
|
|
|
if (ait.value() == QLatin1String("debug")) {
|
|
|
|
|
if (!haveTag && debug)
|
|
|
|
|
haveTag = true;
|
|
|
|
|
else
|
|
|
|
|
ait.deleteArg();
|
|
|
|
|
} else if (ait.value() == QLatin1String("release")) {
|
|
|
|
|
if (!haveTag && !debug)
|
|
|
|
|
haveTag = true;
|
|
|
|
|
else
|
|
|
|
|
ait.deleteArg();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (!haveTag)
|
|
|
|
|
ait.appendArg(QLatin1String(debug ? "debug" : "release"));
|
|
|
|
|
makeStep()->setUserArguments(makeCmdArguments);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-03-03 16:12:00 +01:00
|
|
|
|
|
|
|
|
BuildConfiguration::BuildType Qt4BuildConfiguration::buildType() const
|
|
|
|
|
{
|
2011-05-20 21:40:53 +02:00
|
|
|
if (qmakeBuildConfiguration() & QtSupport::BaseQtVersion::DebugBuild)
|
2011-03-03 16:12:00 +01:00
|
|
|
return Debug;
|
|
|
|
|
else
|
|
|
|
|
return Release;
|
|
|
|
|
}
|