blob: 7d04e506ca4da9f3ed7fc8d4f368734f8972327f (
plain)
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
#include "hostosinfo.h"
#include "filepath.h"
#include "utilstr.h"
#include <QDir>
#if !defined(QT_NO_OPENGL) && defined(QT_GUI_LIB)
#include <QOpenGLContext>
#endif
#ifdef Q_OS_LINUX
#include <sys/sysinfo.h>
#endif
#ifdef Q_OS_WIN
#include <qt_windows.h>
#endif
#ifdef Q_OS_MACOS
#include <sys/sysctl.h>
#endif
namespace Utils::HostOsInfo {
static Qt::CaseSensitivity m_overrideFileNameCaseSensitivity = Qt::CaseSensitive;
static bool m_useOverrideFileNameCaseSensitivity = false;
OsArch hostArchitecture()
{
#ifdef Q_OS_WIN
// Workaround for Creator running in x86 emulation mode on ARM machines
static const OsArch arch = []() {
const HANDLE procHandle = GetCurrentProcess();
ushort processMachine;
ushort nativeMachine;
if (IsWow64Process2(procHandle, &processMachine, &nativeMachine)
&& nativeMachine == IMAGE_FILE_MACHINE_ARM64) {
return OsArchArm64;
}
return osArchFromString(QSysInfo::currentCpuArchitecture()).value_or(OsArchUnknown);
}();
#else
static const OsArch arch
= osArchFromString(QSysInfo::currentCpuArchitecture()).value_or(OsArchUnknown);
#endif
return arch;
}
void setOverrideFileNameCaseSensitivity(Qt::CaseSensitivity sensitivity)
{
m_useOverrideFileNameCaseSensitivity = true;
m_overrideFileNameCaseSensitivity = sensitivity;
}
void unsetOverrideFileNameCaseSensitivity()
{
m_useOverrideFileNameCaseSensitivity = false;
}
std::optional<quint64> totalMemoryInstalledInBytes()
{
#ifdef Q_OS_LINUX
struct sysinfo info;
if (sysinfo(&info) == -1)
return {};
return info.totalram;
#elif defined(Q_OS_WIN)
MEMORYSTATUSEX statex;
statex.dwLength = sizeof statex;
if (!GlobalMemoryStatusEx(&statex))
return {};
return statex.ullTotalPhys;
#elif defined(Q_OS_MACOS)
int mib[] = {CTL_HW, HW_MEMSIZE};
int64_t ram;
size_t length = sizeof(int64_t);
if (sysctl(mib, 2, &ram, &length, nullptr, 0) == -1)
return {};
return ram;
#endif
return {};
}
const FilePath &root()
{
static const FilePath rootDir = FilePath::fromUserInput(QDir::rootPath());
return rootDir;
}
Qt::CaseSensitivity fileNameCaseSensitivity()
{
return m_useOverrideFileNameCaseSensitivity
? m_overrideFileNameCaseSensitivity
: OsSpecificAspects::fileNameCaseSensitivity(hostOs());
}
OsArch binaryArchitecture()
{
// MSVC:
#if defined(_M_X64)
return OsArchAMD64;
#elif defined(_M_IX86)
return OsArchX86;
#elif defined(_M_ARM64)
return OsArchArm64;
#elif defined(_M_ARM)
return OsArchArm;
#elif defined(_M_IA64)
return OsArchItanium;
// GCC / Clang:
#elif defined(__amd64__) || defined(__amd64) || defined(__x86_64__) || defined(__x86_64)
return OsArchAMD64;
#elif defined(__i386__) || defined(__i386) || defined(__i486__) || defined(__i586__) \
|| defined(__i686__)
return OsArchX86;
#elif defined(__aarch64__)
return OsArchArm64;
#elif defined(__arm__)
return OsArchArm;
#elif defined(__ia64__) || defined(__itanium__)
return OsArchItanium;
#else
static_assert(false, "Unknown architecture, please add detection.");
return OsArchUnknown;
#endif
}
QString withExecutableSuffix(const QString &executable)
{
return OsSpecificAspects::withExecutableSuffix(hostOs(), executable);
}
} // namespace Utils
|