Utils: Make Utils::is64BitWindowsBinary operate on FilePaths

Change-Id: I8ef840219bc93f77f5a55e38013facf892de759d
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
hjk
2021-11-09 18:45:07 +01:00
parent a3ae60d729
commit aac740f127
7 changed files with 37 additions and 37 deletions

View File

@@ -24,6 +24,8 @@
****************************************************************************/ ****************************************************************************/
#include "winutils.h" #include "winutils.h"
#include "filepath.h"
#include "qtcassert.h" #include "qtcassert.h"
#ifdef Q_OS_WIN #ifdef Q_OS_WIN
@@ -152,16 +154,16 @@ QTCREATOR_UTILS_EXPORT bool is64BitWindowsSystem()
#endif #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 Q_OS_WIN32
# ifdef __GNUC__ // MinGW lacking some definitions/winbase.h # ifdef __GNUC__ // MinGW lacking some definitions/winbase.h
# define SCS_64BIT_BINARY 6 # define SCS_64BIT_BINARY 6
# endif # endif
bool isAmd64 = false; bool isAmd64 = false;
DWORD binaryType = 0; DWORD binaryType = 0;
const QString binary = QDir::toNativeSeparators(binaryIn); const QString binary = binaryIn.deviceLocalPath();
bool success = GetBinaryTypeW(reinterpret_cast<const TCHAR*>(binary.utf16()), &binaryType) != 0; bool success = GetBinaryTypeW(reinterpret_cast<const TCHAR*>(binary.utf16()), &binaryType) != 0;
if (success && binaryType == SCS_64BIT_BINARY) if (success && binaryType == SCS_64BIT_BINARY)
isAmd64=true; isAmd64=true;

View File

