aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/tools
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/corelib/tools')
-rw-r--r--src/lib/corelib/tools/buildoptions.h2
-rw-r--r--src/lib/corelib/tools/clangclinfo.cpp7
-rw-r--r--src/lib/corelib/tools/commandechomode.h6
-rw-r--r--src/lib/corelib/tools/error.h4
-rw-r--r--src/lib/corelib/tools/fileinfo.cpp17
-rw-r--r--src/lib/corelib/tools/fileinfo.h5
-rw-r--r--src/lib/corelib/tools/jsliterals.cpp9
-rw-r--r--src/lib/corelib/tools/launcherinterface.cpp14
-rw-r--r--src/lib/corelib/tools/msvcinfo.cpp11
-rw-r--r--src/lib/corelib/tools/msvcinfo.h6
-rw-r--r--src/lib/corelib/tools/persistence.cpp4
-rw-r--r--src/lib/corelib/tools/persistence.h4
-rw-r--r--src/lib/corelib/tools/processresult.h3
-rw-r--r--src/lib/corelib/tools/profile.h5
-rw-r--r--src/lib/corelib/tools/projectgeneratormanager.h5
-rw-r--r--src/lib/corelib/tools/qttools.h28
-rw-r--r--src/lib/corelib/tools/set.h4
-rw-r--r--src/lib/corelib/tools/settings.cpp4
-rw-r--r--src/lib/corelib/tools/settings.h2
-rw-r--r--src/lib/corelib/tools/settingscreator.cpp4
-rw-r--r--src/lib/corelib/tools/settingsrepresentation.cpp4
-rw-r--r--src/lib/corelib/tools/setupprojectparameters.h2
-rw-r--r--src/lib/corelib/tools/stlutils.h26
-rw-r--r--src/lib/corelib/tools/vsenvironmentdetector.cpp6
24 files changed, 122 insertions, 60 deletions
diff --git a/src/lib/corelib/tools/buildoptions.h b/src/lib/corelib/tools/buildoptions.h
index bd0fb22cb..59b87237d 100644
--- a/src/lib/corelib/tools/buildoptions.h
+++ b/src/lib/corelib/tools/buildoptions.h
@@ -45,10 +45,10 @@
#include "joblimits.h"
#include <QtCore/qshareddata.h>
+#include <QtCore/qstringlist.h>
QT_BEGIN_NAMESPACE
class QJsonObject;
-class QStringList;
QT_END_NAMESPACE
namespace qbs {
diff --git a/src/lib/corelib/tools/clangclinfo.cpp b/src/lib/corelib/tools/clangclinfo.cpp
index 4e1022c28..0090b8f2c 100644
--- a/src/lib/corelib/tools/clangclinfo.cpp
+++ b/src/lib/corelib/tools/clangclinfo.cpp
@@ -102,8 +102,7 @@ ClangClInfo ClangClInfo::fromCompilerFilePath(const QString &path, Logger &logge
return {};
}
- const auto toolchainInstallPath = getToolchainInstallPath(path);
- return {toolchainInstallPath, vcvarsallPath};
+ return {getToolchainInstallPath(QFileInfo(path)), vcvarsallPath};
}
std::vector<ClangClInfo> ClangClInfo::installedCompilers(
@@ -151,7 +150,7 @@ std::vector<ClangClInfo> ClangClInfo::installedCompilers(
result.reserve(compilerPaths.size() + msvcs.size());
for (const auto &path: compilerPaths)
- result.push_back({getToolchainInstallPath(path), vcvarsallPath});
+ result.push_back({getToolchainInstallPath(QFileInfo(path)), vcvarsallPath});
// If we didn't find custom LLVM installation, try to find if it's installed with Visual Studio
for (const auto &msvc : msvcs) {
@@ -165,7 +164,7 @@ std::vector<ClangClInfo> ClangClInfo::installedCompilers(
.arg(msvc.installDir);
}
- result.push_back({getToolchainInstallPath(compilerPath), vcvarsallPath});
+ result.push_back({getToolchainInstallPath(QFileInfo(compilerPath)), vcvarsallPath});
}
}
diff --git a/src/lib/corelib/tools/commandechomode.h b/src/lib/corelib/tools/commandechomode.h
index 88d8377ad..e7b315563 100644
--- a/src/lib/corelib/tools/commandechomode.h
+++ b/src/lib/corelib/tools/commandechomode.h
@@ -43,11 +43,7 @@
#include "qbs_export.h"
#include <QtCore/qglobal.h>
-
-QT_BEGIN_NAMESPACE
-class QString;
-class QStringList;
-QT_END_NAMESPACE
+#include <QtCore/qstringlist.h>
namespace qbs {
diff --git a/src/lib/corelib/tools/error.h b/src/lib/corelib/tools/error.h
index 3ae9399f1..ea8ddb5ec 100644
--- a/src/lib/corelib/tools/error.h
+++ b/src/lib/corelib/tools/error.h
@@ -45,12 +45,10 @@
#include <QtCore/qhash.h>
#include <QtCore/qmetatype.h>
#include <QtCore/qshareddata.h>
+#include <QtCore/qstringlist.h>
QT_BEGIN_NAMESPACE
class QJsonObject;
-template <class T> class QList;
-class QString;
-class QStringList;
QT_END_NAMESPACE
namespace qbs {
diff --git a/src/lib/corelib/tools/fileinfo.cpp b/src/lib/corelib/tools/fileinfo.cpp
index 6fdd90fb1..382843a33 100644
--- a/src/lib/corelib/tools/fileinfo.cpp
+++ b/src/lib/corelib/tools/fileinfo.cpp
@@ -133,16 +133,16 @@ void FileInfo::splitIntoDirectoryAndFileName(const QString &filePath, QString *d
*fileName = filePath.mid(idx + 1);
}
-void FileInfo::splitIntoDirectoryAndFileName(const QString &filePath, QStringRef *dirPath, QStringRef *fileName)
+void FileInfo::splitIntoDirectoryAndFileName(const QString &filePath, QStringView *dirPath, QStringView *fileName)
{
int idx = filePath.lastIndexOf(QLatin1Char('/'));
if (idx < 0) {
- dirPath->clear();
- *fileName = QStringRef(&filePath);
+ *dirPath = QStringView();
+ *fileName = QStringView(filePath);
return;
}
- *dirPath = filePath.leftRef(idx);
- *fileName = filePath.midRef(idx + 1);
+ *dirPath = QStringView(filePath).left(idx);
+ *fileName = QStringView(filePath).mid(idx + 1);
}
bool FileInfo::exists(const QString &fp)
@@ -180,12 +180,7 @@ bool FileInfo::isAbsolute(const QString &path, HostOsInfo::HostOs hostOs)
return false;
}
-bool FileInfo::isPattern(const QString &str)
-{
- return isPattern(QStringRef(&str));
-}
-
-bool FileInfo::isPattern(const QStringRef &str)
+bool FileInfo::isPattern(QStringView str)
{
for (const QChar &ch : str) {
if (ch == QLatin1Char('*') || ch == QLatin1Char('?')
diff --git a/src/lib/corelib/tools/fileinfo.h b/src/lib/corelib/tools/fileinfo.h
index c4ca5931a..f0a09a16b 100644
--- a/src/lib/corelib/tools/fileinfo.h
+++ b/src/lib/corelib/tools/fileinfo.h
@@ -72,11 +72,10 @@ public:
static QString completeSuffix(const QString &fp);
static QString path(const QString &fp, HostOsInfo::HostOs hostOs = HostOsInfo::hostOs());
static void splitIntoDirectoryAndFileName(const QString &filePath, QString *dirPath, QString *fileName);
- static void splitIntoDirectoryAndFileName(const QString &filePath, QStringRef *dirPath, QStringRef *fileName);
+ static void splitIntoDirectoryAndFileName(const QString &filePath, QStringView *dirPath, QStringView *fileName);
static bool exists(const QString &fp);
static bool isAbsolute(const QString &fp, HostOsInfo::HostOs hostOs = HostOsInfo::hostOs());
- static bool isPattern(const QStringRef &str);
- static bool isPattern(const QString &str);
+ static bool isPattern(QStringView str);
static QString resolvePath(const QString &base, const QString &rel,
HostOsInfo::HostOs hostOs = HostOsInfo::hostOs());
static bool isFileCaseCorrect(const QString &filePath);
diff --git a/src/lib/corelib/tools/jsliterals.cpp b/src/lib/corelib/tools/jsliterals.cpp
index 69d170336..647bdc640 100644
--- a/src/lib/corelib/tools/jsliterals.cpp
+++ b/src/lib/corelib/tools/jsliterals.cpp
@@ -40,6 +40,7 @@
#include "jsliterals.h"
#include <tools/stringconstants.h>
+#include <tools/qttools.h>
#include <QtCore/qregularexpression.h>
@@ -75,7 +76,7 @@ QString toJSLiteral(const QVariant &val)
{
if (!val.isValid())
return Internal::StringConstants::undefinedValue();
- if (val.type() == QVariant::List || val.type() == QVariant::StringList) {
+ if (val.userType() == QMetaType::QVariantList || val.userType() == QMetaType::QStringList) {
QString res;
const auto list = val.toList();
for (const QVariant &child : list) {
@@ -86,7 +87,7 @@ QString toJSLiteral(const QVariant &val)
res.append(QLatin1Char(']'));
return res;
}
- if (val.type() == QVariant::Map) {
+ if (val.userType() == QMetaType::QVariantMap) {
const QVariantMap &vm = val.toMap();
QString str = QStringLiteral("{");
for (QVariantMap::const_iterator it = vm.begin(); it != vm.end(); ++it) {
@@ -97,9 +98,9 @@ QString toJSLiteral(const QVariant &val)
str += QLatin1Char('}');
return str;
}
- if (val.type() == QVariant::Bool)
+ if (val.userType() == QMetaType::Bool)
return toJSLiteral(val.toBool());
- if (val.canConvert(QVariant::String))
+ if (qVariantCanConvert(val, QMetaType::QString))
return toJSLiteral(val.toString());
return QStringLiteral("Unconvertible type %1").arg(QLatin1String(val.typeName()));
}
diff --git a/src/lib/corelib/tools/launcherinterface.cpp b/src/lib/corelib/tools/launcherinterface.cpp
index d2cdf44df..cd877c154 100644
--- a/src/lib/corelib/tools/launcherinterface.cpp
+++ b/src/lib/corelib/tools/launcherinterface.cpp
@@ -61,11 +61,23 @@ namespace Internal {
class LauncherProcess : public QProcess
{
public:
- LauncherProcess(QObject *parent) : QProcess(parent) { }
+ LauncherProcess(QObject *parent) : QProcess(parent)
+ {
+#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0) && defined(Q_OS_UNIX)
+ setChildProcessModifier([this] { setupChildProcess_impl(); });
+#endif
+ }
private:
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
void setupChildProcess() override
{
+ setupChildProcess_impl();
+ }
+#endif
+
+ void setupChildProcess_impl()
+ {
#ifdef Q_OS_UNIX
const auto pid = static_cast<pid_t>(processId());
setpgid(pid, pid);
diff --git a/src/lib/corelib/tools/msvcinfo.cpp b/src/lib/corelib/tools/msvcinfo.cpp
index 42cfefe7b..ed94613d9 100644
--- a/src/lib/corelib/tools/msvcinfo.cpp
+++ b/src/lib/corelib/tools/msvcinfo.cpp
@@ -43,6 +43,7 @@
#include <logging/logger.h>
#include <tools/error.h>
#include <tools/profile.h>
+#include <tools/stlutils.h>
#include <tools/stringconstants.h>
#include <QtCore/qbytearray.h>
@@ -471,12 +472,20 @@ static std::vector<MSVC> installedCompilersHelper(Logger &logger)
QDir vcInstallDir = vsInstallDir;
vcInstallDir.cd(QStringLiteral("Tools/MSVC"));
const auto vcVersionStrs = vcInstallDir.entryList(QDir::Dirs | QDir::NoDotAndDotDot);
+ std::vector<Version> vcVersions;
+ vcVersions.reserve(vcVersionStrs.size());
for (const QString &vcVersionStr : vcVersionStrs) {
const Version vcVersion = Version::fromString(vcVersionStr);
if (!vcVersion.isValid())
continue;
+ vcVersions.push_back(vcVersion);
+ }
+ // sort the versions so the new one comes first
+ std::sort(vcVersions.begin(), vcVersions.end(), std::greater<>());
+
+ for (const Version &vcVersion : vcVersions) {
QDir specificVcInstallDir = vcInstallDir;
- if (!specificVcInstallDir.cd(vcVersionStr)
+ if (!specificVcInstallDir.cd(vcVersion.toString())
|| !specificVcInstallDir.cd(QStringLiteral("bin"))) {
continue;
}
diff --git a/src/lib/corelib/tools/msvcinfo.h b/src/lib/corelib/tools/msvcinfo.h
index de4470bf0..d081e5c15 100644
--- a/src/lib/corelib/tools/msvcinfo.h
+++ b/src/lib/corelib/tools/msvcinfo.h
@@ -81,12 +81,14 @@ public:
QString binPath;
QString pathPrefix;
QString architecture;
+ QString sdkVersion;
QProcessEnvironment environment;
MSVC() = default;
- MSVC(const QString &clPath, QString arch):
- architecture(std::move(arch))
+ MSVC(const QString &clPath, QString arch, QString sdkVersion = {}):
+ architecture(std::move(arch)),
+ sdkVersion(std::move(sdkVersion))
{
QDir parentDir = QFileInfo(clPath).dir();
binPath = parentDir.absolutePath();
diff --git a/src/lib/corelib/tools/persistence.cpp b/src/lib/corelib/tools/persistence.cpp
index 4674b24ae..7c4458b5f 100644
--- a/src/lib/corelib/tools/persistence.cpp
+++ b/src/lib/corelib/tools/persistence.cpp
@@ -140,7 +140,7 @@ void PersistentPool::finalizeWriteStream()
void PersistentPool::storeVariant(const QVariant &variant)
{
- const auto type = static_cast<quint32>(variant.type());
+ const auto type = static_cast<quint32>(variant.userType());
m_stream << type;
switch (type) {
case QMetaType::QString:
@@ -218,7 +218,7 @@ void PersistentPool::doStoreValue(const QString &s)
void PersistentPool::doStoreValue(const QStringList &l)
{
- m_stream << l.size();
+ m_stream << int(l.size());
for (const QString &s : l)
store(s);
}
diff --git a/src/lib/corelib/tools/persistence.h b/src/lib/corelib/tools/persistence.h
index b0fed9f68..29d586177 100644
--- a/src/lib/corelib/tools/persistence.h
+++ b/src/lib/corelib/tools/persistence.h
@@ -50,6 +50,7 @@
#include <QtCore/qprocess.h>
#include <QtCore/qregularexpression.h>
#include <QtCore/qstring.h>
+#include <QtCore/qstringlist.h>
#include <QtCore/qvariant.h>
#include <memory>
@@ -467,6 +468,7 @@ template<typename T> struct PPHelper<QFlags<T>>
template<typename T> struct IsSimpleContainer : std::false_type { };
template<typename T> struct IsSimpleContainer<QList<T>> : std::true_type { };
+template<> struct IsSimpleContainer<QStringList> : std::false_type { };
template<typename T> struct IsSimpleContainer<std::vector<T>> : std::true_type { };
template<typename T> struct PPHelper<T, std::enable_if_t<IsSimpleContainer<T>::value>>
@@ -496,7 +498,7 @@ struct PPHelper<T, std::enable_if_t<IsKeyValueContainer<T>::value>>
{
static void store(const T &container, PersistentPool *pool)
{
- pool->store(container.size());
+ pool->store(int(container.size()));
for (auto it = container.cbegin(); it != container.cend(); ++it) {
pool->store(it.key());
pool->store(it.value());
diff --git a/src/lib/corelib/tools/processresult.h b/src/lib/corelib/tools/processresult.h
index 92408aa31..3870a3ae5 100644
--- a/src/lib/corelib/tools/processresult.h
+++ b/src/lib/corelib/tools/processresult.h
@@ -44,11 +44,10 @@
#include <QtCore/qshareddata.h>
#include <QtCore/qmetatype.h>
#include <QtCore/qprocess.h>
+#include <QtCore/qstringlist.h>
QT_BEGIN_NAMESPACE
class QJsonObject;
-class QString;
-class QStringList;
QT_END_NAMESPACE
namespace qbs {
diff --git a/src/lib/corelib/tools/profile.h b/src/lib/corelib/tools/profile.h
index 0eee23ae4..b7fc7ff67 100644
--- a/src/lib/corelib/tools/profile.h
+++ b/src/lib/corelib/tools/profile.h
@@ -42,12 +42,9 @@
#include "qbs_export.h"
#include <QtCore/qstring.h>
+#include <QtCore/qstringlist.h>
#include <QtCore/qvariant.h>
-QT_BEGIN_NAMESPACE
-class QStringList;
-QT_END_NAMESPACE
-
namespace qbs {
class ErrorInfo;
class Settings;
diff --git a/src/lib/corelib/tools/projectgeneratormanager.h b/src/lib/corelib/tools/projectgeneratormanager.h
index 469d650b9..1efe593fc 100644
--- a/src/lib/corelib/tools/projectgeneratormanager.h
+++ b/src/lib/corelib/tools/projectgeneratormanager.h
@@ -45,10 +45,7 @@
#include <QtCore/qmap.h>
#include <QtCore/qstring.h>
-
-QT_BEGIN_NAMESPACE
-class QStringList;
-QT_END_NAMESPACE
+#include <QtCore/qstringlist.h>
namespace qbs {
class ProjectGenerator;
diff --git a/src/lib/corelib/tools/qttools.h b/src/lib/corelib/tools/qttools.h
index 2d4a38544..bbec32544 100644
--- a/src/lib/corelib/tools/qttools.h
+++ b/src/lib/corelib/tools/qttools.h
@@ -43,6 +43,7 @@
#include <QtCore/qhash.h>
#include <QtCore/qstringlist.h>
#include <QtCore/qtextstream.h>
+#include <QtCore/qvariant.h>
#include <functional>
@@ -118,6 +119,33 @@ QHash<K, V> &unite(QHash<K, V> &h, const QHash<K, V> &other)
#endif
}
+inline void setupDefaultCodec(QTextStream &stream)
+{
+#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0))
+ stream.setCodec("UTF-8");
+#else
+ Q_UNUSED(stream);
+#endif
+}
+
+inline bool qVariantCanConvert(const QVariant &variant, int typeId)
+{
+#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
+ return variant.canConvert(QMetaType(typeId));
+#else
+ return variant.canConvert(typeId); // deprecated in Qt6
+#endif
+}
+
+inline bool qVariantConvert(QVariant &variant, int typeId)
+{
+#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
+ return variant.convert(QMetaType(typeId));
+#else
+ return variant.convert(typeId); // deprecated in Qt6
+#endif
+}
+
} // namespace qbs
#endif // QBSQTTOOLS_H
diff --git a/src/lib/corelib/tools/set.h b/src/lib/corelib/tools/set.h
index 75db0528b..463d3beb6 100644
--- a/src/lib/corelib/tools/set.h
+++ b/src/lib/corelib/tools/set.h
@@ -112,8 +112,8 @@ public:
Set &operator&=(const Set &other) { return intersect(other); }
Set &operator&=(const T &v) { return intersect(Set{ v }); }
- iterator find(const T &v) { return std::find(m_data.begin(), m_data.end(), v); }
- const_iterator find(const T &v) const { return std::find(m_data.cbegin(), m_data.cend(), v); }
+ iterator find(const T &v) { return binaryFind(m_data.begin(), m_data.end(), v); }
+ const_iterator find(const T &v) const { return binaryFind(m_data.cbegin(), m_data.cend(), v); }
std::pair<iterator, bool> insert(const T &v);
Set &operator+=(const T &v) { insert(v); return *this; }
Set &operator|=(const T &v) { return operator+=(v); }
diff --git a/src/lib/corelib/tools/settings.cpp b/src/lib/corelib/tools/settings.cpp
index fccb9c9b2..8b22c45e5 100644
--- a/src/lib/corelib/tools/settings.cpp
+++ b/src/lib/corelib/tools/settings.cpp
@@ -117,9 +117,9 @@ QVariant Settings::value(const QString &key, Scopes scopes, const QVariant &defa
}
if (!systemValue.isValid())
return userValue;
- if (static_cast<QMetaType::Type>(userValue.type()) == QMetaType::QStringList)
+ if (static_cast<QMetaType::Type>(userValue.userType()) == QMetaType::QStringList)
return userValue.toStringList() + systemValue.toStringList();
- if (static_cast<QMetaType::Type>(userValue.type()) == QMetaType::QVariantList)
+ if (static_cast<QMetaType::Type>(userValue.userType()) == QMetaType::QVariantList)
return userValue.toList() + systemValue.toList();
return userValue;
}
diff --git a/src/lib/corelib/tools/settings.h b/src/lib/corelib/tools/settings.h
index 638216669..4ea148af0 100644
--- a/src/lib/corelib/tools/settings.h
+++ b/src/lib/corelib/tools/settings.h
@@ -43,13 +43,13 @@
#include "qbs_export.h"
#include <QtCore/qstring.h>
+#include <QtCore/qstringlist.h>
#include <QtCore/qvariant.h>
#include <memory>
QT_BEGIN_NAMESPACE
class QSettings;
-class QStringList;
QT_END_NAMESPACE
namespace qbs {
diff --git a/src/lib/corelib/tools/settingscreator.cpp b/src/lib/corelib/tools/settingscreator.cpp
index 36e67440c..3fdaf0bc3 100644
--- a/src/lib/corelib/tools/settingscreator.cpp
+++ b/src/lib/corelib/tools/settingscreator.cpp
@@ -109,11 +109,11 @@ void SettingsCreator::migrate()
const auto allKeys = m_settings->allKeys();
for (const QString &key : allKeys) {
QVariant v = m_settings->value(key);
- if (v.type() == QVariant::String) {
+ if (v.userType() == QMetaType::QString) {
QString s = v.toString();
if (s.contains(oldProfilesDir))
m_settings->setValue(key, s.replace(oldProfilesDir, newProfilesDir));
- } else if (v.type() == QVariant::StringList) {
+ } else if (v.userType() == QMetaType::QStringList) {
const QStringList oldList = v.toStringList();
QStringList newList;
for (const QString &oldString : oldList) {
diff --git a/src/lib/corelib/tools/settingsrepresentation.cpp b/src/lib/corelib/tools/settingsrepresentation.cpp
index 256c60c0e..7790f1aa1 100644
--- a/src/lib/corelib/tools/settingsrepresentation.cpp
+++ b/src/lib/corelib/tools/settingsrepresentation.cpp
@@ -67,8 +67,8 @@ QVariant representationToSettingsValue(const QString &representation)
QVariant variant = variantFromString(representation, ok);
// We have no floating-point properties, so this is most likely intended to be a string.
- if (static_cast<QMetaType::Type>(variant.type()) == QMetaType::Float
- || static_cast<QMetaType::Type>(variant.type()) == QMetaType::Double) {
+ if (static_cast<QMetaType::Type>(variant.userType()) == QMetaType::Float
+ || static_cast<QMetaType::Type>(variant.userType()) == QMetaType::Double) {
variant = variantFromString(QLatin1Char('"') + representation + QLatin1Char('"'), ok);
}
diff --git a/src/lib/corelib/tools/setupprojectparameters.h b/src/lib/corelib/tools/setupprojectparameters.h
index a4d090ec5..2617a34cd 100644
--- a/src/lib/corelib/tools/setupprojectparameters.h
+++ b/src/lib/corelib/tools/setupprojectparameters.h
@@ -44,10 +44,10 @@
#include <tools/error.h>
#include <QtCore/qshareddata.h>
+#include <QtCore/qstringlist.h>
QT_BEGIN_NAMESPACE
class QProcessEnvironment;
-class QStringList;
using QVariantMap = QMap<QString, QVariant>;
QT_END_NAMESPACE
diff --git a/src/lib/corelib/tools/stlutils.h b/src/lib/corelib/tools/stlutils.h
index 63b9c098e..d4c569a95 100644
--- a/src/lib/corelib/tools/stlutils.h
+++ b/src/lib/corelib/tools/stlutils.h
@@ -75,6 +75,17 @@ bool containsKey(const C &container, const typename C::key_type &v)
return container.find(v) != end;
}
+template <class C>
+typename C::mapped_type mapValue(
+ const C &container,
+ const typename C::key_type &key,
+ const typename C::mapped_type &value = typename C::mapped_type())
+{
+ const auto end = container.cend();
+ const auto it = container.find(key);
+ return it != end ? it->second : value;
+}
+
template <typename C>
bool removeOne(C &container, const typename C::value_type &v)
{
@@ -112,6 +123,21 @@ bool none_of(const Container &container, const UnaryPredicate &predicate)
return std::none_of(std::begin(container), std::end(container), predicate);
}
+template <class It, class T, class Compare>
+It binaryFind(It begin, It end, const T &value, Compare comp)
+{
+ const auto it = std::lower_bound(begin, end, value, comp);
+ if (it == end || comp(value, *it))
+ return end;
+ return it;
+}
+
+template <class It, class T>
+It binaryFind(It begin, It end, const T &value)
+{
+ return binaryFind(begin, end, value, std::less<T>());
+}
+
template <class C>
C &operator<<(C &container, const typename C::value_type &v)
{
diff --git a/src/lib/corelib/tools/vsenvironmentdetector.cpp b/src/lib/corelib/tools/vsenvironmentdetector.cpp
index b0788823f..a11934d52 100644
--- a/src/lib/corelib/tools/vsenvironmentdetector.cpp
+++ b/src/lib/corelib/tools/vsenvironmentdetector.cpp
@@ -241,8 +241,10 @@ void VsEnvironmentDetector::writeBatchFile(QIODevice *device, const QString &vcv
<< "setlocal" << endl;
batClearVars(s, varnames);
s << "set PATH=" << m_windowsSystemDirPath << endl; // vcvarsall.bat needs tools from here
- s << "call \"" << vcvarsallbat << "\" " << vcArchitecture(msvc)
- << " || exit /b 1" << endl;
+ s << "call \"" << vcvarsallbat << "\" " << vcArchitecture(msvc);
+ if (!msvc->sdkVersion.isEmpty())
+ s << " " << msvc->sdkVersion;
+ s << " || exit /b 1" << endl;
batPrintVars(s, varnames);
s << "endlocal" << endl;
}