QmakeProject: Use QString mkspec in QmakeKitInformation

... and BaseQtVersion, and QmakeBuildConfiguration.

Change-Id: Iac5f768b80a7f8c2ea9a37d099b285d5793270db
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2019-05-27 15:19:36 +02:00
parent 28c2a618a2
commit 93dfbad97b
10 changed files with 66 additions and 64 deletions

View File

@@ -424,16 +424,17 @@ QmakeBuildConfiguration::MakefileState QmakeBuildConfiguration::compareToImportF
// This copies the settings from userArgs to actualArgs (minus some we // This copies the settings from userArgs to actualArgs (minus some we
// are not interested in), splitting them up into individual strings: // are not interested in), splitting them up into individual strings:
extractSpecFromArguments(&userArgs, workingDirectory, version, &actualArgs); extractSpecFromArguments(&userArgs, workingDirectory, version, &actualArgs);
FileName actualSpec = qs->mkspec(); const QString actualSpec = qs->mkspec();
QString qmakeArgs = parse.unparsedArguments(); QString qmakeArgs = parse.unparsedArguments();
QStringList parsedArgs; QStringList parsedArgs;
FileName parsedSpec = extractSpecFromArguments(&qmakeArgs, workingDirectory, version, &parsedArgs); QString parsedSpec =
extractSpecFromArguments(&qmakeArgs, workingDirectory, version, &parsedArgs);
qCDebug(logs) << " Actual args:" << actualArgs; qCDebug(logs) << " Actual args:" << actualArgs;
qCDebug(logs) << " Parsed args:" << parsedArgs; qCDebug(logs) << " Parsed args:" << parsedArgs;
qCDebug(logs) << " Actual spec:" << actualSpec.toString(); qCDebug(logs) << " Actual spec:" << actualSpec;
qCDebug(logs) << " Parsed spec:" << parsedSpec.toString(); qCDebug(logs) << " Parsed spec:" << parsedSpec;
qCDebug(logs) << " Actual config:" << qs->deducedArguments(); qCDebug(logs) << " Actual config:" << qs->deducedArguments();
qCDebug(logs) << " Parsed config:" << parse.config(); qCDebug(logs) << " Parsed config:" << parse.config();
@@ -474,8 +475,8 @@ QmakeBuildConfiguration::MakefileState QmakeBuildConfiguration::compareToImportF
} }
// Actual spec is the default one // Actual spec is the default one
// qDebug() << "AS vs VS" << actualSpec << version->mkspec(); // qDebug() << "AS vs VS" << actualSpec << version->mkspec();
if ((actualSpec == version->mkspec() || actualSpec == FileName::fromLatin1("default")) if ((actualSpec == version->mkspec() || actualSpec == "default")
&& (parsedSpec == version->mkspec() || parsedSpec == FileName::fromLatin1("default") || parsedSpec.isEmpty())) { && (parsedSpec == version->mkspec() || parsedSpec == "default" || parsedSpec.isEmpty())) {
qCDebug(logs) << "**Matched specs (2)"; qCDebug(logs) << "**Matched specs (2)";
return MakefileMatches; return MakefileMatches;
} }
@@ -486,7 +487,7 @@ QmakeBuildConfiguration::MakefileState QmakeBuildConfiguration::compareToImportF
return MakefileIncompatible; return MakefileIncompatible;
} }
FileName QmakeBuildConfiguration::extractSpecFromArguments(QString *args, QString QmakeBuildConfiguration::extractSpecFromArguments(QString *args,
const QString &directory, const BaseQtVersion *version, const QString &directory, const BaseQtVersion *version,
QStringList *outArgs) QStringList *outArgs)
{ {
@@ -520,7 +521,7 @@ FileName QmakeBuildConfiguration::extractSpecFromArguments(QString *args,
} }
if (parsedSpec.isEmpty()) if (parsedSpec.isEmpty())
return FileName(); return {};
FileName baseMkspecDir = FileName::fromUserInput( FileName baseMkspecDir = FileName::fromUserInput(
version->qmakeProperty("QT_HOST_DATA") + QLatin1String("/mkspecs")); version->qmakeProperty("QT_HOST_DATA") + QLatin1String("/mkspecs"));
@@ -552,7 +553,7 @@ FileName QmakeBuildConfiguration::extractSpecFromArguments(QString *args,
if (parsedSpec.isChildOf(sourceMkSpecPath)) if (parsedSpec.isChildOf(sourceMkSpecPath))
parsedSpec = parsedSpec.relativeChildPath(sourceMkSpecPath); parsedSpec = parsedSpec.relativeChildPath(sourceMkSpecPath);
} }
return parsedSpec; return parsedSpec.toString();
} }
bool QmakeBuildConfiguration::isEnabled() const bool QmakeBuildConfiguration::isEnabled() const
@@ -724,7 +725,7 @@ QmakeBuildConfiguration::LastKitState::LastKitState() = default;
QmakeBuildConfiguration::LastKitState::LastKitState(Kit *k) QmakeBuildConfiguration::LastKitState::LastKitState(Kit *k)
: m_qtVersion(QtKitAspect::qtVersionId(k)), : m_qtVersion(QtKitAspect::qtVersionId(k)),
m_sysroot(SysRootKitAspect::sysRoot(k).toString()), m_sysroot(SysRootKitAspect::sysRoot(k).toString()),
m_mkspec(QmakeKitAspect::mkspec(k).toString()) m_mkspec(QmakeKitAspect::mkspec(k))
{ {
ToolChain *tc = ToolChainKitAspect::toolChain(k, ProjectExplorer::Constants::CXX_LANGUAGE_ID); ToolChain *tc = ToolChainKitAspect::toolChain(k, ProjectExplorer::Constants::CXX_LANGUAGE_ID);
m_toolchain = tc ? tc->id() : QByteArray(); m_toolchain = tc ? tc->id() : QByteArray();

View File

@@ -83,7 +83,7 @@ public:
enum MakefileState { MakefileMatches, MakefileForWrongProject, MakefileIncompatible, MakefileMissing }; enum MakefileState { MakefileMatches, MakefileForWrongProject, MakefileIncompatible, MakefileMissing };
MakefileState compareToImportFrom(const QString &makefile, QString *errorString = nullptr); MakefileState compareToImportFrom(const QString &makefile, QString *errorString = nullptr);
static Utils::FileName extractSpecFromArguments( static QString extractSpecFromArguments(
QString *arguments, const QString &directory, const QtSupport::BaseQtVersion *version, QString *arguments, const QString &directory, const QtSupport::BaseQtVersion *version,
QStringList *outArgs = nullptr); QStringList *outArgs = nullptr);

View File

@@ -36,6 +36,7 @@
#include <utils/algorithm.h> #include <utils/algorithm.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <QDir>
#include <QLineEdit> #include <QLineEdit>
using namespace ProjectExplorer; using namespace ProjectExplorer;
@@ -66,14 +67,13 @@ private:
void refresh() override void refresh() override
{ {
if (!m_ignoreChange) if (!m_ignoreChange)
m_lineEdit->setText(QmakeKitAspect::mkspec(m_kit).toUserOutput()); m_lineEdit->setText(QDir::toNativeSeparators(QmakeKitAspect::mkspec(m_kit)));
} }
void mkspecWasChanged(const QString &text) void mkspecWasChanged(const QString &text)
{ {
m_ignoreChange = true; m_ignoreChange = true;
QmakeKitAspect::setMkspec(m_kit, Utils::FileName::fromString(text), QmakeKitAspect::setMkspec(m_kit, text, QmakeKitAspect::MkspecSource::User);
QmakeKitAspect::MkspecSource::User);
m_ignoreChange = false; m_ignoreChange = false;
} }
@@ -97,7 +97,7 @@ Tasks QmakeKitAspect::validate(const Kit *k) const
Tasks result; Tasks result;
QtSupport::BaseQtVersion *version = QtSupport::QtKitAspect::qtVersion(k); QtSupport::BaseQtVersion *version = QtSupport::QtKitAspect::qtVersion(k);
FileName mkspec = QmakeKitAspect::mkspec(k); const QString mkspec = QmakeKitAspect::mkspec(k);
if (!version && !mkspec.isEmpty()) if (!version && !mkspec.isEmpty())
result << Task(Task::Warning, tr("No Qt version set, so mkspec is ignored."), result << Task(Task::Warning, tr("No Qt version set, so mkspec is ignored."),
FileName(), -1, ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM); FileName(), -1, ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM);
@@ -117,13 +117,13 @@ void QmakeKitAspect::setup(Kit *k)
if (version->type() == "Boot2Qt.QtVersionType" || version->type() == "Qdb.EmbeddedLinuxQt") if (version->type() == "Boot2Qt.QtVersionType" || version->type() == "Qdb.EmbeddedLinuxQt")
return; return;
FileName spec = QmakeKitAspect::mkspec(k); QString spec = QmakeKitAspect::mkspec(k);
if (spec.isEmpty()) if (spec.isEmpty())
spec = version->mkspec(); spec = version->mkspec();
ToolChain *tc = ToolChainKitAspect::toolChain(k, ProjectExplorer::Constants::CXX_LANGUAGE_ID); ToolChain *tc = ToolChainKitAspect::toolChain(k, ProjectExplorer::Constants::CXX_LANGUAGE_ID);
if (!tc || (!tc->suggestedMkspecList().empty() && !tc->suggestedMkspecList().contains(spec.toString()))) { if (!tc || (!tc->suggestedMkspecList().empty() && !tc->suggestedMkspecList().contains(spec))) {
const QList<ToolChain *> possibleTcs = ToolChainManager::toolChains( const QList<ToolChain *> possibleTcs = ToolChainManager::toolChains(
[version](const ToolChain *t) { [version](const ToolChain *t) {
return t->isValid() return t->isValid()
@@ -133,7 +133,7 @@ void QmakeKitAspect::setup(Kit *k)
if (!possibleTcs.isEmpty()) { if (!possibleTcs.isEmpty()) {
const QList<ToolChain *> goodTcs = Utils::filtered(possibleTcs, const QList<ToolChain *> goodTcs = Utils::filtered(possibleTcs,
[&spec](const ToolChain *t) { [&spec](const ToolChain *t) {
return t->suggestedMkspecList().contains(spec.toString()); return t->suggestedMkspecList().contains(spec);
}); });
// Hack to prefer a tool chain from PATH (e.g. autodetected) over other matches. // Hack to prefer a tool chain from PATH (e.g. autodetected) over other matches.
// This improves the situation a bit if a cross-compilation tool chain has the // This improves the situation a bit if a cross-compilation tool chain has the
@@ -159,14 +159,14 @@ KitAspectWidget *QmakeKitAspect::createConfigWidget(Kit *k) const
KitAspect::ItemList QmakeKitAspect::toUserOutput(const Kit *k) const KitAspect::ItemList QmakeKitAspect::toUserOutput(const Kit *k) const
{ {
return ItemList() << qMakePair(tr("mkspec"), mkspec(k).toUserOutput()); return {qMakePair(tr("mkspec"), QDir::toNativeSeparators(mkspec(k)))};
} }
void QmakeKitAspect::addToMacroExpander(Kit *kit, MacroExpander *expander) const void QmakeKitAspect::addToMacroExpander(Kit *kit, MacroExpander *expander) const
{ {
expander->registerVariable("Qmake:mkspec", tr("Mkspec configured for qmake by the Kit."), expander->registerVariable("Qmake:mkspec", tr("Mkspec configured for qmake by the Kit."),
[kit]() -> QString { [kit]() -> QString {
return QmakeKitAspect::mkspec(kit).toUserOutput(); return QDir::toNativeSeparators(mkspec(kit));
}); });
} }
@@ -175,35 +175,35 @@ Core::Id QmakeKitAspect::id()
return Constants::KIT_INFORMATION_ID; return Constants::KIT_INFORMATION_ID;
} }
FileName QmakeKitAspect::mkspec(const Kit *k) QString QmakeKitAspect::mkspec(const Kit *k)
{ {
if (!k) if (!k)
return FileName(); return {};
return FileName::fromString(k->value(QmakeKitAspect::id()).toString()); return k->value(QmakeKitAspect::id()).toString();
} }
FileName QmakeKitAspect::effectiveMkspec(const Kit *k) QString QmakeKitAspect::effectiveMkspec(const Kit *k)
{ {
if (!k) if (!k)
return FileName(); return {};
FileName spec = mkspec(k); const QString spec = mkspec(k);
if (spec.isEmpty()) if (spec.isEmpty())
return defaultMkspec(k); return defaultMkspec(k);
return spec; return spec;
} }
void QmakeKitAspect::setMkspec(Kit *k, const FileName &fn, MkspecSource source) void QmakeKitAspect::setMkspec(Kit *k, const QString &mkspec, MkspecSource source)
{ {
QTC_ASSERT(k, return); QTC_ASSERT(k, return);
k->setValue(QmakeKitAspect::id(), source == MkspecSource::Code && fn == defaultMkspec(k) k->setValue(QmakeKitAspect::id(), source == MkspecSource::Code && mkspec == defaultMkspec(k)
? QString() : fn.toString()); ? QString() : mkspec);
} }
FileName QmakeKitAspect::defaultMkspec(const Kit *k) QString QmakeKitAspect::defaultMkspec(const Kit *k)
{ {
QtSupport::BaseQtVersion *version = QtSupport::QtKitAspect::qtVersion(k); QtSupport::BaseQtVersion *version = QtSupport::QtKitAspect::qtVersion(k);
if (!version) // No version, so no qmake if (!version) // No version, so no qmake
return FileName(); return {};
return version->mkspecFor(ToolChainKitAspect::toolChain(k, return version->mkspecFor(ToolChainKitAspect::toolChain(k,
ProjectExplorer::Constants::CXX_LANGUAGE_ID)); ProjectExplorer::Constants::CXX_LANGUAGE_ID));

View File

@@ -48,10 +48,10 @@ public:
static Core::Id id(); static Core::Id id();
enum class MkspecSource { User, Code }; enum class MkspecSource { User, Code };
static void setMkspec(ProjectExplorer::Kit *k, const Utils::FileName &fn, MkspecSource source); static void setMkspec(ProjectExplorer::Kit *k, const QString &mkspec, MkspecSource source);
static Utils::FileName mkspec(const ProjectExplorer::Kit *k); static QString mkspec(const ProjectExplorer::Kit *k);
static Utils::FileName effectiveMkspec(const ProjectExplorer::Kit *k); static QString effectiveMkspec(const ProjectExplorer::Kit *k);
static Utils::FileName defaultMkspec(const ProjectExplorer::Kit *k); static QString defaultMkspec(const ProjectExplorer::Kit *k);
}; };
} // namespace Internal } // namespace Internal

View File

@@ -67,7 +67,7 @@ struct DirectoryData
Utils::FileName buildDirectory; Utils::FileName buildDirectory;
Utils::FileName canonicalQmakeBinary; Utils::FileName canonicalQmakeBinary;
QtProjectImporter::QtVersionData qtVersionData; QtProjectImporter::QtVersionData qtVersionData;
FileName parsedSpec; QString parsedSpec;
BaseQtVersion::QmakeBuildConfigs buildConfig; BaseQtVersion::QmakeBuildConfigs buildConfig;
QString additionalArguments; QString additionalArguments;
QMakeStepConfig config; QMakeStepConfig config;
@@ -185,8 +185,8 @@ QList<void *> QmakeProjectImporter::examineDirectory(const FileName &importPath)
qCDebug(logs) << " Extracted spec:" << data->parsedSpec; qCDebug(logs) << " Extracted spec:" << data->parsedSpec;
qCDebug(logs) << " Arguments now:" << data->additionalArguments; qCDebug(logs) << " Arguments now:" << data->additionalArguments;
FileName versionSpec = version->mkspec(); const QString versionSpec = version->mkspec();
if (data->parsedSpec.isEmpty() || data->parsedSpec == FileName::fromLatin1("default")) { if (data->parsedSpec.isEmpty() || data->parsedSpec == "default") {
data->parsedSpec = versionSpec; data->parsedSpec = versionSpec;
qCDebug(logs) << " No parsed spec or default spec => parsed spec now:" << data->parsedSpec; qCDebug(logs) << " No parsed spec or default spec => parsed spec now:" << data->parsedSpec;
} }
@@ -204,7 +204,7 @@ bool QmakeProjectImporter::matchKit(void *directoryData, const Kit *k) const
const QLoggingCategory &logs = MakeFileParse::logging(); const QLoggingCategory &logs = MakeFileParse::logging();
BaseQtVersion *kitVersion = QtKitAspect::qtVersion(k); BaseQtVersion *kitVersion = QtKitAspect::qtVersion(k);
FileName kitSpec = QmakeKitAspect::mkspec(k); QString kitSpec = QmakeKitAspect::mkspec(k);
ToolChain *tc = ToolChainKitAspect::toolChain(k, ProjectExplorer::Constants::CXX_LANGUAGE_ID); ToolChain *tc = ToolChainKitAspect::toolChain(k, ProjectExplorer::Constants::CXX_LANGUAGE_ID);
if (kitSpec.isEmpty() && kitVersion) if (kitSpec.isEmpty() && kitVersion)
kitSpec = kitVersion->mkspecFor(tc); kitSpec = kitVersion->mkspecFor(tc);
@@ -265,16 +265,16 @@ void QmakeProjectImporter::deleteDirectoryData(void *directoryData) const
delete static_cast<DirectoryData *>(directoryData); delete static_cast<DirectoryData *>(directoryData);
} }
static const QList<ToolChain *> preferredToolChains(BaseQtVersion *qtVersion, const FileName &ms, static const QList<ToolChain *> preferredToolChains(BaseQtVersion *qtVersion, const QString &ms,
const QMakeStepConfig::TargetArchConfig &archConfig) const QMakeStepConfig::TargetArchConfig &archConfig)
{ {
const FileName spec = ms.isEmpty() ? qtVersion->mkspec() : ms; const QString spec = ms.isEmpty() ? qtVersion->mkspec() : ms;
const QList<ToolChain *> toolchains = ToolChainManager::toolChains(); const QList<ToolChain *> toolchains = ToolChainManager::toolChains();
const Abis qtAbis = qtVersion->qtAbis(); const Abis qtAbis = qtVersion->qtAbis();
const auto matcher = [&](const ToolChain *tc) { const auto matcher = [&](const ToolChain *tc) {
return qtAbis.contains(tc->targetAbi()) return qtAbis.contains(tc->targetAbi())
&& tc->suggestedMkspecList().contains(spec.toString()) && tc->suggestedMkspecList().contains(spec)
&& QMakeStepConfig::targetArchFor(tc->targetAbi(), qtVersion) == archConfig; && QMakeStepConfig::targetArchFor(tc->targetAbi(), qtVersion) == archConfig;
}; };
ToolChain * const cxxToolchain = findOrDefault(toolchains, [matcher](const ToolChain *tc) { ToolChain * const cxxToolchain = findOrDefault(toolchains, [matcher](const ToolChain *tc) {
@@ -292,7 +292,7 @@ static const QList<ToolChain *> preferredToolChains(BaseQtVersion *qtVersion, co
} }
Kit *QmakeProjectImporter::createTemporaryKit(const QtProjectImporter::QtVersionData &data, Kit *QmakeProjectImporter::createTemporaryKit(const QtProjectImporter::QtVersionData &data,
const FileName &parsedSpec, const QString &parsedSpec,
const QMakeStepConfig::TargetArchConfig &archConfig, const QMakeStepConfig::TargetArchConfig &archConfig,
const QMakeStepConfig::OsType &osType) const const QMakeStepConfig::OsType &osType) const
{ {

View File

@@ -50,7 +50,7 @@ private:
void deleteDirectoryData(void *directoryData) const final; void deleteDirectoryData(void *directoryData) const final;
ProjectExplorer::Kit *createTemporaryKit(const QtProjectImporter::QtVersionData &data, ProjectExplorer::Kit *createTemporaryKit(const QtProjectImporter::QtVersionData &data,
const Utils::FileName &parsedSpec, const QString &parsedSpec,
const QmakeProjectManager::QMakeStepConfig::TargetArchConfig &archConfig, const QmakeProjectManager::QMakeStepConfig::TargetArchConfig &archConfig,
const QMakeStepConfig::OsType &osType) const; const QMakeStepConfig::OsType &osType) const;
}; };

View File

@@ -115,9 +115,9 @@ QString QMakeStep::allArguments(const BaseQtVersion *v, ArgumentFlags flags) con
} }
} }
} }
FileName specArg = mkspec(); const QString specArg = mkspec();
if (!userProvidedMkspec && !specArg.isEmpty()) if (!userProvidedMkspec && !specArg.isEmpty())
arguments << "-spec" << specArg.toUserOutput(); arguments << "-spec" << QDir::toNativeSeparators(specArg);
// Find out what flags we pass on to qmake // Find out what flags we pass on to qmake
arguments << bc->configCommandLineArguments(); arguments << bc->configCommandLineArguments();
@@ -491,14 +491,14 @@ QString QMakeStep::userArguments()
return m_userArgs; return m_userArgs;
} }
FileName QMakeStep::mkspec() const QString QMakeStep::mkspec() const
{ {
QString additionalArguments = m_userArgs; QString additionalArguments = m_userArgs;
QtcProcess::addArgs(&additionalArguments, m_extraArgs); QtcProcess::addArgs(&additionalArguments, m_extraArgs);
for (QtcProcess::ArgIterator ait(&additionalArguments); ait.next(); ) { for (QtcProcess::ArgIterator ait(&additionalArguments); ait.next(); ) {
if (ait.value() == "-spec") { if (ait.value() == "-spec") {
if (ait.next()) if (ait.next())
return FileName::fromUserInput(ait.value()); return FileName::fromUserInput(ait.value()).toString();
} }
} }

View File

@@ -136,7 +136,7 @@ public:
// QMake extra arguments. Not user editable. // QMake extra arguments. Not user editable.
QStringList extraArguments() const; QStringList extraArguments() const;
void setExtraArguments(const QStringList &args); void setExtraArguments(const QStringList &args);
Utils::FileName mkspec() const; QString mkspec() const;
bool linkQmlDebuggingLibrary() const; bool linkQmlDebuggingLibrary() const;
void setLinkQmlDebuggingLibrary(bool enable); void setLinkQmlDebuggingLibrary(bool enable);
bool useQtQuickCompiler() const; bool useQtQuickCompiler() const;

View File

@@ -718,7 +718,7 @@ QString BaseQtVersion::toHtml(bool verbose) const
str << "<tr><td><b>" << QCoreApplication::translate("BaseQtVersion", "Source:") str << "<tr><td><b>" << QCoreApplication::translate("BaseQtVersion", "Source:")
<< "</b></td><td>" << sourcePath().toUserOutput() << "</td></tr>"; << "</b></td><td>" << sourcePath().toUserOutput() << "</td></tr>";
str << "<tr><td><b>" << QCoreApplication::translate("BaseQtVersion", "mkspec:") str << "<tr><td><b>" << QCoreApplication::translate("BaseQtVersion", "mkspec:")
<< "</b></td><td>" << mkspec().toUserOutput() << "</td></tr>"; << "</b></td><td>" << QDir::toNativeSeparators(mkspec()) << "</td></tr>";
str << "<tr><td><b>" << QCoreApplication::translate("BaseQtVersion", "qmake:") str << "<tr><td><b>" << QCoreApplication::translate("BaseQtVersion", "qmake:")
<< "</b></td><td>" << m_qmakeCommand.toUserOutput() << "</td></tr>"; << "</b></td><td>" << m_qmakeCommand.toUserOutput() << "</td></tr>";
ensureMkSpecParsed(); ensureMkSpecParsed();
@@ -965,24 +965,25 @@ void BaseQtVersion::parseMkSpec(ProFileEvaluator *evaluator) const
m_mkspecValues.insert(ns, evaluator->value(ns)); m_mkspecValues.insert(ns, evaluator->value(ns));
} }
FileName BaseQtVersion::mkspec() const QString BaseQtVersion::mkspec() const
{ {
updateMkspec(); updateMkspec();
return m_mkspec; return m_mkspec.toString();
} }
FileName BaseQtVersion::mkspecFor(ToolChain *tc) const QString BaseQtVersion::mkspecFor(ToolChain *tc) const
{ {
FileName versionSpec = mkspec(); QString versionSpec = mkspec();
if (!tc) if (!tc)
return versionSpec; return versionSpec;
const QStringList tcSpecList = tc->suggestedMkspecList(); const QStringList tcSpecList = tc->suggestedMkspecList();
if (tcSpecList.contains(versionSpec.toString())) if (tcSpecList.contains(versionSpec))
return versionSpec; return versionSpec;
for (const QString &tcSpec : tcSpecList) { for (const QString &tcSpec : tcSpecList) {
if (hasMkspec(FileName::fromString(tcSpec))) if (hasMkspec(tcSpec))
return FileName::fromString(tcSpec); return tcSpec;
} }
return versionSpec; return versionSpec;
@@ -994,18 +995,18 @@ FileName BaseQtVersion::mkspecPath() const
return m_mkspecFullPath; return m_mkspecFullPath;
} }
bool BaseQtVersion::hasMkspec(const FileName &spec) const bool BaseQtVersion::hasMkspec(const QString &spec) const
{ {
if (spec.isEmpty()) if (spec.isEmpty())
return true; // default spec of a Qt version return true; // default spec of a Qt version
QDir mkspecDir = QDir(QDir::fromNativeSeparators(qmakeProperty("QT_HOST_DATA")) QDir mkspecDir = QDir(QDir::fromNativeSeparators(qmakeProperty("QT_HOST_DATA"))
+ "/mkspecs/"); + "/mkspecs/");
const QString absSpec = mkspecDir.absoluteFilePath(spec.toString()); const QString absSpec = mkspecDir.absoluteFilePath(spec);
if (QFileInfo(absSpec).isDir() && QFileInfo(absSpec + "/qmake.conf").isFile()) if (QFileInfo(absSpec).isDir() && QFileInfo(absSpec + "/qmake.conf").isFile())
return true; return true;
mkspecDir.setPath(sourcePath().toString() + "/mkspecs/"); mkspecDir.setPath(sourcePath().toString() + "/mkspecs/");
const QString absSrcSpec = mkspecDir.absoluteFilePath(spec.toString()); const QString absSrcSpec = mkspecDir.absoluteFilePath(spec);
return absSrcSpec != absSpec return absSrcSpec != absSpec
&& QFileInfo(absSrcSpec).isDir() && QFileInfo(absSrcSpec).isDir()
&& QFileInfo(absSrcSpec + "/qmake.conf").isFile(); && QFileInfo(absSrcSpec + "/qmake.conf").isFile();
@@ -1218,7 +1219,7 @@ BaseQtVersion::createMacroExpander(const std::function<const BaseQtVersion *()>
"Qt:Mkspec", "Qt:Mkspec",
QtKitAspect::tr("The mkspec of the current Qt version."), QtKitAspect::tr("The mkspec of the current Qt version."),
versionProperty([](const BaseQtVersion *version) { versionProperty([](const BaseQtVersion *version) {
return version->mkspec().toUserOutput(); return QDir::toNativeSeparators(version->mkspec());
})); }));
expander->registerVariable( expander->registerVariable(

View File

@@ -178,13 +178,13 @@ public:
Utils::FileName qmakeCommand() const; Utils::FileName qmakeCommand() const;
/// @returns the name of the mkspec /// @returns the name of the mkspec
Utils::FileName mkspec() const; QString mkspec() const;
Utils::FileName mkspecFor(ProjectExplorer::ToolChain *tc) const; QString mkspecFor(ProjectExplorer::ToolChain *tc) const;
/// @returns the full path to the default directory /// @returns the full path to the default directory
/// specifally not the directory the symlink/ORIGINAL_QMAKESPEC points to /// specifally not the directory the symlink/ORIGINAL_QMAKESPEC points to
Utils::FileName mkspecPath() const; Utils::FileName mkspecPath() const;
bool hasMkspec(const Utils::FileName &spec) const; bool hasMkspec(const QString &spec) const;
enum QmakeBuildConfig enum QmakeBuildConfig
{ {