Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
runqttool.cpp
Go to the documentation of this file.
1// Copyright (C) 2018 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4#include "runqttool.h"
5#include "fmt.h"
6
7#include "profileutils.h"
8
9#include <QtCore/qcoreapplication.h>
10#include <QtCore/qdir.h>
11#include <QtCore/qregularexpression.h>
12
13#include <cstdlib>
14#include <iostream>
15
16#ifdef Q_OS_UNIX
17#include <sys/wait.h>
18#endif
19
20static QString qtToolFilePath(const QString &toolName, QLibraryInfo::LibraryPath location)
21{
22 QString filePath = QLibraryInfo::path(location) + QLatin1Char('/') + toolName;
23#ifdef Q_OS_WIN
24 filePath.append(QLatin1String(".exe"));
25#endif
26 return QDir::cleanPath(filePath);
27}
28
29static void rtPrintErr(const QString &out)
30{
31 std::cerr << qUtf8Printable(out);
32}
33
34static QString shellQuoted(const QString &str)
35{
36 static QRegularExpression rx(QStringLiteral("\\s"));
37 QString result = str;
38 if (result.contains(rx)) {
39 const QLatin1Char dblqt = QLatin1Char('"');
40 result.prepend(dblqt);
41 result.append(dblqt);
42 }
43 return result;
44}
45
46static QStringList shellQuoted(const QStringList &strs)
47{
48 QStringList result;
49 result.reserve(strs.size());
50 std::transform(strs.begin(), strs.end(), std::back_inserter(result),
51 static_cast<QString (*)(const QString &)>(&shellQuoted));
52 return result;
53}
54
55static QString commandLineForSystem(const QString &program,
56 const QStringList &arguments)
57{
58 return shellQuoted(program)
59 + QLatin1Char(' ')
60 + shellQuoted(arguments).join(QLatin1Char(' '));
61}
62
63static int runQtToolHelper(const QString &toolName, const QStringList &arguments,
64 QLibraryInfo::LibraryPath location)
65{
66 int exitCode = 0;
67 const QString commandLine = commandLineForSystem(qtToolFilePath(toolName, location), arguments);
68#if defined(Q_OS_WIN)
69 exitCode = _wsystem(reinterpret_cast<const wchar_t *>(commandLine.utf16()));
70#elif defined(Q_OS_UNIX)
71 int ret = std::system(qPrintable(commandLine));
72 exitCode = WEXITSTATUS(ret);
73#else
74 exitCode = std::system(qPrintable(commandLine));
75#endif
76 return exitCode;
77}
78
79void runQtTool(const QString &toolName, const QStringList &arguments,
80 QLibraryInfo::LibraryPath location)
81{
82 const int exitCode = runQtToolHelper(toolName, arguments, location);
83 if (exitCode != 0)
84 exit(exitCode);
85}
86
87static int runInternalQtToolHelper(const QString &toolName, const QStringList &arguments)
88{
89 return runQtToolHelper(toolName, arguments, QLibraryInfo::LibraryExecutablesPath);
90}
91
92void runInternalQtTool(const QString &toolName, const QStringList &arguments)
93{
94 const int exitCode = runInternalQtToolHelper(toolName, arguments);
95 if (exitCode != 0)
96 exit(exitCode);
97}
98
100{
101 std::unique_ptr<QTemporaryFile> file(new QTemporaryFile(QStringLiteral("XXXXXX.json")));
102 if (!file->open()) {
103 rtPrintErr(FMT::tr("Cannot create temporary file: %1\n").arg(file->errorString()));
104 exit(1);
105 }
106 file->close();
107 args << QStringLiteral("-out") << file->fileName();
108 const int exitCode = runInternalQtToolHelper(QStringLiteral("lprodump"), args);
109 if (exitCode != 0) {
110 file.reset();
111 exit(exitCode);
112 }
113 return file;
114}
static QString shellQuoted(const QString &str)
Definition runqttool.cpp:34
static int runInternalQtToolHelper(const QString &toolName, const QStringList &arguments)
Definition runqttool.cpp:87
static int runQtToolHelper(const QString &toolName, const QStringList &arguments, QLibraryInfo::LibraryPath location)
Definition runqttool.cpp:63
static QString commandLineForSystem(const QString &program, const QStringList &arguments)
Definition runqttool.cpp:55
static void rtPrintErr(const QString &out)
Definition runqttool.cpp:29
static QString qtToolFilePath(const QString &toolName, QLibraryInfo::LibraryPath location)
Definition runqttool.cpp:20
void runInternalQtTool(const QString &toolName, const QStringList &arguments)
Definition runqttool.cpp:92
std::unique_ptr< QTemporaryFile > createProjectDescription(QStringList args)
Definition runqttool.cpp:99
void runQtTool(const QString &toolName, const QStringList &arguments, QLibraryInfo::LibraryPath location=QLibraryInfo::BinariesPath)
Definition runqttool.cpp:79