diff --git a/src/plugins/cmakeprojectmanager/servermode.cpp b/src/plugins/cmakeprojectmanager/servermode.cpp index 24d0253354e..0e29fd6d8a1 100644 --- a/src/plugins/cmakeprojectmanager/servermode.cpp +++ b/src/plugins/cmakeprojectmanager/servermode.cpp @@ -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(); }); diff --git a/src/plugins/cmakeprojectmanager/servermode.h b/src/plugins/cmakeprojectmanager/servermode.h index c397d5a8475..e7b645623ad 100644 --- a/src/plugins/cmakeprojectmanager/servermode.h +++ b/src/plugins/cmakeprojectmanager/servermode.h @@ -30,6 +30,7 @@ #include #include #include +#include #include @@ -84,6 +85,9 @@ private: void reportError(const QString &msg); +#if defined(Q_OS_UNIX) + QTemporaryDir m_socketDir; +#endif std::unique_ptr 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