diff --git a/src/libs/utils/environment.cpp b/src/libs/utils/environment.cpp index 500b0166266..baaf0e32174 100644 --- a/src/libs/utils/environment.cpp +++ b/src/libs/utils/environment.cpp @@ -233,6 +233,23 @@ FileName Environment::searchInDirectory(const QStringList &execs, QString direct return FileName(); } +QStringList Environment::appendExeExtensions(const QString &executable) const +{ + QFileInfo fi(executable); + QStringList execs(executable); + if (m_osType == OsTypeWindows) { + // Check all the executable extensions on windows: + // PATHEXT is only used if the executable has no extension + if (fi.suffix().isEmpty()) { + QStringList extensions = value(QLatin1String("PATHEXT")).split(QLatin1Char(';')); + + foreach (const QString &ext, extensions) + execs << executable + ext.toLower(); + } + } + return execs; +} + FileName Environment::searchInPath(const QString &executable, const QStringList &additionalDirs) const { @@ -242,27 +259,14 @@ FileName Environment::searchInPath(const QString &executable, QString exec = QDir::cleanPath(expandVariables(executable)); QFileInfo fi(exec); - QStringList execs(exec); - if (m_osType == OsTypeWindows) { - // Check all the executable extensions on windows: - // PATHEXT is only used if the executable has no extension - if (fi.suffix().isEmpty()) { - QStringList extensions = value(QLatin1String("PATHEXT")).split(QLatin1Char(';')); + QStringList execs = appendExeExtensions(exec); - foreach (const QString &ext, extensions) { - QString tmp = executable + ext.toLower(); - if (fi.isAbsolute()) { - if (QFile::exists(tmp)) - return FileName::fromString(tmp); - } else { - execs << tmp; - } - } - } - } - - if (fi.isAbsolute()) + if (fi.isAbsolute()) { + foreach (const QString &path, execs) + if (QFile::exists(path)) + return FileName::fromString(path); return FileName::fromString(exec); + } QSet alreadyChecked; foreach (const QString &dir, additionalDirs) { diff --git a/src/libs/utils/environment.h b/src/libs/utils/environment.h index ec00d4c03d1..b9a79c73248 100644 --- a/src/libs/utils/environment.h +++ b/src/libs/utils/environment.h @@ -105,6 +105,7 @@ public: FileName searchInPath(const QString &executable, const QStringList &additionalDirs = QStringList()) const; QStringList path() const; + QStringList appendExeExtensions(const QString &executable) const; QString expandVariables(const QString &input) const; QStringList expandVariables(const QStringList &input) const; diff --git a/src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp b/src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp index c3ea485c8bc..9620acecc5e 100644 --- a/src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp +++ b/src/plugins/cmakeprojectmanager/cmaketoolmanager.cpp @@ -163,20 +163,29 @@ static void readAndDeleteLegacyCMakeSettings () static QList autoDetectCMakeTools() { - QStringList filters; - filters.append(QStringLiteral("cmake")); - QList suspects; - QStringList path = Environment::systemEnvironment().path(); + Utils::Environment env = Environment::systemEnvironment(); + + QStringList path = env.path(); path.removeDuplicates(); - QDir dir; - dir.setNameFilters(filters); - dir.setFilter(QDir::Files | QDir::Executable); - foreach (const QString &base, path) { - dir.setPath(base); - foreach (const QString &entry, dir.entryList()) - suspects.append(FileName::fromString(dir.absoluteFilePath(entry))); + + QStringList execs = env.appendExeExtensions(QLatin1String("cmake")); + + foreach (QString base, path) { + const QChar slash = QLatin1Char('/'); + if (base.isEmpty()) + continue; + // Avoid turning '/' into '//' on Windows which triggers Windows to check + // for network drives! + if (!base.endsWith(slash)) + base += slash; + + foreach (const QString &exec, execs) { + QFileInfo fi(base + exec); + if (fi.exists() && fi.isFile() && fi.isExecutable()) + suspects << FileName::fromString(fi.absoluteFilePath()); + } } QList found;