forked from qt-creator/qt-creator
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:
@@ -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;
|
||||||
|
@@ -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);
|
||||||
|
@@ -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));
|
||||||
|
@@ -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"
|
||||||
|
@@ -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)
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
|
@@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user