@@ -29,6 +29,8 @@
namespace Utils { namespace Utils {
class FilePath;
// Helper to format a Windows error message, taking the // Helper to format a Windows error message, taking the
// code as returned by the GetLastError()-API. // code as returned by the GetLastError()-API.
QTCREATOR_UTILS_EXPORT QString winErrorMessage(unsigned long error); QTCREATOR_UTILS_EXPORT QString winErrorMessage(unsigned long error);
@@ -42,7 +44,7 @@ QTCREATOR_UTILS_EXPORT QString winGetDLLVersion(WinDLLVersionType t,
QTCREATOR_UTILS_EXPORT bool is64BitWindowsSystem(); QTCREATOR_UTILS_EXPORT bool is64BitWindowsSystem();
// Check for a 64bit binary. // 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. // Get the path to the executable for a given PID.
QTCREATOR_UTILS_EXPORT QString imageName(quint32 processId); QTCREATOR_UTILS_EXPORT QString imageName(quint32 processId);

View File

@@ -352,7 +352,7 @@ void CdbEngine::setupEngine()
return; return;
} }
bool cdbIs64Bit = Utils::is64BitWindowsBinary(sp.debugger.command.executable().toString()); bool cdbIs64Bit = Utils::is64BitWindowsBinary(sp.debugger.command.executable());
if (!cdbIs64Bit) if (!cdbIs64Bit)
m_wow64State = noWow64Stack; m_wow64State = noWow64Stack;
const QFileInfo extensionFi(CdbEngine::extensionLibraryName(cdbIs64Bit)); const QFileInfo extensionFi(CdbEngine::extensionLibraryName(cdbIs64Bit));

View File

@@ -495,8 +495,8 @@ void DebuggerRunTool::start()
return; return;
if (m_runParameters.cppEngineType == CdbEngineType if (m_runParameters.cppEngineType == CdbEngineType
&& Utils::is64BitWindowsBinary(m_runParameters.inferior.command.executable().toString()) && Utils::is64BitWindowsBinary(m_runParameters.inferior.command.executable())
&& !Utils::is64BitWindowsBinary(m_runParameters.debugger.command.executable().toString())) { && !Utils::is64BitWindowsBinary(m_runParameters.debugger.command.executable())) {
reportFailure( reportFailure(
DebuggerPlugin::tr( DebuggerPlugin::tr(
"%1 is a 64 bit executable which can not be debugged by a 32 bit Debugger.\n" "%1 is a 64 bit executable which can not be debugged by a 32 bit Debugger.\n"

View File

@@ -126,7 +126,7 @@ void DesktopProcessSignalOperation::interruptProcessSilently(qint64 pid)
bool is64BitSystem = Utils::is64BitWindowsSystem(); bool is64BitSystem = Utils::is64BitWindowsSystem();
SpecialInterrupt si = NoSpecialInterrupt; SpecialInterrupt si = NoSpecialInterrupt;
if (is64BitSystem) 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 Windows 64 bit has a 32 bit subsystem (WOW64) which makes it possible to run a
32 bit application inside a 64 bit environment. 32 bit application inside a 64 bit environment.
@@ -167,7 +167,8 @@ GDB 32bit | Api | Api | N/A | Win32
+ Utils::winErrorMessage(GetLastError())); + Utils::winErrorMessage(GetLastError()));
break; break;
} }
bool creatorIs64Bit = Utils::is64BitWindowsBinary(QCoreApplication::applicationFilePath()); bool creatorIs64Bit = Utils::is64BitWindowsBinary(
Utils::FilePath::fromUserInput(QCoreApplication::applicationFilePath()));
if (!is64BitSystem if (!is64BitSystem
|| si == NoSpecialInterrupt || si == NoSpecialInterrupt
|| (si == Win64Interrupt && creatorIs64Bit) || (si == Win64Interrupt && creatorIs64Bit)

View File

@@ -1521,9 +1521,9 @@ void ClangClToolChainConfigWidget::setFromClangClToolChain()
const auto *clangClToolChain = static_cast<const ClangClToolChain *>(toolChain()); const auto *clangClToolChain = static_cast<const ClangClToolChain *>(toolChain());
if (clangClToolChain->isAutoDetected()) if (clangClToolChain->isAutoDetected())
m_llvmDirLabel->setText(QDir::toNativeSeparators(clangClToolChain->clangPath())); m_llvmDirLabel->setText(clangClToolChain->clangPath().toUserOutput());
else else
m_compilerCommand->setFilePath(Utils::FilePath::fromString(clangClToolChain->clangPath())); m_compilerCommand->setFilePath(clangClToolChain->clangPath());
} }
static const MsvcToolChain *findMsvcToolChain(unsigned char wordWidth, Abi::OSFlavor flavor) 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; QtcProcess clangClProcess;
clangClProcess.setCommand({FilePath::fromString(clangClPath), {"--version"}}); clangClProcess.setCommand({clangClPath, {"--version"}});
clangClProcess.runBlocking(); clangClProcess.runBlocking();
if (clangClProcess.result() != QtcProcess::FinishedWithSuccess) if (clangClProcess.result() != QtcProcess::FinishedWithSuccess)
return {}; return {};
@@ -1559,7 +1559,7 @@ static QVersionNumber clangClVersion(const QString &clangClPath)
} }
static const MsvcToolChain *selectMsvcToolChain(const QString &displayedVarsBat, static const MsvcToolChain *selectMsvcToolChain(const QString &displayedVarsBat,
const QString &clangClPath, const FilePath &clangClPath,
unsigned char wordWidth) unsigned char wordWidth)
{ {
const MsvcToolChain *toolChain = nullptr; const MsvcToolChain *toolChain = nullptr;
@@ -1584,7 +1584,7 @@ static const MsvcToolChain *selectMsvcToolChain(const QString &displayedVarsBat,
return toolChain; return toolChain;
} }
static QList<ToolChain *> detectClangClToolChainInPath(const QString &clangClPath, static QList<ToolChain *> detectClangClToolChainInPath(const FilePath &clangClPath,
const QList<ToolChain *> &alreadyKnown, const QList<ToolChain *> &alreadyKnown,
const QString &displayedVarsBat, const QString &displayedVarsBat,
bool isDefault = false) bool isDefault = false)
@@ -1595,7 +1595,7 @@ static QList<ToolChain *> detectClangClToolChainInPath(const QString &clangClPat
if (!toolChain) { if (!toolChain) {
qWarning("Unable to find a suitable MSVC version for \"%s\".", qWarning("Unable to find a suitable MSVC version for \"%s\".",
qPrintable(QDir::toNativeSeparators(clangClPath))); qPrintable(clangClPath.toUserOutput()));
return res; return res;
} }
@@ -1615,7 +1615,7 @@ static QList<ToolChain *> detectClangClToolChainInPath(const QString &clangClPat
if (tc->language() != language) if (tc->language() != language)
return false; return false;
return systemEnvironment.isSameExecutable(tc->compilerCommand().toString(), return systemEnvironment.isSameExecutable(tc->compilerCommand().toString(),
clangClPath); clangClPath.toString());
})); }));
if (tc) { if (tc) {
res << tc; res << tc;
@@ -1632,16 +1632,11 @@ static QList<ToolChain *> detectClangClToolChainInPath(const QString &clangClPat
return res; return res;
} }
static QString compilerFromPath(const QString &path)
{
return path + "/bin/clang-cl.exe";
}
void ClangClToolChainConfigWidget::applyImpl() void ClangClToolChainConfigWidget::applyImpl()
{ {
Utils::FilePath clangClPath = m_compilerCommand->filePath(); Utils::FilePath clangClPath = m_compilerCommand->filePath();
auto clangClToolChain = static_cast<ClangClToolChain *>(toolChain()); auto clangClToolChain = static_cast<ClangClToolChain *>(toolChain());
clangClToolChain->setClangPath(clangClPath.toString()); clangClToolChain->setClangPath(clangClPath);
if (clangClPath.fileName() != "clang-cl.exe") { if (clangClPath.fileName() != "clang-cl.exe") {
clangClToolChain->resetVarsBat(); clangClToolChain->resetVarsBat();
@@ -1650,7 +1645,7 @@ void ClangClToolChainConfigWidget::applyImpl()
} }
const QString displayedVarsBat = m_varsBatDisplayCombo->currentText(); const QString displayedVarsBat = m_varsBatDisplayCombo->currentText();
QList<ToolChain *> results = detectClangClToolChainInPath(clangClPath.toString(), QList<ToolChain *> results = detectClangClToolChainInPath(clangClPath,
{}, {},
displayedVarsBat); displayedVarsBat);
@@ -1694,19 +1689,19 @@ ClangClToolChain::ClangClToolChain()
bool ClangClToolChain::isValid() const bool ClangClToolChain::isValid() const
{ {
const QFileInfo fi(clangPath()); const FilePath clang = clangPath();
return MsvcToolChain::isValid() && fi.exists() && fi.fileName() == "clang-cl.exe"; return MsvcToolChain::isValid() && clang.exists() && clang.fileName() == "clang-cl.exe";
} }
void ClangClToolChain::addToEnvironment(Utils::Environment &env) const void ClangClToolChain::addToEnvironment(Utils::Environment &env) const
{ {
MsvcToolChain::addToEnvironment(env); MsvcToolChain::addToEnvironment(env);
env.prependOrSetPath(FilePath::fromString(m_clangPath).parentDir()); // bin folder env.prependOrSetPath(m_clangPath.parentDir()); // bin folder
} }
Utils::FilePath ClangClToolChain::compilerCommand() const Utils::FilePath ClangClToolChain::compilerCommand() const
{ {
return Utils::FilePath::fromString(m_clangPath); return m_clangPath;
} }
QStringList ClangClToolChain::suggestedMkspecList() const QStringList ClangClToolChain::suggestedMkspecList() const
@@ -1728,7 +1723,7 @@ static inline QString llvmDirKey()
QVariantMap ClangClToolChain::toMap() const QVariantMap ClangClToolChain::toMap() const
{ {
QVariantMap result = MsvcToolChain::toMap(); QVariantMap result = MsvcToolChain::toMap();
result.insert(llvmDirKey(), m_clangPath); result.insert(llvmDirKey(), m_clangPath.toString());
return result; return result;
} }
@@ -1739,7 +1734,7 @@ bool ClangClToolChain::fromMap(const QVariantMap &data)
const QString clangPath = data.value(llvmDirKey()).toString(); const QString clangPath = data.value(llvmDirKey()).toString();
if (clangPath.isEmpty()) if (clangPath.isEmpty())
return false; return false;
m_clangPath = clangPath; m_clangPath = FilePath::fromString(clangPath);
return true; return true;
} }
@@ -2034,15 +2029,15 @@ QList<ToolChain *> ClangClToolChainFactory::autoDetect(const QList<ToolChain *>
FilePath qtCreatorsClang = Core::ICore::clangExecutable(CLANG_BINDIR); FilePath qtCreatorsClang = Core::ICore::clangExecutable(CLANG_BINDIR);
if (!qtCreatorsClang.isEmpty()) { if (!qtCreatorsClang.isEmpty()) {
qtCreatorsClang = qtCreatorsClang.parentDir().pathAppended("clang-cl.exe"); qtCreatorsClang = qtCreatorsClang.parentDir().pathAppended("clang-cl.exe");
results.append(detectClangClToolChainInPath(qtCreatorsClang.toString(), results.append(detectClangClToolChainInPath(qtCreatorsClang,
alreadyKnown, "", true)); alreadyKnown, "", true));
known.append(results); known.append(results);
} }
const QSettings registry(QLatin1String(registryNode), QSettings::NativeFormat); const QSettings registry(QLatin1String(registryNode), QSettings::NativeFormat);
if (registry.status() == QSettings::NoError) { if (registry.status() == QSettings::NoError) {
const QString path = QDir::cleanPath(registry.value(QStringLiteral(".")).toString()); const FilePath path = FilePath::fromUserInput(registry.value(QStringLiteral(".")).toString());
const QString clangClPath = compilerFromPath(path); const FilePath clangClPath = path / "bin/clang-cl.exe";
if (!path.isEmpty()) { if (!path.isEmpty()) {
results.append(detectClangClToolChainInPath(clangClPath, known, "")); results.append(detectClangClToolChainInPath(clangClPath, known, ""));
known.append(results); known.append(results);
@@ -2052,7 +2047,7 @@ QList<ToolChain *> ClangClToolChainFactory::autoDetect(const QList<ToolChain *>
const Utils::Environment systemEnvironment = Utils::Environment::systemEnvironment(); const Utils::Environment systemEnvironment = Utils::Environment::systemEnvironment();
const Utils::FilePath clangClPath = systemEnvironment.searchInPath("clang-cl"); const Utils::FilePath clangClPath = systemEnvironment.searchInPath("clang-cl");
if (!clangClPath.isEmpty()) if (!clangClPath.isEmpty())
results.append(detectClangClToolChainInPath(clangClPath.toString(), known, "")); results.append(detectClangClToolChainInPath(clangClPath, known, ""));
return results; return results;
} }

View File

@@ -178,8 +178,8 @@ public:
const Utils::Environment &env) const override; const Utils::Environment &env) const override;
const QList<MsvcToolChain *> &msvcToolchains() const; const QList<MsvcToolChain *> &msvcToolchains() const;
QString clangPath() const { return m_clangPath; } Utils::FilePath clangPath() const { return m_clangPath; }
void setClangPath(const QString &path) { m_clangPath = path; } void setClangPath(const Utils::FilePath &path) { m_clangPath = path; }
Macros msvcPredefinedMacros(const QStringList &cxxflags, Macros msvcPredefinedMacros(const QStringList &cxxflags,
const Utils::Environment &env) const override; const Utils::Environment &env) const override;
@@ -192,7 +192,7 @@ public:
int priority() const override; int priority() const override;
private: private:
QString m_clangPath; Utils::FilePath m_clangPath;
}; };
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------