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:
Marco Bubke
2015-11-30 20:32:47 +01:00
committed by Nikolai Kosjar
parent a5a0864741
commit 5f29a00c89
2 changed files with 27 additions and 1 deletions

View File

@@ -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();

View File

@@ -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;