forked from qt-creator/qt-creator
Clang: Change temporary directory for clangbackend
This is meant to 1. Work around a libclang bug on Windows (not deleting preamble files) 2. Delete left-over preamble files in case of a clangbackend crash The temporary diretory will be removed on Qt Creator exit. Task-number: QTCREATORBUG-10988 Change-Id: Ia5837c2a6ab2d55366d167dd591d87faaededf3e Reviewed-by: Marco Bubke <marco.bubke@theqtcompany.com> Reviewed-by: Nikolai Kosjar <nikolai.kosjar@theqtcompany.com>
This commit is contained in:
committed by
Nikolai Kosjar
parent
a5a0864741
commit
5f29a00c89
@@ -37,11 +37,19 @@
|
||||
|
||||
#include <QCoreApplication>
|
||||
#include <QProcess>
|
||||
#include <QTemporaryDir>
|
||||
#include <QThread>
|
||||
|
||||
namespace ClangBackEnd {
|
||||
|
||||
namespace {
|
||||
const QTemporaryDir &temporaryDirectory()
|
||||
{
|
||||
static QTemporaryDir temporaryDirectory(QDir::tempPath() + QStringLiteral("/qtc-clang-XXXXXX"));
|
||||
|
||||
return temporaryDirectory;
|
||||
}
|
||||
|
||||
QString currentProcessId()
|
||||
{
|
||||
return QString::number(QCoreApplication::applicationPid());
|
||||
@@ -49,7 +57,7 @@ QString currentProcessId()
|
||||
|
||||
QString connectionName()
|
||||
{
|
||||
return QStringLiteral("ClangBackEnd-") + currentProcessId();
|
||||
return temporaryDirectory().path() + QStringLiteral("/ClangBackEnd-") + currentProcessId();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,6 +136,20 @@ void ConnectionClient::setProcessAliveTimerInterval(int processTimerInterval)
|
||||
processAliveTimer.setInterval(processTimerInterval);
|
||||
}
|
||||
|
||||
QProcessEnvironment ConnectionClient::processEnvironment() const
|
||||
{
|
||||
auto processEnvironment = QProcessEnvironment::systemEnvironment();
|
||||
|
||||
if (temporaryDirectory().isValid()) {
|
||||
const QString temporaryDirectoryPath = temporaryDirectory().path();
|
||||
processEnvironment.insert(QStringLiteral("TMPDIR"), temporaryDirectoryPath);
|
||||
processEnvironment.insert(QStringLiteral("TMP"), temporaryDirectoryPath);
|
||||
processEnvironment.insert(QStringLiteral("TEMP"), temporaryDirectoryPath);
|
||||
}
|
||||
|
||||
return processEnvironment;
|
||||
}
|
||||
|
||||
void ConnectionClient::startProcess()
|
||||
{
|
||||
TIME_SCOPE_DURATION("ConnectionClient::startProcess");
|
||||
@@ -135,6 +157,7 @@ void ConnectionClient::startProcess()
|
||||
if (!isProcessIsRunning()) {
|
||||
connectProcessFinished();
|
||||
connectStandardOutputAndError();
|
||||
process()->setProcessEnvironment(processEnvironment());
|
||||
process()->start(processPath(), {connectionName()});
|
||||
process()->waitForStarted();
|
||||
resetProcessAliveTimer();
|
||||
|
@@ -35,6 +35,7 @@
|
||||
#include "lineprefixer.h"
|
||||
|
||||
#include <QLocalSocket>
|
||||
#include <QProcessEnvironment>
|
||||
|
||||
#include <memory>
|
||||
|
||||
@@ -100,6 +101,8 @@ private:
|
||||
|
||||
void ensureMessageIsWritten();
|
||||
|
||||
QProcessEnvironment processEnvironment() const;
|
||||
|
||||
private:
|
||||
mutable std::unique_ptr<QProcess> process_;
|
||||
QLocalSocket localSocket;
|
||||
|
Reference in New Issue
Block a user