diff --git a/src/libs/utils/winutils.cpp b/src/libs/utils/winutils.cpp index fbfec11233b..6941c58c371 100644 --- a/src/libs/utils/winutils.cpp +++ b/src/libs/utils/winutils.cpp @@ -24,6 +24,8 @@ ****************************************************************************/ #include "winutils.h" + +#include "filepath.h" #include "qtcassert.h" #ifdef Q_OS_WIN @@ -152,16 +154,16 @@ QTCREATOR_UTILS_EXPORT bool is64BitWindowsSystem() #endif } -QTCREATOR_UTILS_EXPORT bool is64BitWindowsBinary(const QString &binaryIn) +QTCREATOR_UTILS_EXPORT bool is64BitWindowsBinary(const FilePath &binaryIn) { - QTC_ASSERT(!binaryIn.isEmpty(), return false); + QTC_ASSERT(!binaryIn.isEmpty() && !binaryIn.needsDevice(), return false); #ifdef Q_OS_WIN32 # ifdef __GNUC__ // MinGW lacking some definitions/winbase.h # define SCS_64BIT_BINARY 6 # endif bool isAmd64 = false; DWORD binaryType = 0; - const QString binary = QDir::toNativeSeparators(binaryIn); + const QString binary = binaryIn.deviceLocalPath(); bool success = GetBinaryTypeW(reinterpret_cast(binary.utf16()), &binaryType) != 0; if (success && binaryType == SCS_64BIT_BINARY) isAmd64=true; diff --git a/src/libs/utils/winutils.h b/src/libs/utils/winutils.h index 314cce673d3..7d7f618b30f 100644 --- a/src/libs/utils/winutils.h +++ b/src/libs/utils/winutils.h @@ -29,6 +29,8 @@ namespace Utils { +class FilePath; + // Helper to format a Windows error message, taking the // code as returned by the GetLastError()-API. QTCREATOR_UTILS_EXPORT QString winErrorMessage(unsigned long error); @@ -42,7 +44,7 @@ QTCREATOR_UTILS_EXPORT QString winGetDLLVersion(WinDLLVersionType t, QTCREATOR_UTILS_EXPORT bool is64BitWindowsSystem(); // Check for a 64bit binary. -QTCREATOR_UTILS_EXPORT bool is64BitWindowsBinary(const QString &binary); +QTCREATOR_UTILS_EXPORT bool is64BitWindowsBinary(const FilePath &binary); // Get the path to the executable for a given PID. QTCREATOR_UTILS_EXPORT QString imageName(quint32 processId); diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp index d685d550d01..37d9b16e230 100644 --- a/src/plugins/debugger/cdb/cdbengine.cpp +++ b/src/plugins/debugger/cdb/cdbengine.cpp @@ -352,7 +352,7 @@ void CdbEngine::setupEngine() return; } - bool cdbIs64Bit = Utils::is64BitWindowsBinary(sp.debugger.command.executable().toString()); + bool cdbIs64Bit = Utils::is64BitWindowsBinary(sp.debugger.command.executable()); if (!cdbIs64Bit) m_wow64State = noWow64Stack; const QFileInfo extensionFi(CdbEngine::extensionLibraryName(cdbIs64Bit)); diff --git a/src/plugins/debugger/debuggerruncontrol.cpp b/src/plugins/debugger/debuggerruncontrol.cpp index 80e9cecba7c..3d7a4f2aba3 100644 --- a/src/plugins/debugger/debuggerruncontrol.cpp +++ b/src/plugins/debugger/debuggerruncontrol.cpp @@ -495,8 +495,8 @@ void DebuggerRunTool::start() return; if (m_runParameters.cppEngineType == CdbEngineType - && Utils::is64BitWindowsBinary(m_runParameters.inferior.command.executable().toString()) - && !Utils::is64BitWindowsBinary(m_runParameters.debugger.command.executable().toString())) { + && Utils::is64BitWindowsBinary(m_runParameters.inferior.command.executable()) + && !Utils::is64BitWindowsBinary(m_runParameters.debugger.command.executable())) { reportFailure( DebuggerPlugin::tr( "%1 is a 64 bit executable which can not be debugged by a 32 bit Debugger.\n" diff --git a/src/plugins/projectexplorer/devicesupport/desktopprocesssignaloperation.cpp b/src/plugins/projectexplorer/devicesupport/desktopprocesssignaloperation.cpp index 1003b978874..5a1d0f94277 100644 --- a/src/plugins/projectexplorer/devicesupport/desktopprocesssignaloperation.cpp +++ b/src/plugins/projectexplorer/devicesupport/desktopprocesssignaloperation.cpp @@ -126,7 +126,7 @@ void DesktopProcessSignalOperation::interruptProcessSilently(qint64 pid) bool is64BitSystem = Utils::is64BitWindowsSystem(); SpecialInterrupt si = NoSpecialInterrupt; if (is64BitSystem) - si = Utils::is64BitWindowsBinary(m_debuggerCommand.path()) ? Win64Interrupt : Win32Interrupt; + si = Utils::is64BitWindowsBinary(m_debuggerCommand) ? Win64Interrupt : Win32Interrupt; /* Windows 64 bit has a 32 bit subsystem (WOW64) which makes it possible to run a 32 bit application inside a 64 bit environment. @@ -167,7 +167,8 @@ GDB 32bit | Api | Api | N/A | Win32 + Utils::winErrorMessage(GetLastError())); break; } - bool creatorIs64Bit = Utils::is64BitWindowsBinary(QCoreApplication::applicationFilePath()); + bool creatorIs64Bit = Utils::is64BitWindowsBinary( + Utils::FilePath::fromUserInput(QCoreApplication::applicationFilePath())); if (!is64BitSystem || si == NoSpecialInterrupt || (si == Win64Interrupt && creatorIs64Bit) diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index 4c8aca48024..81088c66e05 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -1521,9 +1521,9 @@ void ClangClToolChainConfigWidget::setFromClangClToolChain() const auto *clangClToolChain = static_cast(toolChain()); if (clangClToolChain->isAutoDetected()) - m_llvmDirLabel->setText(QDir::toNativeSeparators(clangClToolChain->clangPath())); + m_llvmDirLabel->setText(clangClToolChain->clangPath().toUserOutput()); else - m_compilerCommand->setFilePath(Utils::FilePath::fromString(clangClToolChain->clangPath())); + m_compilerCommand->setFilePath(clangClToolChain->clangPath()); } static const MsvcToolChain *findMsvcToolChain(unsigned char wordWidth, Abi::OSFlavor flavor) @@ -1543,10 +1543,10 @@ static const MsvcToolChain *findMsvcToolChain(const QString &displayedVarsBat) }); } -static QVersionNumber clangClVersion(const QString &clangClPath) +static QVersionNumber clangClVersion(const FilePath &clangClPath) { QtcProcess clangClProcess; - clangClProcess.setCommand({FilePath::fromString(clangClPath), {"--version"}}); + clangClProcess.setCommand({clangClPath, {"--version"}}); clangClProcess.runBlocking(); if (clangClProcess.result() != QtcProcess::FinishedWithSuccess) return {}; @@ -1559,7 +1559,7 @@ static QVersionNumber clangClVersion(const QString &clangClPath) } static const MsvcToolChain *selectMsvcToolChain(const QString &displayedVarsBat, - const QString &clangClPath, + const FilePath &clangClPath, unsigned char wordWidth) { const MsvcToolChain *toolChain = nullptr; @@ -1584,7 +1584,7 @@ static const MsvcToolChain *selectMsvcToolChain(const QString &displayedVarsBat, return toolChain; } -static QList detectClangClToolChainInPath(const QString &clangClPath, +static QList detectClangClToolChainInPath(const FilePath &clangClPath, const QList &alreadyKnown, const QString &displayedVarsBat, bool isDefault = false) @@ -1595,7 +1595,7 @@ static QList detectClangClToolChainInPath(const QString &clangClPat if (!toolChain) { qWarning("Unable to find a suitable MSVC version for \"%s\".", - qPrintable(QDir::toNativeSeparators(clangClPath))); + qPrintable(clangClPath.toUserOutput())); return res; } @@ -1615,7 +1615,7 @@ static QList detectClangClToolChainInPath(const QString &clangClPat if (tc->language() != language) return false; return systemEnvironment.isSameExecutable(tc->compilerCommand().toString(), - clangClPath); + clangClPath.toString()); })); if (tc) { res << tc; @@ -1632,16 +1632,11 @@ static QList detectClangClToolChainInPath(const QString &clangClPat return res; } -static QString compilerFromPath(const QString &path) -{ - return path + "/bin/clang-cl.exe"; -} - void ClangClToolChainConfigWidget::applyImpl() { Utils::FilePath clangClPath = m_compilerCommand->filePath(); auto clangClToolChain = static_cast(toolChain()); - clangClToolChain->setClangPath(clangClPath.toString()); + clangClToolChain->setClangPath(clangClPath); if (clangClPath.fileName() != "clang-cl.exe") { clangClToolChain->resetVarsBat(); @@ -1650,7 +1645,7 @@ void ClangClToolChainConfigWidget::applyImpl() } const QString displayedVarsBat = m_varsBatDisplayCombo->currentText(); - QList results = detectClangClToolChainInPath(clangClPath.toString(), + QList results = detectClangClToolChainInPath(clangClPath, {}, displayedVarsBat); @@ -1694,19 +1689,19 @@ ClangClToolChain::ClangClToolChain() bool ClangClToolChain::isValid() const { - const QFileInfo fi(clangPath()); - return MsvcToolChain::isValid() && fi.exists() && fi.fileName() == "clang-cl.exe"; + const FilePath clang = clangPath(); + return MsvcToolChain::isValid() && clang.exists() && clang.fileName() == "clang-cl.exe"; } void ClangClToolChain::addToEnvironment(Utils::Environment &env) const { MsvcToolChain::addToEnvironment(env); - env.prependOrSetPath(FilePath::fromString(m_clangPath).parentDir()); // bin folder + env.prependOrSetPath(m_clangPath.parentDir()); // bin folder } Utils::FilePath ClangClToolChain::compilerCommand() const { - return Utils::FilePath::fromString(m_clangPath); + return m_clangPath; } QStringList ClangClToolChain::suggestedMkspecList() const @@ -1728,7 +1723,7 @@ static inline QString llvmDirKey() QVariantMap ClangClToolChain::toMap() const { QVariantMap result = MsvcToolChain::toMap(); - result.insert(llvmDirKey(), m_clangPath); + result.insert(llvmDirKey(), m_clangPath.toString()); return result; } @@ -1739,7 +1734,7 @@ bool ClangClToolChain::fromMap(const QVariantMap &data) const QString clangPath = data.value(llvmDirKey()).toString(); if (clangPath.isEmpty()) return false; - m_clangPath = clangPath; + m_clangPath = FilePath::fromString(clangPath); return true; } @@ -2034,15 +2029,15 @@ QList ClangClToolChainFactory::autoDetect(const QList FilePath qtCreatorsClang = Core::ICore::clangExecutable(CLANG_BINDIR); if (!qtCreatorsClang.isEmpty()) { qtCreatorsClang = qtCreatorsClang.parentDir().pathAppended("clang-cl.exe"); - results.append(detectClangClToolChainInPath(qtCreatorsClang.toString(), + results.append(detectClangClToolChainInPath(qtCreatorsClang, alreadyKnown, "", true)); known.append(results); } const QSettings registry(QLatin1String(registryNode), QSettings::NativeFormat); if (registry.status() == QSettings::NoError) { - const QString path = QDir::cleanPath(registry.value(QStringLiteral(".")).toString()); - const QString clangClPath = compilerFromPath(path); + const FilePath path = FilePath::fromUserInput(registry.value(QStringLiteral(".")).toString()); + const FilePath clangClPath = path / "bin/clang-cl.exe"; if (!path.isEmpty()) { results.append(detectClangClToolChainInPath(clangClPath, known, "")); known.append(results); @@ -2052,7 +2047,7 @@ QList ClangClToolChainFactory::autoDetect(const QList const Utils::Environment systemEnvironment = Utils::Environment::systemEnvironment(); const Utils::FilePath clangClPath = systemEnvironment.searchInPath("clang-cl"); if (!clangClPath.isEmpty()) - results.append(detectClangClToolChainInPath(clangClPath.toString(), known, "")); + results.append(detectClangClToolChainInPath(clangClPath, known, "")); return results; } diff --git a/src/plugins/projectexplorer/msvctoolchain.h b/src/plugins/projectexplorer/msvctoolchain.h index 34894d78397..6a601a54d4c 100644 --- a/src/plugins/projectexplorer/msvctoolchain.h +++ b/src/plugins/projectexplorer/msvctoolchain.h @@ -178,8 +178,8 @@ public: const Utils::Environment &env) const override; const QList &msvcToolchains() const; - QString clangPath() const { return m_clangPath; } - void setClangPath(const QString &path) { m_clangPath = path; } + Utils::FilePath clangPath() const { return m_clangPath; } + void setClangPath(const Utils::FilePath &path) { m_clangPath = path; } Macros msvcPredefinedMacros(const QStringList &cxxflags, const Utils::Environment &env) const override; @@ -192,7 +192,7 @@ public: int priority() const override; private: - QString m_clangPath; + Utils::FilePath m_clangPath; }; // --------------------------------------------------------------------------