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 "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<const TCHAR*>(binary.utf16()), &binaryType) != 0;
|
||||
if (success && binaryType == SCS_64BIT_BINARY)
|
||||
isAmd64=true;
|
||||
|
@@ -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);
|
||||
|
@@ -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));
|
||||
|
@@ -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"
|
||||
|
@@ -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)
|
||||
|
@@ -1521,9 +1521,9 @@ void ClangClToolChainConfigWidget::setFromClangClToolChain()
|
||||
|
||||
const auto *clangClToolChain = static_cast<const ClangClToolChain *>(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<ToolChain *> detectClangClToolChainInPath(const QString &clangClPath,
|
||||
static QList<ToolChain *> detectClangClToolChainInPath(const FilePath &clangClPath,
|
||||
const QList<ToolChain *> &alreadyKnown,
|
||||
const QString &displayedVarsBat,
|
||||
bool isDefault = false)
|
||||
@@ -1595,7 +1595,7 @@ static QList<ToolChain *> 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<ToolChain *> 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<ToolChain *> 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<ClangClToolChain *>(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<ToolChain *> results = detectClangClToolChainInPath(clangClPath.toString(),
|
||||
QList<ToolChain *> 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<ToolChain *> ClangClToolChainFactory::autoDetect(const QList<ToolChain *>
|
||||
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<ToolChain *> ClangClToolChainFactory::autoDetect(const QList<ToolChain *>
|
||||
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;
|
||||
}
|
||||
|
@@ -178,8 +178,8 @@ public:
|
||||
const Utils::Environment &env) const override;
|
||||
|
||||
const QList<MsvcToolChain *> &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;
|
||||
};
|
||||
|
||||
// --------------------------------------------------------------------------
|
||||
|
Reference in New Issue
Block a user