forked from qt-creator/qt-creator
CMake: Use shorter names for local sockets in server-mode
Apparently there is a limit to about 100 characters or so on some versions of Unix (e.g. Darwin), and there is also the tendency to point TMPDIR into places very far from '/' (e.g. Darwin), which can result in the local socket path getting trunkated. So make sure to put the local socket into /tmp on Unix. That works on Linux and on Darwin. Change-Id: I40bfaf932c5013cf72addb5621360e97c9583daa Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
@@ -63,14 +63,6 @@ Q_LOGGING_CATEGORY(cmakeServerMode, "qtc.cmake.serverMode");
|
||||
// Helpers:
|
||||
// ----------------------------------------------------------------------
|
||||
|
||||
QString socketName()
|
||||
{
|
||||
QUuid uuid = QUuid::createUuid();
|
||||
if (HostOsInfo::isWindowsHost())
|
||||
return "\\\\.\\pipe\\" + uuid.toString();
|
||||
return Utils::TemporaryDirectory::masterDirectoryPath() + "/cmake-socket-" + uuid.toString();
|
||||
}
|
||||
|
||||
bool isValid(const QVariant &v)
|
||||
{
|
||||
if (v.isNull())
|
||||
@@ -93,6 +85,12 @@ ServerMode::ServerMode(const Environment &env,
|
||||
bool experimental, int major, int minor,
|
||||
QObject *parent) :
|
||||
QObject(parent),
|
||||
#if defined(Q_OS_UNIX)
|
||||
// Some unixes (e.g. Darwin) limit the length of a local socket to about 100 char (or less).
|
||||
// Since some unixes (e.g. Darwin) also point TMPDIR to /really/long/paths we need to create
|
||||
// our own socket in a place closer to '/'.
|
||||
m_socketDir("/tmp/cmake-"),
|
||||
#endif
|
||||
m_sourceDirectory(sourceDirectory), m_buildDirectory(buildDirectory),
|
||||
m_cmakeExecutable(cmakeExecutable),
|
||||
m_generator(generator), m_extraGenerator(extraGenerator),
|
||||
@@ -109,7 +107,13 @@ ServerMode::ServerMode(const Environment &env,
|
||||
|
||||
m_cmakeProcess->setEnvironment(env);
|
||||
m_cmakeProcess->setWorkingDirectory(buildDirectory.toString());
|
||||
m_socketName = socketName();
|
||||
|
||||
#if defined(Q_OS_UNIX)
|
||||
m_socketName = m_socketDir.path() + "/socket";
|
||||
#else
|
||||
m_socketName = QString::fromLatin1("\\\\.\\pipe\\") + QUuid::createUuid().toString();
|
||||
#endif
|
||||
|
||||
const QStringList args = QStringList({ "-E", "server", "--pipe=" + m_socketName });
|
||||
|
||||
connect(m_cmakeProcess.get(), &QtcProcess::started, this, [this]() { m_connectionTimer.start(); });
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
#include <QLoggingCategory>
|
||||
#include <QTimer>
|
||||
#include <QVariantMap>
|
||||
#include <QTemporaryDir>
|
||||
|
||||
#include <memory>
|
||||
|
||||
@@ -84,6 +85,9 @@ private:
|
||||
|
||||
void reportError(const QString &msg);
|
||||
|
||||
#if defined(Q_OS_UNIX)
|
||||
QTemporaryDir m_socketDir;
|
||||
#endif
|
||||
std::unique_ptr<Utils::QtcProcess> m_cmakeProcess;
|
||||
QLocalSocket *m_cmakeSocket = nullptr;
|
||||
QTimer m_connectionTimer;
|
||||
@@ -112,6 +116,7 @@ private:
|
||||
const int m_minorProtocol = -1;
|
||||
|
||||
int m_requestCounter = 0;
|
||||
|
||||
};
|
||||
|
||||
} // namespace Internal
|
||||
|
||||
Reference in New Issue
Block a user