forked from qt-creator/qt-creator
QmakeProject: Take deduced arguments into consideration on import
That is try to find a kit that matches the deduced arguments found in the Makefile. Task-number: QTCREATORBUG-11067 Change-Id: I01dc122ffcba8ccb71b112c271a0ae2cf860328d Reviewed-by: Fawzi Mohamed <fawzi.mohamed@digia.com>
This commit is contained in:
@@ -507,6 +507,52 @@ FileName QmakeBuildConfiguration::extractSpecFromArguments(QString *args,
|
|||||||
return parsedSpec;
|
return parsedSpec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QStringList QmakeBuildConfiguration::extractDeducedArguments(QString *args)
|
||||||
|
{
|
||||||
|
QStringList allPossibleDeducedArguments;
|
||||||
|
allPossibleDeducedArguments << QLatin1String("CONFIG+=x86")
|
||||||
|
<< QLatin1String("CONFIG+=x86_64")
|
||||||
|
<< QLatin1String("CONFIG+=iphonesimulator")
|
||||||
|
<< QLatin1String("CONFIG+=ppc")
|
||||||
|
<< QLatin1String("CONFIG+=ppc64")
|
||||||
|
<< QLatin1String("CONFIG+=iphoneos");
|
||||||
|
QStringList result;
|
||||||
|
for (QtcProcess::ArgIterator ait(args); ait.next(); ) {
|
||||||
|
QString arg = ait.value();
|
||||||
|
if (allPossibleDeducedArguments.contains(arg)) {
|
||||||
|
result << arg;
|
||||||
|
ait.deleteArg();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList QmakeBuildConfiguration::deduceArgumnetsForTargetAbi(const ProjectExplorer::Abi &targetAbi, const BaseQtVersion *version)
|
||||||
|
{
|
||||||
|
QStringList arguments;
|
||||||
|
if ((targetAbi.os() == ProjectExplorer::Abi::MacOS)
|
||||||
|
&& (targetAbi.binaryFormat() == ProjectExplorer::Abi::MachOFormat)) {
|
||||||
|
if (targetAbi.architecture() == ProjectExplorer::Abi::X86Architecture) {
|
||||||
|
if (targetAbi.wordWidth() == 32)
|
||||||
|
arguments << QLatin1String("CONFIG+=x86");
|
||||||
|
else if (targetAbi.wordWidth() == 64)
|
||||||
|
arguments << QLatin1String("CONFIG+=x86_64");
|
||||||
|
|
||||||
|
const char IOSQT[] = "Qt4ProjectManager.QtVersion.Ios";
|
||||||
|
if (version && version->type() == QLatin1String(IOSQT)) // ugly, we can't distinguish between ios and mac toolchains
|
||||||
|
arguments << QLatin1String("CONFIG+=iphonesimulator");
|
||||||
|
} else if (targetAbi.architecture() == ProjectExplorer::Abi::PowerPCArchitecture) {
|
||||||
|
if (targetAbi.wordWidth() == 32)
|
||||||
|
arguments << QLatin1String("CONFIG+=ppc");
|
||||||
|
else if (targetAbi.wordWidth() == 64)
|
||||||
|
arguments << QLatin1String("CONFIG+=ppc64");
|
||||||
|
} else if (targetAbi.architecture() == ProjectExplorer::Abi::ArmArchitecture) {
|
||||||
|
arguments << QLatin1String("CONFIG+=iphoneos");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return arguments;
|
||||||
|
}
|
||||||
|
|
||||||
bool QmakeBuildConfiguration::isEnabled() const
|
bool QmakeBuildConfiguration::isEnabled() const
|
||||||
{
|
{
|
||||||
return m_isEnabled;
|
return m_isEnabled;
|
||||||
|
|||||||
@@ -91,6 +91,8 @@ public:
|
|||||||
static Utils::FileName extractSpecFromArguments(QString *arguments,
|
static Utils::FileName extractSpecFromArguments(QString *arguments,
|
||||||
const QString &directory, const QtSupport::BaseQtVersion *version,
|
const QString &directory, const QtSupport::BaseQtVersion *version,
|
||||||
QStringList *outArgs = 0);
|
QStringList *outArgs = 0);
|
||||||
|
static QStringList extractDeducedArguments(QString *args);
|
||||||
|
static QStringList deduceArgumnetsForTargetAbi(const ProjectExplorer::Abi &targetAbi, const QtSupport::BaseQtVersion *version);
|
||||||
|
|
||||||
QVariantMap toMap() const;
|
QVariantMap toMap() const;
|
||||||
|
|
||||||
|
|||||||
@@ -38,11 +38,14 @@
|
|||||||
#include <coreplugin/idocument.h>
|
#include <coreplugin/idocument.h>
|
||||||
#include <projectexplorer/kitmanager.h>
|
#include <projectexplorer/kitmanager.h>
|
||||||
#include <projectexplorer/target.h>
|
#include <projectexplorer/target.h>
|
||||||
|
#include <projectexplorer/toolchain.h>
|
||||||
|
#include <projectexplorer/toolchainmanager.h>
|
||||||
#include <qtsupport/qtkitinformation.h>
|
#include <qtsupport/qtkitinformation.h>
|
||||||
#include <qtsupport/qtsupportconstants.h>
|
#include <qtsupport/qtsupportconstants.h>
|
||||||
#include <qtsupport/qtversionfactory.h>
|
#include <qtsupport/qtversionfactory.h>
|
||||||
#include <qtsupport/qtversionmanager.h>
|
#include <qtsupport/qtversionmanager.h>
|
||||||
#include <utils/qtcprocess.h>
|
#include <utils/qtcprocess.h>
|
||||||
|
#include <utils/algorithm.h>
|
||||||
|
|
||||||
#include <QDir>
|
#include <QDir>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
@@ -113,6 +116,9 @@ QList<ProjectExplorer::BuildInfo *> QmakeProjectImporter::import(const Utils::Fi
|
|||||||
QString additionalArguments = makefileBuildConfig.second;
|
QString additionalArguments = makefileBuildConfig.second;
|
||||||
Utils::FileName parsedSpec =
|
Utils::FileName parsedSpec =
|
||||||
QmakeBuildConfiguration::extractSpecFromArguments(&additionalArguments, importPath.toString(), version);
|
QmakeBuildConfiguration::extractSpecFromArguments(&additionalArguments, importPath.toString(), version);
|
||||||
|
QStringList deducedArguments =
|
||||||
|
QmakeBuildConfiguration::extractDeducedArguments(&additionalArguments);
|
||||||
|
|
||||||
Utils::FileName versionSpec = version->mkspec();
|
Utils::FileName versionSpec = version->mkspec();
|
||||||
if (parsedSpec.isEmpty() || parsedSpec == Utils::FileName::fromLatin1("default"))
|
if (parsedSpec.isEmpty() || parsedSpec == Utils::FileName::fromLatin1("default"))
|
||||||
parsedSpec = versionSpec;
|
parsedSpec = versionSpec;
|
||||||
@@ -131,13 +137,17 @@ QList<ProjectExplorer::BuildInfo *> QmakeProjectImporter::import(const Utils::Fi
|
|||||||
ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(k);
|
ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(k);
|
||||||
if (kitSpec.isEmpty() && kitVersion)
|
if (kitSpec.isEmpty() && kitVersion)
|
||||||
kitSpec = kitVersion->mkspecFor(tc);
|
kitSpec = kitVersion->mkspecFor(tc);
|
||||||
|
QStringList kitDeducedArguments;
|
||||||
|
if (tc)
|
||||||
|
kitDeducedArguments = QmakeBuildConfiguration::deduceArgumnetsForTargetAbi(tc->targetAbi(), kitVersion);
|
||||||
|
|
||||||
if (kitVersion == version
|
if (kitVersion == version
|
||||||
&& kitSpec == parsedSpec)
|
&& kitSpec == parsedSpec
|
||||||
|
&& kitDeducedArguments == deducedArguments)
|
||||||
kitList.append(k);
|
kitList.append(k);
|
||||||
}
|
}
|
||||||
if (kitList.isEmpty())
|
if (kitList.isEmpty())
|
||||||
kitList.append(createTemporaryKit(version, temporaryVersion, parsedSpec));
|
kitList.append(createTemporaryKit(version, temporaryVersion, parsedSpec, deducedArguments));
|
||||||
|
|
||||||
foreach (ProjectExplorer::Kit *k, kitList) {
|
foreach (ProjectExplorer::Kit *k, kitList) {
|
||||||
addProject(k);
|
addProject(k);
|
||||||
@@ -254,16 +264,34 @@ void QmakeProjectImporter::makePermanent(ProjectExplorer::Kit *k)
|
|||||||
ProjectImporter::makePermanent(k);
|
ProjectImporter::makePermanent(k);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
ProjectExplorer::ToolChain *preferredToolChain(QtSupport::BaseQtVersion *qtVersion, const Utils::FileName &ms, const QStringList &deducedArguments)
|
||||||
|
{
|
||||||
|
const Utils::FileName spec = ms.isEmpty() ? qtVersion->mkspec() : ms;
|
||||||
|
|
||||||
|
QList<ProjectExplorer::ToolChain *> toolchains = ProjectExplorer::ToolChainManager::toolChains();
|
||||||
|
QList<ProjectExplorer::Abi> qtAbis = qtVersion->qtAbis();
|
||||||
|
return Utils::findOr(toolchains,
|
||||||
|
toolchains.isEmpty() ? 0 : toolchains.first(),
|
||||||
|
[&spec, &deducedArguments, &qtAbis](ProjectExplorer::ToolChain *tc) -> bool{
|
||||||
|
return qtAbis.contains(tc->targetAbi())
|
||||||
|
&& tc->suggestedMkspecList().contains(spec)
|
||||||
|
&& QmakeBuildConfiguration::deduceArgumnetsForTargetAbi(tc->targetAbi(), 0) == deducedArguments;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ProjectExplorer::Kit *QmakeProjectImporter::createTemporaryKit(QtSupport::BaseQtVersion *version,
|
ProjectExplorer::Kit *QmakeProjectImporter::createTemporaryKit(QtSupport::BaseQtVersion *version,
|
||||||
bool temporaryVersion,
|
bool temporaryVersion,
|
||||||
const Utils::FileName &parsedSpec)
|
const Utils::FileName &parsedSpec,
|
||||||
|
const QStringList &deducedQmakeArguments)
|
||||||
{
|
{
|
||||||
ProjectExplorer::Kit *k = new ProjectExplorer::Kit;
|
ProjectExplorer::Kit *k = new ProjectExplorer::Kit;
|
||||||
|
|
||||||
ProjectExplorer::KitGuard guard(k);
|
ProjectExplorer::KitGuard guard(k);
|
||||||
|
|
||||||
QtSupport::QtKitInformation::setQtVersion(k, version);
|
QtSupport::QtKitInformation::setQtVersion(k, version);
|
||||||
ProjectExplorer::ToolChainKitInformation::setToolChain(k, version->preferredToolChain(parsedSpec));
|
ProjectExplorer::ToolChainKitInformation::setToolChain(k, preferredToolChain(version, parsedSpec, deducedQmakeArguments));
|
||||||
QmakeKitInformation::setMkspec(k, parsedSpec);
|
QmakeKitInformation::setMkspec(k, parsedSpec);
|
||||||
|
|
||||||
markTemporary(k);
|
markTemporary(k);
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ public:
|
|||||||
private:
|
private:
|
||||||
ProjectExplorer::Kit *createTemporaryKit(QtSupport::BaseQtVersion *version,
|
ProjectExplorer::Kit *createTemporaryKit(QtSupport::BaseQtVersion *version,
|
||||||
bool temporaryVersion,
|
bool temporaryVersion,
|
||||||
const Utils::FileName &parsedSpec);
|
const Utils::FileName &parsedSpec, const QStringList &deducedQmakeArguments);
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
|||||||
@@ -170,29 +170,9 @@ QStringList QMakeStep::deducedArguments()
|
|||||||
targetAbi = tc->targetAbi();
|
targetAbi = tc->targetAbi();
|
||||||
|
|
||||||
// explicitly add architecture to CONFIG
|
// explicitly add architecture to CONFIG
|
||||||
if ((targetAbi.os() == ProjectExplorer::Abi::MacOS)
|
|
||||||
&& (targetAbi.binaryFormat() == ProjectExplorer::Abi::MachOFormat)) {
|
|
||||||
if (targetAbi.architecture() == ProjectExplorer::Abi::X86Architecture) {
|
|
||||||
if (targetAbi.wordWidth() == 32)
|
|
||||||
arguments << QLatin1String("CONFIG+=x86");
|
|
||||||
else if (targetAbi.wordWidth() == 64)
|
|
||||||
arguments << QLatin1String("CONFIG+=x86_64");
|
|
||||||
|
|
||||||
const char IOSQT[] = "Qt4ProjectManager.QtVersion.Ios"; // from Ios::Constants (include header?)
|
|
||||||
QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target()->kit());
|
|
||||||
if (version && version->type() == QLatin1String(IOSQT))
|
|
||||||
arguments << QLatin1String("CONFIG+=iphonesimulator");
|
|
||||||
} else if (targetAbi.architecture() == ProjectExplorer::Abi::PowerPCArchitecture) {
|
|
||||||
if (targetAbi.wordWidth() == 32)
|
|
||||||
arguments << QLatin1String("CONFIG+=ppc");
|
|
||||||
else if (targetAbi.wordWidth() == 64)
|
|
||||||
arguments << QLatin1String("CONFIG+=ppc64");
|
|
||||||
} else if (targetAbi.architecture() == ProjectExplorer::Abi::ArmArchitecture) {
|
|
||||||
arguments << QLatin1String("CONFIG+=iphoneos");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target()->kit());
|
QtSupport::BaseQtVersion *version = QtSupport::QtKitInformation::qtVersion(target()->kit());
|
||||||
|
arguments << QmakeBuildConfiguration::deduceArgumnetsForTargetAbi(targetAbi, version);
|
||||||
if (linkQmlDebuggingLibrary() && version) {
|
if (linkQmlDebuggingLibrary() && version) {
|
||||||
arguments << QLatin1String(Constants::QMAKEVAR_QUICK1_DEBUG);
|
arguments << QLatin1String(Constants::QMAKEVAR_QUICK1_DEBUG);
|
||||||
if (version->qtVersion().majorVersion >= 5)
|
if (version->qtVersion().majorVersion >= 5)
|
||||||
|
|||||||
@@ -478,19 +478,6 @@ QStringList BaseQtVersion::warningReason() const
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ToolChain *BaseQtVersion::preferredToolChain(const FileName &ms) const
|
|
||||||
{
|
|
||||||
const FileName spec = ms.isEmpty() ? mkspec() : ms;
|
|
||||||
|
|
||||||
QList<ToolChain *> toolchains = ToolChainManager::toolChains();
|
|
||||||
return Utils::findOr(toolchains,
|
|
||||||
toolchains.isEmpty() ? 0 : toolchains.first(),
|
|
||||||
[&spec, this](ToolChain *tc) {
|
|
||||||
return qtAbis().contains(tc->targetAbi())
|
|
||||||
&& tc->suggestedMkspecList().contains(spec);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
FileName BaseQtVersion::qmakeCommand() const
|
FileName BaseQtVersion::qmakeCommand() const
|
||||||
{
|
{
|
||||||
return m_qmakeCommand;
|
return m_qmakeCommand;
|
||||||
|
|||||||
@@ -108,8 +108,6 @@ public:
|
|||||||
virtual QString invalidReason() const;
|
virtual QString invalidReason() const;
|
||||||
virtual QStringList warningReason() const;
|
virtual QStringList warningReason() const;
|
||||||
|
|
||||||
virtual ProjectExplorer::ToolChain *preferredToolChain(const Utils::FileName &ms) const;
|
|
||||||
|
|
||||||
virtual QString description() const = 0;
|
virtual QString description() const = 0;
|
||||||
virtual QString toHtml(bool verbose) const;
|
virtual QString toHtml(bool verbose) const;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user