8#include <QtCore/QCommandLineOption>
9#include <QtCore/QCommandLineParser>
11#include <QtCore/QFileInfo>
12#include <QtCore/QCoreApplication>
13#include <QtCore/QJsonDocument>
14#include <QtCore/QJsonObject>
15#include <QtCore/QJsonArray>
16#include <QtCore/QList>
17#include <QtCore/QOperatingSystemVersion>
18#include <QtCore/QSharedPointer>
21#include <QtCore/qt_windows.h>
23#define IMAGE_FILE_MACHINE_ARM64 0xaa64
26#include <QtCore/private/qconfig_p.h>
32#include <unordered_map>
40#define DECLARE_KNOWN_MODULE(name) \
41 static size_t Qt##name ## ModuleId = QtModule::InvalidId
54#define DEFINE_KNOWN_MODULE(name) \
55 m[QLatin1String("Qt6" #name)] = &Qt##name ## ModuleId
59 std::unordered_map<QString, size_t *>
m;
79#undef DECLARE_KNOWN_MODULE
80#undef DEFINE_KNOWN_MODULE
117 if (xSpec ==
"linux-g++"_L1)
122 if (xSpec.
contains(
"clang-msvc++"_L1))
144 std::wcerr <<
"Warning: both -" << enableOption.
names().first()
145 <<
" and -" << disableOption.
names().first() <<
" were specified, defaulting to -"
146 << enableOption.
names().first() <<
".\n";
199 for (
const QFileInfo &binaryFi : binaries) {
202 return binaryFi.absoluteFilePath();
222 u
"Use specified qmake instead of qmake from PATH. Deprecated, use qtpaths instead."_s,
231 u
"Use specified qtpaths.exe instead of qtpaths.exe from PATH."_s,
240 u
"Verbose level (0-2)."_s,
263 if (parser.
isSet(qmakeOption) && parser.
isSet(qtpathsOption)) {
269 std::wcerr <<
"Warning: -qmake option is deprecated. Use -qpaths instead.\n";
271 if (parser.
isSet(qtpathsOption) || parser.
isSet(qmakeOption)) {
272 const QString qtpathsArg = parser.
isSet(qtpathsOption) ? parser.
value(qtpathsOption)
273 : parser.
value(qmakeOption);
290 if (parser.
isSet(verboseOption)) {
312 "\n\nThe simplest way to use windeployqt is to add the bin directory of your Qt\n"
313 "installation (e.g. <QT_DIR\\bin>) to the PATH variable and then run:\n windeployqt <path-to-app-binary>\n\n"
314 "If your application uses Qt Quick, run:\n windeployqt --qmldir <path-to-app-qml-files> <path-to-app-binary>"_s);
339 u
"Copy translations to path."_s,
355 QStringLiteral(
"Assume release binaries with debug information."));
357 parser->
addOption(releaseWithDebugInfoOption);
368 QStringLiteral(
"Simulation mode. Behave normally, but do not copy/update any files."));
384 QStringLiteral(
"A comma-separated list of plugin types that are not deployed (qmltooling,generic)."),
386 parser->
addOption(skipPluginTypesOption);
398 QStringLiteral(
"Add the given path to the QML module search locations."),
408 QStringLiteral(
"A comma-separated list of languages to deploy (de,fi)."),
418 parser->
addOption(noSystemD3DCompilerOption);
421 QStringLiteral(
"Skip deployment of the system DXC (dxcompiler.dll, dxil.dll)."));
427 parser->
addOption(compilerRunTimeOption);
430 QStringLiteral(
"Do not deploy compiler runtime (Desktop only)."));
431 parser->
addOption(noCompilerRunTimeOption);
438 QStringLiteral(
"Do not deploy the software rasterizer library."));
439 parser->
addOption(suppressSoftwareRasterizerOption);
442 "Print only the names of the files copied.\n"
443 "Available options:\n"
444 " source: absolute path of the source files\n"
445 " target: absolute path of the target files\n"
446 " relative: paths of the target files, relative\n"
447 " to the target directory\n"
448 " mapping: outputs the source and the relative\n"
449 " target, suitable for use within an\n"
450 " Appx mapping file"_L1,
460 OptionPtrVector enabledModuleOptions;
461 OptionPtrVector disabledModuleOptions;
463 enabledModuleOptions.reserve(qtModulesCount);
464 disabledModuleOptions.reserve(qtModulesCount);
470 parser->
addOption(*enabledOption.data());
471 enabledModuleOptions.append(enabledOption);
474 disabledDescription));
475 disabledModuleOptions.append(disabledOption);
476 parser->
addOption(*disabledOption.data());
480 if (parser->
isSet(helpOption))
494 if (parser->
isSet(translationOption))
502 || parser->
isSet(compilerRunTimeOption))
504 if (parser->
isSet(noCompilerRunTimeOption))
512 if (parser->
isSet(skipPluginTypesOption))
515 if (parser->
isSet(releaseWithDebugInfoOption))
516 std::wcerr <<
"Warning: " << releaseWithDebugInfoOption.
names().first() <<
" is obsolete.";
529 if (parser->
isSet(deployPdbOption)) {
533 std::wcerr <<
"Warning: --" << deployPdbOption.
names().first() <<
" is not supported on this platform.\n";
536 if (parser->
isSet(suppressSoftwareRasterizerOption))
539 if (parser->
isSet(forceOption))
541 if (parser->
isSet(dryRunOption)) {
550 if (parser->
isSet(*enabledModuleOptions.at(module.id)))
552 if (parser->
isSet(*disabledModuleOptions.at(module.id)))
562 if (parser->
isSet(listOption)) {
578 if (parser->
isSet(jsonOption) || options->
list) {
584 if (posArgs.isEmpty()) {
589 if (parser->
isSet(dirOption))
592 if (parser->
isSet(qmlDirOption))
595 if (parser->
isSet(qmlImportOption))
625 bool multipleDirs =
false;
626 for (
int i = 1;
i < posArgs.size(); ++
i) {
636 for (
const QString &library : libraries)
645 std::wcerr <<
"Warning: using binaries from different directories\n";
656 if (lastBlank >= 0) {
657 s[lastBlank] = u
'\n';
673 const qsizetype moduleStart =
result.indexOf(
"\n --"_L1 + firstModuleOption);
674 const qsizetype argumentsStart =
result.lastIndexOf(
"\nArguments:"_L1);
675 if (moduleStart >= argumentsStart)
679 "\n\nQt libraries can be added by passing their name (-xml) or removed by passing\n"
680 "the name prepended by --no- (--no-xml). Available libraries:\n"_L1;
684 result.
replace(moduleStart, argumentsStart - moduleStart, moduleHelp);
693 const QChar version = libName.
at(2);
694 return version.
isDigit() && (version.
toLatin1() -
'0') == QT_VERSION_MAJOR;
700 unsigned *wordSize =
nullptr,
bool *isDebug =
nullptr,
701 unsigned short *machineArch =
nullptr,
702 int *directDependencyCount =
nullptr,
int recursionDepth = 0)
705 if (directDependencyCount)
706 *directDependencyCount = 0;
715 for (
const QString &lib : std::as_const(dependentLibs)) {
723 if (directDependencyCount)
724 *directDependencyCount =
end -
start;
728 nullptr,
nullptr,
nullptr,
nullptr, recursionDepth + 1))
739 m_platform(
platform), m_debugMatchMode(debugMatchMode), m_prefix(prefix) {}
755 libraryFileName.
replace(lastDot, libraryFileName.
size() - lastDot,
"pdb"_L1);
756 return libraryFileName;
774 , m_dllFilter(
platform, debugMatchMode)
781 for (
const QString &library : libraries) {
807 const unsigned m_flags;
816 if (lastSlashPos > 0)
817 module.
remove(0, lastSlashPos + 1);
828 if (module == libraryName
833 std::wcerr <<
"Warning: module " <<
qPrintable(module) <<
" could not be found\n";
846 if (disabledPluginTypes.contains(subDirName)) {
847 std::wcout <<
"Skipping plugin " << plugin <<
" due to skipped plugin type " << subDirName <<
'\n';
855 if (subDirName == u
"designer")
863 for (
int d = 0;
d < dependentQtLibs.size(); ++
d) {
866 neededModules[module] = 1;
869 std::wcerr <<
"Warning: Cannot determine dependencies of "
874 missingModules = neededModules & disabledQtModules;
875 if (missingModules.any()) {
877 std::wcout <<
"Skipping plugin " << plugin
878 <<
" due to disabled dependencies ("
884 missingModules = (neededModules & ~*usedQtModules);
885 if (missingModules.any()) {
886 *usedQtModules |= missingModules;
889 <<
" for " << plugin <<
'\n';
901 if (qtPluginsDirName.
isEmpty())
903 QDir pluginsDir(qtPluginsDirName);
906 for (
const QFileInfo &subDirFi : pluginDirs) {
907 const QString subDirName = subDirFi.fileName();
911 std::wcerr <<
"No Qt module found for plugin type \"" << subDirName <<
"\".\n";
915 if (usedQtModules->test(module)) {
916 const DebugMatchMode debugMatchMode = (module == QtWebEngineCoreModuleId)
919 QDir subDir(subDirFi.absoluteFilePath());
923 const bool isPlatformPlugin = subDirName ==
"platforms"_L1;
924 if (isPlatformPlugin) {
942 for (
const QString &plugin : plugins) {
944 deployPlugin(plugin, subDir, usedQtModules, disabledQtModules,
945 disabledPluginTypes, libraryLocation, infix,
platform);
947 if (isPlatformPlugin)
976 QDir sourceDir(sourcePath);
980 const QString prefix = qmFi.baseName().
mid(7);
982 prefixes.append(prefix);
984 if (prefixes.isEmpty()) {
985 std::wcerr <<
"Warning: Could not find any translations in "
994 for (
const QString &prefix : std::as_const(prefixes)) {
998 const QString targetFilePath = absoluteTarget + u
'/' + targetFile;
1000 options.
json->
addFile(sourcePath + u
'/' + targetFile, absoluteTarget);
1003 if (translationFilters.isEmpty()){
1004 std::wcerr <<
"Warning: translation catalogs are all empty, skipping translation deployment\n";
1008 for (
const QFileInfo &langQmFileFi : langQmFiles) {
1010 options.
json->
addFile(langQmFileFi.absoluteFilePath(),
1016 std::wcout <<
"Creating " << targetFile <<
"...\n";
1017 unsigned long exitCode;
1060 const char vcDirVar[] =
"VCINSTALLDIR";
1061 const QChar slash(u
'/');
1063 if (vcRedistDirName.
isEmpty()) {
1064 std::wcerr <<
"Warning: Cannot find Visual Studio installation directory, " << vcDirVar
1065 <<
" is not set.\n";
1068 if (!vcRedistDirName.
endsWith(slash))
1069 vcRedistDirName.
append(slash);
1071 if (!
QFileInfo(vcRedistDirName).isDir()) {
1072 std::wcerr <<
"Warning: Cannot find Visual Studio redist directory, "
1078 QDir(vcRedistDirName)
1088 std::wcerr <<
"Warning: Cannot find Visual Studio redist directory under "
1100 for (
const auto &minGWRuntime : runtimeFilters)
1101 filters.append(minGWRuntime + suffix);
1105 std::wcerr <<
"Warning: Runtime libraries not found in Qt binary folder, defaulting to looking in path\n";
1108 std::wcerr <<
"Warning: Cannot find " << (isClang ?
"Clang" :
"GCC") <<
" installation directory, " << (isClang ?
"clang++" :
"g++") <<
".exe must be in the path\n";
1126 const QStringList minGWRuntimes = {
"*gcc_"_L1,
"*stdc++"_L1,
"*winpthread"_L1 };
1131 const QStringList clangMinGWRuntimes = {
"*unwind"_L1,
"*c++"_L1 };
1138 if (vcRedistDirName.
isEmpty())
1142 const QString machineArchString = getArchString(machineArch);
1150 redistFiles.append(dll.absoluteFilePath());
1154 QString releaseRedistDir = vcRedistDirName;
1156 if (!countryCodes.isEmpty())
1157 releaseRedistDir += u
'/' + countryCodes.constFirst();
1159 + machineArchString +
".exe"_L1);
1161 fi.
setFile(releaseRedistDir +
"/vcredist_"_L1
1162 + machineArchString +
".exe"_L1);
1167 if (redistFiles.isEmpty()) {
1168 std::wcerr <<
"Warning: Cannot find Visual Studio " << (isDebug ?
"debug" :
"release")
1172 result.append(redistFiles);
1189 return (majorVersion << 16) | (minorVersion << 8) | patchVersion;
1198 std::wcerr <<
"Warning: Could not update " << sourceFileName <<
" :" << *
errorMessage <<
'\n';
1218 std::copy_if(libName.
cbegin(), libName.
cend(), std::back_inserter(version),
1219 [](
QChar c) { return c.isDigit(); });
1228 const QChar slash = u
'/';
1235 const int version =
qtVersion(qtpathsVariables);
1244 unsigned short machineArch;
1245 int directDependencyCount = 0;
1247 &detectedDebug, &machineArch, &directDependencyCount)) {
1250 for (
int b = 1;
b < options.
binaries.size(); ++
b) {
1252 nullptr,
nullptr,
nullptr)) {
1265 result.isDebug = detectedDebug;
1280 for (
int m = 0;
m < dependentQtLibs.size(); ++
m) {
1283 result.directlyUsedQtLibraries[module] = 1;
1286 const bool usesQml =
result.directlyUsedQtLibraries.test(QtQmlModuleId);
1287 const bool usesQuick =
result.directlyUsedQtLibraries.test(QtQuickModuleId);
1288 const bool uses3DQuick =
result.directlyUsedQtLibraries.test(Qt3DQuickModuleId);
1290 && (usesQml || usesQuick || uses3DQuick || (options.
additionalLibraries.test(QtQmlModuleId)));
1294 << wordSize <<
" bit, " << (
result.isDebug ?
"debug" :
"release")
1297 std::wcout <<
" [QML]";
1301 if (dependentQtLibs.isEmpty()) {
1311 for (
const QString &qtLib : qtLibs) {
1313 if (!icuLibs.isEmpty()) {
1319 std::wcout <<
"Adding ICU version " << icuVersion <<
'\n';
1327 if (!
findInPath(icuLibCandidate).isEmpty()) {
1328 icuLib = icuLibCandidate;
1331 icuLibs.push_back(icuLib);
1333 for (
const QString &icuLib : std::as_const(icuLibs)) {
1339 dependentQtLibs.push_back(icuPath);
1354 if (qmlDirectories.isEmpty()) {
1357 qmlDirectories.append(qmlDirectory);
1359 for (
const QString &qmlDirectory : std::as_const(qmlDirectories)) {
1364 result.directlyUsedQtLibraries.test(QtWidgetsModuleId),
1368 qmlScanResult.
append(scanResult);
1370 for (
const QString &plugin : std::as_const(qmlScanResult.
plugins)) {
1375 std::wcout <<
"QML imports:\n";
1377 std::wcout <<
" '" << mod.name <<
"' "
1381 std::wcout <<
"QML plugins:\n";
1393 for (
int i = 0 ;
i < dependentQtLibs.size(); ++
i) {
1396 result.usedQtLibraries[module] = 1;
1398 deployedQtLibraries.push_back(dependentQtLibs.at(
i));
1408 &
result.deployedQtLibraries,
1413 libraryLocation, infix, debugMatchMode, options.
platform, &platformPlugin);
1421 deployedQtLibraries.append(library);
1423 qtGuiLibrary = library;
1434 std::wcout <<
"Plugins: " << plugins.join(u
',') <<
'\n';
1436 if (
result.deployedQtLibraries.test(QtGuiModuleId) && platformPlugin.
isEmpty()) {
1446 if (softwareRasterizer.
isFile())
1452 std::wcerr <<
"Warning: Cannot find any version of the d3dcompiler DLL.\n";
1454 deployedQtLibraries.push_back(d3dCompiler);
1459 if (!dxcLibs.isEmpty())
1460 deployedQtLibraries.append(dxcLibs);
1462 std::wcerr <<
"Warning: Cannot find any version of the dxcompiler.dll and dxil.dll.\n";
1473 for (
const QString &qtLib : std::as_const(libraries)) {
1478#if !QT_CONFIG(relocatable)
1500 for (
const QString &plugin : plugins) {
1501 const QString targetDirName = plugin.section(slash, -2, -2);
1502 const QString targetPath =
dir.absoluteFilePath(targetDirName);
1503 if (!
dir.exists(targetDirName)) {
1505 std::wcout <<
"Creating directory " << targetPath <<
".\n";
1526 const QString installPath = module.installPath(targetPath);
1528 std::wcout <<
"Installing: '" << module.name
1529 <<
"' from " << module.sourcePath <<
" to "
1535 unsigned qmlDirectoryFileFlags = 0;
1540 qmlDirectoryFileFlags),
1567 + u
'/' + webProcess;
1570 Options options(sourceOptions);
1580 static const char *installDataFiles[] = {
"icudtl.dat",
1581 "qtwebengine_devtools_resources.pak",
1582 "qtwebengine_resources.pak",
1583 "qtwebengine_resources_100p.pak",
1584 "qtwebengine_resources_200p.pak"};
1587 webEngineProcessName.
append(
'd');
1589 std::wcout <<
"Deploying: " << webEngineProcessName.
constData() <<
"...\n";
1594 + resourcesSubDir + u
'/';
1598 for (
auto installDataFile : installDataFiles) {
1606 if (!translations.
isDir()) {
1607 std::wcerr <<
"Warning: Cannot find the translation files of the QtWebEngine module at "
1620 std::wcerr <<
"Warning: Cannot find "
1643 if (!
path.contains(qtBinPath)) {
1645 path.prepend(qtBinPath);
1667 std::wcerr <<
"Unsupported platform " << xSpec <<
'\n';
1673 std::wcerr <<
"Unable to query qtpaths: " <<
errorMessage <<
'\n';
1722 if (
result.deployedQtLibraries.test(QtWebEngineCoreModuleId)) {
1734 delete options.
json;
1735 options.
json =
nullptr;
QStringList operator()(const QDir &dir) const
DllDirectoryFileEntryFunction(Platform platform, DebugMatchMode debugMatchMode, const QString &prefix=QString())
void addFile(const QString &source, const QString &target)
QByteArray toJson() const
QByteArray toList(ListOption option, const QDir &base) const
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
QByteArray & append(char c)
This is an overloaded member function, provided for convenience. It differs from the above function o...
constexpr bool isDigit() const noexcept
Returns true if the character is a decimal digit (Number_DecimalDigit); otherwise returns false.
constexpr char toLatin1() const noexcept
Returns the Latin-1 character equivalent to the QChar, or 0.
The QCommandLineOption class defines a possible command-line option. \inmodule QtCore.
void setFlags(Flags aflags)
Set the set of flags that affect this command-line option to flags.
QStringList names() const
Returns the names set for this option.
The QCommandLineParser class provides a means for handling the command line options.
QString value(const QString &name) const
Returns the option value found for the given option name optionName, or an empty string if not found.
bool parse(const QStringList &arguments)
Parses the command line arguments.
void addPositionalArgument(const QString &name, const QString &description, const QString &syntax=QString())
Defines an additional argument to the application, for the benefit of the help text.
QStringList positionalArguments() const
Returns a list of positional arguments.
void setSingleDashWordOptionMode(SingleDashWordOptionMode parsingMode)
Sets the parsing mode to singleDashWordOptionMode.
QStringList values(const QString &name) const
Returns a list of option values found for the given option name optionName, or an empty list if not f...
void setApplicationDescription(const QString &description)
Sets the application description shown by helpText().
bool addOption(const QCommandLineOption &commandLineOption)
Adds the option option to look for while parsing.
QString errorText() const
Returns a translated error text for the user.
bool isSet(const QString &name) const
Checks whether the option name was passed to the application.
QCommandLineOption addVersionOption()
Adds the {-v} / {–version} option, which displays the version string of the application.
QCommandLineOption addHelpOption()
Adds help options to the command-line parser.
static QString applicationDirPath()
Returns the directory that contains the application executable.
static void setApplicationVersion(const QString &version)
static QStringList arguments()
QString dirName() const
Returns the name of the directory; this is not the same as the path, e.g.
QFileInfoList entryInfoList(Filters filters=NoFilter, SortFlags sort=NoSort) const
This is an overloaded member function, provided for convenience. It differs from the above function o...
static QString cleanPath(const QString &path)
Returns path with directory separators normalized (that is, platform-native separators converted to "...
static QString toNativeSeparators(const QString &pathName)
QString absoluteFilePath(const QString &fileName) const
Returns the absolute path name of a file in the directory.
static constexpr QChar listSeparator() noexcept
\inmodule QtCore \reentrant
QString fileName() const
Returns the name of the file, excluding the path.
bool isExecutable() const
Returns true if the file is executable; otherwise returns false.
void setFile(const QString &file)
Sets the file that the QFileInfo provides information about to file.
QString absoluteFilePath() const
Returns an absolute path including the file name.
bool isFile() const
Returns true if this object points to a file or to a symbolic link to a file.
bool isDir() const
Returns true if this object points to a directory or to a symbolic link to a directory.
QString absolutePath() const
Returns a file's path absolute path.
QString filePath() const
Returns the file name, including the path (which may be absolute or relative).
bool exists() const
Returns true if the file exists; otherwise returns false.
static QByteArray encodeName(const QString &fileName)
Converts fileName to an 8-bit encoding that you can use in native APIs.
static QString decodeName(const QByteArray &localFileName)
This does the reverse of QFile::encodeName() using localFileName.
bool isEmpty() const noexcept
void append(parameter_type t)
T value(const Key &key, const T &defaultValue=T()) const
bool contains(const Key &key) const
iterator find(const T &value)
\macro QT_RESTRICTED_CAST_FROM_ASCII
qsizetype lastIndexOf(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const noexcept
std::wstring toStdWString() const
Returns a std::wstring object with the data contained in this QString.
int toInt(bool *ok=nullptr, int base=10) const
Returns the string converted to an int using base base, which is 10 by default and must be between 2 ...
bool startsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string starts with s; otherwise returns false.
QString & replace(qsizetype i, qsizetype len, QChar after)
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QStringList split(const QString &sep, Qt::SplitBehavior behavior=Qt::KeepEmptyParts, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Splits the string into substrings wherever sep occurs, and returns the list of those strings.
void truncate(qsizetype pos)
Truncates the string at the given position index.
void clear()
Clears the contents of the string and makes it null.
const_iterator cbegin() const
qsizetype size() const
Returns the number of characters in this string.
const_iterator cend() const
void push_back(QChar c)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QString mid(qsizetype position, qsizetype n=-1) const
Returns a string that contains n characters of this string, starting at the specified position index.
QString section(QChar sep, qsizetype start, qsizetype end=-1, SectionFlags flags=SectionDefault) const
This function returns a section of the string.
const QChar at(qsizetype i) const
Returns the character at the given index position in the string.
bool endsWith(const QString &s, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
Returns true if the string ends with s; otherwise returns false.
bool isEmpty() const
Returns true if the string has no characters; otherwise returns false.
QString toLower() const &
bool contains(QChar c, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
QString & append(QChar c)
static QString static QString qsizetype indexOf(QChar c, qsizetype from=0, Qt::CaseSensitivity cs=Qt::CaseSensitive) const
QString & remove(qsizetype i, qsizetype len)
Removes n characters from the string, starting at the given position index, and returns a reference t...
QByteArray toUtf8() const &
QString & prepend(QChar c)
QStringList operator()(const QDir &dir) const
QmlDirectoryFileEntryFunction(Platform platform, DebugMatchMode debugMatchMode, unsigned flags)
bool populate(const QString &modulesDir, const QString &translationsDir, bool verbose, QString *errorString)
const QtModule & moduleById(size_t id) const
size_t moduleIdForPluginType(const QString &pluginType) const
QSet< QString >::iterator it
QList< QVariant > arguments
Combined button and popup list for selecting options.
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLsizei GLsizei GLenum void * binary
GLboolean GLboolean GLboolean b
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLenum GLsizei const GLuint GLboolean enabled
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLint GLint GLint GLint GLint GLint GLint GLbitfield mask
GLsizei const GLchar *const * path
static qreal dot(const QPointF &a, const QPointF &b)
#define qPrintable(string)
QLatin1StringView QLatin1String
#define QStringLiteral(str)
bool updateFile(const QString &fileName, const QHash< QString, QString > &replacements)
QString findInPath(const QString &fileName)
static Platform platformFromMkSpec(const QString &xSpec)
static bool isQtModule(const QString &libName)
static bool deployWebEngineCore(const QMap< QString, QString > &qtpathsVariables, const Options &options, bool isDebug, QString *errorMessage)
static QtModuleInfoStore qtModuleEntries
static QString libraryPath(const QString &libraryLocation, const char *name, const QString &infix, Platform platform, bool debug)
static QString lineBreak(QString s)
static QString deployPlugin(const QString &plugin, const QDir &subDir, ModuleBitset *usedQtModules, const ModuleBitset &disabledQtModules, const QStringList &disabledPluginTypes, const QString &libraryLocation, const QString &infix, Platform platform)
static QString msgFileDoesNotExist(const QString &file)
static QStringList compilerRunTimeLibs(const QString &qtBinDir, Platform platform, bool isDebug, unsigned short machineArch)
static bool updateLibrary(const QString &sourceFileName, const QString &targetDirectory, const Options &options, QString *errorMessage)
static bool deployWebProcess(const QMap< QString, QString > &qtpathsVariables, const char *binaryName, const Options &sourceOptions, QString *errorMessage)
static void assignKnownModuleIds()
static QCommandLineOption createVerboseOption()
static int parseArguments(const QStringList &arguments, QCommandLineParser *parser, Options *options, QString *errorMessage)
static QString moduleNameToOptionName(const QString &moduleName)
static ExlusiveOptionValue parseExclusiveOptions(const QCommandLineParser *parser, const QCommandLineOption &enableOption, const QCommandLineOption &disableOption)
static int qtVersion(const QMap< QString, QString > &qtpathsVariables)
static QStringList translationNameFilters(const ModuleBitset &modules, const QString &prefix)
static QString findBinary(const QString &directory, Platform platform)
static int parseEarlyArguments(const QStringList &arguments, Options *options, QString *errorMessage)
static QCommandLineOption createQMakeOption()
static QStringList qmlCacheFileFilters()
static QString pdbFileName(QString libraryFileName)
@ CommandLineParseHelpRequested
#define DECLARE_KNOWN_MODULE(name)
static QCommandLineOption createQtPathsOption()
static const char webEngineProcessC[]
static qint64 qtModule(QString module, const QString &infix)
static QString vcRedistDir()
static QString webProcessBinary(const char *binaryName, Platform p)
static QString helpText(const QCommandLineParser &p)
static DeployResult deploy(const Options &options, const QMap< QString, QString > &qtpathsVariables, QString *errorMessage)
static QStringList findMinGWRuntimePaths(const QString &qtBinDir, Platform platform, const QStringList &runtimeFilters)
#define DEFINE_KNOWN_MODULE(name)
#define IMAGE_FILE_MACHINE_ARM64
static QString getIcuVersion(const QString &libName)
QStringList findQtPlugins(ModuleBitset *usedQtModules, const ModuleBitset &disabledQtModules, const QStringList &disabledPluginTypes, const QString &qtPluginsDirName, const QString &libraryLocation, const QString &infix, DebugMatchMode debugMatchModeIn, Platform platform, QString *platformPlugin)
static bool findDependentQtLibraries(const QString &qtBinDir, const QString &binary, Platform platform, QString *errorMessage, QStringList *result, unsigned *wordSize=nullptr, bool *isDebug=nullptr, unsigned short *machineArch=nullptr, int *directDependencyCount=nullptr, int recursionDepth=0)
static bool deployTranslations(const QString &sourcePath, const ModuleBitset &usedQtModules, const QString &target, const Options &options, QString *errorMessage)
static QString vcDebugRedistDir()
static QByteArray formatQtModules(const ModuleBitset &mask, bool option=false)
bool qputenv(const char *varName, QByteArrayView raw)
Q_CORE_EXPORT QByteArray qgetenv(const char *varName)
std::bitset< ModuleBitsetSize > ModuleBitset
static QString errorMessage(QUrlPrivate::ErrorCode errorCode, const QString &errorSource, qsizetype errorPosition)
QFileInfo fi("c:/temp/foo")
[newstuff]
const QStringList filters({"Image files (*.png *.xpm *.jpg)", "Text files (*.txt)", "Any files (*)" })
[6]
ModuleBitset usedQtLibraries
ModuleBitset directlyUsedQtLibraries
ModuleBitset deployedQtLibraries
QStringList disabledPluginTypes
DebugDetection debugDetection
QStringList qmlImportPaths
QStringList qmlDirectories
QString translationsDirectory
ModuleBitset additionalLibraries
ModuleBitset disabledLibraries
@ DebugDetectionForceRelease
@ DebugDetectionForceDebug
void append(const QmlImportScanResult &other)
static constexpr size_t InvalidId
QStringList findDxc(Platform, const QString &, unsigned)
QMap< QString, QString > queryQtPaths(const QString &qtpathsBinary, QString *errorMessage)
QString findD3dCompiler(Platform, const QString &, unsigned)
bool createDirectory(const QString &directory, QString *errorMessage, bool dryRun)
QStringList findSharedLibraries(const QDir &directory, Platform platform, DebugMatchMode debugMatchMode, const QString &prefix)
bool runProcess(const QString &binary, const QStringList &args, const QString &workingDirectory, unsigned long *exitCode, QByteArray *stdOut, QByteArray *stdErr, QString *errorMessage)
bool patchQtCore(const QString &path, QString *errorMessage)
const char * qmakeInfixKey
@ WindowsDesktopClangMinGW
@ WindowsDesktopClangMsvc
QStringList findDependentLibraries(const QString &executableFileName, Platform platform, QString *errorMessage)
bool platformHasDebugSuffix(Platform p)
@ SkipQmlDesignerSpecificsDirectories
static const char windowsSharedLibrarySuffix[]
bool readExecutable(const QString &executableFileName, Platform platform, QString *errorMessage, QStringList *dependentLibraries=0, unsigned *wordSize=0, bool *isDebug=0, unsigned short *machineArch=nullptr)
QString normalizeFileName(const QString &name)
QString sharedLibrarySuffix(Platform platform)