From d0394e74e7c34012c3f520a3c3e4a2008911aa6f Mon Sep 17 00:00:00 2001 From: Friedemann Kleint Date: Wed, 18 Dec 2019 12:11:16 +0100 Subject: windeployqt: Refactor platform enumeration - Make it a QFlags, providing operators - Remove WinCE - Add a Msvc compiler flag and make the tests for build directory and d-suffix depending on it. - Add clang-Msvc/clang-MinGW - Rename WindowsDesktop to WindowsDesktopMsvc, WinRtIntel to WinRtIntelMsvc and WinRtArm to WinRtArmMsvc - Use QFlags::testFlag() Task-number: QTBUG-80806 Task-number: QTBUG-80763 Task-number: QTBUG-78445 Change-Id: I0dd74a7b03e9e6bee55d4234c12eec17d52ce0e2 Reviewed-by: Oliver Wolff --- src/shared/winutils/qmlutils.cpp | 6 ++--- src/shared/winutils/qmlutils.h | 2 +- src/shared/winutils/utils.cpp | 7 +++--- src/shared/winutils/utils.h | 37 +++++++++++++++++----------- src/windeployqt/main.cpp | 52 ++++++++++++++++++---------------------- 5 files changed, 54 insertions(+), 50 deletions(-) diff --git a/src/shared/winutils/qmlutils.cpp b/src/shared/winutils/qmlutils.cpp index 6e8d5192b..54e470105 100644 --- a/src/shared/winutils/qmlutils.cpp +++ b/src/shared/winutils/qmlutils.cpp @@ -73,12 +73,12 @@ static QString qmlDirectoryRecursion(Platform platform, const QString &path) } // Find a directory containing QML files in the project -QString findQmlDirectory(int platform, const QString &startDirectoryName) +QString findQmlDirectory(Platform platform, const QString &startDirectoryName) { QDir startDirectory(startDirectoryName); - if (isBuildDirectory(Platform(platform), startDirectory.dirName())) + if (isBuildDirectory(platform, startDirectory.dirName())) startDirectory.cdUp(); - return qmlDirectoryRecursion(Platform(platform), startDirectory.path()); + return qmlDirectoryRecursion(platform, startDirectory.path()); } static void findFileRecursion(const QDir &directory, Platform platform, diff --git a/src/shared/winutils/qmlutils.h b/src/shared/winutils/qmlutils.h index 87e6ca132..572be7cab 100644 --- a/src/shared/winutils/qmlutils.h +++ b/src/shared/winutils/qmlutils.h @@ -35,7 +35,7 @@ QT_BEGIN_NAMESPACE -QString findQmlDirectory(int platform, const QString &startDirectoryName); +QString findQmlDirectory(Platform platform, const QString &startDirectoryName); struct QmlImportScanResult { struct Module { diff --git a/src/shared/winutils/utils.cpp b/src/shared/winutils/utils.cpp index f3bea29ab..b62f69a1e 100644 --- a/src/shared/winutils/utils.cpp +++ b/src/shared/winutils/utils.cpp @@ -59,7 +59,8 @@ int optVerboseLevel = 1; bool isBuildDirectory(Platform platform, const QString &dirName) { - return (platform & WindowsBased) && (dirName == QLatin1String("debug") || dirName == QLatin1String("release")); + return (platform.testFlag(Msvc) || platform.testFlag(ClangMsvc)) + && (dirName == QLatin1String("debug") || dirName == QLatin1String("release")); } // Create a symbolic link by changing to the source directory to make sure the @@ -932,7 +933,7 @@ QString findD3dCompiler(Platform platform, const QString &qtBinDir, unsigned wor const QString kitDir = QString::fromLocal8Bit(qgetenv("WindowsSdkDir")); if (!kitDir.isEmpty()) { QString redistDirPath = QDir::cleanPath(kitDir) + QStringLiteral("/Redist/D3D/"); - if (platform & ArmBased) { + if (platform.testFlag(ArmBased)) { redistDirPath += QStringLiteral("arm"); } else { redistDirPath += wordSize == 32 ? QStringLiteral("x86") : QStringLiteral("x64"); @@ -955,7 +956,7 @@ QString findD3dCompiler(Platform platform, const QString &qtBinDir, unsigned wor return fi.absoluteFilePath(); } // Find the latest D3D compiler DLL in path (Windows 8.1 has d3dcompiler_47). - if (platform & IntelBased) { + if (platform.testFlag(IntelBased)) { QString errorMessage; unsigned detectedWordSize; for (const QString &candidate : qAsConst(candidateVersions)) { diff --git a/src/shared/winutils/utils.h b/src/shared/winutils/utils.h index 7915f8e4e..b15ca01cf 100644 --- a/src/shared/winutils/utils.h +++ b/src/shared/winutils/utils.h @@ -43,27 +43,36 @@ QT_BEGIN_NAMESPACE enum PlatformFlag { - WindowsBased = 0x1000, - UnixBased = 0x2000, - IntelBased = 0x4000, - ArmBased = 0x8000, - MinGW = 0x10000 -}; - -enum Platform { - WindowsDesktop = WindowsBased + IntelBased, + // OS + WindowsBased = 0x00001, + UnixBased = 0x00002, + WinRt = 0x00004, + // CPU + IntelBased = 0x00010, + ArmBased = 0x00020, + // Compiler + Msvc = 0x00100, + MinGW = 0x00200, + ClangMsvc = 0x00400, + ClangMinGW = 0x00800, + // Platforms + WindowsDesktopMsvc = WindowsBased + IntelBased + Msvc, WindowsDesktopMinGW = WindowsBased + IntelBased + MinGW, - WinRtIntel = WindowsBased + IntelBased + 1, - WinRtArm = WindowsBased + ArmBased + 2, - WinCEIntel = WindowsBased + IntelBased + 5, - WinCEArm = WindowsBased + ArmBased + 6, + WindowsDesktopClangMsvc = WindowsBased + IntelBased + ClangMsvc, + WindowsDesktopClangMinGW = WindowsBased + IntelBased + ClangMinGW, + WinRtIntelMsvc = WindowsBased + WinRt + IntelBased + Msvc, + WinRtArmMsvc = WindowsBased + WinRt + ArmBased + Msvc, Unix = UnixBased, UnknownPlatform }; +Q_DECLARE_FLAGS(Platform, PlatformFlag) + +Q_DECLARE_OPERATORS_FOR_FLAGS(Platform) + inline bool platformHasDebugSuffix(Platform p) // Uses 'd' debug suffix { - return (p & WindowsBased) != 0 && (p & MinGW) == 0; + return p.testFlag(Msvc) || p.testFlag(ClangMsvc); } enum ListOption { diff --git a/src/windeployqt/main.cpp b/src/windeployqt/main.cpp index 99d1e152a..71b6e1258 100644 --- a/src/windeployqt/main.cpp +++ b/src/windeployqt/main.cpp @@ -204,18 +204,17 @@ static Platform platformFromMkSpec(const QString &xSpec) { if (xSpec == QLatin1String("linux-g++")) return Unix; - if (xSpec.startsWith(QLatin1String("win32-"))) - return xSpec.contains(QLatin1String("g++")) ? WindowsDesktopMinGW : WindowsDesktop; + if (xSpec.startsWith(QLatin1String("win32-"))) { + if (xSpec.contains(QLatin1String("clang-g++"))) + return WindowsDesktopClangMinGW; + if (xSpec.contains(QLatin1String("clang-msvc++"))) + return WindowsDesktopClangMsvc; + return xSpec.contains(QLatin1String("g++")) ? WindowsDesktopMinGW : WindowsDesktopMsvc; + } if (xSpec.startsWith(QLatin1String("winrt-x"))) - return WinRtIntel; + return WinRtIntelMsvc; if (xSpec.startsWith(QLatin1String("winrt-arm"))) - return WinRtArm; - if (xSpec.startsWith(QLatin1String("wince"))) { - if (xSpec.contains(QLatin1String("-x86-"))) - return WinCEIntel; - if (xSpec.contains(QLatin1String("-arm"))) - return WinCEArm; - } + return WinRtArmMsvc; return UnknownPlatform; } @@ -267,7 +266,7 @@ struct Options { unsigned disabledPlugins = 0; AngleDetection angleDetection = AngleDetectionAuto; bool softwareRasterizer = true; - Platform platform = WindowsDesktop; + Platform platform = WindowsDesktopMsvc; quint64 additionalLibraries = 0; quint64 disabledLibraries = 0; unsigned updateFileFlags = 0; @@ -285,9 +284,7 @@ struct Options { bool dryRun = false; bool patchQt = true; - inline bool isWinRt() const { - return platform == WinRtArm || platform == WinRtIntel; - } + inline bool isWinRt() const { return platform.testFlag(WinRt); } }; // Return binary from folder @@ -503,8 +500,8 @@ static inline int parseArguments(const QStringList &arguments, QCommandLineParse else if (parser->isSet(noCompilerRunTimeOption)) options->compilerRunTime = false; - if (options->compilerRunTime && options->platform != WindowsDesktopMinGW && options->platform != WindowsDesktop) { - *errorMessage = QStringLiteral("Deployment of the compiler runtime is implemented for Desktop only."); + if (options->compilerRunTime && options->platform != WindowsDesktopMinGW && options->platform != WindowsDesktopMsvc) { + *errorMessage = QStringLiteral("Deployment of the compiler runtime is implemented for Desktop MSVC/g++ only."); return CommandLineParseError; } @@ -526,7 +523,7 @@ static inline int parseArguments(const QStringList &arguments, QCommandLineParse } if (parser->isSet(deployPdbOption)) { - if ((options->platform & WindowsBased) && !(options->platform & MinGW)) + if (options->platform.testFlag(WindowsBased) && !options->platform.testFlag(MinGW)) options->deployPdb = true; else std::wcerr << "Warning: --" << deployPdbOption.names().first() << " is not supported on this platform.\n"; @@ -919,14 +916,12 @@ QStringList findQtPlugins(quint64 *usedQtModules, quint64 disabledQtModules, const bool isPlatformPlugin = subDirName == QLatin1String("platforms"); if (isPlatformPlugin) { switch (platform) { - case WindowsDesktop: + case WindowsDesktopMsvc: case WindowsDesktopMinGW: - case WinCEIntel: - case WinCEArm: filter = QStringLiteral("qwindows"); break; - case WinRtIntel: - case WinRtArm: + case WinRtIntelMsvc: + case WinRtArmMsvc: filter = QStringLiteral("qwinrt"); break; case Unix: @@ -1064,7 +1059,7 @@ static QString libraryPath(const QString &libraryLocation, const char *name, result += qtLibInfix; if (debug && platformHasDebugSuffix(platform)) result += QLatin1Char('d'); - } else if (platform & UnixBased) { + } else if (platform.testFlag(UnixBased)) { result += QStringLiteral("lib"); result += QLatin1String(name); result += qtLibInfix; @@ -1137,7 +1132,7 @@ static QStringList compilerRunTimeLibs(Platform platform, bool isDebug, unsigned } break; #ifdef Q_OS_WIN - case WindowsDesktop: { // MSVC/Desktop: Add redistributable packages. + case WindowsDesktopMsvc: { // MSVC/Desktop: Add redistributable packages. QString vcRedistDirName = vcRedistDir(); if (vcRedistDirName.isEmpty()) break; @@ -1285,7 +1280,7 @@ static DeployResult deploy(const Options &options, // Some Windows-specific checks: Qt5Core depends on ICU when configured with "-icu". Other than // that, Qt5WebKit has a hard dependency on ICU. - if (options.platform & WindowsBased) { + if (options.platform.testFlag(WindowsBased)) { const QStringList qtLibs = dependentQtLibs.filter(QStringLiteral("Qt5Core"), Qt::CaseInsensitive) + dependentQtLibs.filter(QStringLiteral("Qt5WebKit"), Qt::CaseInsensitive); for (const QString &qtLib : qtLibs) { @@ -1405,8 +1400,7 @@ static DeployResult deploy(const Options &options, } // Check for ANGLE on the Qt5Gui library. - if ((options.platform & WindowsBased) && options.platform != WinCEIntel - && options.platform != WinCEArm && !qtGuiLibrary.isEmpty()) { + if (options.platform.testFlag(WindowsBased) && !qtGuiLibrary.isEmpty()) { QString libGlesName = QStringLiteral("libGLESV2"); if (isDebug && platformHasDebugSuffix(options.platform)) libGlesName += QLatin1Char('d'); @@ -1454,7 +1448,7 @@ static DeployResult deploy(const Options &options, // We need to copy ucrtbased.dll on WinRT as this library is not part of // the c runtime package. VS 2015 does the same when deploying to a device // or creating an appx. - if (isDebug && options.platform == WinRtArm + if (isDebug && options.platform == WinRtArmMsvc && qmakeVariables.value(QStringLiteral("QMAKE_XSPEC")).endsWith(QLatin1String("msvc2015"))) { const QString extensionPath = QString::fromLocal8Bit(qgetenv("ExtensionSdkDir")); const QString ucrtVersion = QString::fromLocal8Bit(qgetenv("UCRTVersion")); @@ -1671,7 +1665,7 @@ int main(int argc, char **argv) const QMap qmakeVariables = queryQMakeAll(&errorMessage); const QString xSpec = qmakeVariables.value(QStringLiteral("QMAKE_XSPEC")); options.platform = platformFromMkSpec(xSpec); - if (options.platform == WindowsDesktopMinGW || options.platform == WindowsDesktop) + if (options.platform == WindowsDesktopMinGW || options.platform == WindowsDesktopMsvc) options.compilerRunTime = true; { // Command line -- cgit v1.2.3