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